# HG changeset patch # User Pat Downey # Date 1283340194 -3600 # Node ID fbd2e7cec7efe7a454607e63eec538e971a52002 # Parent 2669f8761a99b3c38f8f873d77e7b243460cfd79 Revert incorrect RCL_3 drop: Revision: 201027 Kit: 201035 diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/BWINSCW/XdmEngineU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/BWINSCW/XdmEngineU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,115 @@ +EXPORTS + ??0CXdmDirectory@@IAE@AAVCXdmEngine@@@Z @ 1 NONAME ; CXdmDirectory::CXdmDirectory(class CXdmEngine &) + ??0CXdmDocument@@IAE@AAVCXdmEngine@@@Z @ 2 NONAME ; CXdmDocument::CXdmDocument(class CXdmEngine &) + ??0CXdmDocumentNode@@IAE@AAVCXdmEngine@@AAVMXdmNodeFactory@@@Z @ 3 NONAME ; CXdmDocumentNode::CXdmDocumentNode(class CXdmEngine &, class MXdmNodeFactory &) + ??0CXdmDocumentNode@@IAE@AAVCXdmEngine@@AAVMXdmNodeFactory@@PAV0@@Z @ 4 NONAME ; CXdmDocumentNode::CXdmDocumentNode(class CXdmEngine &, class MXdmNodeFactory &, class CXdmDocumentNode *) + ??0CXdmDocumentNode@@IAE@HAAVCXdmEngine@@AAVMXdmNodeFactory@@PAV0@@Z @ 5 NONAME ; CXdmDocumentNode::CXdmDocumentNode(int, class CXdmEngine &, class MXdmNodeFactory &, class CXdmDocumentNode *) + ??0CXdmNodeAttribute@@IAE@AAVCXdmEngine@@AAVMXdmNodeFactory@@@Z @ 6 NONAME ; CXdmNodeAttribute::CXdmNodeAttribute(class CXdmEngine &, class MXdmNodeFactory &) + ??0CXdmNodeAttribute@@IAE@AAVCXdmEngine@@AAVMXdmNodeFactory@@PAVCXdmDocumentNode@@@Z @ 7 NONAME ; CXdmNodeAttribute::CXdmNodeAttribute(class CXdmEngine &, class MXdmNodeFactory &, class CXdmDocumentNode *) + ??0TXdmCredentials@@QAE@ABVTDesC16@@0@Z @ 8 NONAME ; TXdmCredentials::TXdmCredentials(class TDesC16 const &, class TDesC16 const &) + ??0TXdmCredentials@@QAE@XZ @ 9 NONAME ; TXdmCredentials::TXdmCredentials(void) + ??1CXdmDirectory@@UAE@XZ @ 10 NONAME ; CXdmDirectory::~CXdmDirectory(void) + ??1CXdmDocument@@UAE@XZ @ 11 NONAME ; CXdmDocument::~CXdmDocument(void) + ??1CXdmDocumentNode@@UAE@XZ @ 12 NONAME ; CXdmDocumentNode::~CXdmDocumentNode(void) + ??1CXdmEngine@@UAE@XZ @ 13 NONAME ; CXdmEngine::~CXdmEngine(void) + ??1CXdmNodeAttribute@@UAE@XZ @ 14 NONAME ; CXdmNodeAttribute::~CXdmNodeAttribute(void) + ??1CXdmProtocolInfo@@UAE@XZ @ 15 NONAME ; CXdmProtocolInfo::~CXdmProtocolInfo(void) + ??8CXdmDocument@@QBEHAAV0@@Z @ 16 NONAME ; int CXdmDocument::operator==(class CXdmDocument &) const + ??8CXdmDocumentNode@@QBEHABV0@@Z @ 17 NONAME ; int CXdmDocumentNode::operator==(class CXdmDocumentNode const &) const + ?AccessPoint@CXdmProtocolInfo@@QBEHXZ @ 18 NONAME ; int CXdmProtocolInfo::AccessPoint(void) const + ?AppendChileNodeL@CXdmDocumentNode@@QAEXPAV1@@Z @ 19 NONAME ; void CXdmDocumentNode::AppendChileNodeL(class CXdmDocumentNode *) + ?AppendL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@@Z @ 20 NONAME ; void CXdmDocument::AppendL(class CXdmDocumentNode *) + ?AppendToModelL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@0@Z @ 21 NONAME ; void CXdmDocument::AppendToModelL(class CXdmDocumentNode *, class CXdmDocumentNode *) + ?Attribute@CXdmDocumentNode@@QBEPAVCXdmNodeAttribute@@ABVTDesC16@@@Z @ 22 NONAME ; class CXdmNodeAttribute * CXdmDocumentNode::Attribute(class TDesC16 const &) const + ?Attribute@CXdmDocumentNode@@QBEPAVCXdmNodeAttribute@@H@Z @ 23 NONAME ; class CXdmNodeAttribute * CXdmDocumentNode::Attribute(int) const + ?AttributeCount@CXdmDocumentNode@@QBEHXZ @ 24 NONAME ; int CXdmDocumentNode::AttributeCount(void) const + ?AttributeValue@CXdmNodeAttribute@@QBE?AVTPtrC16@@XZ @ 25 NONAME ; class TPtrC16 CXdmNodeAttribute::AttributeValue(void) const + ?BaseConstructL@CXdmDirectory@@IAEXABVTDesC16@@@Z @ 26 NONAME ; void CXdmDirectory::BaseConstructL(class TDesC16 const &) + ?BaseConstructL@CXdmDocument@@IAEXHABVTDesC16@@@Z @ 27 NONAME ; void CXdmDocument::BaseConstructL(int, class TDesC16 const &) + ?BaseConstructL@CXdmDocument@@IAEXHABVTDesC8@@@Z @ 28 NONAME ; void CXdmDocument::BaseConstructL(int, class TDesC8 const &) + ?BaseConstructL@CXdmDocumentNode@@IAEXABVTDesC16@@@Z @ 29 NONAME ; void CXdmDocumentNode::BaseConstructL(class TDesC16 const &) + ?BaseConstructL@CXdmNodeAttribute@@IAEXABVTDesC16@@@Z @ 30 NONAME ; void CXdmNodeAttribute::BaseConstructL(class TDesC16 const &) + ?CancelUpdate@CXdmEngine@@QAEXPAVCXdmDirectory@@@Z @ 31 NONAME ; void CXdmEngine::CancelUpdate(class CXdmDirectory *) + ?CancelUpdate@CXdmEngine@@QAEXPAVCXdmDocument@@@Z @ 32 NONAME ; void CXdmEngine::CancelUpdate(class CXdmDocument *) + ?CheckFileExistsL@XdmStaticUtils@@SAHAAVRFs@@ABVTDesC16@@@Z @ 33 NONAME ; int XdmStaticUtils::CheckFileExistsL(class RFs &, class TDesC16 const &) + ?ChileNode@CXdmDocumentNode@@QBEPAV1@H@Z @ 34 NONAME ; class CXdmDocumentNode * CXdmDocumentNode::ChileNode(int) const + ?CleanUpDirectoryL@XdmStaticUtils@@SAXAAVRFs@@ABVTDesC16@@@Z @ 35 NONAME ; void XdmStaticUtils::CleanUpDirectoryL(class RFs &, class TDesC16 const &) + ?CopyConstructL@CXdmDocumentNode@@MAEXABV1@0@Z @ 36 NONAME ; void CXdmDocumentNode::CopyConstructL(class CXdmDocumentNode const &, class CXdmDocumentNode const &) + ?CreateAttributeL@CXdmDocumentNode@@QAEPAVCXdmNodeAttribute@@ABVTDesC16@@@Z @ 37 NONAME ; class CXdmNodeAttribute * CXdmDocumentNode::CreateAttributeL(class TDesC16 const &) + ?CreateAttributeL@CXdmDocumentNode@@QAEPAVCXdmNodeAttribute@@XZ @ 38 NONAME ; class CXdmNodeAttribute * CXdmDocumentNode::CreateAttributeL(void) + ?CreateChileNodeL@CXdmDocumentNode@@QAEPAV1@ABVTDesC16@@@Z @ 39 NONAME ; class CXdmDocumentNode * CXdmDocumentNode::CreateChileNodeL(class TDesC16 const &) + ?CreateChileNodeL@CXdmDocumentNode@@QAEPAV1@XZ @ 40 NONAME ; class CXdmDocumentNode * CXdmDocumentNode::CreateChileNodeL(void) + ?CreateDirectoryModelL@CXdmEngine@@QAEPAVCXdmDirectory@@ABVTDesC16@@@Z @ 41 NONAME ; class CXdmDirectory * CXdmEngine::CreateDirectoryModelL(class TDesC16 const &) + ?CreateDocumentModelL@CXdmEngine@@QAEPAVCXdmDocument@@ABVTDesC16@@W4TXdmDocType@@@Z @ 42 NONAME ; class CXdmDocument * CXdmEngine::CreateDocumentModelL(class TDesC16 const &, enum TXdmDocType) + ?CreateDocumentNodeL@CXdmEngine@@QAEPAVCXdmDocumentNode@@XZ @ 43 NONAME ; class CXdmDocumentNode * CXdmEngine::CreateDocumentNodeL(void) + ?Credentials@CXdmProtocolInfo@@QBEABVTXdmCredentials@@XZ @ 44 NONAME ; class TXdmCredentials const & CXdmProtocolInfo::Credentials(void) const + ?DeleteDataL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@@Z @ 45 NONAME ; void CXdmDocument::DeleteDataL(class CXdmDocumentNode *) + ?DeleteDirectoryModelL@CXdmEngine@@QAEXPBVCXdmDirectory@@@Z @ 46 NONAME ; void CXdmEngine::DeleteDirectoryModelL(class CXdmDirectory const *) + ?DeleteDocumentModelL@CXdmEngine@@QAEXPBVCXdmDocument@@@Z @ 47 NONAME ; void CXdmEngine::DeleteDocumentModelL(class CXdmDocument const *) + ?DirectoryCollection@CXdmEngine@@QBEABV?$RPointerArray@VCXdmDirectory@@@@XZ @ 48 NONAME ; class RPointerArray const & CXdmEngine::DirectoryCollection(void) const + ?DocumentCollection@CXdmEngine@@QBEABV?$RPointerArray@VCXdmDocument@@@@XZ @ 49 NONAME ; class RPointerArray const & CXdmEngine::DocumentCollection(void) const + ?DocumentSubsetL@CXdmDocument@@QAEPAVCXdmDocumentNode@@ABVTDesC16@@@Z @ 50 NONAME ; class CXdmDocumentNode * CXdmDocument::DocumentSubsetL(class TDesC16 const &) + ?EightBitNodeNameLC@CXdmDocumentNode@@QBEPAVHBufC8@@XZ @ 51 NONAME ; class HBufC8 * CXdmDocumentNode::EightBitNodeNameLC(void) const + ?EightBitValueLC@CXdmNodeAttribute@@QBEPAVHBufC8@@XZ @ 52 NONAME ; class HBufC8 * CXdmNodeAttribute::EightBitValueLC(void) const + ?ElementDataLC@CXdmDocumentNode@@QBEPAVHBufC8@@XZ @ 53 NONAME ; class HBufC8 * CXdmDocumentNode::ElementDataLC(void) const + ?ElementType@CXdmDocumentNode@@UBE?AW4TXdmElementType@@XZ @ 54 NONAME ; enum TXdmElementType CXdmDocumentNode::ElementType(void) const + ?ElementType@CXdmNodeAttribute@@UBE?AW4TXdmElementType@@XZ @ 55 NONAME ; enum TXdmElementType CXdmNodeAttribute::ElementType(void) const + ?EscapeLeafNodeContentLC@CXdmDocumentNode@@QBEPAVHBufC8@@XZ @ 56 NONAME ; class HBufC8 * CXdmDocumentNode::EscapeLeafNodeContentLC(void) const + ?EscapedValueLC@CXdmNodeAttribute@@QBEPAVHBufC8@@XZ @ 57 NONAME ; class HBufC8 * CXdmNodeAttribute::EscapedValueLC(void) const + ?FetchDataL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@@Z @ 58 NONAME ; void CXdmDocument::FetchDataL(class CXdmDocumentNode *) + ?Find@CXdmDocument@@QBEHABVCXdmDocumentNode@@AAV?$RPointerArray@VCXdmDocumentNode@@@@@Z @ 59 NONAME ; int CXdmDocument::Find(class CXdmDocumentNode const &, class RPointerArray &) const + ?Find@CXdmDocument@@QBEHABVTDesC16@@AAV?$RPointerArray@VCXdmDocumentNode@@@@@Z @ 60 NONAME ; int CXdmDocument::Find(class TDesC16 const &, class RPointerArray &) const + ?Find@CXdmDocument@@QBEHABVTDesC16@@AAV?$RPointerArray@VCXdmDocumentNode@@@@ABV?$RPointerArray@USXdmAttribute16@@@@@Z @ 61 NONAME ; int CXdmDocument::Find(class TDesC16 const &, class RPointerArray &, class RPointerArray const &) const + ?Find@CXdmDocument@@QBEHABVTDesC16@@AAV?$RPointerArray@VCXdmNodeAttribute@@@@@Z @ 62 NONAME ; int CXdmDocument::Find(class TDesC16 const &, class RPointerArray &) const + ?Find@CXdmDocumentNode@@QBEHABV1@AAV?$RPointerArray@VCXdmDocumentNode@@@@@Z @ 63 NONAME ; int CXdmDocumentNode::Find(class CXdmDocumentNode const &, class RPointerArray &) const + ?Find@CXdmDocumentNode@@QBEHABVTDesC16@@AAV?$RPointerArray@VCXdmDocumentNode@@@@@Z @ 64 NONAME ; int CXdmDocumentNode::Find(class TDesC16 const &, class RPointerArray &) const + ?Find@CXdmDocumentNode@@QBEHABVTDesC16@@AAV?$RPointerArray@VCXdmDocumentNode@@@@ABV?$RPointerArray@USXdmAttribute16@@@@@Z @ 65 NONAME ; int CXdmDocumentNode::Find(class TDesC16 const &, class RPointerArray &, class RPointerArray const &) const + ?GenerateFileNameL@XdmStaticUtils@@SAPAVHBufC16@@AAVRFs@@ABVTDesC16@@1@Z @ 66 NONAME ; class HBufC16 * XdmStaticUtils::GenerateFileNameL(class RFs &, class TDesC16 const &, class TDesC16 const &) + ?HasAttribute@CXdmDocumentNode@@QBEHABVTDesC16@@@Z @ 67 NONAME ; int CXdmDocumentNode::HasAttribute(class TDesC16 const &) const + ?InsertChileNodeL@CXdmDocumentNode@@QAEXHPAV1@@Z @ 68 NONAME ; void CXdmDocumentNode::InsertChileNodeL(int, class CXdmDocumentNode *) + ?InsertL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@@Z @ 69 NONAME ; void CXdmDocument::InsertL(class CXdmDocumentNode *) + ?IsCacheEnabled@CXdmProtocolInfo@@QBEHXZ @ 70 NONAME ; int CXdmProtocolInfo::IsCacheEnabled(void) const + ?IsEmptyNode@CXdmDocumentNode@@QBEHXZ @ 71 NONAME ; int CXdmDocumentNode::IsEmptyNode(void) const + ?IsLeafNode@CXdmDocumentNode@@QBEHXZ @ 72 NONAME ; int CXdmDocumentNode::IsLeafNode(void) const + ?IsSecure@CXdmProtocolInfo@@QBEHXZ @ 73 NONAME ; int CXdmProtocolInfo::IsSecure(void) const + ?LeafNodeContent@CXdmDocumentNode@@QBE?AVTPtrC8@@XZ @ 74 NONAME ; class TPtrC8 CXdmDocumentNode::LeafNodeContent(void) const + ?Match@CXdmDocumentNode@@QBEHABV1@@Z @ 75 NONAME ; int CXdmDocumentNode::Match(class CXdmDocumentNode const &) const + ?Match@CXdmDocumentNode@@QBEHABVTDesC16@@ABV?$RPointerArray@USXdmAttribute8@@@@@Z @ 76 NONAME ; int CXdmDocumentNode::Match(class TDesC16 const &, class RPointerArray const &) const + ?Name@CXdmDocument@@QBE?AVTPtrC16@@XZ @ 77 NONAME ; class TPtrC16 CXdmDocument::Name(void) const + ?NewL@CXdmEngine@@SAPAV1@ABVCXdmProtocolInfo@@@Z @ 78 NONAME ; class CXdmEngine * CXdmEngine::NewL(class CXdmProtocolInfo const &) + ?NewL@CXdmLogWriter@@SAPAV1@ABVTDesC16@@@Z @ 79 NONAME ; class CXdmLogWriter * CXdmLogWriter::NewL(class TDesC16 const &) + ?NewL@CXdmProtocolInfo@@SAPAV1@H@Z @ 80 NONAME ; class CXdmProtocolInfo * CXdmProtocolInfo::NewL(int) + ?NewL@CXdmProtocolInfo@@SAPAV1@HHABVTDesC16@@@Z @ 81 NONAME ; class CXdmProtocolInfo * CXdmProtocolInfo::NewL(int, int, class TDesC16 const &) + ?NextNode@CXdmDocumentNode@@QBEPAV1@XZ @ 82 NONAME ; class CXdmDocumentNode * CXdmDocumentNode::NextNode(void) const + ?NodeCount@CXdmDocumentNode@@QBEHXZ @ 83 NONAME ; int CXdmDocumentNode::NodeCount(void) const + ?NodeName@CXdmDocumentNode@@QBE?AVTPtrC16@@XZ @ 84 NONAME ; class TPtrC16 CXdmDocumentNode::NodeName(void) const + ?Parent@CXdmDocumentNode@@QBEPAV1@XZ @ 85 NONAME ; class CXdmDocumentNode * CXdmDocumentNode::Parent(void) const + ?Print@CXdmDocumentNode@@QAEXXZ @ 86 NONAME ; void CXdmDocumentNode::Print(void) + ?ProtocolUid@CXdmProtocolInfo@@QBE?AVTUid@@XZ @ 87 NONAME ; class TUid CXdmProtocolInfo::ProtocolUid(void) const + ?RemoveChileNodeL@CXdmDocumentNode@@QAEXPAV1@@Z @ 88 NONAME ; void CXdmDocumentNode::RemoveChileNodeL(class CXdmDocumentNode *) + ?RemoveFromModelL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@@Z @ 89 NONAME ; void CXdmDocument::RemoveFromModelL(class CXdmDocumentNode *) + ?ReplaceChileNodeL@CXdmDocumentNode@@QAEXPAV1@0@Z @ 90 NONAME ; void CXdmDocumentNode::ReplaceChileNodeL(class CXdmDocumentNode *, class CXdmDocumentNode *) + ?ReplaceInModelL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@0@Z @ 91 NONAME ; void CXdmDocument::ReplaceInModelL(class CXdmDocumentNode *, class CXdmDocumentNode *) + ?ReplaceL@CXdmDocument@@QAEXPAVCXdmDocumentNode@@0@Z @ 92 NONAME ; void CXdmDocument::ReplaceL(class CXdmDocumentNode *, class CXdmDocumentNode *) + ?ReplaceL@CXdmDocument@@QAEXXZ @ 93 NONAME ; void CXdmDocument::ReplaceL(void) + ?ResetSubset@CXdmDocument@@UAEXXZ @ 94 NONAME ; void CXdmDocument::ResetSubset(void) + ?Root@CXdmProtocolInfo@@QBE?AVTPtrC16@@XZ @ 95 NONAME ; class TPtrC16 CXdmProtocolInfo::Root(void) const + ?SetAttributeValueL@CXdmNodeAttribute@@QAEXABVTDesC16@@@Z @ 96 NONAME ; void CXdmNodeAttribute::SetAttributeValueL(class TDesC16 const &) + ?SetAttributeValueL@CXdmNodeAttribute@@QAEXABVTDesC8@@@Z @ 97 NONAME ; void CXdmNodeAttribute::SetAttributeValueL(class TDesC8 const &) + ?SetCacheUsage@CXdmProtocolInfo@@QAEXH@Z @ 98 NONAME ; void CXdmProtocolInfo::SetCacheUsage(int) + ?SetCredentials@CXdmProtocolInfo@@QAEXVTXdmCredentials@@@Z @ 99 NONAME ; void CXdmProtocolInfo::SetCredentials(class TXdmCredentials) + ?SetEmptyNode@CXdmDocumentNode@@QAEXH@Z @ 100 NONAME ; void CXdmDocumentNode::SetEmptyNode(int) + ?SetLeafNode@CXdmDocumentNode@@QAEXH@Z @ 101 NONAME ; void CXdmDocumentNode::SetLeafNode(int) + ?SetLeafNodeContentL@CXdmDocumentNode@@QAEXABVTDesC16@@@Z @ 102 NONAME ; void CXdmDocumentNode::SetLeafNodeContentL(class TDesC16 const &) + ?SetLeafNodeContentL@CXdmDocumentNode@@QAEXABVTDesC8@@@Z @ 103 NONAME ; void CXdmDocumentNode::SetLeafNodeContentL(class TDesC8 const &) + ?SetNameL@CXdmDocumentNode@@QAEXABVTDesC16@@@Z @ 104 NONAME ; void CXdmDocumentNode::SetNameL(class TDesC16 const &) + ?SetNameL@CXdmDocumentNode@@QAEXABVTDesC8@@@Z @ 105 NONAME ; void CXdmDocumentNode::SetNameL(class TDesC8 const &) + ?SetNextNode@CXdmDocumentNode@@QAEXPAV1@@Z @ 106 NONAME ; void CXdmDocumentNode::SetNextNode(class CXdmDocumentNode *) + ?SetSecurity@CXdmProtocolInfo@@QAEXH@Z @ 107 NONAME ; void CXdmProtocolInfo::SetSecurity(int) + ?SettingsID@CXdmProtocolInfo@@QBEHXZ @ 108 NONAME ; int CXdmProtocolInfo::SettingsID(void) const + ?UpdateL@CXdmEngine@@QAEXAAVTRequestStatus@@PAVCXdmDirectory@@W4TDirUpdatePhase@@@Z @ 109 NONAME ; void CXdmEngine::UpdateL(class TRequestStatus &, class CXdmDirectory *, enum TDirUpdatePhase) + ?UpdateL@CXdmEngine@@QAEXPAVCXdmDocument@@AAVTRequestStatus@@@Z @ 110 NONAME ; void CXdmEngine::UpdateL(class CXdmDocument *, class TRequestStatus &) + ?WriteToLog@CXdmLogWriter@@QBEXABVTDesC16@@@Z @ 111 NONAME ; void CXdmLogWriter::WriteToLog(class TDesC16 const &) const + ?WriteToLog@CXdmLogWriter@@QBEXABVTDesC8@@@Z @ 112 NONAME ; void CXdmLogWriter::WriteToLog(class TDesC8 const &) const + ?XdmSettingsLC@CXdmEngine@@SAPAVCDesC16Array@@AAV?$RArray@H@@@Z @ 113 NONAME ; class CDesC16Array * CXdmEngine::XdmSettingsLC(class RArray &) + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/Conf/xdmengine.confml Binary file XDMEngine/Conf/xdmengine.confml has changed diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/Conf/xdmengine_10207453.crml Binary file XDMEngine/Conf/xdmengine_10207453.crml has changed diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/Conf/xdmengine_10282384.crml Binary file XDMEngine/Conf/xdmengine_10282384.crml has changed diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/XdmDeviceManagement/inc/xdmdmadapter.h --- a/XDMEngine/XdmDeviceManagement/inc/xdmdmadapter.h Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/XdmDeviceManagement/inc/xdmdmadapter.h Wed Sep 01 12:23:14 2010 +0100 @@ -61,6 +61,7 @@ _LIT8( KXdmDmUriDotSlash, "./" ); _LIT8( KXdmDmSeparator, "/" ); _LIT8( KXdmDmSipLinkPrefix, "./SIP" ); +_LIT8( KXdmDefaultSettingsName,"DMAdapterIns" ); _LIT( KXdmDefaultId, "-1" ); _LIT( KXdmDmStartBracket, "(" ); _LIT( KXdmDmCloseBracket, ")" ); @@ -70,6 +71,7 @@ // CONSTANTS const TInt KXdmDmLogBufferMaxSize = 2000; +const TInt KXdmMaxUriLength = 256; const TInt KXdmDefaultResultSize = 255; const TInt KXdmDmLevel = 2; const TInt KXdmDmIdTableSize = 16; diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/XdmDeviceManagement/src/xdmdmadapter.cpp --- a/XDMEngine/XdmDeviceManagement/src/xdmdmadapter.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/XdmDeviceManagement/src/xdmdmadapter.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -235,13 +235,18 @@ } Callback().SetResultsL( aResultsRef, *currentList, KNullDesC8 ); Callback().SetStatusL( aStatusRef, retValue ); - CleanupStack::PopAndDestroy( 3, currentList ); // >>> settingIds, names, currentList + CleanupStack::PopAndDestroy( names ); // >>> names + CleanupStack::PopAndDestroy(); // >>> settingIds + CleanupStack::PopAndDestroy( currentList ); // >>> currentList return; } // ./OMA_XDM/X if( NSmlDmURI::NumOfURISegs( aUri ) == KXdmDmLevel ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ChildURIListL(): /OMA_XDM/X") ); +#endif segmentName.Copy( KXdmDmAppId ); currentList->InsertL( currentList->Size(), segmentName ); currentList->InsertL( currentList->Size(), KXdmDmSeparator ); @@ -278,6 +283,9 @@ // ./OMA_XDM/X/ToConRef else if ( Match( lastUriSeg, KXdmDmToConRef ) ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ChildURIListL(): /OMA_XDM/X/ToConRef") ); +#endif segmentName.Copy( KXdmDmSip ); currentList->InsertL( currentList->Size(), segmentName ); currentList->InsertL( currentList->Size(), KXdmDmSeparator ); @@ -290,6 +298,9 @@ // ./OMA_XDM/X/ToConRef/SIP else if( Match( lastUriSeg, KXdmDmSip ) ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ChildURIListL(): /OMA_XDM/X/ToConRef/SIP") ); +#endif segmentName.Copy( KXdmDmConRef ); currentList->InsertL( currentList->Size(), segmentName ); currentList->InsertL( currentList->Size(), KXdmDmSeparator ); @@ -298,6 +309,9 @@ // ./OMA_XDM/X/ToConRef/TO-NAPID else if( Match ( lastUriSeg, KXdmDmToNapId ) ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ChildURIListL(): /OMA_XDM/X/ToConRef/TO-NAPID") ); +#endif segmentName.Copy( KXdmDmConRef ); currentList->InsertL( currentList->Size(), segmentName ); currentList->InsertL( currentList->Size(), KXdmDmSeparator ); @@ -305,6 +319,9 @@ else { // if none of asked nodes found return error. +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ChildURIListL(): return ENotFound") ); +#endif retValue = CSmlDmAdapter::ENotFound; } @@ -502,6 +519,9 @@ { #ifdef _DEBUG WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL(): begin") ); + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL() - aUri: %S"), &aUri ); + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL() - aLUID: %S"), &aLUID ); + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL() - aObject: %S"), &aObject ); #endif CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; @@ -521,6 +541,9 @@ HBufC* current = NULL; TInt error( KErrNone ); TRAP( error, ( current = TXdmSettingsApi::PropertyL( settingsId, EXdmPropName ) ) ); +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL() - EXdmPropName error: %d"), error ); +#endif if ( error == KErrNone ) { TBool same ( EFalse ); @@ -530,16 +553,20 @@ { same = ETrue; } - CleanupStack::PopAndDestroy( 2, current8 ); // >>> current, current8 + CleanupStack::PopAndDestroy( current8 ); // >>> current8 + CleanupStack::PopAndDestroy( current ); // >>> current if ( same ) { Callback().SetStatusL( aStatusRef, status ); - return; + return; // value was same, just return without change } } // if the name is already in use, new name with index is created HBufC* value = CheckExistingNamesLC( aObject ); // << value TRAP( error, TXdmSettingsApi::UpdatePropertyL( settingsId, *value, EXdmPropName ) ); +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL() - EXdmPropName error: %d"), error ); +#endif CleanupStack::PopAndDestroy( value ); // >>> value if ( error != KErrNone ) { @@ -647,14 +674,33 @@ TInt id = TXdmSettingsApi::CreateCollectionL( *collection ); HBufC8* luid = IntToDes8LC( id ); // << luid Callback().SetMappingL( aUri, *luid ); - CleanupStack::PopAndDestroy( 2, luid ); // >>> collection, luid - status = CSmlDmAdapter::EOk; + status = CSmlDmAdapter::EOk; #ifdef _DEBUG WriteToLog(_L8("CXdmDMAdapter::AddNodeObjectL(): Settings created id=%d"), id ); #endif + HBufC8* nameUri = HBufC8::NewLC( aUri.Length() + + KXdmDmSeparator().Length() + + KXdmDmName().Length() ); + TPtr8 nameUriPtr = nameUri->Des(); + nameUriPtr.Append( aUri ); + nameUriPtr.Append( KXdmDmSeparator ); + nameUriPtr.Append( KXdmDmName ); + + // Update Node's NAME to default so UI can recognize settings + UpdateLeafObjectL( nameUriPtr, + *luid, + KXdmDefaultSettingsName, + KXdmDmName, + aStatusRef ); + CleanupStack::PopAndDestroy( nameUri ); // >> nameUri + CleanupStack::PopAndDestroy( luid ); // >> luid + CleanupStack::PopAndDestroy( collection ); // >> collection } - Callback().SetStatusL( aStatusRef, status ); - + else + { + Callback().SetStatusL( aStatusRef, status ); + } + #ifdef _DEBUG WriteToLog(_L8("CXdmDMAdapter::AddNodeObjectL(): end") ); #endif @@ -703,6 +749,9 @@ const TDesC8& /*aType*/, const TInt aStatusRef ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdateLeafObjectL( ): begin / end") ); +#endif // Update from stream not used Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); } @@ -717,6 +766,9 @@ const TDesC8& /*aType*/, const TInt aStatusRef ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ExecuteCommandL( ): Not supported") ); +#endif // Not supported Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); } @@ -731,6 +783,9 @@ const TDesC8& /*aType*/, const TInt aStatusRef ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::ExecuteCommandL( ): Not supported") ); +#endif // Not supported Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); } @@ -746,6 +801,9 @@ const TDesC8& /*aType*/, TInt aStatusRef ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::CopyCommandL( ): Not supported") ); +#endif // Not supported Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); } @@ -757,6 +815,9 @@ void CXdmDMAdapter::StartAtomicL() { // Not supported +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::StartAtomicL( ): Not supported") ); +#endif } // ----------------------------------------------------------------------------- @@ -766,6 +827,9 @@ void CXdmDMAdapter::CommitAtomicL() { // Not supported +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::CommitAtomicL( ): Not supported") ); +#endif } // ----------------------------------------------------------------------------- @@ -775,6 +839,9 @@ void CXdmDMAdapter::RollbackAtomicL() { // Not supported +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::RollBackAtomicL( ): Not supported") ); +#endif } // ----------------------------------------------------------------------------- @@ -783,6 +850,9 @@ // TBool CXdmDMAdapter::StreamingSupport( TInt& /*aItemSize*/ ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::StreamingSupport( ): Return EFalse") ); +#endif return EFalse; } @@ -793,6 +863,9 @@ void CXdmDMAdapter::StreamCommittedL() { // Not supported +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::StreamCommittedL( ): Not supported") ); +#endif } // ----------------------------------------------------------------------------- @@ -814,6 +887,9 @@ TXdmSettingsProperty aProperty, CBufBase& aObject ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::GetPropertyL( ) - aSettingsId = %d"), &aSettingsId ); +#endif HBufC* value = NULL; TInt error( KErrNone ); TRAP( error, ( value = TXdmSettingsApi::PropertyL( aSettingsId, aProperty ) ) ); @@ -822,9 +898,16 @@ CleanupStack::PushL( value ); // << value HBufC8* utfValue = ConvertLC( *value ); // << utfValue aObject.InsertL( 0, *utfValue ); - CleanupStack::PopAndDestroy( 2, utfValue ); // >>> value, utfValue + CleanupStack::PopAndDestroy( utfValue ); // >>> utfValue + CleanupStack::PopAndDestroy( value ); // >>> value +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::GetPropertyL( ): return EOk") ); +#endif return CSmlDmAdapter::EOk; } +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::GetPropertyL( ): return ENotFound") ); +#endif return CSmlDmAdapter::ENotFound; } @@ -837,6 +920,9 @@ TXdmSettingsProperty aProperty, const TDesC8& aObject ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdatePropertyL( ): begin") ); +#endif HBufC* value = ConvertLC( aObject ); // << value TInt error( KErrNone ); TRAP( error, TXdmSettingsApi::UpdatePropertyL( aSettingsId, *value, aProperty ) ); @@ -844,8 +930,14 @@ if ( error == KErrNone ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdatePropertyL( ): return EOk") ); +#endif return CSmlDmAdapter::EOk; } +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UpdatePropertyL( ): return ENotFound") ); +#endif return CSmlDmAdapter::ENotFound; } @@ -861,6 +953,9 @@ MSmlDmDDFObject::TDFFormat aFormat, const TDesC8& aDescription) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FillNodeInfoL( ): begin") ); +#endif aNode.SetAccessTypesL( aAccTypes ); aNode.SetOccurenceL( aOccurrence ); aNode.SetScopeL( aScope ); @@ -871,6 +966,9 @@ aNode.AddDFTypeMimeTypeL( KXdmDmTextPlain ); } aNode.SetDescriptionL( aDescription ); +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FillNodeInfoL( ): end") ); +#endif } @@ -880,6 +978,9 @@ // TInt CXdmDMAdapter::IapIdFromURIL( const TDesC8& aUri ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::IapIdFromUriL( ): begin") ); +#endif TInt id( KErrNotFound ); MSmlDmAdapter::TError status( MSmlDmAdapter::EError ); CBufBase* result = CBufFlat::NewL(1); @@ -901,6 +1002,9 @@ } CleanupStack::PopAndDestroy( result ); // >>> result +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::IapIdFromUriL( ): end") ); +#endif return id; } @@ -910,6 +1014,9 @@ // HBufC8* CXdmDMAdapter::URIFromIapIdL( TInt aId ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UriFromIapIdL( ): begin") ); +#endif CBufBase *allIds = CBufFlat::NewL(KXdmDmIdTableSize); CleanupStack::PushL( allIds ); // << allIds MSmlDmAdapter::TError status; @@ -936,7 +1043,7 @@ else { TPtrC8 uriSeg8Ptr = allIds->Ptr(segStart).Mid( 0, index ); - uriSeg = uriSeg8Ptr.AllocLC(); // << uriSeg8Ptr + uriSeg = uriSeg8Ptr.AllocLC(); // << uriSeg } // Construct the uri HBufC8* uri = HBufC8::NewLC( KXdmDmAP().Length() @@ -957,17 +1064,25 @@ if ( id == aId ) { // The correct one found - CleanupStack::Pop(); // >>> uri - CleanupStack::PopAndDestroy( 2, allIds ); // >>> uriSeg, allIds + CleanupStack::Pop(); // >>> uri + CleanupStack::PopAndDestroy( uriSeg ); // >>> uriSeg + CleanupStack::PopAndDestroy( allIds ); // >>> allIds +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UriFromIapIdL( ): return uri") ); +#endif return uri; } } // This was wrong, delete and get the next one - CleanupStack::PopAndDestroy( 2, uriSeg ); // >>> uri, uriSeg + CleanupStack::PopAndDestroy( uri ); // >>> uri + CleanupStack::PopAndDestroy( uriSeg ); // >>> uriSeg segStart += index + 1; } } CleanupStack::PopAndDestroy( allIds ); // >>> allIds +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::UriFromIapIdL( ): return NULL") ); +#endif return NULL; } // ----------------------------------------------------------------------------- @@ -976,7 +1091,9 @@ // TInt CXdmDMAdapter::GetSipIdL( const TDesC8& aUri ) { - +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::GetSipIdL( ): begin") ); +#endif CSmlDmAdapter::TError status = EOk; CBufBase* result = CBufFlat::NewL(1); CleanupStack::PushL( result ); // << result @@ -991,10 +1108,16 @@ TPtrC8 hexIndex = uri.Right( KXdmDmHexLength ); TLex8 lexer( hexIndex ); lexer.Val( id, EHex ); - CleanupStack::PopAndDestroy( result ); // >>> result + CleanupStack::PopAndDestroy( result ); // >>> result +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::GetSipIdL( ): return id: %d"), id ); +#endif return id; } - CleanupStack::PopAndDestroy( result ); // >>> result + CleanupStack::PopAndDestroy( result ); // >>> result +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::GetSipIdL( ): return KErrNotFound") ); +#endif return KErrNotFound; } // ----------------------------------------------------------------------------- @@ -1004,7 +1127,9 @@ CSmlDmAdapter::TError CXdmDMAdapter::FetchSipConRefL( TInt aSettingsId, CBufBase& aObject) { - +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchSipConRefL( ): begin") ); +#endif CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; TInt sipSettingsId( KErrNotFound ); @@ -1084,7 +1209,9 @@ { status = CSmlDmAdapter::ENotFound; } - +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FetchSipConRefL( ): return status") ); +#endif return status; } @@ -1094,10 +1221,16 @@ // TInt CXdmDMAdapter::FindSettingsIdL( const TDesC8& aLUID, const TDesC8& aUri ) { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FindSettingsIdL( ): begin") ); +#endif TInt settingsId(0); if ( aLUID.Length() > 0 ) { settingsId = DesToInt( aLUID ); +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FindSettingsIdL( ): return settingsId: %d "), settingsId ); +#endif return settingsId; } else @@ -1107,6 +1240,9 @@ HBufC8* luid = IntToDes8LC( settingsId ); // << luid Callback().SetMappingL( aUri, *luid ); CleanupStack::PopAndDestroy( luid ); // luid +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::FindSettingsIdL( ): return settingsId: %d "), settingsId ); +#endif return settingsId; } } @@ -1116,7 +1252,10 @@ // ----------------------------------------------------------------------------- // HBufC* CXdmDMAdapter::CheckExistingNamesLC( const TDesC8& aName ) - { + { +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::CheckExistingNamesLC( ): begin") ); +#endif TBool ready( EFalse ); RArray settingIds; CleanupClosePushL( settingIds ); // << settingIds @@ -1147,8 +1286,12 @@ ready = ETrue; } } - CleanupStack::PopAndDestroy( 2 ); // >>> settingNames, settingIds + CleanupStack::PopAndDestroy( settingNames ); // >>> settingNames + CleanupStack::PopAndDestroy(); // >>> settingIds HBufC* newName = tempName.AllocLC(); // << newName +#ifdef _DEBUG + WriteToLog(_L8("CXdmDMAdapter::CheckExistingNamesLC( ): end") ); +#endif return newName; } diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/XdmProvisioning/inc/xdmprovitem.h --- a/XDMEngine/XdmProvisioning/inc/xdmprovitem.h Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/XdmProvisioning/inc/xdmprovitem.h Wed Sep 01 12:23:14 2010 +0100 @@ -137,7 +137,7 @@ * @param aName Name of the parameter * @param aValue Value of the parameter */ - void DetermineNamedParameter( const TDesC& aName, + void DetermineNamedParameterL( const TDesC& aName, const TDesC& aValue ); /** diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/XdmProvisioning/src/xdmprovadapter.cpp --- a/XDMEngine/XdmProvisioning/src/xdmprovadapter.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/XdmProvisioning/src/xdmprovadapter.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -28,6 +28,8 @@ #include "xdmprovitem.h" #include "xdmprovadapter.h" +// for CleanupResetAndDestroyPushL +#include #ifdef _DEBUG #include @@ -305,6 +307,9 @@ #ifdef _DEBUG WriteToLog( _L8( "CXdmProvAdapter::GetSavingInfoL" ) ); #endif + + CleanupResetAndDestroyPushL( aSavingInfo ); + if ( aIndex < iProvItems.Count() - 1 ) { #ifdef _DEBUG @@ -339,7 +344,9 @@ CleanupStack::Pop( idBuf ); // >> idBuf idBuf = NULL; } - + + CleanupStack::Pop( &aSavingInfo ); + #ifdef _DEBUG WriteToLog( _L8( "CXdmProvAdapter::GetSavingInfoL done" ) ); #endif diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/XdmProvisioning/src/xdmprovitem.cpp --- a/XDMEngine/XdmProvisioning/src/xdmprovitem.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/XdmProvisioning/src/xdmprovitem.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -270,7 +270,7 @@ case EWPParameterToAppRef: { - iToAppReferences.Append( aParameter.Value() ); + iToAppReferences.AppendL( aParameter.Value() ); #ifdef _DEBUG CXdmProvAdapter::WriteToLog( _L8( "CXdmProvItem::EWPParameterToAppRef" ) ); #endif @@ -332,7 +332,7 @@ break; default: { - DetermineNamedParameter( aParameter.Name(), aParameter.Value() ); + DetermineNamedParameterL( aParameter.Name(), aParameter.Value() ); } break; } @@ -342,7 +342,7 @@ // CXdmProvItem::DetermineNamedParameter // ----------------------------------------------------------------------------- // -void CXdmProvItem::DetermineNamedParameter( const TDesC& aName, const TDesC& aValue ) +void CXdmProvItem::DetermineNamedParameterL( const TDesC& aName, const TDesC& aValue ) { if ( !aName.Compare( KXdmProvAppRef ) ) { @@ -350,7 +350,7 @@ } else if ( !aName.Compare( KXdmProvToAppRef ) ) { - iToAppReferences.Append( aValue ); + iToAppReferences.AppendL( aValue ); } } // ----------------------------------------------------------------------------- diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/XdmSettingsApi/src/XdmSettingsApi.cpp --- a/XDMEngine/XdmSettingsApi/src/XdmSettingsApi.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/XdmSettingsApi/src/XdmSettingsApi.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -31,11 +31,11 @@ EXPORT_C TInt TXdmSettingsApi::CreateCollectionL( const CXdmSettingsCollection& aCollection ) { #ifdef _DEBUG - WriteToLog( _L8( "TXdmSettingsApi::CreateCollectionL()" ) ); + WriteToLog( _L8( "TXdmSettingsApi::CreateCollectionL() - begin" ) ); #endif TInt error = KErrArgument; CRepository* repository = CRepository::NewL( KCRUidXdmEngine ); - CleanupStack::PushL( repository ); + CleanupStack::PushL( repository ); // CS: 1 TInt row = LastRow( repository ); TInt count = aCollection.Count(); __ASSERT_DEBUG( count > 0, User::Leave( KErrArgument ) ); @@ -364,8 +364,10 @@ EXPORT_C CDesCArray* TXdmSettingsApi::CollectionNamesLC( RArray& aSettingIds ) { #ifdef _DEBUG - WriteToLog( _L8( "TXdmSettingsApi::CollectionNamesL()" ) ); + WriteToLog( _L8( "TXdmSettingsApi::CollectionNamesLC() - begin" ) ); #endif + TInt nameError = KErrNone; + TInt idError = KErrNone; TInt error = KErrNone; CDesCArrayFlat* propertySet = new ( ELeave ) CDesCArrayFlat( 10 ); CleanupStack::PushL( propertySet ); @@ -390,9 +392,9 @@ identifier.Zero(); name = HBufC::NewLC( NCentralRepositoryConstants::KMaxUnicodeStringLength ); TPtr desc( name->Des()); - error = repository->Get( nameKeys[i], desc ); - error = repository->Get( idKeys[i], identifier ); - if( error == KErrNone && desc.Length() > 0 && identifier.Length() > 0 ) + nameError = repository->Get( nameKeys[i], desc ); + idError = repository->Get( idKeys[i], identifier ); + if( idError == KErrNone && desc.Length() > 0 && identifier.Length() > 0 ) { #ifdef _DEBUG HBufC8* eightName = HBufC8::NewLC( desc.Length() ); @@ -404,18 +406,21 @@ propertySet->AppendL( desc ); TLex id( identifier ); error = id.Val( numId ); - aSettingIds.Append( error == KErrNone ? numId : error ); + aSettingIds.AppendL( error == KErrNone ? numId : error ); } else { #ifdef _DEBUG - WriteToLog( _L8( " Fetching of the name no. %d failed with: %d" ), i, error ); + WriteToLog( _L8( " Fetching of the name no. %d failed with idError:%d & nameError:%d" ), i, idError, nameError ); #endif } CleanupStack::PopAndDestroy(); //name } } CleanupStack::PopAndDestroy( 3 ); //idKeys, nameKeys, repository +#ifdef _DEBUG + WriteToLog( _L8( "TXdmSettingsApi::CollectionNamesLC() - end" ) ); +#endif return propertySet; } @@ -518,6 +523,7 @@ User::Leave( error ); } CleanupStack::PopAndDestroy( 2 ); //keys, repository + WriteToLog( _L8( " Return: %S" ), buf ); return buf; } diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/cenrep/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/cenrep/backup_registration.xml Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,5 @@ + + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/cenrep/keys_xdmengine.xls Binary file XDMEngine/cenrep/keys_xdmengine.xls has changed diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/eabi/XdmEngineU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/eabi/XdmEngineU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,140 @@ +EXPORTS + _ZN10CXdmEngine12CancelUpdateEP12CXdmDocument @ 1 NONAME + _ZN10CXdmEngine12CancelUpdateEP13CXdmDirectory @ 2 NONAME + _ZN10CXdmEngine13XdmSettingsLCER6RArrayIiE @ 3 NONAME + _ZN10CXdmEngine19CreateDocumentNodeLEv @ 4 NONAME + _ZN10CXdmEngine20CreateDocumentModelLERK7TDesC1611TXdmDocType @ 5 NONAME + _ZN10CXdmEngine20DeleteDocumentModelLEPK12CXdmDocument @ 6 NONAME + _ZN10CXdmEngine21CreateDirectoryModelLERK7TDesC16 @ 7 NONAME + _ZN10CXdmEngine21DeleteDirectoryModelLEPK13CXdmDirectory @ 8 NONAME + _ZN10CXdmEngine4NewLERK16CXdmProtocolInfo @ 9 NONAME + _ZN10CXdmEngine7UpdateLEP12CXdmDocumentR14TRequestStatus @ 10 NONAME + _ZN10CXdmEngine7UpdateLER14TRequestStatusP13CXdmDirectory15TDirUpdatePhase @ 11 NONAME + _ZN12CXdmDocument10FetchDataLEP16CXdmDocumentNode @ 12 NONAME + _ZN12CXdmDocument11DeleteDataLEP16CXdmDocumentNode @ 13 NONAME + _ZN12CXdmDocument11ResetSubsetEv @ 14 NONAME + _ZN12CXdmDocument14AppendToModelLEP16CXdmDocumentNodeS1_ @ 15 NONAME + _ZN12CXdmDocument14BaseConstructLEiRK6TDesC8 @ 16 NONAME + _ZN12CXdmDocument14BaseConstructLEiRK7TDesC16 @ 17 NONAME + _ZN12CXdmDocument15DocumentSubsetLERK7TDesC16 @ 18 NONAME + _ZN12CXdmDocument15ReplaceInModelLEP16CXdmDocumentNodeS1_ @ 19 NONAME + _ZN12CXdmDocument16RemoveFromModelLEP16CXdmDocumentNode @ 20 NONAME + _ZN12CXdmDocument7AppendLEP16CXdmDocumentNode @ 21 NONAME + _ZN12CXdmDocument7InsertLEP16CXdmDocumentNode @ 22 NONAME + _ZN12CXdmDocument8ReplaceLEP16CXdmDocumentNodeS1_ @ 23 NONAME + _ZN12CXdmDocument8ReplaceLEv @ 24 NONAME + _ZN12CXdmDocumentC2ER10CXdmEngine @ 25 NONAME + _ZN12CXdmDocumentD0Ev @ 26 NONAME + _ZN12CXdmDocumentD1Ev @ 27 NONAME + _ZN12CXdmDocumentD2Ev @ 28 NONAME + _ZN13CXdmDirectory14BaseConstructLERK7TDesC16 @ 29 NONAME + _ZN13CXdmDirectoryC2ER10CXdmEngine @ 30 NONAME + _ZN13CXdmDirectoryD0Ev @ 31 NONAME + _ZN13CXdmDirectoryD1Ev @ 32 NONAME + _ZN13CXdmDirectoryD2Ev @ 33 NONAME + _ZN13CXdmLogWriter4NewLERK7TDesC16 @ 34 NONAME + _ZN14XdmStaticUtils16CheckFileExistsLER3RFsRK7TDesC16 @ 35 NONAME + _ZN14XdmStaticUtils17CleanUpDirectoryLER3RFsRK7TDesC16 @ 36 NONAME + _ZN14XdmStaticUtils17GenerateFileNameLER3RFsRK7TDesC16S4_ @ 37 NONAME + _ZN15TXdmCredentialsC1ERK7TDesC16S2_ @ 38 NONAME + _ZN15TXdmCredentialsC1Ev @ 39 NONAME + _ZN15TXdmCredentialsC2ERK7TDesC16S2_ @ 40 NONAME + _ZN15TXdmCredentialsC2Ev @ 41 NONAME + _ZN16CXdmDocumentNode11SetLeafNodeEi @ 42 NONAME + _ZN16CXdmDocumentNode11SetNextNodeEPS_ @ 43 NONAME + _ZN16CXdmDocumentNode12SetEmptyNodeEi @ 44 NONAME + _ZN16CXdmDocumentNode14BaseConstructLERK7TDesC16 @ 45 NONAME + _ZN16CXdmDocumentNode14CopyConstructLERKS_S1_ @ 46 NONAME + _ZN16CXdmDocumentNode16AppendChileNodeLEPS_ @ 47 NONAME + _ZN16CXdmDocumentNode16CreateAttributeLERK7TDesC16 @ 48 NONAME + _ZN16CXdmDocumentNode16CreateAttributeLEv @ 49 NONAME + _ZN16CXdmDocumentNode16CreateChileNodeLERK7TDesC16 @ 50 NONAME + _ZN16CXdmDocumentNode16CreateChileNodeLEv @ 51 NONAME + _ZN16CXdmDocumentNode16InsertChileNodeLEiPS_ @ 52 NONAME + _ZN16CXdmDocumentNode16RemoveChileNodeLEPS_ @ 53 NONAME + _ZN16CXdmDocumentNode17ReplaceChileNodeLEPS_S0_ @ 54 NONAME + _ZN16CXdmDocumentNode19SetLeafNodeContentLERK6TDesC8 @ 55 NONAME + _ZN16CXdmDocumentNode19SetLeafNodeContentLERK7TDesC16 @ 56 NONAME + _ZN16CXdmDocumentNode5PrintEv @ 57 NONAME + _ZN16CXdmDocumentNode8SetNameLERK6TDesC8 @ 58 NONAME + _ZN16CXdmDocumentNode8SetNameLERK7TDesC16 @ 59 NONAME + _ZN16CXdmDocumentNodeC2ER10CXdmEngineR15MXdmNodeFactory @ 60 NONAME + _ZN16CXdmDocumentNodeC2ER10CXdmEngineR15MXdmNodeFactoryPS_ @ 61 NONAME + _ZN16CXdmDocumentNodeC2EiR10CXdmEngineR15MXdmNodeFactoryPS_ @ 62 NONAME + _ZN16CXdmDocumentNodeD0Ev @ 63 NONAME + _ZN16CXdmDocumentNodeD1Ev @ 64 NONAME + _ZN16CXdmDocumentNodeD2Ev @ 65 NONAME + _ZN16CXdmProtocolInfo11SetSecurityEi @ 66 NONAME + _ZN16CXdmProtocolInfo13SetCacheUsageEi @ 67 NONAME + _ZN16CXdmProtocolInfo14SetCredentialsE15TXdmCredentials @ 68 NONAME + _ZN16CXdmProtocolInfo4NewLEi @ 69 NONAME + _ZN16CXdmProtocolInfo4NewLEiiRK7TDesC16 @ 70 NONAME + _ZN16CXdmProtocolInfoD0Ev @ 71 NONAME + _ZN16CXdmProtocolInfoD1Ev @ 72 NONAME + _ZN16CXdmProtocolInfoD2Ev @ 73 NONAME + _ZN17CXdmNodeAttribute14BaseConstructLERK7TDesC16 @ 74 NONAME + _ZN17CXdmNodeAttribute18SetAttributeValueLERK6TDesC8 @ 75 NONAME + _ZN17CXdmNodeAttribute18SetAttributeValueLERK7TDesC16 @ 76 NONAME + _ZN17CXdmNodeAttributeC2ER10CXdmEngineR15MXdmNodeFactory @ 77 NONAME + _ZN17CXdmNodeAttributeC2ER10CXdmEngineR15MXdmNodeFactoryP16CXdmDocumentNode @ 78 NONAME + _ZN17CXdmNodeAttributeD0Ev @ 79 NONAME + _ZN17CXdmNodeAttributeD1Ev @ 80 NONAME + _ZN17CXdmNodeAttributeD2Ev @ 81 NONAME + _ZNK10CXdmEngine18DocumentCollectionEv @ 82 NONAME + _ZNK10CXdmEngine19DirectoryCollectionEv @ 83 NONAME + _ZNK12CXdmDocument4FindERK16CXdmDocumentNodeR13RPointerArrayIS0_E @ 84 NONAME + _ZNK12CXdmDocument4FindERK7TDesC16R13RPointerArrayI16CXdmDocumentNodeE @ 85 NONAME + _ZNK12CXdmDocument4FindERK7TDesC16R13RPointerArrayI16CXdmDocumentNodeERKS3_I15SXdmAttribute16E @ 86 NONAME + _ZNK12CXdmDocument4FindERK7TDesC16R13RPointerArrayI17CXdmNodeAttributeE @ 87 NONAME + _ZNK12CXdmDocument4NameEv @ 88 NONAME + _ZNK12CXdmDocumenteqERS_ @ 89 NONAME + _ZNK13CXdmLogWriter10WriteToLogERK6TDesC8 @ 90 NONAME + _ZNK13CXdmLogWriter10WriteToLogERK7TDesC16 @ 91 NONAME + _ZNK16CXdmDocumentNode10IsLeafNodeEv @ 92 NONAME + _ZNK16CXdmDocumentNode11ElementTypeEv @ 93 NONAME + _ZNK16CXdmDocumentNode11IsEmptyNodeEv @ 94 NONAME + _ZNK16CXdmDocumentNode12HasAttributeERK7TDesC16 @ 95 NONAME + _ZNK16CXdmDocumentNode13ElementDataLCEv @ 96 NONAME + _ZNK16CXdmDocumentNode14AttributeCountEv @ 97 NONAME + _ZNK16CXdmDocumentNode15LeafNodeContentEv @ 98 NONAME + _ZNK16CXdmDocumentNode18EightBitNodeNameLCEv @ 99 NONAME + _ZNK16CXdmDocumentNode23EscapeLeafNodeContentLCEv @ 100 NONAME + _ZNK16CXdmDocumentNode4FindERK7TDesC16R13RPointerArrayIS_E @ 101 NONAME + _ZNK16CXdmDocumentNode4FindERK7TDesC16R13RPointerArrayIS_ERKS3_I15SXdmAttribute16E @ 102 NONAME + _ZNK16CXdmDocumentNode4FindERKS_R13RPointerArrayIS_E @ 103 NONAME + _ZNK16CXdmDocumentNode5MatchERK7TDesC16RK13RPointerArrayI14SXdmAttribute8E @ 104 NONAME + _ZNK16CXdmDocumentNode5MatchERKS_ @ 105 NONAME + _ZNK16CXdmDocumentNode6ParentEv @ 106 NONAME + _ZNK16CXdmDocumentNode8NextNodeEv @ 107 NONAME + _ZNK16CXdmDocumentNode8NodeNameEv @ 108 NONAME + _ZNK16CXdmDocumentNode9AttributeERK7TDesC16 @ 109 NONAME + _ZNK16CXdmDocumentNode9AttributeEi @ 110 NONAME + _ZNK16CXdmDocumentNode9ChileNodeEi @ 111 NONAME + _ZNK16CXdmDocumentNode9NodeCountEv @ 112 NONAME + _ZNK16CXdmDocumentNodeeqERKS_ @ 113 NONAME + _ZNK16CXdmProtocolInfo10SettingsIDEv @ 114 NONAME + _ZNK16CXdmProtocolInfo11AccessPointEv @ 115 NONAME + _ZNK16CXdmProtocolInfo11CredentialsEv @ 116 NONAME + _ZNK16CXdmProtocolInfo11ProtocolUidEv @ 117 NONAME + _ZNK16CXdmProtocolInfo14IsCacheEnabledEv @ 118 NONAME + _ZNK16CXdmProtocolInfo4RootEv @ 119 NONAME + _ZNK16CXdmProtocolInfo8IsSecureEv @ 120 NONAME + _ZNK17CXdmNodeAttribute11ElementTypeEv @ 121 NONAME + _ZNK17CXdmNodeAttribute14AttributeValueEv @ 122 NONAME + _ZNK17CXdmNodeAttribute14EscapedValueLCEv @ 123 NONAME + _ZNK17CXdmNodeAttribute15EightBitValueLCEv @ 124 NONAME + _ZTI10CXdmEngine @ 125 NONAME ; ## + _ZTI12CXdmDocument @ 126 NONAME ; ## + _ZTI13CXdmDirectory @ 127 NONAME ; ## + _ZTI13CXdmLogWriter @ 128 NONAME ; ## + _ZTI16CXdmDocumentNode @ 129 NONAME ; ## + _ZTI16CXdmProtocolInfo @ 130 NONAME ; ## + _ZTI17CXdmNodeAttribute @ 131 NONAME ; ## + _ZTV10CXdmEngine @ 132 NONAME ; ## + _ZTV12CXdmDocument @ 133 NONAME ; ## + _ZTV13CXdmDirectory @ 134 NONAME ; ## + _ZTV13CXdmLogWriter @ 135 NONAME ; ## + _ZTV16CXdmDocumentNode @ 136 NONAME ; ## + _ZTV16CXdmProtocolInfo @ 137 NONAME ; ## + _ZTV17CXdmNodeAttribute @ 138 NONAME ; ## + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/group/XdmEngine.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/group/XdmEngine.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2005 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: XDM Engine +* +*/ + + + +#include + +TARGET xdmengine.dll +UID 0x1000008d 0x1020740E +CAPABILITY CAP_GENERAL_DLL +VENDORID VID_DEFAULT +TARGETTYPE DLL + +SOURCEPATH ../src + +SOURCE XdmEngine.cpp +SOURCE XdmDocument.cpp +SOURCE XdmDirectory.cpp +SOURCE XdmLogWriter.cpp +SOURCE XdmStaticUtils.cpp +SOURCE XdmCredentials.cpp +SOURCE XdmProtocolInfo.cpp +SOURCE XdmDocumentNode.cpp +SOURCE XdmNodeAttribute.cpp + +USERINCLUDE ../inc +USERINCLUDE ../../pressrv_dom/xdm_api/inc +//USERINCLUDE ../XdmSettingsApi/inc + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY ecom.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +LIBRARY charconv.lib +LIBRARY flogger.lib +LIBRARY xdmsettingsapi.lib +LIBRARY inetprotutil.lib + + +#if defined( ARMCC ) +DEFFILE ../eabi/ +#elif defined ( WINSCW ) +deffile ../BWINSCW/ +#elif defined (WINS ) +deffile ../bwins/ +#endif + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/group/bld.inf --- a/XDMEngine/group/bld.inf Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -28,13 +28,29 @@ PRJ_EXPORTS //-------------------- +../Conf/xdmengine.confml MW_LAYER_CONFML(xdmengine.confml) +../Conf/xdmengine_10207453.crml MW_LAYER_CRML(xdmengine_10207453.crml) +../Conf/xdmengine_10282384.crml MW_LAYER_CRML(xdmengine_10282384.crml) + +//For _DEBUG +../inc/XdmLogWriter.h |../../inc/xdmlogwriter.h + +//Backup registry +../cenrep/backup_registration.xml z:/private/10207421/backup_registration.xml + +// IBYs +../rom/XdmEngine.iby CORE_MW_LAYER_IBY_EXPORT_PATH(xdmengine.iby) +../rom/XdmEngineResources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(xdmengineresources.iby) + // LOC (note: This would be better in XdmProvisioning's bld.inf, but since it is not used, it is here.) ../XdmProvisioning/loc/xdmprovisioningadapter.loc MW_LAYER_LOC_EXPORT_PATH(xdmprovisioningadapter.loc) + //-------------------- PRJ_MMPFILES //-------------------- ../XdmSettingsApi/group/XdmSettingsApi.mmp +XdmEngine.mmp ../XdmProvisioning/group/xdmprovisioning.mmp ../XdmDeviceManagement/group/xdmdevicemanagementadapter.mmp diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/group/bld_engine.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/group/bld_engine.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: XDM Engine build file +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- + +XdmEngine.mmp diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/inc/XdmEngineDefines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/inc/XdmEngineDefines.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2004 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: XDM Engine defines +* +*/ + + + + +#ifndef __XdmENGINEDEFINES__ +#define __XdmENGINEDEFINES__ + +#include + +//General defines +_LIT8( KGeneralEqualsAndQuotes, "=\"" ); +_LIT8( KGeneralQuotes, "\"" ); + +//Xdm specific defines +const TInt KXdmPathSeparator = 47; + +//XCAP specific defines +_LIT8( KXCAPEquality, "=" ); +_LIT8( KXCAPNodeSeparator, "~~" ); +_LIT8( KXCAPPathSeparator, "/" ); +_LIT8( KXCAPAttributeIdentifier, "@" ); + +//HTTP specific defines +_LIT8( KHTTPAngleBracketOpen, "%5b"); +_LIT8( KHTTPAngleBracketClose, "%5d"); +_LIT8( KHTTPAngleQuotationMark, "%22"); + +//XML specific defines +_LIT8( KXmlSpace, " "); +#endif //__XdmENGINEDEFINES__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/inc/XdmLogWriter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/inc/XdmLogWriter.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2007 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: XDM Engine log writer +* +*/ + + + + +#ifndef __XDMLOGWRITER__ +#define __XDMLOGWRITER__ + +#include + +_LIT( KXdmLogDir, "XDM" ); +_LIT( KXdmLogFileExt, ".txt" ); +_LIT( KXdmLogRoot, "C:\\logs\\" ); + +//Determines how many log file instances are +//retained until the directory is cleaned up +/* E.g. XdmEngine1.txt, XdmEngine2.txt ... XdmEngine10.txt */ +const TInt KMaxLogFiles = 10; + +/* Default size of the log buffer */ +const TInt KLogBufferMaxSize = 2000; + +// CLASS DECLARATION +class CXdmLogWriter : public CBase + { + public: + + /** + * Symbian OS constructor + * + * @param TDesC& The log file name + * @return CXdmLogWriter* A log writer instance + */ + IMPORT_C static CXdmLogWriter* NewL( const TDesC& aLogName ); + + /** + * Write a log string. + * + * @param TDesC& Log string in 16-bit + * @return void + */ + IMPORT_C void WriteToLog( const TDesC& aLogLine ) const; + + /** + * Write a log string. + * + * @param TDesC8& Log string in 8-bit + * @return void + */ + IMPORT_C void WriteToLog( const TDesC8& aLogLine ) const; + + /** + * Destructor + */ + virtual ~CXdmLogWriter(); + + private: + + /** + * C++ constructor is private + */ + CXdmLogWriter(); + + /** + * Symbian OS second-phase constructor + * @param TDesC& Name of the log file to write to + * @return void + */ + void ConstructL( const TDesC& aLogName ); + + private: //Data + + HBufC* iLogFileName; + + }; + +#endif //__XDMLOGWRITER__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/inc/XdmStaticUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/inc/XdmStaticUtils.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2007 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: XDM Engine static utils +* +*/ + + + + +#ifndef __XDMSTATICUTILS__ +#define __XDMSTATICUTILS__ + +#include + +const TInt KBackSlash = 92; + +class RFs; + +// CLASS DECLARATION +class XdmStaticUtils + + { + public: + + /** + * Check whether a file already exists. + * + * @param RFs& An opened file session + * @param TDesC& The file name to check + * @return TBool Is the file already there + */ + IMPORT_C static TBool CheckFileExistsL( RFs& aFileSession, const TDesC& aFileName ); + + /** + * Generate a new file name unique in the context + * of the folder in which it resides + * + * @param RFs& An opened file session + * @param TDesC& The file name to check + * @param TDesC& The extension in the filename + * @return HBufC* The generated filename + */ + IMPORT_C static HBufC* GenerateFileNameL( RFs& aFileSession, const TDesC& aFileName, + const TDesC& aExtension ); + + /** + * Clean up a directory + * + * @param RFs& An opened file session + * @param TDesC& The directory to clean up + * @return void + */ + IMPORT_C static void CleanUpDirectoryL( RFs& aFileSession, const TDesC& aDirectory ); + + }; + +#endif //__XDMCREDENTIALS__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/rom/XdmEngine.iby --- a/XDMEngine/rom/XdmEngine.iby Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/rom/XdmEngine.iby Wed Sep 01 12:23:14 2010 +0100 @@ -22,7 +22,9 @@ #define __XDMENGINE_IBY__ #ifdef __XDM - file=ABI_DIR\BUILD_DIR\XdmSettingsApi.dll SHARED_LIB_DIR\XdmSettingsApi.dll + file=ABI_DIR/BUILD_DIR/XdmEngine.dll SHARED_LIB_DIR/XdmEngine.dll + file=ABI_DIR/BUILD_DIR/XdmXmlParser.dll SHARED_LIB_DIR/XdmXmlParser.dll + file=ABI_DIR/BUILD_DIR/XdmSettingsApi.dll SHARED_LIB_DIR/XdmSettingsApi.dll ECOM_PLUGIN( XdmDeviceManagementAdapter.dll, 10275112.rsc) ECOM_PLUGIN( XdmProvisioning.dll, 1028237A.rsc) #endif //__XDM diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/rom/XdmEngineResources.iby --- a/XDMEngine/rom/XdmEngineResources.iby Tue Aug 31 15:35:50 2010 +0300 +++ b/XDMEngine/rom/XdmEngineResources.iby Wed Sep 01 12:23:14 2010 +0100 @@ -23,7 +23,7 @@ // // Settings provisioning adapter plugin resources // -data=DATAZ_\RESOURCE_FILES_DIR\XdmProvisioningTexts.RSC RESOURCE_FILES_DIR\XdmProvisioningTexts.RSC +data=DATAZ_/RESOURCE_FILES_DIR/XdmProvisioningTexts.RSC RESOURCE_FILES_DIR/XdmProvisioningTexts.RSC #endif //__XDMENGINE_RESOURCES_IBY__ diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmCredentials.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmCredentials.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2005 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: XDM Engine credentials +* +*/ + + + +#include "XdmCredentials.h" + +// --------------------------------------------------------- +// TXdmCredentials::TXdmCredentials +// +// --------------------------------------------------------- +// +EXPORT_C TXdmCredentials::TXdmCredentials() + { + } + +// --------------------------------------------------------- +// TXdmCredentials::TXdmCredentials +// +// --------------------------------------------------------- +// +EXPORT_C TXdmCredentials::TXdmCredentials( const TDesC& aUserName, + const TDesC& aPassword ) + { + iUserName.Copy( aUserName ); + iPassword.Copy( aPassword ); + } + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmDirectory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmDirectory.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,68 @@ +/* +* Copyright (c) 2005 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: XDM Engine directory +* +*/ + + + + +// INCLUDE FILES +#include "XdmEngine.h" + +// ---------------------------------------------------------- +// CXdmDirectory::CXdmDirectory +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDirectory::CXdmDirectory( CXdmEngine& aXdmEngine ) : + CActive( EPriorityStandard ), + iFileCount( KErrNotReady ), + iXdmEngine( aXdmEngine ) + { + } + +// ---------------------------------------------------------- +// CXdmDirectory::BaseConstructL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDirectory::BaseConstructL( const TDesC& aDirectoryPath ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDirectory::ConstructL()" ) ); + #endif + iDirectoryPath = aDirectoryPath.AllocL(); + iDirectoryPath->Des().Copy( aDirectoryPath ); + } + +// ---------------------------------------------------------- +// CXdmDirectory::CXdmDirectory +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDirectory::~CXdmDirectory() + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDirectory::~CXdmDirectory()" ) ); + #endif + delete iDirectoryPath; + } + + + + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmDocument.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmDocument.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,505 @@ +/* +* Copyright (c) 2005 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: XDM Engine document +* +*/ + + + + +// INCLUDE FILES +#include +#include "XdmEngine.h" +#include "XdmProtocol.h" +#include "XdmDocument.h" +#include "XdmOperation.h" +#include "XdmDocumentNode.h" +#include "XdmNodeAttribute.h" +#include "XdmOperationFactory.h" + +// ---------------------------------------------------------- +// CXdmDocument::CXdmDocument +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDocument::CXdmDocument( CXdmEngine& aXdmEngine ) : + CActive( EPriorityStandard ), + iDocSubset( EFalse ), + iXdmEngine( aXdmEngine ) + + { + } + +// ---------------------------------------------------------- +// CXdmDocument::BaseConstructL( 16-bit ) +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocument::BaseConstructL( TInt aOperationFactoryUid, + const TDesC& aDocumentName ) + { + delete iDocumentName; + iDocumentName = NULL; + iDocumentName = HBufC::NewL( aDocumentName.Length() ); + iDocumentName->Des().Copy( aDocumentName ); + iOperationFactory = CXdmOperationFactory::NewL( aOperationFactoryUid ); + } + +// ---------------------------------------------------------- +// CXdmDocument::BaseConstructL( 8-bit ) +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocument::BaseConstructL( TInt aOperationFactoryUid, + const TDesC8& aDocumentName ) + { + delete iDocumentName; + iDocumentName = NULL; + iDocumentName = HBufC::NewL( aDocumentName.Length() ); + iDocumentName->Des().Copy( aDocumentName ); + iOperationFactory = CXdmOperationFactory::NewL( aOperationFactoryUid ); + } + +// ---------------------------------------------------- +// CXdmDocument::~CXdmDocument +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDocument::~CXdmDocument() + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::~CXdmDocument()" ) ); + #endif + delete iDocumentName; + EmptyOperationQueue(); + iChangeRequests.Close(); + delete iOperationFactory; + } + +// --------------------------------------------------------- +// CXdmDocument::EmptyOperationQueue +// +// --------------------------------------------------------- +// +void CXdmDocument::EmptyOperationQueue() + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::EmptyOperationQueue()" ) ); + #endif + + while (iChangeRequests.Count()) + { + MXdmOperation* operation = iChangeRequests[0]; + iChangeRequests.Remove( 0 ); + operation->Destroy(); + operation = NULL; + } + } + +// ---------------------------------------------------- +// CXdmDocument::FetchDataL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::FetchDataL( CXdmDocumentNode* aDocNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::FetchDataL()" ) ); + #endif + MXdmOperation* operation = iOperationFactory->FetchL( *this, aDocNode ); + CleanupStack::PushL( operation ); + User::LeaveIfError( iChangeRequests.Append( operation ) ); + CleanupStack::Pop(); //operation + } + +// ---------------------------------------------------- +// CXdmDocument::ReplaceL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::ReplaceL( CXdmDocumentNode* aOldNode, + CXdmDocumentNode* aNewNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::ReplaceL()" ) ); + #endif + if( aOldNode->Parent() == aNewNode->Parent() ) + { + MXdmOperation* operation = iOperationFactory->ReplaceL( + *this, aOldNode, aNewNode ); + CleanupStack::PushL( operation ); + User::LeaveIfError( iChangeRequests.Append( operation ) ); + CleanupStack::Pop(); //operation + } + else + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( " Different parents, leaves!" ) ); + #endif + User::Leave( KErrGeneral ); + } + } + +// ---------------------------------------------------- +// CXdmDocument::ReplaceL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::ReplaceL() + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::ReplaceL()" ) ); + #endif + MXdmOperation* operation = iOperationFactory->ReplaceL( *this, NULL, NULL ); + CleanupStack::PushL( operation ); + User::LeaveIfError( iChangeRequests.Append( operation ) ); + CleanupStack::Pop(); //operation + } + +// ---------------------------------------------------- +// CXdmDocument::InsertL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::InsertL( CXdmDocumentNode* aDocNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::InsertL()" ) ); + #endif + __ASSERT_DEBUG( aDocNode != NULL, User::Panic( _L( "CXcapDocument" ), EDocNodeNull ) ); + MXdmOperation* operation = iOperationFactory->InsertL( + *this, aDocNode ); + CleanupStack::PushL( operation ); + User::LeaveIfError( iChangeRequests.Append( operation ) ); + CleanupStack::Pop(); //operation + } + +// ---------------------------------------------------- +// CXdmDocument::AppendL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::AppendL( CXdmDocumentNode* aDocNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::AppendL()" ) ); + #endif + MXdmOperation* operation = + iOperationFactory->AppendL( *this, aDocNode ); + CleanupStack::PushL( operation ); + User::LeaveIfError( iChangeRequests.Append( operation ) ); + CleanupStack::Pop(); //operation + } + +// ---------------------------------------------------- +// CXdmDocument::DeleteDataL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::DeleteDataL( CXdmDocumentNode* aDocNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::DeleteDataL()" ) ); + #endif + MXdmOperation* operation = aDocNode == NULL ? + iOperationFactory->DeletionL( *this, NULL ) : + iOperationFactory->DeletionL( *this, aDocNode ); + CleanupStack::PushL( operation ); + User::LeaveIfError( iChangeRequests.Append( operation ) ); + CleanupStack::Pop(); //operation + } + +// ---------------------------------------------------- +// CXdmDocument::Find +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXdmDocument::Find( const CXdmDocumentNode& aTargetNode, + RPointerArray& aResultArray ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::Find()" ) ); + #endif + TInt error = KErrNone; + CXdmDocumentNode* root = DocumentRoot(); + __ASSERT_ALWAYS( root != NULL, User::Panic( _L( "CXcapDocument" ), EDocNodeNull ) ); + if( root->NodeName().Compare( aTargetNode.NodeName() ) == 0 ) + { + TBool found = EFalse; + TInt attrCount = root->AttributeCount(); + TInt attrCount2 = aTargetNode.AttributeCount(); + if( attrCount > 0 && attrCount == attrCount2 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < attrCount;i++ ) + { + attribute.iName.Set( aTargetNode.Attribute( i )->NodeName() ); + attribute.iValue.Set( aTargetNode.Attribute( i )->AttributeValue() ); + found = root->HasAttribute( attribute ); + } + } + error = found ? aResultArray.Append( root ) : KErrNotFound; + } + else + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( " Root does not match, search child nodes" ) ); + #endif + error = root->Find( aTargetNode, aResultArray ); + } + TInt count = aResultArray.Count(); + return error == KErrNone && count > 0 ? count : KErrNotFound; + } + +// ---------------------------------------------------- +// CXdmDocument::Find +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXdmDocument::Find( const TDesC& aNodeName, + RPointerArray& aResultArray, + const RPointerArray& aAttributeArray ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::Find()" ) ); + #endif + TInt error = KErrNone; + CXdmDocumentNode* root = DocumentRoot(); + __ASSERT_ALWAYS( root != NULL, User::Panic( _L( "CXcapDocument" ), EDocNodeNull ) ); + if( root->NodeName().Compare( aNodeName ) == 0 ) + { + TBool found = EFalse; + TInt attrCount = root->AttributeCount(); + if( attrCount > 0 ) + { + for( TInt i = 0;i < attrCount;i++ ) + found = root->HasAttribute( *aAttributeArray[i] ); + } + error = found ? aResultArray.Append( root ) : KErrNotFound; + } + else + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( " Root does not match, search child nodes" ) ); + #endif + error = root->Find( aNodeName, aResultArray, aAttributeArray ); + } + TInt count = aResultArray.Count(); + return error == KErrNone && count > 0 ? count : KErrNotFound; + } + +// ---------------------------------------------------- +// CXdmDocument::Find +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXdmDocument::Find( const TDesC& aNodeName, + RPointerArray& aResultArray ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::Find()" ) ); + #endif + TInt error = KErrNone; + CXdmDocumentNode* root = DocumentRoot(); + __ASSERT_ALWAYS( root != NULL, User::Panic( _L( "CXcapDocument" ), EDocNodeNull ) ); + if( root->NodeName().Compare( aNodeName ) == 0 ) + error = aResultArray.Append( root ); + else + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( " Root does not match, search child nodes" ) ); + #endif + error = root->Find( aNodeName, aResultArray ); + } + TInt count = aResultArray.Count(); + return error == KErrNone && count > 0 ? count : KErrNotFound; + } + +// ---------------------------------------------------- +// CXcapDocument::operator== +// +// ---------------------------------------------------- +// +EXPORT_C TBool CXdmDocument::operator==( CXdmDocument& aDocument ) const + { + CXdmDocumentNode* root1 = DocumentRoot(); + CXdmDocumentNode* root2 = aDocument.DocumentRoot(); + __ASSERT_ALWAYS( root1 != NULL, User::Panic( _L( "CXcapDocument" ), EDocNodeNull ) ); + __ASSERT_ALWAYS( root2 != NULL, User::Panic( _L( "CXcapDocument" ), EDocNodeNull ) ); + return Name().Compare( aDocument.Name() ) == 0 ? *root1 == *root2 : EFalse; + } + +// ---------------------------------------------------- +// CXdmDocument::Name +// +// ---------------------------------------------------- +// +EXPORT_C TPtrC CXdmDocument::Name() const + { + return iDocumentName != NULL ? iDocumentName->Des() : TPtrC(); + } + +// ---------------------------------------------------- +// CXdmDocument::Find +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXdmDocument::Find( const TDesC& aAttributeName, + RPointerArray& aResultArray ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::Find()" ) ); + #endif + TInt error = KErrNone; + CXdmDocumentNode* root = DocumentRoot(); + __ASSERT_ALWAYS( root != NULL, User::Panic( _L( "CXdmDocument" ), EDocNodeNull ) ); + error = DoFindAttributes( root, aAttributeName, aResultArray ); + TInt count = aResultArray.Count(); + return error == KErrNone && count > 0 ? count : KErrNotFound; + } + +// ---------------------------------------------------- +// CXdmDocument::RemoveFromModelL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::RemoveFromModelL( CXdmDocumentNode* aChileNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::RemoveFromModel()" ) ); + #endif + if( !iDocSubset ) + { + CXdmDocumentNode* parent = aChileNode->Parent(); + parent != NULL ? parent->RemoveChileNodeL( aChileNode ) : User::Leave( KErrArgument); + } + else User::Leave( KErrGeneral ); + } + +// ---------------------------------------------------- +// CXdmDocument::ResetSubset +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::ResetSubset() + { + iDocSubset = EFalse; + } + +// ---------------------------------------------------- +// CXdmDocument::AppendToModelL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::AppendToModelL( CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aParentNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::AppendToModelL()" ) ); + #endif + if( !iDocSubset ) + { + if( aNewNode != NULL && aParentNode != NULL ) + aParentNode->AppendChileNodeL( aNewNode ); + } + else User::Leave( KErrGeneral ); + } + +// ---------------------------------------------------- +// CXdmDocument::ReplaceInModelL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocument::ReplaceInModelL( CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aTargetNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::ReplaceInModelL()" ) ); + #endif + if( !iDocSubset ) + { + CXdmDocumentNode* parent = aTargetNode->Parent(); + parent != NULL ? parent->ReplaceChileNodeL( aNewNode, aTargetNode ) : User::Leave( KErrArgument); + } + else User::Leave( KErrGeneral ); + } + +// ---------------------------------------------------- +// CXdmDocument::DocumentSubsetL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDocumentNode* CXdmDocument::DocumentSubsetL( const TDesC& aNodePath ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::DocumentSubsetL()" ) ); + #endif + TBool ready = EFalse; + HBufC* temp = HBufC::NewLC( aNodePath.Length() ); + temp->Des().Copy( aNodePath ); + TPtr nodePath( temp->Des() ); + while( !ready && nodePath.Length() != 0 ) + { + TPtrC part; + TInt index = nodePath.LocateF( KXdmPathSeparatorChar ); + if( index > 0 ) + part.Set( nodePath.Left( index ) ); + else + { + part.Set( nodePath ); + ready = ETrue; + } + AppendPathPartL( part ); + nodePath.Delete( 0, index + 1 ); + } + iDocSubset = ETrue; + CleanupStack::PopAndDestroy(); //temp + return CurrentExtent(); + } + +// ---------------------------------------------------- +// CXdmDocument::DoFindAttributes +// +// ---------------------------------------------------- +// +TInt CXdmDocument::DoFindAttributes( CXdmDocumentNode* aNode, + const TDesC& aAttributeName, + RPointerArray& aResultArray ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocument::DoFindAttributes()" ) ); + #endif + TInt error = KErrNone; + CXdmDocumentNode* node = aNode; + TInt attrCount = aNode->AttributeCount(); + for( TInt i = 0; i < attrCount; i++ ) + { + CXdmNodeAttribute* attr = node->Attribute( i ); + if( !attr->NodeName().CompareF( aAttributeName ) ) + error = aResultArray.Append( attr ); + } + TInt nodeCount = node->NodeCount(); + for( TInt i = 0; i < nodeCount; i++ ) + { + CXdmDocumentNode* child = node->ChileNode( i ); + DoFindAttributes ( child, aAttributeName, aResultArray ); + } + TInt count = aResultArray.Count(); + return error == KErrNone && count > 0 ? count : KErrNotFound; + } + + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmDocumentNode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmDocumentNode.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1143 @@ +/* +* Copyright (c) 2005 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: XDM Engine document node +* +*/ + + + + +// INCLUDE FILES +#include "XdmEngine.h" +#include "XdmDocument.h" +#include "XdmNodeFactory.h" +#include "XdmDocumentNode.h" +#include "XdmNodeAttribute.h" + +//XML Escape codes +_LIT8( KXmlBracketOpenEsc, "<"); +_LIT8( KXmlBracketCloseEsc, ">"); +_LIT8( KXmlAmpersandEsc, "&"); + +// ---------------------------------------------------------- +// CXdmDocumentNode::CXdmDocumentNode +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDocumentNode::CXdmDocumentNode( CXdmEngine& aXdmEngine, + MXdmNodeFactory& aNodeFactory ) : + iPosition( KErrNotFound ), + iEmptyNode( EFalse ), + iXdmEngine( aXdmEngine ), + iNodeFactory( aNodeFactory ) + { + } + + +// ---------------------------------------------------------- +// CXdmDocumentNode::CXdmDocumentNode +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDocumentNode::CXdmDocumentNode( CXdmEngine& aXdmEngine, + MXdmNodeFactory& aNodeFactory, + CXdmDocumentNode* aParentNode ) : + iEmptyNode( EFalse ), + iXdmEngine( aXdmEngine ), + iNodeFactory( aNodeFactory ), + iParentNode( aParentNode ) + + { + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::CXdmDocumentNode +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDocumentNode::CXdmDocumentNode( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + MXdmNodeFactory& aNodeFactory, + CXdmDocumentNode* aParentNode ) : + iLeafNode( aLeafNode ), + iEmptyNode( EFalse ), + iXdmEngine( aXdmEngine ), + iNodeFactory( aNodeFactory ), + iParentNode( aParentNode ) + + { + + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::ConstructL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::BaseConstructL( const TDesC& aNodeName ) + { + delete iNodeName; + iNodeName = NULL; + iNodeName = HBufC::NewL( aNodeName.Length() ); + iNodeName->Des().Copy( aNodeName ); + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::CopyConstructL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::CopyConstructL( const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CopyConstructL()" ) ); + #endif + if( aAnotherNode.ElementType() != EXdmElementAttribute ) + { + ConstructChildrenL( aAnotherNode ); + ConstructAttributesL( aAnotherNode ); + } + iLeafNode = aAnotherNode.IsLeafNode(); + iEmptyNode = aAnotherNode.IsEmptyNode(); + if( iLeafNode ) + { + iLeafContent = HBufC8::New( aAnotherNode.LeafNodeContent().Length() ); + iLeafContent->Des().Copy( aAnotherNode.LeafNodeContent() ); + } + iParentNode = CONST_CAST( CXdmDocumentNode*, &aParentNode ); + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::ConstructAttributesL +// +// ---------------------------------------------------------- +// +void CXdmDocumentNode::ConstructAttributesL( const CXdmDocumentNode& aAnotherNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CopyConstructL()" ) ); + #endif + TInt attrCount = aAnotherNode.AttributeCount(); + for( TInt i = 0;i < attrCount;i++ ) + { + TPtrC name = aAnotherNode.Attribute( i )->NodeName(); + TPtrC value = aAnotherNode.Attribute( i )->AttributeValue(); + CXdmNodeAttribute* attribute = iNodeFactory.AttributeL( name ); + CleanupStack::PushL( attribute ); + attribute->SetAttributeValueL( value ); + User::LeaveIfError( iAttributes.Append( attribute ) ); + CleanupStack::Pop(); //attribute + } + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::ConstructChildrenL +// +// ---------------------------------------------------------- +// +void CXdmDocumentNode::ConstructChildrenL( const CXdmDocumentNode& aAnotherNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ConstructChildrenL()" ) ); + #endif + TInt childCount = aAnotherNode.NodeCount(); + for( TInt i = 0;i < childCount;i++ ) + { + CXdmDocumentNode* node = aAnotherNode.ChileNode( i ); + CXdmDocumentNode* copy = iNodeFactory.ChileNodeL( node ); + CleanupStack::PushL( copy ); + User::LeaveIfError( iChildren.Append( copy ) ); + CleanupStack::Pop(); //copy + } + } + +// ---------------------------------------------------- +// CXdmDocumentNode::~CXdmDocumentNode +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDocumentNode::~CXdmDocumentNode() + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::~CXdmDocumentNode()" ) ); + #endif + delete iNextNode; + iNextNode = NULL; + delete iLeafContent; + delete iNodeName; + iChildren.ResetAndDestroy(); + iChildren.Close(); + iAttributes.ResetAndDestroy(); + iAttributes.Close(); + } + +// ---------------------------------------------------- +// CXdmDocumentNode::CreateChileNodeL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDocumentNode* CXdmDocumentNode::CreateChileNodeL() + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateChileNodeL()" ) ); + #endif*/ + __ASSERT_ALWAYS( !iEmptyNode, User::Panic( _L( "CXdmDocumentNode" ), ENodeNotEmpty ) ); + CXdmDocumentNode* node = iNodeFactory.ChileNodeL(); + CleanupStack::PushL( node ); + User::LeaveIfError( iChildren.Append( node ) ); + CleanupStack::Pop(); //node + return node; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::CreateChileNodeL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDocumentNode* CXdmDocumentNode::CreateChileNodeL( const TDesC& aChildName ) + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateChileNodeL() - Name: %S" ), &aChildName ); + #endif*/ + __ASSERT_ALWAYS( !iEmptyNode, User::Panic( _L( "CXdmDocumentNode" ), ENodeNotEmpty ) ); + CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aChildName ); + CleanupStack::PushL( node ); + User::LeaveIfError( iChildren.Append( node ) ); + CleanupStack::Pop(); //node + return node; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::SetLeafNode +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::SetLeafNode( const TBool aIsLeafNode ) + { + iLeafNode = aIsLeafNode; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::IsLeafNode +// +// ---------------------------------------------------- +// +EXPORT_C TBool CXdmDocumentNode::IsLeafNode() const + { + return iLeafNode; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::SetEmptyNode +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::SetEmptyNode( const TBool aIsEmptyNode ) + { + //Do nothing if the state is not being changed + if( aIsEmptyNode != iEmptyNode ) + { + if( aIsEmptyNode ) + { + if( !iEmptyNode ) + { + TInt count = iChildren.Count(); + if( count > 0 ) + iChildren.ResetAndDestroy(); + } + } + iEmptyNode = aIsEmptyNode; + } + } + +// ---------------------------------------------------- +// CXdmDocumentNode::IsEmptyNode +// +// ---------------------------------------------------- +// +EXPORT_C TBool CXdmDocumentNode::IsEmptyNode() const + { + return iEmptyNode; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::CreateAttributeL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::CreateAttributeL() + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateAttributeL()" ) ); + #endif*/ + CXdmDocumentNode* node = iNodeFactory.AttributeL(); + CleanupStack::PushL( node ); + User::LeaveIfError( iAttributes.Append( ( CXdmNodeAttribute* )node ) ); + CleanupStack::Pop(); //node + return ( CXdmNodeAttribute* )node; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::CreateAttributeL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::CreateAttributeL( const TDesC& aAttributeName ) + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateAttributeL() - Name: %S" ), &aAttributeName ); + #endif*/ + CXdmDocumentNode* node = iNodeFactory.AttributeL( aAttributeName ); + CleanupStack::PushL( node ); + User::LeaveIfError( iAttributes.Append( ( CXdmNodeAttribute* )node ) ); + CleanupStack::Pop(); //node + return ( CXdmNodeAttribute* )node; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::SetLeafNodeContentL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::SetLeafNodeContentL( const TDesC& aLeafContent ) + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetLeafNodeContentL( 16 ) - Content: %S" ), + &aLeafContent ); + #endif*/ + if( iLeafNode ) + { + delete iLeafContent; + iLeafContent = NULL; + iLeafContent = CXdmEngine::ConvertToUTF8L( aLeafContent ); + } + else + User::Leave( KErrGeneral ); + } + +// ---------------------------------------------------- +// CXdmDocumentNode::SetLeafNodeContentL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::SetLeafNodeContentL( const TDesC8& aLeafContent ) + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetLeafNodeContentL( 8 ) - Content: %S" ), + &aLeafContent ); + #endif*/ + if( iLeafNode ) + { + delete iLeafContent; + iLeafContent = NULL; + iLeafContent = HBufC8::NewL( aLeafContent.Length() ); + iLeafContent->Des().Copy( aLeafContent ); + } + else + User::Leave( KErrGeneral ); + } + +// ---------------------------------------------------- +// CXdmDocumentNode::ElementData +// +// ---------------------------------------------------- +// +EXPORT_C HBufC8* CXdmDocumentNode::ElementDataLC() const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ElementDataLC()" ) ); + #endif*/ + TInt position = 0; + CBufFlat* buffer = CBufFlat::NewL( 48 ); + CleanupStack::PushL( buffer ); + buffer->InsertL( position, EightBitNodeNameLC()->Des() ); + CleanupStack::PopAndDestroy(); //EightBitNodeNameLC() + position = position + NodeName().Length(); + TInt attributeCount = iAttributes.Count(); + if( attributeCount > 0 ) + { + for( TInt i = 0;i < attributeCount;i++ ) + { + buffer->InsertL( position, KGeneralSpace ); + position = position + KGeneralSpace().Length(); + CXdmNodeAttribute* attribute = iAttributes[i]; + TPtrC8 name( attribute->EightBitNodeNameLC()->Des() ); + buffer->InsertL( position, name ); + position = position + name.Length(); + buffer->InsertL( position, KGeneralEqualsAndQuotes ); + position = position + KGeneralEqualsAndQuotes().Length(); + TPtrC8 value( attribute->EscapedValueLC()->Des() ); + buffer->InsertL( position, value ); + position = position + value.Length(); + buffer->InsertL( position, KGeneralQuotes ); + position = position + KGeneralQuotes().Length(); + CleanupStack::PopAndDestroy( 2 ); //EscapedValueLC(), + //EightBitNodeNameLC() + } + } + HBufC8* ret = HBufC8::NewL( buffer->Size() ); + TPtr8 pointer( ret->Des() ); + buffer->Read( 0, pointer, buffer->Size() ); + CleanupStack::PopAndDestroy(); //buffer + CleanupStack::PushL( ret ); + return ret; + } + +// ---------------------------------------------------------- +// CXdmNodeAttribute::NodeCount +// +// ---------------------------------------------------------- +// +EXPORT_C TInt CXdmDocumentNode::NodeCount() const + { + return iNextNode ? 1 : iChildren.Count(); + } + +// ---------------------------------------------------------- +// CXdmNodeAttribute::NodeCount +// +// ---------------------------------------------------------- +// +EXPORT_C TInt CXdmDocumentNode::AttributeCount() const + { + return iAttributes.Count(); + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::Parent +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDocumentNode* CXdmDocumentNode::ChileNode( const TInt aPosition ) const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ChileNode() - Position: %d" ), aPosition ); + #endif*/ + if( iNextNode ) + return iNextNode; + else + { + TInt count = NodeCount(); + if( count > 0 && aPosition >= 0 && aPosition < count ) + return iChildren[aPosition]; + else return NULL; + } + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::Attribute +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::Attribute( const TInt aPosition ) const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Attribute() - Position: %d" ), aPosition ); + #endif*/ + TInt count = iAttributes.Count(); + if( count > 0 && aPosition >= 0 && aPosition < count ) + return iAttributes[aPosition]; + else return NULL; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::Attribute +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::Attribute( const TDesC& aAttributeName ) const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Attribute() - Name: %S" ), &aAttributeName ); + #endif*/ + TInt count = iAttributes.Count(); + if( count > 0 ) + { + TBool found = EFalse; + CXdmNodeAttribute* target = NULL; + for( TInt i = 0;!found && i < count;i++ ) + { + if( iAttributes[i]->NodeName().Compare( aAttributeName ) == 0 ) + { + target = iAttributes[i]; + found = ETrue; + } + } + return target; + } + else return NULL; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::Parent +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXdmDocumentNode::LeafNodeContent() const + { + return iLeafNode && iLeafContent != NULL ? iLeafContent->Des() : TPtrC8(); + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::Parent +// +// ---------------------------------------------------------- +// +EXPORT_C HBufC8* CXdmDocumentNode::EscapeLeafNodeContentLC() const + { + return iLeafNode && iLeafContent != NULL ? EscapeDescLC( iLeafContent->Des() ) : NULL; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::SetNextNode +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC CXdmDocumentNode::NodeName() const + { + return iNodeName != NULL ? iNodeName->Des() : TPtrC(); + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::SetNextNode +// +// ---------------------------------------------------------- +// +EXPORT_C HBufC8* CXdmDocumentNode::EightBitNodeNameLC() const + { + HBufC8* eightBit = CXdmEngine::ConvertToUTF8L( iNodeName->Des() ); + CleanupStack::PushL( eightBit ); + return eightBit; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::SetNextNode +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::SetNameL( const TDesC& aNodeName ) + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetNameL( 16-Bit ) - Name: %S" ), + &aNodeName ); + #endif*/ + delete iNodeName; + iNodeName = NULL; + iNodeName = HBufC::NewL( aNodeName.Length() ); + iNodeName->Des().Copy( aNodeName ); + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::SetNextNode +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::SetNameL( const TDesC8& aNodeName ) + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetNameL( 8-Bit ) - Name: %S" ), + &aNodeName ); + #endif*/ + delete iNodeName; + iNodeName = NULL; + iNodeName = HBufC::NewL( aNodeName.Length() ); + iNodeName->Des().Copy( aNodeName ); + } + +// ---------------------------------------------------------- +// CXdmNodeAttribute::ElementType +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDocumentNode* CXdmDocumentNode::Parent() const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Parent()" ) ); + #endif*/ + return iParentNode; + } + +// ---------------------------------------------------------- +// CXdmNodeAttribute::ElementType +// +// ---------------------------------------------------------- +// +EXPORT_C TXdmElementType CXdmDocumentNode::ElementType() const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ElementType()" ) ); + #endif*/ + return EXdmElementNode; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::Match +// +// ---------------------------------------------------------- +// +EXPORT_C TBool CXdmDocumentNode::Match( const CXdmDocumentNode& aAnotherNode ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Match()" ) ); + #endif + if( NodeName().Compare( aAnotherNode.NodeName() ) == 0 ) + { + TBool match = ETrue; + TInt attrCount = iAttributes.Count(); + if( attrCount == aAnotherNode.AttributeCount() ) + { + for( TInt i = 0;match && i < attrCount;i++ ) + match = HasAttribute( *aAnotherNode.Attribute( i ) ); + } + else match = EFalse; + return match; + } + else return EFalse; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::Match +// +// ---------------------------------------------------------- +// +EXPORT_C TBool CXdmDocumentNode::Match( const TDesC& aNodeName, + const RPointerArray& + aAttributeArray ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Match()" ) ); + #endif + if( NodeName().Compare( aNodeName ) == 0 ) + { + TBool match = ETrue; + TInt attrCount = iAttributes.Count(); + if( attrCount == aAttributeArray.Count() ) + { + for( TInt i = 0;match && i < attrCount;i++ ) + match = HasAttributeL( *aAttributeArray[i] ); + } + else match = EFalse; + return match; + } + else return EFalse; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::HasAttribute +// +// --------------------------------------------------------- +// +EXPORT_C TBool CXdmDocumentNode::HasAttribute( const TDesC& aAttributeName ) const + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::HasAttribute()" ) ); + #endif + TInt count = iAttributes.Count(); + for( TInt i = 0; i < count;i++ ) + { + if( !iAttributes[i]->NodeName().Compare( aAttributeName ) ) + return ETrue; + } + return EFalse; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::Print +// !!! For debugging ONLY !!! +// --------------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::Print() + { + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Print()" ) ); + HBufC8* nameBuf = HBufC8::NewLC( iNodeName->Des().Length() ); + TPtr8 name( nameBuf->Des() ); + name.Copy( iNodeName->Des() ); + if( ElementType() == EXdmElementAttribute ) + { + CXdmNodeAttribute* attr = ( CXdmNodeAttribute* )this; + TPtrC8 value( attr->EightBitValueLC()->Des() ); + iXdmEngine.WriteToLog( _L8( "* Name: %S Value: %S" ), &name, &value ); + CleanupStack::PopAndDestroy(); //value + } + else + { + iXdmEngine.WriteToLog( _L8( "* Name: %S" ), &name ); + TInt count = iAttributes.Count(); + if( count > 0 ) + { + for( TInt i = 0;i < count;i++ ) + { + CXdmNodeAttribute* attr = iAttributes[i]; + TPtrC8 value( attr->EightBitValueLC()->Des() ); + TPtrC8 name( attr->EightBitNodeNameLC()->Des() ); + iXdmEngine.WriteToLog( _L8( "* Attribute %d - Name: %S Value: %S" ), i, &name, &value ); + CleanupStack::PopAndDestroy( 2 ); //name, value + } + + } + if( iLeafNode ) + { + TPtr8 data( iLeafContent->Des() ); + iXdmEngine.WriteToLog( _L8( "* Data: %S" ), &data ); + } + CXdmDocumentNode* node = NULL; + TInt nodeCount = NodeCount(); + for( TInt i = 0;i < nodeCount;i++ ) + { + node = ChileNode( i ); + node->Print(); + } + } + CleanupStack::PopAndDestroy(); //nameBuf + } + +// --------------------------------------------------------- +// CXdmDocumentNode::Find +// +// --------------------------------------------------------- +// +EXPORT_C TInt CXdmDocumentNode::Find( const TDesC& aNodeName, + RPointerArray& aResultArray ) const + { + TInt error = KErrNotFound; + TInt childCount = NodeCount(); + if( childCount > 0 ) + { + for( TInt i = 0;i < childCount;i++ ) + error = ChileNode( i )->DoFind( aNodeName, aResultArray ); + } + return error; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::DoFind +// +// --------------------------------------------------------- +// +TInt CXdmDocumentNode::DoFind( const TDesC& aNodeName, + RPointerArray& aResultArray ) const + { + TInt error = KErrNone; + if( NodeName().Compare( aNodeName ) == 0 ) + error = aResultArray.Append( this ); + if( error == KErrNone ) + { + TInt childCount = NodeCount(); + if( childCount > 0 ) + { + for( TInt i = 0;i < childCount;i++ ) + error = ChileNode( i )->DoFind( aNodeName, aResultArray ); + } + } + return error; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::Find +// +// --------------------------------------------------------- +// +EXPORT_C TInt CXdmDocumentNode::Find( const CXdmDocumentNode& aTargetNode, + RPointerArray& aResultArray ) const + { + TInt error = KErrNotFound; + TInt childCount = NodeCount(); + if( childCount > 0 ) + { + for( TInt i = 0;i < childCount;i++ ) + error = ChileNode( i )->DoFind( aTargetNode, aResultArray ); + } + return error; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::Find +// +// --------------------------------------------------------- +// +TInt CXdmDocumentNode::DoFind( const CXdmDocumentNode& aTargetNode, + RPointerArray& aResultArray ) const + { + TInt error = KErrNone; + if( *this == aTargetNode ) + error = aResultArray.Append( this ); + if( error == KErrNone ) + { + TInt childCount = NodeCount(); + if( childCount > 0 ) + { + for( TInt i = 0;i < childCount;i++ ) + error = ChileNode( i )->DoFind( aTargetNode, aResultArray ); + } + } + return error; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::Find +// +// --------------------------------------------------------- +// +EXPORT_C TInt CXdmDocumentNode::Find( const TDesC& aNodeName, + RPointerArray& aResultArray, + const RPointerArray& aAttributeArray ) const + { + TInt error = KErrNone; + TInt childCount = NodeCount(); + if( childCount > 0 ) + { + for( TInt j = 0;j < childCount;j++ ) + error = ChileNode( j )->DoFind( aNodeName, aResultArray, aAttributeArray ); + } + return error; + } + +// --------------------------------------------------------- +// CXcapHttpOperation::RemoveNamespaceAttributes +// +// --------------------------------------------------------- +// +void CXdmDocumentNode::RemoveNamespaceAttributes() + { + _LIT( KXmlNamespaceAttr, "xmlns" ); + for( TInt i( iAttributes.Count() - 1 ); i > KErrNotFound; i-- ) + { + CXdmNodeAttribute* attr( iAttributes[i] ); + if( attr->NodeName().Find( KXmlNamespaceAttr ) == 0 ) + { + iAttributes.Remove( i ); + delete attr; + attr = NULL; + } + } + } + +// --------------------------------------------------------- +// CXdmDocumentNode::DoFind +// +// --------------------------------------------------------- +// +TInt CXdmDocumentNode::DoFind( const TDesC& aNodeName, + RPointerArray& aResultArray, + const RPointerArray& aAttributeArray ) + { + TBool match = EFalse; + TInt error = KErrNone; + if( NodeName().Compare( aNodeName ) == 0 ) + { + match = ETrue; + RemoveNamespaceAttributes(); + TInt attrCount = iAttributes.Count(); + if( attrCount == aAttributeArray.Count() ) + { + if( attrCount > 0 ) + { + for( TInt i = 0;i < attrCount;i++ ) + match = HasAttribute( *aAttributeArray[i] ); + } + } + else match = EFalse; + error = match ? aResultArray.Append( this ) : KErrNotFound; + } + TInt childCount = NodeCount(); + if( childCount > 0 ) + { + for( TInt j = 0;j < childCount;j++ ) + error = ChileNode( j )->DoFind( aNodeName, aResultArray, aAttributeArray ); + } + return error; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::operator== +// +// --------------------------------------------------------- +// +EXPORT_C TBool CXdmDocumentNode::operator==( const CXdmDocumentNode& aNode ) const + { + TBool match = EFalse; + if( NodeName().Compare( aNode.NodeName() ) == 0 ) + { + match = ETrue; + TInt attrCount = iAttributes.Count(); + if( attrCount == aNode.AttributeCount() ) + { + if( attrCount > 0 ) + { + for( TInt i = 0;i < attrCount;i++ ) + match = aNode.HasAttribute( *iAttributes[i] ); + } + } + if( match ) + { + TInt childCount = NodeCount(); + if( childCount == aNode.NodeCount() ) + { + if( childCount > 0 ) + { + for( TInt j = 0;j < childCount;j++ ) + { + match = *ChileNode( j ) == *aNode.ChileNode( j ); + if( !match ) + break; + } + } + } + else match = EFalse; + } + else match = EFalse; + } + return match; + } + +// ---------------------------------------------------- +// CXdmDocumentNode::AppendChileNodeL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::AppendChileNodeL( CXdmDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CLocalDocument::AppendChileNodeL()" ) ); + #endif + CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aDocumentNode ); + CleanupStack::PushL( node ); + User::LeaveIfError( iChildren.Append( node ) ); + CleanupStack::Pop(); //node + } + +// ---------------------------------------------------- +// CXdmDocumentNode::InsertChileNodeL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::InsertChileNodeL( TInt aIndex, CXdmDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CLocalDocument::InsertChileNodeL()" ) ); + #endif + __ASSERT_ALWAYS( aIndex >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); + CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aDocumentNode ); + CleanupStack::PushL( node ); + User::LeaveIfError( iChildren.Insert( node, aIndex ) ); + CleanupStack::Pop(); //node + } + +// ---------------------------------------------------- +// CXdmDocumentNode::ReplaceChileNodeL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::ReplaceChileNodeL( CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aTargetNode ) + { + CXdmDocumentNode* remove = NULL; + TInt index = iChildren.Find( aTargetNode ); + #ifdef _DEBUG + CXdmDocumentNode* a = NULL; + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ReplaceChileNodeL()" ) ); + iXdmEngine.WriteToLog( _L8( " New node: %x" ), aNewNode ); + iXdmEngine.WriteToLog( _L8( " Target node: %x" ), aTargetNode ); + for( TInt i = 0;i < iChildren.Count();i++ ) + { + a = iChildren[i]; + iXdmEngine.WriteToLog( _L8( " Child %d: %x" ), i, a ); + } + #endif + __ASSERT_DEBUG( index >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); + remove = iChildren[index]; + iChildren.Remove( index ); + delete remove; + remove = NULL; + CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aNewNode ); + CleanupStack::PushL( node ); + User::LeaveIfError( iChildren.Insert( node, index ) ); + CleanupStack::Pop(); //node + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::RemoveChileNodeL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::RemoveChileNodeL( CXdmDocumentNode* aChileNode ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::RemoveChileNodeL()" ) ); + #endif + CXdmDocumentNode* remove = NULL; + switch( aChileNode->ElementType() ) + { + case EXdmElementNode: + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( " Element is a node" ) ); + #endif + TInt index( iChildren.Find( aChileNode ) ); + __ASSERT_DEBUG( index >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); + remove = iChildren[index]; + iChildren.Remove( index ); + delete remove; + remove = NULL; + } + break; + case EXdmElementAttribute: + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( " Element is an attribute" ) ); + #endif + TInt index( iAttributes.Find( ( CXdmNodeAttribute* )aChileNode ) ); + __ASSERT_DEBUG( index >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); + remove = iAttributes[index]; + iAttributes.Remove( index ); + delete remove; + remove = NULL; + } + break; + default: + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( " Element is of undefined type, ignore" ) ); + #endif + break; + } + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::NextNode +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmDocumentNode* CXdmDocumentNode::NextNode() const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXcapDocumentNode::NextNode()" ) ); + #endif*/ + return iNextNode; + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::SetNextNode +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmDocumentNode::SetNextNode( CXdmDocumentNode* aNextNode ) + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetNextNode()" ) ); + #endif*/ + __ASSERT_DEBUG( aNextNode != NULL, User::Panic( _L( "CXdmDocumentNode" ), EDocNodeNull ) ); + iNextNode = aNextNode; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::EscapeDescLC +// +// --------------------------------------------------------- +// +HBufC8* CXdmDocumentNode::EscapeDescLC( const TDesC8& aDescriptor ) const + { + /*#ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::EscapeDescLC()" ) ); + #endif*/ + TInt bufPos = 0; + TBuf8<10> format; + HBufC8* ret = NULL; + CBufFlat* buffer = CBufFlat::NewL( 50 ); + CleanupStack::PushL( buffer ); + for( TInt i = 0;i < aDescriptor.Length();i++ ) + { + TUint8 byte = aDescriptor[i]; + switch( byte ) + { + case 0x26: //'&' + format.Append( KXmlAmpersandEsc ); + break; + case 0x3C: //'<' + format.Append( KXmlBracketOpenEsc ); + break; + case 0x3E: //'>' + format.Append( KXmlBracketCloseEsc ); + break; + default: + format.Append( byte ); + break; + } + buffer->InsertL( bufPos, format ); + bufPos = bufPos + format.Length(); + format.Zero(); + } + ret = HBufC8::NewL( buffer->Size() ); + ret->Des().Copy( buffer->BackPtr( buffer->Size() ) ); + CleanupStack::PopAndDestroy(); //buffer + CleanupStack::PushL( ret ); + return ret; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::HasAttribute +// +// --------------------------------------------------------- +// +TBool CXdmDocumentNode::HasAttribute( const CXdmNodeAttribute& aAttribute ) const + { + TBool ret = EFalse; + TInt count = iAttributes.Count(); + for( TInt i = 0;i < count && !ret;i++ ) + { + ret = iAttributes[i]->NodeName().Compare( aAttribute.NodeName() ) == 0 && + iAttributes[i]->AttributeValue().Compare( aAttribute.AttributeValue() ) == 0; + } + return ret; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::HasAttribute +// +// --------------------------------------------------------- +// +TBool CXdmDocumentNode::HasAttributeL( const SXdmAttribute8& aAttribute ) const + { + TBool ret = EFalse; + TInt count = iAttributes.Count(); + for( TInt i = 0;i < count && !ret;i++ ) + { + HBufC8* name = CXdmEngine::ConvertToUTF8L( iAttributes[i]->NodeName() ); + CleanupStack::PushL( name ); + HBufC8* value = CXdmEngine::ConvertToUTF8L( iAttributes[i]->AttributeValue() ); + CleanupStack::PushL( value ); + ret = name->Des().Compare( aAttribute.iName ) == 0 && + value->Des().Compare( aAttribute.iValue ) == 0; + CleanupStack::PopAndDestroy( 2 ); //value, name + } + return ret; + } + +// --------------------------------------------------------- +// CXdmDocumentNode::HasAttribute +// +// --------------------------------------------------------- +// +TBool CXdmDocumentNode::HasAttribute( const SXdmAttribute16& aAttribute ) const + { + TBool ret = EFalse; + TInt count = iAttributes.Count(); + for( TInt i = 0;i < count && !ret;i++ ) + { + ret = iAttributes[i]->NodeName().Compare( aAttribute.iName ) == 0 && + iAttributes[i]->AttributeValue().Compare( aAttribute.iValue ) == 0; + } + return ret; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmEngine.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmEngine.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,446 @@ +/* +* Copyright (c) 2005 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: XDM Engine +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include "XdmEngine.h" +#include "XdmDocument.h" +#include "XdmProtocol.h" +#include "XdmDirectory.h" +#include "XdmLogWriter.h" +#include "XdmStaticUtils.h" +#include "XdmSettingsApi.h" +#include "XdmProtocolInfo.h" + +// ---------------------------------------------------------- +// CXdmEngine::CXdmEngine +// +// ---------------------------------------------------------- +// +CXdmEngine::CXdmEngine() : CActive( EPriorityStandard ) + { + } + +// ---------------------------------------------------------- +// CXdmEngine::NewL +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmEngine* CXdmEngine::NewL( const CXdmProtocolInfo& aProtocolInfo ) + { + CXdmEngine* self = new ( ELeave ) CXdmEngine(); + CleanupStack::PushL( self ); + self->ConstructL( CONST_CAST( CXdmProtocolInfo&, aProtocolInfo ) ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXdmEngine::XdmSettingsLC +// +// ---------------------------------------------------------- +// +EXPORT_C CDesC16Array* CXdmEngine::XdmSettingsLC( RArray& aSettingIds ) + { + return TXdmSettingsApi::CollectionNamesLC( aSettingIds ); + } + +// ---------------------------------------------------------- +// CXdmEngine::ConstructL +// +// ---------------------------------------------------------- +// +void CXdmEngine::ConstructL( CXdmProtocolInfo& aProtocolInfo ) + { + #ifdef _DEBUG + iLogWriter = CXdmLogWriter::NewL( KXdmEngLogFile ); + WriteToLog( _L8( "CXdmEngine::ConstructL()" ) ); + #endif + TRAPD( error, iXdmProtocol = CXdmProtocol::NewL( *this, aProtocolInfo ) ); + if( error == KErrNone && iXdmProtocol != NULL ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Protocol implementation created successfully" ) ); + #endif + CActiveScheduler::Add( this ); + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Protocol creation failed - Error: %d Protocol: %x" ), error, iXdmProtocol ); + #endif + User::Leave( KErrUnknown ); + } + } + +// ---------------------------------------------------- +// CXdmEngine::~CXdmEngine +// +// ---------------------------------------------------- +// +CXdmEngine::~CXdmEngine() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::~CXdmEngine()" ) ); + #endif + iDocUpdateQueue.Close(); + iDirUpdateQueue.Close(); + iDocumentQueue.Close(); + iDirectoryQueue.Close(); + #ifdef _DEBUG + WriteToLog( _L8( " Queues closed" ) ); + #endif + delete iXdmProtocol; + #ifdef _DEBUG + WriteToLog( _L8( " Protocol deleted" ) ); + #endif + REComSession::FinalClose(); + #ifdef _DEBUG + WriteToLog( _L8( " Destructor finished" ) ); + #endif + delete iLogWriter; + } + +// ---------------------------------------------------------- +// CXdmEngine::WriteToLog +// +// ---------------------------------------------------------- +// +void CXdmEngine::WriteToLog( TRefByValue aFmt,... ) const + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + iLogWriter->WriteToLog( buf ); + } + +// ---------------------------------------------------- +// CXdmEngine::DirectoryCollection +// +// ---------------------------------------------------- +// +EXPORT_C const RPointerArray& CXdmEngine::DocumentCollection() const + { + return iDocumentQueue; + } + +// ---------------------------------------------------- +// CXdmEngine::DirectoryCollection +// +// ---------------------------------------------------- +// +EXPORT_C const RPointerArray& CXdmEngine::DirectoryCollection() const + { + return iDirectoryQueue; + } + + +// ---------------------------------------------------- +// CXdmEngine::CancelUpdate +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmEngine::CancelUpdate( CXdmDocument* aDocument ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::CancelUpdate( document )" ) ); + #endif + TInt index = iDocumentQueue.Find( aDocument ); + if( IsActive() ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Transfer media init pending, cancel self" ) ); + #endif + Cancel(); + } + else if( index != KErrNotFound && aDocument->IsActive() ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Cancel document update" ) ); + #endif + aDocument->CancelUpdate(); + if( iDocUpdateQueue.Find( aDocument ) == KErrNone ) + iDocUpdateQueue.Remove( index ); + } + } + +// ---------------------------------------------------- +// CXdmEngine::CancelUpdate +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmEngine::CancelUpdate( CXdmDirectory* aDirectory ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::CancelUpdate( directory )" ) ); + #endif + TInt index = iDirectoryQueue.Find( aDirectory ); + if( IsActive() ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Transfer media init pending, cancel self" ) ); + #endif + Cancel(); + } + else if( index != KErrNotFound && aDirectory->IsActive() ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Cancel directory update" ) ); + #endif + aDirectory->CancelUpdate(); + if( iDirUpdateQueue.Find( aDirectory ) == KErrNone ) + iDirUpdateQueue.Remove( index ); + } + } + +// ---------------------------------------------------- +// CXdmEngine::CreateDocumentModelL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDocument* CXdmEngine::CreateDocumentModelL( const TDesC& aDocumentName, + const TXdmDocType aDocumentType ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::CreateDocumentModelL()" ) ); + #endif + CXdmDocument* document = iXdmProtocol->CreateDocumentL( aDocumentName, aDocumentType ); + CleanupStack::PushL( document ); + User::LeaveIfError( iDocumentQueue.Append( document ) ); + CleanupStack::Pop(); //document + return document; + } + +// ---------------------------------------------------- +// CXdmEngine::DeleteDocumentModelL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmEngine::DeleteDocumentModelL( const CXdmDocument* aDocument ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::DeleteDocumentModelL()" ) ); + #endif + TInt index = iDocumentQueue.Find( aDocument ); + __ASSERT_ALWAYS( index != KErrNotFound, User::Leave( KErrNotFound ) ); + iDocumentQueue.Remove( index ); + delete aDocument; + aDocument = NULL; + } + +// ---------------------------------------------------- +// CXdmEngine::CreateDirectoryModelL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDirectory* CXdmEngine::CreateDirectoryModelL( const TDesC& aDirectoryPath ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::CreateDirectoryModelL()" ) ); + #endif + CXdmDirectory* directory = iXdmProtocol->CreateDirectoryL( aDirectoryPath ); + CleanupStack::PushL( directory ); + User::LeaveIfError( iDirectoryQueue.Append( directory ) ); + CleanupStack::Pop(); //document + return directory; + } + +// ---------------------------------------------------- +// CXdmEngine::DeleteDirectoryModelL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmEngine::DeleteDirectoryModelL( const CXdmDirectory* aDirectory ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::DeleteDirectoryModelL()" ) ); + #endif + TInt index = iDirectoryQueue.Find( aDirectory ); + __ASSERT_ALWAYS( index != KErrNotFound, User::Panic( _L( "CXdmEngine" ), EDirModelNotFound ) ); + iDirectoryQueue.Remove( index ); + delete aDirectory; + aDirectory = NULL; + } + +// ---------------------------------------------------- +// CXdmEngine::CreateDocumentNodeL +// +// ---------------------------------------------------- +// +EXPORT_C CXdmDocumentNode* CXdmEngine::CreateDocumentNodeL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::CreateDocumentNodeL()" ) ); + #endif + return iXdmProtocol->CreateDocumentNodeL(); + } + +// ---------------------------------------------------- +// CXdmEngine::UpdateL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmEngine::UpdateL( CXdmDocument* aDocument, + TRequestStatus& aStatus ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::UpdateL( document )" ) ); + #endif + iClientStatus = &aStatus; + aStatus = KRequestPending; + aDocument->SaveClientStatus( aStatus ); + User::LeaveIfError( iDocUpdateQueue.Append( aDocument ) ); + if( !IsActive() ) + { + iXdmProtocol->InitTransferMedium( KDefaultIdleTimeout, iStatus ); + SetActive(); + } + } + +// ---------------------------------------------------- +// CXdmEngine::UpdateL +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmEngine::UpdateL( TRequestStatus& aStatus, + CXdmDirectory* aDirectory, + TDirUpdatePhase aUpdatePhase ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::UpdateL( directory )" ) ); + #endif + iClientStatus = &aStatus; + aStatus = KRequestPending; + aDirectory->SaveRequestData( aUpdatePhase, aStatus ); + User::LeaveIfError( iDirUpdateQueue.Append( aDirectory ) ); + if( !IsActive() ) + { + iXdmProtocol->InitTransferMedium( KDefaultIdleTimeout, iStatus ); + SetActive(); + } + } + +// --------------------------------------------------------- +// CXdmEngine::RunL +// +// --------------------------------------------------------- +// +void CXdmEngine::RunL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::RunL() - Status: %d" ), iStatus.Int() ); + #endif + if( iStatus == KErrCancel ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Update cancelled, complete client request" ) ); + #endif + if( iClientStatus ) + { + iDocUpdateQueue.Reset(); + iDirUpdateQueue.Reset(); + User::RequestComplete( iClientStatus, KErrCancel ); + #ifdef _DEBUG + WriteToLog( _L8( " Request complete" ) ); + #endif + } + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Transfer media initialised, start update" ) ); + #endif + TInt dirCount( iDirUpdateQueue.Count() ); + TInt docCount( iDocUpdateQueue.Count() ); + #ifdef _DEBUG + WriteToLog( _L8( " Document queue count: %d" ), docCount ); + WriteToLog( _L8( " Directory queue count: %d" ), dirCount ); + #endif + //First check the document queue + for( TInt i = 0;i < docCount;i++ ) + { + iDocUpdateQueue[0]->StartUpdateL(); + iDocUpdateQueue.Remove( 0 ); + } + //Then the directory queue + for( TInt j = 0;j < dirCount;j++ ) + { + iDirUpdateQueue[0]->StartUpdateL(); + iDirUpdateQueue.Remove( 0 ); + } + } + } + +// --------------------------------------------------------- +// CXdmEngine::DoCancel +// +// --------------------------------------------------------- +// +void CXdmEngine::DoCancel() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::DoCancel()" ) ); + #endif + iXdmProtocol->CancelTransferMediumInit(); + if( iClientStatus ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Client request pending => Complete" ) ); + #endif + iDocUpdateQueue.Reset(); + iDirUpdateQueue.Reset(); + User::RequestComplete( iClientStatus, KErrCancel ); + } + } + +// --------------------------------------------------------- +// CXdmEngine::XdmProtocol +// +// --------------------------------------------------------- +// +CXdmProtocol* CXdmEngine::XdmProtocol() const + { + #ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::XdmProtocol()" ) ); + #endif + return iXdmProtocol; + } + +// --------------------------------------------------------- +// CXdmEngine::ConvertToUTF8L +// +// --------------------------------------------------------- +// +HBufC8* CXdmEngine::ConvertToUTF8L( const TDesC& aUnicodeDesc ) + { + /*#ifdef _DEBUG + WriteToLog( _L8( "CXdmEngine::ConvertToUTF8L()" ) ); + #endif*/ + return CnvUtfConverter::ConvertFromUnicodeToUtf8L( aUnicodeDesc ); + } + + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmLogWriter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmLogWriter.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,123 @@ +/* +* Copyright (c) 2007 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: XDM Engine log writer +* +*/ + + + +#include +#include +#include +#include "XdmLogWriter.h" +#include "XdmStaticUtils.h" + + +// ---------------------------------------------------------- +// XdmStaticUtils::CheckFileExistsL +// +// ---------------------------------------------------------- +// +CXdmLogWriter::CXdmLogWriter() + { + } + +// ---------------------------------------------------------- +// CXdmLogWriter::NewL +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmLogWriter* CXdmLogWriter::NewL( const TDesC& aLogName ) + { + CXdmLogWriter* self = new ( ELeave ) CXdmLogWriter(); + CleanupStack::PushL( self ); + self->ConstructL( aLogName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXdmLogWriter::ConstructL +// +// ---------------------------------------------------------- +// +void CXdmLogWriter::ConstructL( const TDesC& aLogName ) + { + RFs session; + HBufC* full = NULL; + User::LeaveIfError( session.Connect() ); + CleanupClosePushL( session ); + HBufC* concat = HBufC::NewLC( KXdmLogRoot().Length() + + KXdmLogDir().Length() + + aLogName.Length() + 1 ); + TPtr path( concat->Des() ); + path.Copy( KXdmLogRoot ); + path.Append( KXdmLogDir ); + path.Append( _L( "\\") ); + path.Append( aLogName ); + TRAPD( error, full = XdmStaticUtils::GenerateFileNameL( session, path, KXdmLogFileExt ) ); + if( full && error == KErrNone ) + { + CleanupStack::PushL( full ); + TPtrC fullDes( full->Des() ); + iLogFileName = fullDes.Mid( fullDes.LocateReverse( 92 ) + 1 ).AllocL(); + CleanupStack::PopAndDestroy(); //full + } + else iLogFileName = NULL; + CleanupStack::PopAndDestroy( 2 ); //concat, session + } + +// ---------------------------------------------------------- +// CXdmLogWriter::~CXdmLogWriter +// +// ---------------------------------------------------------- +// +CXdmLogWriter::~CXdmLogWriter() + { + delete iLogFileName; + } + +// ---------------------------------------------------------- +// CXdmLogWriter::WriteToLog +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmLogWriter::WriteToLog( const TDesC& aLogLine ) const + { + if( iLogFileName ) + { + RFileLogger::Write( KXdmLogDir, *iLogFileName, EFileLoggingModeAppend, aLogLine ); + } + RDebug::Print( aLogLine ); + } + +// ---------------------------------------------------------- +// CXdmLogWriter::WriteToLog +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmLogWriter::WriteToLog( const TDesC8& aLogLine ) const + { + if( iLogFileName ) + { + RFileLogger::Write( KXdmLogDir, *iLogFileName, EFileLoggingModeAppend, aLogLine ); + } + RDebug::RawPrint( aLogLine ); + } + +// End of File + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmNodeAttribute.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmNodeAttribute.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,162 @@ +/* +* Copyright (c) 2005 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: XDM Engine node attribute +* +*/ + + + + +// INCLUDE FILES +#include + +#include "XdmEngine.h" +#include "XdmNodeFactory.h" +#include "XdmNodeAttribute.h" + +// ---------------------------------------------------------- +// CXdmNodeAttribute::CXdmNodeAttribute +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmNodeAttribute::CXdmNodeAttribute( CXdmEngine& aXdmEngine, + MXdmNodeFactory& aNodeFactory ) : + CXdmDocumentNode( aXdmEngine, aNodeFactory ) + + { + } + +// ---------------------------------------------------------- +// CXdmNodeAttribute::CXdmNodeAttribute +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmNodeAttribute::CXdmNodeAttribute( CXdmEngine& aXdmEngine, + MXdmNodeFactory& aNodeFactory, + CXdmDocumentNode* aParentNode ) : + CXdmDocumentNode( aXdmEngine, aNodeFactory, aParentNode ) + { + } + +// ---------------------------------------------------------- +// CXdmNodeAttribute::ConstructL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmNodeAttribute::BaseConstructL( const TDesC& aAttributeName ) + { + SetNameL( aAttributeName ); + } + +// ---------------------------------------------------------- +// CXdmNodeAttribute::ElementType +// +// ---------------------------------------------------------- +// +EXPORT_C TXdmElementType CXdmNodeAttribute::ElementType() const + { + return EXdmElementAttribute; + } + +// ---------------------------------------------------- +// CXdmNodeAttribute::~CXdmNodeAttribute +// +// ---------------------------------------------------- +// +EXPORT_C CXdmNodeAttribute::~CXdmNodeAttribute() + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmNodeAttribute::~CXdmNodeAttribute()" ) ); + #endif + delete iAttributeValue; + } + +// ---------------------------------------------------- +// CXdmNodeAttribute::AttributeValue +// +// ---------------------------------------------------- +// +EXPORT_C TPtrC CXdmNodeAttribute::AttributeValue() const + { + return iAttributeValue != NULL ? iAttributeValue->Des() : TPtrC(); + } + +// ---------------------------------------------------- +// CXdmNodeAttribute::AttributeValue +// +// ---------------------------------------------------- +// +EXPORT_C HBufC8* CXdmNodeAttribute::EightBitValueLC() const + { + HBufC8* eightBit = CXdmEngine::ConvertToUTF8L( iAttributeValue->Des() ); + CleanupStack::PushL( eightBit ); + return eightBit; + } + +// ---------------------------------------------------- +// CXdmNodeAttribute::EscapedValueLC +// +// ---------------------------------------------------- +// +EXPORT_C HBufC8* CXdmNodeAttribute::EscapedValueLC() const + { + HBufC8* eightBit = CXdmEngine::ConvertToUTF8L( iAttributeValue->Des() ); + CleanupStack::PushL( eightBit ); + HBufC8* escape = EscapeDescLC( eightBit->Des() ); + CleanupStack::Pop(); //escape + CleanupStack::PopAndDestroy(); //eightBit + CleanupStack::PushL( escape ); + return escape; + } + +// ---------------------------------------------------- +// CXdmNodeAttribute::SetAttributeValue +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmNodeAttribute::SetAttributeValueL( const TDesC& aAttributeValue ) + { + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmNodeAttribute::SetAttributeValueL() - Value: %S" ), + &aAttributeValue ); + #endif + delete iAttributeValue; + iAttributeValue = NULL; + iAttributeValue = HBufC::NewL( aAttributeValue.Length() ); + iAttributeValue->Des().Copy( aAttributeValue ); + } + +// ---------------------------------------------------- +// CXdmNodeAttribute::SetAttributeValue +// +// ---------------------------------------------------- +// +EXPORT_C void CXdmNodeAttribute::SetAttributeValueL( const TDesC8& aAttributeValue ) + { + // change to UNICODE from UTF8 format + HBufC* unicode = EscapeUtils::ConvertToUnicodeFromUtf8L( aAttributeValue ); + CleanupStack::PushL( unicode ); + + #ifdef _DEBUG + iXdmEngine.WriteToLog( _L8( "CXdmNodeAttribute::SetAttributeValueL() - Value: %S" ), + unicode ); + #endif + delete iAttributeValue; + iAttributeValue = NULL; + iAttributeValue = HBufC::NewL( unicode->Length() ); + iAttributeValue->Des().Copy( *unicode ); + CleanupStack::PopAndDestroy( unicode ); + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmProtocol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmProtocol.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,23 @@ +/* +* Copyright (c) 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: XDM Engine protocol +* +*/ + + + +#include +#include "XdmProtocol.h" +#include "XdmProtocolInfo.h" + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmProtocolInfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmProtocolInfo.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,228 @@ +/* +* Copyright (c) 2005 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: XDM Engine protocol info +* +*/ + + + +#include "XdmProtocol.h" +#include "XdmDocument.h" +#include "XdmSettingsApi.h" +#include "XdmProtocolInfo.h" +#include "XdmProtocolUidList.h" +#include "XdmSettingsProperty.h" +#include "XdmSettingsCollection.h" + +// ---------------------------------------------------------- +// CXdmProtocolInfo::CXdmProtocolInfo +// +// ---------------------------------------------------------- +// +CXdmProtocolInfo::CXdmProtocolInfo() : iSecure( EFalse ), + iUseCache( ETrue ) + { + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::CXdmProtocolInfo +// +// ---------------------------------------------------------- +// +CXdmProtocolInfo::CXdmProtocolInfo( TInt aProtocolUid ) : + iProtocolUid( TUid::Uid( aProtocolUid ) ), + iSecure( EFalse ), + iUseCache( ETrue ) + { + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::CXdmProtocolInfo +// +// ---------------------------------------------------------- +// +CXdmProtocolInfo::CXdmProtocolInfo( TInt aAccessPoint, + TInt aProtocolUid ) : + iProtocolUid( TUid::Uid( aProtocolUid ) ), + iAccessPoint( aAccessPoint ), + iSecure( EFalse ), + iUseCache( ETrue ) + { + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::NewL +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmProtocolInfo* CXdmProtocolInfo::NewL( TInt aAccessPoint, + TInt aProtocolUid, + const TDesC& aRootLocation ) + { + CXdmProtocolInfo* self = new ( ELeave ) CXdmProtocolInfo( aAccessPoint, aProtocolUid ); + CleanupStack::PushL( self ); + self->ConstructL( aRootLocation ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::NewL +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmProtocolInfo* CXdmProtocolInfo::NewL( TInt aSettingsId ) + { + CXdmProtocolInfo* self = new ( ELeave ) CXdmProtocolInfo( KXcapProtocol ); + self->Construct( aSettingsId ); + return self; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::ConstructL +// +// ---------------------------------------------------------- +// +void CXdmProtocolInfo::ConstructL( const TDesC& aRootLocation ) + { + delete iRootLocation; + iRootLocation = NULL; + iRootLocation = HBufC::NewL( aRootLocation.Length() ); + iRootLocation->Des().Copy( aRootLocation ); + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::Construct +// +// ---------------------------------------------------------- +// +void CXdmProtocolInfo::Construct( TInt aSettingsId ) + { + iSettingsId = aSettingsId; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::~CXdmProtocolInfo +// +// ---------------------------------------------------------- +// +EXPORT_C CXdmProtocolInfo::~CXdmProtocolInfo() + { + delete iRootLocation; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::SetCredentials +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmProtocolInfo::SetCredentials( const TXdmCredentials aCredentials ) + { + iCredentials = aCredentials; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::SetCacheUsage +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmProtocolInfo::SetCacheUsage( const TBool aCacheUsage ) + { + iUseCache = aCacheUsage; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::CacheUsage +// +// ---------------------------------------------------------- +// +EXPORT_C TBool CXdmProtocolInfo::IsCacheEnabled() const + { + return iUseCache; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::Credentials +// +// ---------------------------------------------------------- +// +EXPORT_C const TXdmCredentials& CXdmProtocolInfo::Credentials() const + { + return iCredentials; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::SetCredentials +// +// ---------------------------------------------------------- +// +EXPORT_C void CXdmProtocolInfo::SetSecurity( const TBool aSecure ) + { + iSecure = aSecure; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::SetCredentials +// +// ---------------------------------------------------------- +// +EXPORT_C TBool CXdmProtocolInfo::IsSecure() const + { + return iSecure; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::Root +// +// ---------------------------------------------------------- +// +EXPORT_C TUid CXdmProtocolInfo::ProtocolUid() const + { + return iProtocolUid; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::AccessPoint +// +// ---------------------------------------------------------- +// +EXPORT_C TInt CXdmProtocolInfo::AccessPoint() const + { + return iAccessPoint; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::AccessPoint +// +// ---------------------------------------------------------- +// +EXPORT_C TInt CXdmProtocolInfo::SettingsID() const + { + return iSettingsId; + } + +// ---------------------------------------------------------- +// CXdmProtocolInfo::Root +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC CXdmProtocolInfo::Root() const + { + return iRootLocation != NULL ? iRootLocation->Des() : TPtrC(); + } + + +// End of File + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMEngine/src/XdmStaticUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMEngine/src/XdmStaticUtils.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,100 @@ +/* +* Copyright (c) 2007 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: XDM Engine static utils +* +*/ + + + + +#include +#include "XdmStaticUtils.h" +#include "XdmLogWriter.h" + +// ---------------------------------------------------------- +// XdmStaticUtils::CheckFileExistsL +// +// ---------------------------------------------------------- +// +EXPORT_C TBool XdmStaticUtils::CheckFileExistsL( RFs& aFileSession, const TDesC& aFileName ) + { + TBool found = EFalse; + CDir* directory = NULL; + TInt index = aFileName.LocateReverse( KBackSlash ); + TPtrC dir( aFileName.Left( index + 1 ) ); + TPtrC name( aFileName.Right( aFileName.Length() - index - 1 ) ); + User::LeaveIfError( aFileSession.GetDir( dir, KEntryAttNormal, ESortNone, directory ) ); + CleanupStack::PushL( directory ); + const TInt count = directory->Count(); + for( TInt i = 0;!found && i < count;i++ ) + { + if( name.CompareF( ( *directory )[i].iName ) == 0 ) + found = ETrue; + } + CleanupStack::PopAndDestroy(); //directory + return found; + } + +// ---------------------------------------------------------- +// XdmStaticUtils::GenerateFileNameLC +// +// ---------------------------------------------------------- +// +EXPORT_C HBufC* XdmStaticUtils::GenerateFileNameL( RFs& aFileSession, const TDesC& aFileName, + const TDesC& aExtension ) + { + TInt i = 1; + TBuf name; + name.Copy( aFileName ); + name.Append( aExtension ); + TBool exists = XdmStaticUtils::CheckFileExistsL( aFileSession, name ); + for( ;exists && i <= KMaxLogFiles;i++ ) + { + name.Zero(); + name.Copy( aFileName ); + name.AppendNum( i ); + name.Append( aExtension ); + exists = XdmStaticUtils::CheckFileExistsL( aFileSession, name ); + } + if( i >= KMaxLogFiles ) + { + TPtrC dir( aFileName.Left( aFileName.LocateReverse( KBackSlash ) ) ); + CleanUpDirectoryL( aFileSession, dir ); + name.Zero(); + name.Copy( aFileName ); + name.Append( aExtension ); + } + return name.AllocL(); + } + +// ---------------------------------------------------------- +// XdmStaticUtils::CleanUpDirectoryL +// +// ---------------------------------------------------------- +// +EXPORT_C void XdmStaticUtils::CleanUpDirectoryL( RFs& aFileSession, const TDesC& aDirectory ) + { + TBuf allFiles; + allFiles.Copy( aDirectory ); + allFiles.Append( _L( "\\*.*") ); + CFileMan* manager = CFileMan::NewL( aFileSession ); + manager->Delete( allFiles ); + delete manager; + manager = NULL; + } + +// End of File + + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/data/10207428.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/data/10207428.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 1020 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: ECOM plugin resource file for GS XDM plugin. +* +*/ + + + +#include + +RESOURCE REGISTRY_INFO theInfo + { + dll_uid = 0x10207428; // Plugin dll UID + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10207236; // UID for CGSPluginInterface + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x10207429; // Plugin UID + version_no = 1; + display_name = "XDM Settings Plugin"; // Plugin debug name + + #ifdef RD_CONTROL_PANEL // for control panel change (5.0) + default_data = "0x10283341"; // Parent UID adminstrative settings + opaque_data = "50"; // Order number + #else // for normal 3.0 without control panel change + default_data = "0x10207250"; // Parent UID connection settings + opaque_data = "140"; // Order number + #endif //RD_CONTROL_PANEL + } + }; + } + }; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/data/XDMPluginRsc.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/data/XDMPluginRsc.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,444 @@ +/* +* Copyright (c) 2005-2010 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: Resource file for XDMPlugin +* +*/ + + + + +// RESOURCE IDENTIFIER +NAME GSXD // 4 letter ID + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "XDMPlugin.hrh" + +// CONSTANTS +//---------------------------------------------------- +// +// +// Needed or loading the resource fails! +// +//---------------------------------------------------- +// +RESOURCE RSS_SIGNATURE + { + } + +//---------------------------------------------------- +// +// r_gs_xdm_settings_main_menubar +// Menu when main list is visible +// +//---------------------------------------------------- +// +RESOURCE MENU_BAR r_gs_xdm_settings_main_menubar + { + titles = + { + MENU_TITLE { menu_pane = r_gs_xdm_settings_main_menu;} + }; + } + +//---------------------------------------------------- +// +// r_gs_xdm_settings_main_menu +// Main menu when we enter in XDM settings +// +//---------------------------------------------------- +// +RESOURCE MENU_PANE r_gs_xdm_settings_main_menu + { + items = + { + MENU_ITEM + { + command = EGSXDMPluginCmdChange; + txt = qtn_xdm_settings_change; + flags = EEikMenuItemAction; + }, + MENU_ITEM + { + command = EGSXDMPluginCmdEdit; + txt = qtn_xdm_options_edit_set; + flags = EEikMenuItemAction; + }, + MENU_ITEM + { + command = EGSXDMPluginCmdNewSettings; + cascade = r_gs_xdm_new_settings_menu; + txt = qtn_xdm_options_new_set; + }, + MENU_ITEM + { + command = EGSXDMPluginCmdDelete; + txt = qtn_xdm_options_delete; + }, + MENU_ITEM + { + command = EAknCmdHelp; + txt = qtn_options_help; + }, + MENU_ITEM + { + command = EGSXDMPluginCmdExitFromSL; + txt = qtn_options_exit; + }, + MENU_ITEM + { + command = EAknCmdExit; + txt = qtn_options_exit; + } + }; + } + +//---------------------------------------------------- +// +// r_gs_xdm_new_settings_menu +// case menu +// +//---------------------------------------------------- +// +RESOURCE MENU_PANE r_gs_xdm_new_settings_menu + { + items = + { + MENU_ITEM + { + command = EGSXDMPluginCmdNewDefault; + txt = qtn_xdm_options_new_sub_default; + }, + MENU_ITEM + { + command = EGSXDMPluginCmdNewExisting; + txt = qtn_xdm_options_new_sub_existing; + } + }; + } + +//---------------------------------------------------- +// +// r_gs_xdm_main_view_title +// XDM view's title. +// +//---------------------------------------------------- +// +RESOURCE TITLE_PANE r_gs_xdm_main_view_title + { + txt = qtn_xdm_title; + } + +//---------------------------------------------------- +// +// r_gs_xdm_main_view +// XDM plugin main view. +// +//---------------------------------------------------- +// +RESOURCE AVKON_VIEW r_gs_xdm_main_view + { + menubar = r_gs_xdm_settings_main_menubar; + cba = r_xdmui_mainview_softkeys;//R_AVKON_SOFTKEYS_OPTIONS_BACK; + } + +//---------------------------------------------------- +// +// r_xdmui_mainview_softkeys +// XDM plugin main view softkeys. +// +//---------------------------------------------------- +// +RESOURCE CBA r_xdmui_mainview_softkeys + { + flags = 0; + buttons = + { + CBA_BUTTON {id=EAknSoftkeyOptions; txt= text_softkey_option;}, + CBA_BUTTON {id=EAknSoftkeyBack; txt= text_softkey_back;}, + CBA_BUTTON {id=EGSXDMPluginCmdEdit; txt= qtn_msk_edit;} + }; + } + +//---------------------------------------------------- +// +// r_xdmui_mainview_softkeys_sl +// XDM plugin main view softkeys for settings list +// +//---------------------------------------------------- +// +RESOURCE CBA r_xdmui_mainview_softkeys_sl + { + flags = 0; + buttons = + { + CBA_BUTTON {id=EAknSoftkeyOptions; txt= text_softkey_option;}, + CBA_BUTTON {id=EAknSoftkeyBack; txt= text_softkey_back;}, + CBA_BUTTON {id=EGSXDMPluginCmdChange; txt= qtn_msk_change;} + }; + } + +// --------------------------------------------------------- +// +// r_settings +// +// settings list - collection of all setting types +// +// --------------------------------------------------------- +// +RESOURCE LISTBOX r_gs_xdm_main_list + { + flags = EAknListBoxSelectionList; + } + + +// --------------------------------------------------------- +// +// r_settings +// +// settings list - collection of all setting types +// +// --------------------------------------------------------- +// + +RESOURCE AVKON_SETTING_ITEM_LIST r_settings + { + flags = EAknSettingItemIncludeHiddenInOrdinal; + title = qtn_xdm_title; + items = + { + AVKON_SETTING_ITEM + { + identifier = ESettingItemSettingName; + setting_page_resource = r_server_name_editor_page; + name = qtn_xdm_settings_set_name; + compulsory_ind_string = qtn_xdm_compulsory_indicator; + empty_item_text = qtn_xdm_settings_must_define; + }, + AVKON_SETTING_ITEM + { + identifier = ESettingItemAccessPoint; + setting_page_resource = r_accesspoint_editor_page; + name = qtn_xdm_settings_access_point; + compulsory_ind_string = qtn_xdm_compulsory_indicator; + empty_item_text = qtn_xdm_settings_must_define; + }, + AVKON_SETTING_ITEM + { + identifier = ESettingItemServerAddress; + setting_page_resource = r_server_address_editor_page; + name = qtn_xdm_settings_address; + compulsory_ind_string = qtn_xdm_compulsory_indicator; + empty_item_text = qtn_xdm_settings_must_define; + }, + AVKON_SETTING_ITEM + { + identifier = ESettingItemSipURL; + setting_page_resource = r_sip_url_editor_page; + name = qtn_xdm_settings_sip; + }, + AVKON_SETTING_ITEM + { + identifier = ESettingItemUserID; + setting_page_resource = r_user_id_editor_page; + name = qtn_xdm_settings_username; + compulsory_ind_string = qtn_xdm_compulsory_indicator; + empty_item_text = qtn_xdm_settings_must_define; + }, + AVKON_SETTING_ITEM + { + identifier = ESettingItemPassword; + setting_page_resource = r_password_editor_page; + name = qtn_xdm_settings_password; + empty_item_text = qtn_xdm_text_password; + } + }; + } + +// --------------------------------------------------------- +// +// Settings Pages +// +// defines the AVKON_SETTING_PAGE structures referred to in +// setting_page_resource fields above. +// +// These structures define the way in which the editors used +// to change the setting data are presented. +// +// --------------------------------------------------------- +// +RESOURCE AVKON_SETTING_PAGE r_server_name_editor_page + { + label= qtn_xdm_settings_set_name; + type = EEikCtEdwin; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + editor_resource_id = r_server_name_editor; + } + +RESOURCE AVKON_SETTING_PAGE r_server_address_editor_page + { + label= qtn_xdm_settings_address; + type = EEikCtEdwin; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + editor_resource_id = r_server_address_editor; + } + + +RESOURCE AVKON_SETTING_PAGE r_accesspoint_editor_page + { + label= qtn_xdm_settings_access_point; + type = EEikCtEdwin; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + editor_resource_id = r_accesspoint_editor; + } + +RESOURCE AVKON_SETTING_PAGE r_sip_url_editor_page + { + label= qtn_xdm_settings_sip; + type = EEikCtEdwin; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + editor_resource_id = r_sip_url_editor; + } + +RESOURCE AVKON_SETTING_PAGE r_user_id_editor_page + { + label= qtn_xdm_settings_username; + type = EEikCtEdwin; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + editor_resource_id = r_user_id_editor; + } + +RESOURCE AVKON_SETTING_PAGE r_password_editor_page + { + label= qtn_xdm_settings_password; + type = EEikCtSecretEd; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + editor_resource_id = r_password_editor; + } + +RESOURCE EDWIN r_user_id_editor + { + flags = EEikEdwinAutoSelection | EAknEditorLowerCase | EEikEdwinNoLineOrParaBreaks; + allowed_case_modes = EAknEditorLowerCase | EAknEditorUpperCase; + numeric_keymap=EAknEditorCalculatorNumberModeKeymap; + allowed_input_modes = EAknEditorTextInputMode | EAknEditorNumericInputMode; + default_input_mode = EAknEditorTextInputMode; + special_character_table = R_AVKON_URL_SPECIAL_CHARACTER_TABLE_DIALOG; + default_case = EAknEditorLowerCase; + avkon_flags = EAknEditorFlagLatinInputModesOnly; + width = 0; + lines = 0; + maxlength = KMaxUserIDLength; + } + +RESOURCE SECRETED r_password_editor + { + num_letters = KMaxPasswordLength; + } + +RESOURCE EDWIN r_server_address_editor + { + flags = EEikEdwinAutoSelection | EAknEditorLowerCase | EEikEdwinNoLineOrParaBreaks; + allowed_case_modes = EAknEditorLowerCase | EAknEditorUpperCase; + numeric_keymap=EAknEditorCalculatorNumberModeKeymap; + allowed_input_modes = EAknEditorTextInputMode | EAknEditorNumericInputMode; + default_input_mode = EAknEditorTextInputMode; + special_character_table = R_AVKON_URL_SPECIAL_CHARACTER_TABLE_DIALOG; + default_case = EAknEditorLowerCase; + avkon_flags = EAknEditorFlagLatinInputModesOnly; + width = 0; + lines = 0; + maxlength = KMaxServerAddressLength; + } + +RESOURCE EDWIN r_accesspoint_editor + { + maxlength = KMaxAccessPointNameLength; + } + +RESOURCE EDWIN r_server_name_editor + { + width = 0; + lines = 0; + flags = EEikEdwinNoLineOrParaBreaks; + maxlength = KMaxSettingSetNameLength; + } + +RESOURCE EDWIN r_sip_url_editor + { + width = 0; + lines = 0; + maxlength = KMaxSIPURLLength; + } + + +RESOURCE DIALOG r_confirmation_query + { + flags = EGeneralQueryFlags; + buttons = R_AVKON_SOFTKEYS_YES_NO; + items= + { + DLG_LINE + { + type = EAknCtQuery; + id = EGeneralQuery; + control = AVKON_CONFIRMATION_QUERY + { + layout =EConfirmationQueryLayout; + }; + } + }; + } + +//---------------------------------------------------- +// +// string resouces +// the strings can be localized in loc file +// +//---------------------------------------------------- +// +RESOURCE TBUF r_str_xdm_settings { buf = qtn_xdm_title; } +RESOURCE TBUF r_str_xdm_compulsory { buf = qtn_selec_setting_compulsory; } +RESOURCE TBUF r_str_xdm_must_define { buf = qtn_poc_settings_must_define; } +RESOURCE TBUF r_str_xdm_use_existing { buf = qtn_xdm_propmt_use_exist; } +RESOURCE TBUF r_str_xdm_empty_text { buf = qtn_xdm_main_empty_info_text; } +RESOURCE TBUF r_str_xdm_empty_text_sec { buf = qtn_xdm_main_empty_info_text_secondary; } +RESOURCE TBUF r_str_xdm_new_set { buf = qtn_xdm_text_new_set; } +RESOURCE TBUF r_str_xdm_new_set_many { buf = qtn_xdm_text_new_set_many; } +RESOURCE TBUF r_str_xdm_conf_delete_last { buf = qtn_xdm_conf_delete_last; } +RESOURCE TBUF r_str_xdm_conf_delete { buf = qtn_query_common_conf_delete; } +RESOURCE TBUF r_str_xdm_conf_compulsory { buf = qtn_xdm_compulsory_query_info_text; } +RESOURCE TBUF r_str_xdm_title_pane_text { buf = qtn_xdm_title; } +RESOURCE TBUF r_str_xdm_name_already_exist { buf = qtn_xdm_set_already_exist_info; } +RESOURCE TBUF r_str_xdm_ap_name_for_debug_only { buf = qtn_xdm_settings_access_point;} + +// ****** PDATA RESOURCES END ****** +//End of File diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/group/XDMPlugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/group/XDMPlugin.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2005-2007 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: This is project specification file for GS XDMPlugin. +* +*/ + + + + +#include +#include + +CAPABILITY CAP_ECOM_PLUGIN +TARGET gsxdmplugin.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x10207428 +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE XDMPluginImplementationTable.cpp +SOURCE XDMPlugin.cpp +SOURCE XDMPluginContainer.cpp +SOURCE SettingsData.cpp +SOURCE XDMPluginSettinglist.cpp +SOURCE XDMPluginSLContainer.cpp + +USERINCLUDE ../inc +USERINCLUDE ../data + +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom + +SOURCEPATH ../data + +//ECOM resource definition +START RESOURCE 10207428.rss + TARGET gsxdmplugin.rsc +END // ECOM resource definition + +//XDMPlugin resources +START RESOURCE XDMPluginRsc.rss + HEADER + TARGETPATH RESOURCE_FILES_DIR + LANGUAGE_IDS +END // XDMPlugin resources + +LIBRARY euser.lib +LIBRARY ecom.lib +LIBRARY efsrv.lib +LIBRARY avkon.lib +LIBRARY bafl.lib +LIBRARY cone.lib +LIBRARY eikcoctl.lib +LIBRARY eikcore.lib +LIBRARY eikctl.lib +LIBRARY commonengine.lib//For RConeResourceLoader + +LIBRARY egul.lib // CGulIcon +LIBRARY aknskins.lib // AknsUtils.h +LIBRARY apsettingshandlerui.lib // access point UI +LIBRARY commdb.lib +LIBRARY apengine.lib //AP engine +LIBRARY xdmsettingsapi.lib +LIBRARY gsecomplugin.lib //GS Ecom plugin +LIBRARY agentdialog.lib // To show access points only in emulator + +LIBRARY featmgr.lib // Feature Manager +LIBRARY hlplch.lib // HlpLauncher +LIBRARY inetprotutil.lib // conversions + +// This is optional - used only by Codewarrior for convenience. +DOCUMENT 10207428.rss +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/group/XDMPluginIcons.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/group/XDMPluginIcons.mk Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,71 @@ +# +# Copyright (c) 2005 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: XDM Settings UI +# + +ifeq (WINS,$(findstring WINS, $(PLATFORM))) +ZDIR=\epoc32\release\$(PLATFORM)\$(CFG)\Z +else +ZDIR=\epoc32\data\z +endif + +# ---------------------------------------------------------------------------- +# TODO: Configure these +# ---------------------------------------------------------------------------- + +TARGETDIR=$(ZDIR)\resource\apps +HEADERDIR=\epoc32\include +ICONTARGETFILENAME=$(TARGETDIR)\gsxdmplugin.mif +HEADERFILENAME=$(HEADERDIR)\gsxdmplugin.mbg + +do_nothing : + @rem do_nothing + +MAKMAKE : do_nothing + +BLD : do_nothing + +CLEAN : do_nothing + +LIB : do_nothing + +CLEANLIB : do_nothing + +# ---------------------------------------------------------------------------- +# TODO: Configure these. +# +# NOTE 1: DO NOT DEFINE MASK FILE NAMES! They are included automatically by +# MifConv if the mask detph is defined. +# +# NOTE 2: Usually, source paths should not be included in the bitmap +# definitions. MifConv searches for the icons in all icon directories in a +# predefined order, which is currently \s60\icons, \s60\bitmaps2, \s60\bitmaps. +# The directory \s60\icons is included in the search only if the feature flag +# __SCALABLE_ICONS is defined. +# ---------------------------------------------------------------------------- + +RESOURCE : + mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \ + /c8,8 qgn_prop_set_conn_xdm.bmp + + +FREEZE : do_nothing + +SAVESPACE : do_nothing + +RELEASABLES : + @echo $(HEADERFILENAME)&& \ + @echo $(ICONTARGETFILENAME) + +FINAL : do_nothing diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2005-2007 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: Build information file GS XDM Plugin +* +*/ + + + + +#include + +#ifdef __XDM + +// Platforms +PRJ_PLATFORMS +DEFAULT +// Help exports +#include "../help/group/bld.inf" + +PRJ_EXPORTS +// IBYs +../rom/GSXDMPlugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(gsxdmplugin.iby) +../rom/GSXDMPluginResources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(gsxdmpluginresources.iby) +// LOC +../loc/gsxdmplugin.loc MW_LAYER_LOC_EXPORT_PATH(gsxdmplugin.loc) + +PRJ_EXTENSIONS +START EXTENSION s60/mifconv + OPTION TARGETFILE gsxdmplugin.mif + OPTION HEADERFILE gsxdmplugin.mbg + OPTION SOURCES -c8,8 qgn_prop_set_conn_xdm +END + + +// MMP Files +PRJ_MMPFILES +XDMPlugin.mmp + +PRJ_TESTMMPFILES +//../internal/tsrc/test/group/ut_xdmplugin.mmp + + +#endif //__XDM + +// End of File + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/help/data/xhtml.zip Binary file XDMSettingsUI/help/data/xhtml.zip has changed diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/help/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/help/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 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: +* Export help related files. +* +*/ + +#include +PRJ_EXPORTS +:zip ../data/xhtml.zip /epoc32/data/z/resource/ overwrite +:zip ../data/xhtml.zip /epoc32/winscw/c/resource/ overwrite + +../inc/xdm.hlp.hrh MW_LAYER_PLATFORM_EXPORT_PATH(csxhelp/xdm.hlp.hrh) +../rom/xdmsettingsuihelps_variant.iby CUSTOMER_APP_LAYER_IBY_EXPORT_PATH(xdmsettingsuihelps_variant.iby) diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/help/inc/xdm.hlp.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/help/inc/xdm.hlp.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 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: +* +*/ + +// +// xdm.hlp.hrh generated by CSXHelp Utilities. +// + +#ifndef __XDM_HLP_HRH__ +#define __XDM_HLP_HRH__ + +_LIT(KXDM_HLP_LIST_VIEW, "XDM_HLP_LIST_VIEW"); // +_LIT(KXDM_HLP_EDIT_SET, "XDM_HLP_EDIT_SET"); // + +#endif \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/help/rom/xdmsettingsuihelps_variant.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/help/rom/xdmsettingsuihelps_variant.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 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: +* +*/ + +#ifndef __XDMSETTINGSUIHELPS_VARIANT_IBY__ +#define __XDMSETTINGSUIHELPS_VARIANT_IBY__ + +#if defined(FF_S60_HELPS_IN_USE) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10207429/contents.zip, RESOURCE_FILES_DIR/xhtml/%02d/0x10207429/contents.zip) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10207429/index.xml, RESOURCE_FILES_DIR/xhtml/%02d/0x10207429/index.xml) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10207429/keywords.xml, RESOURCE_FILES_DIR/xhtml/%02d/0x10207429/keywords.xml) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10207429/meta.xml, RESOURCE_FILES_DIR/xhtml/%02d/0x10207429/meta.xml) +#endif + +#endif \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/inc/SettingsData.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/inc/SettingsData.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2005-2007 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: XDM GS plugin data holding class for XDM setting list +* +*/ + + + + +#ifndef __SettingsData_H__ +#define __SettingsData_H__ + +// INCLUDE FILES +#include +#include + +#include "XDMPlugin.hrh" + + +/** +* CSettingsData data holding class for an XDM set +*/ +class CSettingsData : public CBase + { + public: + + /** + * Default 1st phase factory method. + * Creates an instance of CSettingsData + */ + static CSettingsData* NewL(); + + /** + * Default 1st phase factory method. + * Creates an instance of CSettingsData, leaves it on stack + */ + static CSettingsData* NewLC(); + + /** + * Destructor + */ + virtual ~CSettingsData(); + + /** + * Resets all data to initial values + */ + void Reset(); + + private: + + /** + * 2nd Phase constructor + */ + void ConstructL(); + + /** + * C++ Constructor + */ + CSettingsData(); + + public: + + // Buffer holding the XDM set name + TBuf iSettingName; + + // Buffer holding the XDM set name with localized digits for display + TBuf iSettingNameDisp; + + // Buffer holding the XDM set server address + TBuf iServerAddress; + + // Access point number + TInt32 iAccessPoint; + + // Buffer holding the access point number as a descriptor + TBuf iAccessPointDes; + + // Buffer holding the SIP URL + TBuf iSipURL; + + // Buffer holding the User ID + TBuf iUserID; + + // Buffer holding the password + TBuf iPassword; + + // Buffer holding the access point name + TBuf iAccessPointName; + + // XDM setting, settings id, used to identify in XDM settings API + TInt32 iSettingId; + }; + +#endif // __SettingsData_H__ \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/inc/XDMExternalInterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/inc/XDMExternalInterface.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2005 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: Header file with UID definitions + * +*/ + + + +#ifndef XDMEXTERNALINTERFACE_H +#define XDMEXTERNALINTERFACE_H + +#include +#include +#include +#include "XDMPlugin.h" +#define XDM_PLUGIN + +/** +* This UID is used for both the view UID and the ECOM plugin implementation +* UID. +*/ +const TUid KGSXDMPluginUid = { 0x10207429 }; + +// View UIDs +const TUid KViewId= {0x1028236B}; + +#endif // XDMEXTERNALINTERFACE_H + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/inc/XDMPlugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/inc/XDMPlugin.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,184 @@ +/* +* Copyright (c) 2005-2007 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: XDM GS plugin, UI(CAknView) interface header +* +*/ + + + + +#ifndef GS_XDMPLUGIN_H +#define GS_XDMPLUGIN_H + +// INCLUDES +#include +#include +#include +#include + +#include "XDMPlugin.hrh" + +// FORWARD DECLARATIONS +class CXDMPluginContainer; +class CXDMPluginSLContainer; +class CAknViewAppUi; +class CSettingsData; + +/** +* This UID is used for both the view UID and the ECOM plugin implementation +* UID. +*/ +//const TUid KGSXDMPluginUid = { 0x10207429 }; + +// CLASS DECLARATION + +/** +* CXDMPlugin view class (CAknView). +* +* This is XDM GS plugin. +*/ +class CXDMPlugin : public CGSPluginInterface + { + + public: // Constructors and destructor + + /** + * Symbian OS two-phased constructor + * @return + */ + static CXDMPlugin* NewL( TAny* aInitParams ); + + /** + * Destructor. + */ + ~CXDMPlugin(); + + /** + * Load the SettingsView with specified XDM set and type of loading + * The types are EEditExisting, ENewDefault, ENewFromExisting + */ + void LoadSettingsViewL(TXDMSettingsViewType aType, TDesC& aXDMSetName); + + /** + * Loads the Main View where list of XDM sets are visible + */ + void LoadMainViewL(); + + /** + * Manual resource change method + * @param aType ype of resource + */ + void HandleResourceChangeManual(TInt aType); + + /** + * Hides MSK if not needed + */ + void UpdateMskL(); + + public: // From CAknView + + /** + * This function is used for identifying the plugin + */ + TUid Id() const; + + /** + * See CAknView + */ + //void HandleClientRectChange(); + void HandleViewRectChange(); + + /** + * See CAknView + */ + void DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ); + /** + * See CAknView + */ + void DoDeactivate(); + + /** + * See CAknView + */ + void HandleCommandL( TInt aCommand ); + + + + protected: + + /** + * C++ default constructor. + */ + CXDMPlugin( ); + + /** + * Symbian OS default constructor. + */ + void ConstructL(); + + private: + + /** + * See base classes + */ + void DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane); + + public: // From CGSPluginInterface + + /** + * See CGSPluginInterface + */ + void GetCaptionL( TDes& aCaption ) const; + + /** + * See CGSPluginInterface + */ + TInt PluginProviderCategory() const; + + /** + * @see CGSPluginInterface + */ + CGulIcon* CreateIconL( const TUid aIconType ); + + + protected: //Data + + // Reference to application UI - not owned. + CAknViewAppUi* iAppUi; + + // RConeResourceLoader + RConeResourceLoader iResources; + + // Previous View ID + TVwsViewId iPrevViewId; // Previous view. + + private: + + // Pointer to the main list container - owned + CXDMPluginContainer* iMainListContainer; + + // Pointer to the setting list container - owned. + CXDMPluginSLContainer* iSettingListContainer; + + // Pointer to the current container - not owned. + CCoeControl* iCurrentContainer; + +#ifdef _DEBUG + friend class UT_CXDMPluginContainer; +#endif + }; + +#endif // GS_XDMPLUGIN_H diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/inc/XDMPlugin.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/inc/XDMPlugin.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2009-2010 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: XDM Settings enumerations +* +*/ + + +#ifndef XDM_PLUGIN_HRH +#define XDM_PLUGIN_HRH + +/** + * TSettingItems - identifiers for individual setting items + */ +enum TSettingItems + { + ESettingItemSettingName = 1, + ESettingItemAccessPoint, + ESettingItemServerAddress, + ESettingItemSipURL, + ESettingItemUserID, + ESettingItemPassword + }; + +/** + * TGSXDMPluginCommandIds - GSXDMPlugin menu commands + */ +enum TGSXDMPluginCommandIds + { + EGSXDMPluginCmdChange = 0x06000, + EGSXDMPluginCmdEdit, + EGSXDMPluginCmdNewSettings, + EGSXDMPluginCmdNewExisting, + EGSXDMPluginCmdNewDefault, + EGSXDMPluginCmdDelete, + EGSXDMPluginCmdExitFromSL + }; + +/** + * TXDMSettingsViewType - Used inside UI to differentiate + * different kinds of editing + */ +enum TXDMSettingsViewType + { + EEditExisting, + ENewDefault, + ENewFromExisting + }; + +/** + * Constants used in application + */ +enum TXDMSettingsIndex + { + ESettingNameIndex = 0, + EAccessPointIndex, + EServerAddressIndex, + ESipURLIndex, + EUserIDIndex, + EPasswordIndex + }; + +/** + * Constants used in resources and in application + */ +#define KMaxSettingSetNameLength 32 +#define KMaxSettingSetNameArrayGran 10 +#define KMaxUserIDLength 100 +#define KMaxServerAddressLength 100 +#define KMaxPasswordLength 100 +#define KMaxSIPURLLength 100 +#define KMaxAccessPointNameLength 32 +#define KMaxAccessPointDesLength 32 +#define KMaxMessageToDisplayLength 100 + + +#endif // XDM_PLUGIN_HRH diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/inc/XDMPluginContainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/inc/XDMPluginContainer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,230 @@ +/* +* Copyright (c) 2005-2007 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: XDM GS plugin main list container. +* +*/ + + + + +#ifndef GS_XDMPLUGIN_CONTAINER_H +#define GS_XDMPLUGIN_CONTAINER_H + +// INCLUDES +#include +#include +#include +#include +#include +#include + +#include "XDMPlugin.hrh" + + +// FORWARD DECLARATION +class CGSListBoxItemTextArray; +class CEikTextListBox; +class CAknSingleStyleListBox; +class CXDMPluginMainList; +class CAknColumnListBox; +class CAknViewAppUi; +class CXDMPlugin; +class CMainView; + +// CLASS DECLARATION + +/** +* CXDMPluginContainer main list container class +*/ +class CXDMPluginContainer : public CCoeControl, + public MEikListBoxObserver, + public MEikMenuObserver + { + public: // Constructors and destructor + + /** + * Constructor + */ + CXDMPluginContainer(CAknView* aView); + + /** + * Symbian OS constructor. + * + * @param aRect Listbox's rect. + */ + void ConstructL( const TRect& aRect ); + + /** + * Destructor. + */ + ~CXDMPluginContainer(); + + public: // From CCoeControl + + /** + * See CCoeControl + */ + TInt CountComponentControls() const; + + /** + * See CCoeControl + */ + CCoeControl* ComponentControl( TInt aIndex ) const; + + /** + * See CCoeControl + */ + TKeyResponse OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType ); + + /** + * See CCoeControl + */ + void SizeChanged(); + + /** + * See CCoeControl + */ + void HandleResourceChange( TInt aType ); + + /** + * Gets help context + */ + void GetHelpContext( TCoeHelpContext& aContext ) const; + + /** + * See CCoeControl + */ + void FocusChanged(TDrawNow aDrawNow); + + + public: // own methods + + /** + * Invokes editing on current item, in response to UI Edit command + */ + void EditCurrentItemL(); + + /** + * See MEikListBoxObserver + */ + void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType); + + /** + * From MEikMenuObserver + */ + void SetEmphasis( CCoeControl* /*aMenuControl*/, TBool /*aEmphasis*/ ){}; + + + /** + * From MEikMenuObserver + */ + void ProcessCommandL( TInt /*aCommandId*/ ){}; + + /** + * Finds whether main list is empty + * @return ETrue if main list is empty. + */ + TBool IsListEmpty(); + + /** + * Finds whether the current item is the last item in main list + * @return ETrue if current item is last in main list. + */ + TBool IsLastItem(); + + /** + * Delete the currently focused set. Also deletes it using XDM API + */ + void DeleteCurrentSetL(); + + /** + * Load the main list using XDM API, and perform other necessary tasks + */ + void LoadSettingsListArrayL(); + + /** + * Get the name of currently focused set. Usually called by UI. + * The pointer to buffer remains on heap, which is deleted by caller. + * @return HBufC* pointer to currently focused set name + */ + HBufC* GetCurrentSetNameLC(); + + /** + * This function starts the deleting current XDM set. All sub functions + * are called through this function. + */ + void DeleteSetProcedureL(); + + /** + * This function does necessary action on layout change, it is called from + * actual resource change function. + * @param aType type of resource + */ + void HandleResourceChangeManual(TInt aType); + + /** + * Set the focus to the given set name if it exist + * @param aSetName Set name to set focus + */ + void SetFocusIfExist(TDes& aSetName); + + + private: // own methods + + /** + * Perform the initial setup of the main list. Called by Constructor + */ + void SetupListL(); + + /** + * Get the Setting ID of the current set + * @return TInt setting ID of the current set + */ + TInt CXDMPluginContainer::GetCurrentSetIdL(); + + /** + * Load XDM Collection names with trap, useful when list doesnt have anything + * @param Reference to setting ids + * @return CDesCArray collection names + */ + CDesCArray* LoadCollectionNamesL(RArray& aSettingIDs); + + + + private: // data + + // Pointer to the main list, owned + CAknColumnListBox* iMainList; + + // Pointer to the application view, not owned + CAknView* iView; // not owned + + // The XDM set names list array, not owned + CDesCArray* iSettingListArray; + + // Buffer for holding new XDM set name + TBuf iSettingNewName; + + // Title for menu pane + TBuf iTitle; + + // Pointer to title pane, not owned + CAknTitlePane* iTitlePane; + + // Menubar, owned + CEikMenuBar* iEikMenuBar; + }; + +#endif //GS_XDMPLUGIN_CONTAINER_H diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/inc/XDMPluginSLContainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/inc/XDMPluginSLContainer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,306 @@ +/* +* Copyright (c) 2005-2010 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: XDM GS plugin Settings list container. +* +*/ + + + + +#ifndef GS_XDMPLUGIN_SL_CONTAINER_H +#define GS_XDMPLUGIN_SL_CONTAINER_H + +// INCLUDES +#include +#include +#include +#include + +#include "XDMPlugin.hrh" + +// FORWARD DECLARATION +class CGSListBoxItemTextArray; +class CEikTextListBox; +class CSettingsData; +class CXDMPluginSettinglist; +class CAknColumnListBox; +class CAknViewAppUi; + +/** +* CXDMPluginSLContainer Settings list container class +*/ +class CXDMPluginSLContainer : public CCoeControl, MEikListBoxObserver + { + public: + + /** + * C++ Constructor + */ + CXDMPluginSLContainer(CAknView* aView); + + /** + * Symbian OS constructor. + * @param aRect Listbox's rect. + */ + void ConstructL( const TRect& aRect); + + /** + * Destructor. + */ + ~CXDMPluginSLContainer(); + + public: // From CCoeControl + + /** + * See CCoeControl. + */ + TInt CountComponentControls() const; + + /** + * See CCoeControl. + */ + CCoeControl* ComponentControl( TInt aIndex ) const; + + /** + * See CCoeControl. + */ + TKeyResponse OfferKeyEventL( + const TKeyEvent& aKeyEvent, TEventCode aType ); + + /** + * See CCoeControl. + */ + void SizeChanged(); + + /** + * See CCoeControl. + */ + void Draw(const TRect& aRect) const; + + /** + * See CCoeControl + */ + void HandleResourceChange( TInt aType ); + + /** + * Gets help context + */ + void GetHelpContext( TCoeHelpContext& aContext ) const; + + /** + * See CCoeControl + */ + void FocusChanged(TDrawNow aDrawNow); + + public: + + /** + * Edit currently focused item on settings list. called from UI + */ + void EditCurrentItemL(); + + /** + * See MEikListBoxObserver + */ + void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType); + + /** + * Prepare the XDM set with given name for editing + * @param aXDMSetName reference to the XDM set name to be edited + */ + void PrepareXDMSetForEditingL(TDesC& aXDMSetName); + + /** + * Prepare the a new XDM set with default values + * @param none + */ + void PrepareXDMSetNewDefaultL(); + + /** + * Prepare the a new XDM set with values from an existing set + * @param aXDMSetName reference to the new XDM set name + */ + void PrepareNewXDMSetFromExistingL(TDesC& aXDMSetName); + + /** + * Display the dialog to the user to select the creation of new set + * from existing sets. Saves the selected name to iData + * @return ETrue if user has choosen a set, return EFalse if user cancels + */ + TBool DisplayNewXDMSetOptionsL(); + + /** + * Called by the UI when back button is pressed, to perform needed steps + * @return ETrue if settings list is allowed to close + */ + TBool IsExitProcessingOKL(); + + /** + * Handle manual resource change with its type + * @param aType, type of resource + */ + void HandleResourceChangeManual(TInt aType); + + /** + * Save settings if possible, without any user interaction. + * this is useful for force exit, e.g. when mmc taken out + */ + void SaveSettingsIfPossibleL(); + + /** + * Return the name of current set in iData + * @return TDes reference to current set + */ + TDes& GetCurrentSetName(); + + /** + * Returns ETrue is AP used by XDM settings is in use + * @return ETrue if ap in use + */ + TBool SettingsApInUseL(TDesC& aXDMSetName); + + + private: // Most of these methods perform operations using iData + + /** + * Sets the title pane text with given discriptor + * @param aTitleText text to be shown on title pane + */ + void SetTitlePaneTextL( const TDesC& aTitleText ) const; + + /** + * Finds out whether compulsory items are filled + * @return ETrue if compulsory items are filled + */ + TBool AreCompulsoryItemsFilled(); + + /** + * Display a query dialog to user that compulsory settings are not + * filled, and if user wants to delete the settings + * @return ETrue if user wants to delete the settings + */ + TBool DisplayDeleteOrDontSaveDialogL(); + + /** + * Update an XDM set if it already exist or create it if it doesnt exist + * @param aShowDialog whether dialog will be displayed or not + * @return ETrue if save procedure goes ok + */ + TBool SaveOrCreateAndSaveXDMSetL(TBool aShowDialog); + + /** + * Deletes the XDM set if it exist in the XDM settings API + */ + void DeleteXDMSetIfExistL(); + + /** + * Gets the setting id of the given set name + * @param aXDMSetName reference to XDM set name + * @return settingid of the given xdm set + */ + TInt GetSettingIdL(TDesC& aXDMSetName); + + /** + * If the given XDM set name with given ID is exist or not + * @param aXDMSetName reference to XDM set name + * aSettingId settings id of the XDM + * @return ETrue of XDM set exist with given name + */ + TBool IsXDMSetNameExistL(TDesC& aXDMSetName, TInt32& aSettingId); + + /** + * Load XDM Collection names with trap, useful when list doesnt have anything + * @param Reference to setting ids + * @return CDesCArray collection names + */ + CDesCArray* LoadCollectionNamesL(RArray& aSettingIDs, TBool aDisp); + + /** + * Check the given name and returns the possible altered name. NULL + * pointer is returned no change is needed in aName, so aName can be + * used if NULL pointer is returned. If some valid pointer is returned + * then that pointer is owned by client, and needed to be deleted after + * usage. + * @param aName, the name from which to start suggestion. + * @param aChanged, returns ETrue if an alternate name is returned. + * @return HBufC* pointer to the new name, can be NULL if not needed. + */ + HBufC* DoMakeValidNameL(HBufC* aName, TBool& aChanged); + + /** + * Ensures that the passed name is valid, length > 0 & length < max. + * If length == 0, leaves with KErrInvalidName + * If name is only whitespace, leaves with KErrInvalidName + * If name is longer than max, name is truncated + * It copies the name, pushes it onto the CleanupStack and passes + * ownership. + + * @param aName The name + * @param aChanged A reference to a boolean to hold whether the name + * had been changed or not. + * @return The valid-length name + */ + HBufC* EnsureMaxLengthLC( const TDesC* aName, TBool& aChanged); + + /** + * Given aName in the format or + * , return a + * pointer to the leading part. That is, if there is + * trailing , then that is excluded; + * if there is no trailing part, then the original + * decriptor is returned. + * Examples: + * - "Foo" returns "Foo"; + * - "Foo 12" returns "Foo 12"; + * - "Foo(12)" returns "Foo"; + * - "Foo 12 (34)" returns "Foo 12 "; + * - "Foo bar" returns "Foo bar"; + * - "Foo " returns "Foo ". + * @param aName The name to get the prefix from + * @return The prefix + */ + TPtrC GetPrefix( const TDesC& aName ); + + + /** + * If aName is constructed from aPrefix with a postfix, get the numeric + * value of the postfix, e.g: + * - GetPostfix( "Foo (3)", "Foo" ) == 3 + * - GetPostfix( "Foo 23 (45)", "Foo 23" ) == 45 + * If aName is the same as aPrefix, return 0, e.g.: + * - GetPostfix( "Foo", "Foo" ) == 0 + * If aName is not constructed from aPrefix, return -1, e.g.: + * - GetPostfix( "Foobar", "Foo" ) == -1 + * - GetPostfix( "Fo 23 45", "Foo" ) == -1 + * @param aName The name to get the postfix from + * @param aPrefix The prefix + * @return The postfix + */ + TInt GetPostfix( const TDesC& aName, const TDesC& aPrefix ); + + + private: // data + + // CXDMPluginSettinglist owned + CXDMPluginSettinglist* iSettingList; + + // Pointer to settings data owned + CSettingsData* iData; + + // Pointer to the application view, not owned + CAknView* iView; // not owned + + }; + +#endif //GS_XDMPLUGIN_SL_CONTAINER_H diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/inc/XDMPluginSettinglist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/inc/XDMPluginSettinglist.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2005-2010 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: XDM GS plugin, Setting List class +* +*/ + + + + +#ifndef CXDMPLUGINSETTINGLIST_H +#define CXDMPLUGINSETTINGLIST_H + +// INCLUDE FILES +#include +#include +#include + +// FORWARD DECLARATIONS +class CSettingsData; + +/** +* CXDMPluginSettinglist derived from CAknSettingItemList +*/ +class CXDMPluginSettinglist : public CAknSettingItemList + { + + public: + + /** + * Symbian OS two-phased constructor + * @param reference to CSettingsData from which data to be displayed + */ + static CXDMPluginSettinglist* NewL(CSettingsData &aData); + + /** + * Symbian OS two-phased constructor, leave pointer to stack + * @param reference to CSettingsData from which data to be displayed + */ + static CXDMPluginSettinglist* NewLC(CSettingsData &aData); + + /** + * Destructor. + */ + virtual ~CXDMPluginSettinglist(); + + /** + * Inherited from base classes. See CCoeControl + */ + void SizeChanged(); + + /** + * Edit the indexed item. This probably came as a result of UI command + * @param aIndex index to the item + * aCalledFromMenu ETrue of this call resulted from UI command + */ + void EditItemL (TInt aIndex, TBool aCalledFromMenu); + + /** + * Actual editing of item done here, from whereever the call is made from + */ + void EditCurrentItemL(); + + /** + * Gets the Access point name + * @param aAP Access point number as integer + * aAccessPoint reference to TDes, doesnt change if AP not found + * otherwise access point name returns here + */ + void GetAccessPointNameL(TInt32 aAP, TDes& aAccessPoint); + + /** + * For checking if access point is in use + * @param aAP Access point number as integer + * return ETrue if access point is in use + */ + TBool IsAccessPointInUseL(TInt32 aAP); + + /** + * Sets the focus to the first item of the settings list + */ + void ResetItemIndex(); + + private: + + /** + * C++ constructor + * @param reference to CSettingsData + */ + CXDMPluginSettinglist(CSettingsData &aData); + + /** + * See CAknSettingItemList + */ + CAknSettingItem* CreateSettingItemL (TInt aSettingId); + + /** + * Edit the AccessPoint, We edit the access point differently than other + * settings. We bypass the list's text editor and open the S60 standard + * access point editor + */ + void EditAccessPointL(); + + /** + * Saves the changed settings to the list's data + * @param aIndex index of the setting to be saved + */ + void SaveSettingL(TInt aIndex); + + /** + * Sets the title pane text with given discriptor + * @param aTitleText text to be shown on title pane + */ + void SetTitlePaneTextL( const TDesC& aTitleText ) const; + + private: + + // Reference to the data owned by container + CSettingsData& iSettingsData; + + }; + +#endif // CXDMPLUGINSETTINGLIST_H diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/loc/GSXDMPlugin.loc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/loc/GSXDMPlugin.loc Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,185 @@ +/* +* Copyright (c) 2005 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: Localization strings for GS XDM Plugin +* +*/ + + + + +// LOCALISATION STRINGS + +//d:Caption string for AIF file (short) +//d:GS XDM Settings plugin +//l:cell_app_pane_t1 +//r:3.0 +#define qtn_apps_xdm_grid "XDMSettingsApp" + +//d:Caption string for AIF file (long) +//d:GS XDM Settings plugin +//l:list_single_large_graphic_pane_t1 +//r:3.0 +#define qtn_apps_xdm_list "XDMSettingsApp" + +//d:Popup confirmation dialog text when deleting the last XDM set of the list +//d:GS XDM Settings plugin +//l:popup_note_window +//r:3.1 +#define qtn_xdm_conf_delete_last "%U is the last XDM set. Are you sure to delete it?" + +//d:Popup confirmation dialog text when deleting a XDM set, not the last. +//d:GS XDM Settings plugin +//l:popup_note_window +//r:3.1 +#define qtn_xdm_conf_delete "Delete %U?" + +//d:Menu Item use existing set +//d:GS XDM Settings plugin +//l:heading_pane_t1 +//r:3.1 +#define qtn_xdm_propmt_use_exist "Use existing set" + +//d:Menu Item to change a specific setting in an XDM set +//d:GS XDM Settings plugin +//l:list_single_pane_t1_cp2 +//r:3.1 +#define qtn_xdm_settings_change "Change" + +//d:Default text in password setting field +//d:GS XDM Settings plugin +//l:list_set_graphic_pane_t1 +//r:3.1 +#define qtn_xdm_text_password "****" + +//d:Title for password setting field +//d:GS XDM Settings plugin +//l:list_setting_pane_t1 +//r:3.1 +#define qtn_xdm_settings_password "HTTP password" + +//d:Title for SIP setting field +//d:GS XDM Settings plugin +//l:list_setting_pane_t1 +//r:3.1 +#define qtn_xdm_settings_sip "SIP in use" + +//d:Title for user id settings +//d:GS XDM Settings plugin +//l:list_setting_pane_t1 +//r:3.1 +#define qtn_xdm_settings_username "HTTP username" + +//d:Title of the service address setting field +//d:GS XDM Settings plugin +//l:list_setting_pane_t1 +//r:3.1 +#define qtn_xdm_settings_address "XDM service address" + +//d:Default text in compulsory setting fields +//d:GS XDM Settings plugin +//l:list_set_graphic_pane_t1 +//r:3.1 +#define qtn_xdm_settings_must_define "Must be defined" + +//d:Title of the access point setting field +//d:GS XDM Settings plugin +//l:list_setting_pane_t1 +//r:3.1 +#define qtn_xdm_settings_access_point "Access point" + +//d:Default xdm set name +//d:GS XDM Settings plugin +//l:list_set_graphic_pane_t1 +//r:3.1 +#define qtn_xdm_text_new_set_many "New XDM set(%N)" + +//d:Menu item for setting up a new XDM set +//d:GS XDM Settings plugin +//l:list_single_pane_t1_cp2 +//r:3.1 +#define qtn_xdm_text_new_set "New XDM set" + +//d:Title of XDM set name setting +//d:GS XDM Settings plugin +//l:list_setting_pane_t1 +//r:3.1 +#define qtn_xdm_settings_set_name "XDM set name" + +//d:Menu item delete, to delete an specific XDM set +//d:GS XDM Settings plugin +//l:list_single_pane_t1_cp2 +//r:3.1 +#define qtn_xdm_options_delete "Delete" + +//d:Title of the popup sub menu +//d:GS XDM Settings plugin +//l:list_single_popup_submenu_pane_t1 +//r:3.1 +#define qtn_xdm_options_new_sub_existing "Use existing set" + +//d:Menu item to edit an XDM set +//d:GS XDM Settings plugin +//l:list_single_pane_t1_cp2 +//r:3.1 +#define qtn_xdm_options_edit_set "Edit XDM set" + +//d: Menu Item to use default set template for a new set +//d:GS XDM Settings plugin +//l:list_single_popup_submenu_pane_t1 +//r:3.1 +#define qtn_xdm_options_new_sub_default "Use default set" + +//d:Menu item New XDM set +//d:GS XDM Settings plugin +//l:list_single_pane_t1_cp2/opt3 +//r:3.1 +#define qtn_xdm_options_new_set "New XDM set" + +//d:Compulsory setting item indicator +//d:GS XDM Settings plugin +//l:list_set_graphic_pane_t1 +//r:3.1 +#define qtn_xdm_compulsory_indicator "*" + +//d:XDM sets, empty list primary text +//d:GS XDM Settings plugin +//l:main_pane_empty_t1/opt2 +//r:3.1 +#define qtn_xdm_main_empty_info_text "No XDM settings" + +//d:XDM sets, empty list secondary text +//d:GS XDM Settings plugin +//l:main_list_empty_pane/opt2 +//r:3.1 +#define qtn_xdm_main_empty_info_text_secondary "Create new settings from Options menu" + +//d:Text in main title pane +//d:GS XDM Settings plugin +//l:title_pane_t2/opt12 +//r:3.1 +#define qtn_xdm_title "XDM settings" + +//d:Text in pop up query dialog for reminding compulsory settings +//d:GS XDM Settings plugin +//l:popup_note_window +//r:3.1 +#define qtn_xdm_compulsory_query_info_text "Incomplete XDM setting set. Delete set?" + +//d:Text in info note that a given xdm set name is already exist +//d:GS XDM Settings plugin +//l:popup_note_window +//r:3.1 +#define qtn_xdm_set_already_exist_info "Name already in use: %U" + +//End of file diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/rom/GSXDMPlugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/rom/GSXDMPlugin.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 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: GS XDM Plugin UI +* +*/ + + +#ifndef __GS_XDM_Plugin_IBY__ +#define __GS_XDM_Plugin_IBY__ + +#include +#ifdef __XDM + +//GS plugin in use +#ifdef RD_GS_RENOVATION + +// GS XDM Plugin UI +ECOM_PLUGIN(GSXDMPlugin.dll,10207428.rsc) // this publishes the DLL and the + // resource file to the correct location +data=DATAZ_/BITMAP_DIR/GSXDMplugin.mif BITMAP_DIR/GSXDMplugin.mif + +#endif //RD_GS_RENOVATION + +#endif //__XDM + +#endif //__GS_XDM_Plugin_IBY__ diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/rom/GSXDMPluginResources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/rom/GSXDMPluginResources.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 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: GS XDM Plugin UI Resources +* +*/ + + +#ifndef __GS_XDM_Plugin_Resources_IBY__ +#define __GS_XDM_Plugin_Resources_IBY__ + +#include +#ifdef __XDM + +//GS plugin in use +#ifdef RD_GS_RENOVATION + +// GS XDM Plugin UI + +data=DATAZ_/RESOURCE_FILES_DIR/XDMPluginRsc.RSC RESOURCE_FILES_DIR/XDMPluginRsc.RSC + +#endif //RD_GS_RENOVATION + +#endif //__XDM + +#endif //__GS_XDM_Plugin_Resources_IBY__ diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/src/SettingsData.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/SettingsData.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2005-2007 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: XDM GS plugin data holding class for XDM setting list +* +*/ + + + + +// INCLUDE FILES +#include "SettingsData.h" + +// ----------------------------------------------------------------------------- +// CSettingsData::NewL +// ----------------------------------------------------------------------------- +// +CSettingsData *CSettingsData::NewL() + { + CSettingsData *self = CSettingsData::NewLC(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CSettingsData::NewLC() +// ----------------------------------------------------------------------------- +// +CSettingsData *CSettingsData::NewLC() + { + CSettingsData *self = new (ELeave) CSettingsData(); + CleanupStack::PushL(self); + + self->ConstructL(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CSettingsData::~CSettingsData() +// ----------------------------------------------------------------------------- +// +CSettingsData::~CSettingsData() + { + } + +// ----------------------------------------------------------------------------- +// CSettingsData::CSettingsData() +// ----------------------------------------------------------------------------- +// +CSettingsData::CSettingsData() + { + // initialise local data + Reset(); + } + +// ----------------------------------------------------------------------------- +// CSettingsData::ConstructL() +// ----------------------------------------------------------------------------- +// +void CSettingsData::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CSettingsData::Reset() +// ----------------------------------------------------------------------------- +// +void CSettingsData::Reset() + { + iSettingName = KNullDesC; + iSettingNameDisp = KNullDesC; + iServerAddress = KNullDesC; + iAccessPoint = -1; + iAccessPointDes = KNullDesC; + iSipURL = KNullDesC; + iUserID= KNullDesC; + iPassword = KNullDesC; + iAccessPointName = KNullDesC; + iSettingId = -1; + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/src/XDMPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/XDMPlugin.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,510 @@ +/* +* Copyright (c) 2005-2010 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: XDMPlugin Implementation +* +*/ + + + + +// Includes +#include "XDMExternalInterface.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "XDMPlugin.h" +#include "XDMPluginContainer.h" +#include "XDMPluginSLContainer.h" +#include "XDMPlugin.hrh" + + +// Constants + +const TInt KMaxNameLength = 255; + +_LIT( KGSXDMPluginResourceFileName, "z:\\resource\\XDMPluginRsc.rsc" ); + +#ifdef __SCALABLE_ICONS +// bitmap +_LIT( KGSXDMPluginIconFileName, "\\resource\\apps\\GSXDMplugin.mif"); +#else //__SCALABLE_ICONS +// svg file +_LIT( KGSXDMPluginIconFileName, "\\resource\\apps\\GSXDMplugin.mbm"); +#endif //__SCALABLE_ICONS + + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CXDMPlugin::CXDMPlugin() +// Constructor +// +// --------------------------------------------------------------------------- +// +CXDMPlugin::CXDMPlugin( ) + : iAppUi( CAknView::AppUi() ), iResources( *CCoeEnv::Static() ) + { + + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::~CXDMPlugin() +// Destructor +// --------------------------------------------------------------------------- +// +CXDMPlugin::~CXDMPlugin() + { + if (iCurrentContainer) + { + if(iAppUi) + iAppUi->RemoveFromViewStack( *this, iCurrentContainer ); + iCurrentContainer = NULL; + } + + if( iMainListContainer ) + { + delete iMainListContainer; + iMainListContainer=NULL; + } + + if (iSettingListContainer) + { + delete iSettingListContainer; + iSettingListContainer=NULL; + } + + iResources.Close(); + /** Nice to know when the plugin is cleaned up */ + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPlugin] ~CXDMPlugin()" ) ); + #endif + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::ConstructL() +// Symbian OS two-phased constructor +// --------------------------------------------------------------------------- +// +void CXDMPlugin::ConstructL() + { + // To know if the plugin is loaded (for debugging) + #ifdef _DEBUG + RDebug::Print(_L("[CXDMPlugin] ConstructL()" )); + RDebug::Print( _L( "[CXDMPlugin] Loading resource from :" ) ); + RDebug::Print( KGSXDMPluginResourceFileName ); + #endif + + TFileName fileName( KGSXDMPluginResourceFileName ); + BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName ); + iResources.OpenL( fileName ); + BaseConstructL( R_GS_XDM_MAIN_VIEW ); + + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::NewL() +// Static constructor +// --------------------------------------------------------------------------- +// +CXDMPlugin* CXDMPlugin::NewL( TAny* /*aInitParams*/ ) + { + CXDMPlugin* self = new(ELeave) CXDMPlugin( ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::Id() const +// --------------------------------------------------------------------------- +// +TUid CXDMPlugin::Id() const + { + return KGSXDMPluginUid; + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::HandleClientRectChange() +// --------------------------------------------------------------------------- +void CXDMPlugin::HandleViewRectChange() + { + if ( iMainListContainer->IsVisible() ) + { + iMainListContainer->SetRect( ClientRect() ); + } + + if ( iSettingListContainer->IsVisible() ) + { + iSettingListContainer->SetRect( ClientRect() ); + } + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::DoActivateL() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::DoActivateL( const TVwsViewId& aPrevViewId, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/ ) + { + iPrevViewId = aPrevViewId; + if (iCurrentContainer) + { + iAppUi->RemoveFromViewStack( *this, iCurrentContainer ); + iCurrentContainer = NULL; + } + + + if( iMainListContainer ) + { + delete iMainListContainer; + iMainListContainer=NULL; + } + + if( iSettingListContainer ) + { + delete iSettingListContainer; + iSettingListContainer = NULL; + } + + iMainListContainer = new( ELeave ) CXDMPluginContainer(this); + iMainListContainer->SetMopParent(this); + TRAPD( error, iMainListContainer->ConstructL( ClientRect() ) ); + if (error) + { + delete iMainListContainer; + iMainListContainer = NULL; + User::Leave( error ); + } + + iSettingListContainer = new( ELeave ) CXDMPluginSLContainer(this); + iSettingListContainer->SetMopParent(this); + TRAPD( error1, iSettingListContainer->ConstructL( ClientRect())); + if (error1) + { + delete iSettingListContainer; + iSettingListContainer = NULL; + User::Leave( error1 ); + } + + // switching control + iSettingListContainer->MakeVisible(EFalse); + iCurrentContainer = iMainListContainer; + iAppUi->AddToViewStackL( *this, iCurrentContainer ); + UpdateMskL(); + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::DoDeactivate() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::DoDeactivate() + { + // try to save settings if in settings list container + TInt err; + if (iCurrentContainer == iSettingListContainer) + TRAP(err, iSettingListContainer->SaveSettingsIfPossibleL()); + if (iCurrentContainer) + iAppUi->RemoveFromViewStack( *this, iCurrentContainer ); + iCurrentContainer = NULL; + + if( iMainListContainer ) + { + delete iMainListContainer; + iMainListContainer = NULL; + } + + if( iSettingListContainer ) + { + delete iSettingListContainer; + iSettingListContainer = NULL; + } + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::HandleCommandL() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EAknSoftkeyBack: + if (iCurrentContainer == iSettingListContainer) + { + if (iSettingListContainer->IsExitProcessingOKL()) + LoadMainViewL(); + } + else + iAppUi->ActivateLocalViewL( iPrevViewId.iViewUid ); + break; + case EGSXDMPluginCmdChange: + iSettingListContainer->EditCurrentItemL(); + break; + case EGSXDMPluginCmdEdit: + iMainListContainer->EditCurrentItemL(); + break; + case EGSXDMPluginCmdNewExisting: + if(iSettingListContainer->DisplayNewXDMSetOptionsL()) // if user ok + LoadSettingsViewL(ENewFromExisting, iSettingListContainer->GetCurrentSetName()); + break; + case EGSXDMPluginCmdNewDefault: + LoadSettingsViewL(ENewDefault, iSettingListContainer->GetCurrentSetName()); + break; + case EGSXDMPluginCmdDelete: + iMainListContainer->DeleteSetProcedureL(); + UpdateMskL(); + break; + case EAknCmdHelp: + HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), AppUi()->AppHelpContextL ()); + break; + case EGSXDMPluginCmdExitFromSL: + if (iCurrentContainer == iSettingListContainer) + { + if (iSettingListContainer->IsExitProcessingOKL()) + iAppUi->HandleCommandL( EAknCmdExit ); + } + break; + case EAknCmdExit: + case EEikCmdExit: + if (iCurrentContainer == iSettingListContainer) + iSettingListContainer->SaveSettingsIfPossibleL(); + iAppUi->HandleCommandL( EAknCmdExit ); + break; + default: + iAppUi->HandleCommandL( aCommand ); + break; + } + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::GetCaptionL() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::GetCaptionL( TDes& aCaption ) const + { + StringLoader::Load( aCaption, R_STR_XDM_SETTINGS ); + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::PluginProviderCategory() +// --------------------------------------------------------------------------- +// +TInt CXDMPlugin::PluginProviderCategory() const + { + return KGSPluginProviderInternal; + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::LoadSettingsViewL() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::LoadSettingsViewL(TXDMSettingsViewType aType, TDesC& aXDMSetName) + { + switch(aType) + { + case EEditExisting: + iSettingListContainer->PrepareXDMSetForEditingL(aXDMSetName); + break; + case ENewDefault: + iSettingListContainer->PrepareXDMSetNewDefaultL(); + break; + case ENewFromExisting: + iSettingListContainer->PrepareNewXDMSetFromExistingL(aXDMSetName); + break; + default: + break; + } + if (iCurrentContainer) + iAppUi->RemoveFromViewStack( *this, iCurrentContainer ); + iCurrentContainer = iSettingListContainer; + iAppUi->AddToViewStackL( *this, iCurrentContainer ); + iMainListContainer->MakeVisible(EFalse); + iSettingListContainer->MakeVisible(ETrue); + UpdateMskL(); + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::LoadMainViewL() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::LoadMainViewL() + { + TInt err(KErrNone); + TRAP(err,iMainListContainer->LoadSettingsListArrayL()); // update main container + if (iCurrentContainer) + iAppUi->RemoveFromViewStack( *this, iCurrentContainer ); + iCurrentContainer = iMainListContainer; + iAppUi->AddToViewStackL( *this, iCurrentContainer ); + + iMainListContainer->SetFocusIfExist(iSettingListContainer->GetCurrentSetName()); + + iSettingListContainer->MakeVisible(EFalse); + iMainListContainer->MakeVisible(ETrue); + UpdateMskL(); + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::DynInitMenuPaneL() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane) + { + if (!FeatureManager::FeatureSupported(KFeatureIdHelp)) + { + aMenuPane->SetItemDimmed(EAknCmdHelp, ETrue); + } + + if (aResourceId == R_GS_XDM_SETTINGS_MAIN_MENU) + { + if (iCurrentContainer == iMainListContainer) + { + aMenuPane->SetItemDimmed(EGSXDMPluginCmdChange, ETrue); + aMenuPane->SetItemDimmed(EGSXDMPluginCmdExitFromSL, ETrue); + if (iMainListContainer->IsListEmpty()) + { + aMenuPane->SetItemDimmed(EGSXDMPluginCmdEdit, ETrue); + aMenuPane->SetItemDimmed(EGSXDMPluginCmdDelete, ETrue); + } + } + else + { + aMenuPane->SetItemDimmed(EGSXDMPluginCmdEdit, ETrue); + aMenuPane->SetItemDimmed(EGSXDMPluginCmdDelete, ETrue); + aMenuPane->SetItemDimmed(EGSXDMPluginCmdNewSettings, ETrue); + aMenuPane->SetItemDimmed(EAknCmdExit, ETrue); + } + } + + if (aResourceId == R_GS_XDM_NEW_SETTINGS_MENU) + { + if (iMainListContainer->IsListEmpty()) + { + aMenuPane->SetItemDimmed(EGSXDMPluginCmdNewExisting, ETrue); + } + } + + if ( iSettingListContainer && !iMainListContainer->IsListEmpty() ) + { + TBool inUse( EFalse ); + HBufC* currentSetName = iMainListContainer->GetCurrentSetNameLC(); + TBuf setName; + setName.Copy( currentSetName->Des() ); + TRAP_IGNORE( inUse = iSettingListContainer->SettingsApInUseL( setName ) ); + CleanupStack::PopAndDestroy( currentSetName ); + + if ( inUse ) + { + TInt pos( KErrNotFound ); + if ( aMenuPane->MenuItemExists( EGSXDMPluginCmdDelete, pos ) ) + { + aMenuPane->SetItemSpecific( EGSXDMPluginCmdDelete, EFalse ); + aMenuPane->SetItemDimmed(EGSXDMPluginCmdDelete, ETrue); + } + } + else + { + TInt pos( KErrNotFound ); + if ( aMenuPane->MenuItemExists( EGSXDMPluginCmdDelete, pos ) ) + { + aMenuPane->SetItemSpecific( EGSXDMPluginCmdDelete, ETrue ); + aMenuPane->SetItemDimmed(EGSXDMPluginCmdDelete, EFalse); + } + } + } + } + +// --------------------------------------------------------- +// CXDMPlugin::HandleResourceChangeManual() +// --------------------------------------------------------- +// +void CXDMPlugin::HandleResourceChangeManual(TInt aType) + { + if ( iSettingListContainer ) + iSettingListContainer->HandleResourceChangeManual(aType); + if ( iMainListContainer ) + iMainListContainer->HandleResourceChangeManual(aType); + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::CreateIconL +// --------------------------------------------------------------------------- +// +CGulIcon* CXDMPlugin::CreateIconL( const TUid aIconType ) + { + CGulIcon* icon; + + if( aIconType == KGSIconTypeLbxItem ) + { + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetConnXdm, + KGSXDMPluginIconFileName, + EMbmGsxdmpluginQgn_prop_set_conn_xdm, + EMbmGsxdmpluginQgn_prop_set_conn_xdm_mask); + } + else + { + icon = CGSPluginInterface::CreateIconL( aIconType ); + } + + return icon; + } + +// --------------------------------------------------------------------------- +// CXDMPlugin::UpdateMskL() +// --------------------------------------------------------------------------- +// +void CXDMPlugin::UpdateMskL() + { + if ( !Cba() ) + { + return; + } + + CEikCba* cba = static_cast< CEikCba* >( Cba()->ButtonGroup() ); + if(iCurrentContainer==iMainListContainer) + { + TBool showEdit = !(iMainListContainer->IsListEmpty()); + cba->SetCommandSetL(R_XDMUI_MAINVIEW_SOFTKEYS); + cba->MakeCommandVisible( EGSXDMPluginCmdEdit, showEdit ); + } + else if(iCurrentContainer==iSettingListContainer) + { + cba->SetCommandSetL(R_XDMUI_MAINVIEW_SOFTKEYS_SL); + cba->MakeCommandVisible( EGSXDMPluginCmdChange, ETrue); + if ( iSettingListContainer->IsVisible() ) + { + iCurrentContainer->DrawNow(); + } + } + cba->DrawNow(); + } + +// End of file + + diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/src/XDMPluginContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/XDMPluginContainer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,462 @@ +/* +* Copyright (c) 2005-2007 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: XDM GS plugin main list container. +* +*/ + + + + +// INCLUDE FILES +#include "XDMExternalInterface.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SettingsData.h" +#include "XDMPluginContainer.h" + +#include + + + + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::CXDMPluginContainer() +// --------------------------------------------------------------------------- +// +CXDMPluginContainer::CXDMPluginContainer(CAknView* aView) : iView(aView) + { + SetComponentsToInheritVisibility( ETrue ); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::ConstructL(const TRect& aRect) +// Symbian OS two phased constructor +// +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::ConstructL( const TRect& aRect ) + { + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginContainer] ConstructL()" ) ); + #endif + + CEikStatusPane* sp = static_cast + ( CEikonEnv::Static()->EikAppUi() )->StatusPane(); + iTitlePane = static_cast + ( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + // Set title + + StringLoader::Load ( iTitle, R_STR_XDM_TITLE_PANE_TEXT ); + iTitlePane->SetTextL(iTitle);// FromResourceL( rReader ); + CreateWindowL(); // Makes the control a window-owning control + + // Main List creation and initialization + iMainList = new(ELeave) CAknSingleStyleListBox(); + iMainList->SetContainerWindowL(*this); + iMainList->ConstructL(this, EAknListBoxLoopScrolling); + + // Main list scroll bar issues + iMainList->CreateScrollBarFrameL(EFalse); + iMainList->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + + // Empty text processing + _LIT (KStringHeader, "%S\n%S"); + HBufC* emptyText = iEikonEnv->AllocReadResourceLC( R_STR_XDM_EMPTY_TEXT ); + HBufC* emptyText2 = iEikonEnv->AllocReadResourceLC( R_STR_XDM_EMPTY_TEXT_SEC); + HBufC* emptyFinal = HBufC::NewLC( + emptyText->Length() + emptyText2->Length() + 2 );// 2 is length of "\n" + emptyFinal->Des().Format(KStringHeader, emptyText, emptyText2); + + iMainList->SetListBoxObserver(this); + iMainList->View()->SetListEmptyTextL(*emptyFinal); + CleanupStack::PopAndDestroy(3, emptyText);//emptyText, emptyText2, emptyFinal + + // This call fails if Problems in XDM API, so leave if error + TRAPD(err,SetupListL()); + User::LeaveIfError(err); + + SetRect( aRect ); + ActivateL(); + + iEikMenuBar = new ( ELeave ) CEikMenuBar(); + iEikMenuBar->ConstructL( this, NULL, R_GS_XDM_SETTINGS_MAIN_MENUBAR ); + + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginContainer] Construct done" ) ); + #endif + + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::~CXDMPluginContainer() +// Destructor +// +// --------------------------------------------------------------------------- +// +CXDMPluginContainer::~CXDMPluginContainer() + { + if (iMainList) + { + delete iMainList; + } + + delete iEikMenuBar; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::SizeChanged() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::SizeChanged() + { + iMainList->SetRect(Rect()); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::CountComponentControls() const +// --------------------------------------------------------------------------- +// +TInt CXDMPluginContainer::CountComponentControls() const + { + return 1; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::ComponentControl() const +// --------------------------------------------------------------------------- +// +CCoeControl* CXDMPluginContainer::ComponentControl( TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + return iMainList; + default: + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::EditCurrentItemL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::EditCurrentItemL() + { + TPtrC16 xDMSetName; + TPtrC16 xDMSetNameClipped; + xDMSetName.Set(iSettingListArray->MdcaPoint(iMainList->CurrentItemIndex())); + xDMSetNameClipped.Set(xDMSetName.Mid(1)); // remove '/t' from the begining + CXDMPlugin* iTempView = static_cast (iView); + iTempView->LoadSettingsViewL(EEditExisting, xDMSetNameClipped); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::GetCurrentSetNameLC() +// --------------------------------------------------------------------------- +// +HBufC* CXDMPluginContainer::GetCurrentSetNameLC() + { + TPtrC16 xDMSetName; + TPtrC16 xDMSetNameClipped; + xDMSetName.Set(iSettingListArray->MdcaPoint(iMainList->CurrentItemIndex())); + xDMSetNameClipped.Set(xDMSetName.Mid(1)); // remove '/t' from the begining + + HBufC* name = xDMSetNameClipped.AllocLC(); + TPtr ptr(name->Des()); + AknTextUtils::ConvertDigitsTo(ptr, EDigitTypeWestern ); + + return name; + } + + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::OfferKeyEventL() +// --------------------------------------------------------------------------- +// +TKeyResponse CXDMPluginContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if (iMainList) + { + // if cancel key is pressed and list is not empty, invoke deletion + if ((aKeyEvent.iCode == EKeyBackspace ) && (aType == EEventKey) && + iEikMenuBar->ItemSpecificCommandsEnabled() ) + { + if(!IsListEmpty()) + DeleteSetProcedureL(); + CXDMPlugin* iTempView = static_cast (iView); + iTempView->UpdateMskL(); + return EKeyWasConsumed; + } + else + { + return iMainList->OfferKeyEventL (aKeyEvent, aType); + } + } + return EKeyWasNotConsumed; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::HandleListBoxEventL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent) + { + // if the Select Key has been pressed + if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) || + (aListBoxEvent == MEikListBoxObserver::EEventItemSingleClicked)) + { + EditCurrentItemL(); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::SetupListL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::SetupListL() + { + CTextListBoxModel* model = iMainList->Model(); + model->SetOwnershipType(ELbmOwnsItemArray); + + iSettingListArray = STATIC_CAST(CDesCArray*,model->ItemTextArray()); + LoadSettingsListArrayL(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::LoadSettingsListArrayL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::LoadSettingsListArrayL() + { + iTitlePane->SetTextL(iTitle); + _LIT (KStringHeader, "\t%S"); + TBuf myString; // maximum name + \t + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList = NULL; + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return; + } + CleanupStack::PushL(xdmSetList); + TInt xdmSetListCount = xdmSetList->Count(); + iSettingListArray->Reset(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + myString.Format(KStringHeader, &(xdmSetList->MdcaPoint(i))); + AknTextUtils::LanguageSpecificNumberConversion(myString); + iSettingListArray->AppendL (myString); + } + iSettingListArray->Sort(ECmpCollated); + CleanupStack::PopAndDestroy(2); //xdmSetList,settingIds + iMainList->HandleItemRemovalL(); + iMainList->HandleItemAdditionL(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::IsListEmpty() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginContainer::IsListEmpty() + { + if (iSettingListArray->Count()) + return EFalse; + return ETrue; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::IsLastItem() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginContainer::IsLastItem() + { + if (iSettingListArray->Count() == 1) + return ETrue; + return EFalse; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::DeleteCurrentSetL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::DeleteCurrentSetL() + { + TXdmSettingsApi::RemoveCollectionL( GetCurrentSetIdL() ); + TInt deletedItemIndex = iMainList->CurrentItemIndex(); + iSettingListArray->Delete( deletedItemIndex ); + + AknListBoxUtils::HandleItemRemovalAndPositionHighlightL( + iMainList, deletedItemIndex, ETrue ); + iMainList->DrawNow(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::GetCurrentSetIdL() +// --------------------------------------------------------------------------- +// +TInt CXDMPluginContainer::GetCurrentSetIdL() + { + TInt myId(-1); + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList = NULL; + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return myId; + } + CleanupStack::PushL(xdmSetList); + + TInt xdmSetListCount = xdmSetList->Count(); + HBufC* currentSetName = GetCurrentSetNameLC(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((xdmSetList->MdcaPoint(i)).Compare(*currentSetName))) // if equal + { + myId = settingIds[i]; + break; + } + } + CleanupStack::PopAndDestroy(3); //xdmSetList,settingIds,currentSetName + return myId; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::LoadCollectionNamesL() +// --------------------------------------------------------------------------- +// +CDesCArray* CXDMPluginContainer::LoadCollectionNamesL(RArray& aSettingIDs) + { + CDesCArray* myArray = TXdmSettingsApi::CollectionNamesLC(aSettingIDs); + CleanupStack::Pop(1); // will be pop if above doesnt leave + return myArray; + } + +// --------------------------------------------------------- +// CXDMPluginContainer::GetHelpContext +// This function is called when Help application is launched +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CXDMPluginContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KGSXDMPluginUid; + aContext.iContext = KXDM_HLP_LIST_VIEW; + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::DeleteSetProcedureL() +// --------------------------------------------------------------------------- +// +void CXDMPluginContainer::DeleteSetProcedureL() + { + HBufC* myDisplayMessage = NULL; + HBufC* currentSetName = GetCurrentSetNameLC(); + TPtr myname(currentSetName->Des()); + AknTextUtils::LanguageSpecificNumberConversion(myname); + + CAknQueryDialog* query = CAknQueryDialog::NewL(CAknQueryDialog::EConfirmationTone); + if (IsLastItem()) + myDisplayMessage = StringLoader::LoadLC(R_STR_XDM_CONF_DELETE_LAST, *currentSetName ); + else + myDisplayMessage = StringLoader::LoadLC(R_STR_XDM_CONF_DELETE, *currentSetName ); + + if ( query->ExecuteLD( R_CONFIRMATION_QUERY, *myDisplayMessage ) ) + { + DeleteCurrentSetL(); + } + CleanupStack::PopAndDestroy(2); //currentSetName, myDisplayMessage + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::HandleResourceChange() +// --------------------------------------------------------------------------- +void CXDMPluginContainer::HandleResourceChange( TInt aType ) + { + if ( aType == KAknsMessageSkinChange || + aType == KEikDynamicLayoutVariantSwitch ) + { + CXDMPlugin* iTempView = static_cast (iView); + iTempView->HandleResourceChangeManual(aType); + } + CCoeControl::HandleResourceChange( aType ); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::HandleResourceChangeManual() +// --------------------------------------------------------------------------- +void CXDMPluginContainer::HandleResourceChangeManual(TInt aType) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect); + SetRect( mainPaneRect ); + //DrawNow(); + + iMainList->HandleResourceChange(aType); + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::FocusChanged +// Set focus on the selected listbox. For animated skins feature. +// --------------------------------------------------------------------------- +void CXDMPluginContainer::FocusChanged(TDrawNow aDrawNow) + { + if(iMainList) + { + iMainList->SetFocus( IsFocused(),aDrawNow ); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginContainer::SetFocusIfExist +// Set focus on the given set name +// --------------------------------------------------------------------------- +void CXDMPluginContainer::SetFocusIfExist(TDes& aSetName) + { + _LIT (KStringHeader, "\t%S"); + TBuf myString; // maximum name + \t + myString.Format(KStringHeader, &aSetName); + AknTextUtils::LanguageSpecificNumberConversion(myString); + + TInt xdmSetListCount = iSettingListArray->Count(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((iSettingListArray->MdcaPoint(i)).Compare(myString))) // if equal + { + iMainList->SetCurrentItemIndex(i); + break; + } + } + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/src/XDMPluginImplementationTable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/XDMPluginImplementationTable.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2005,2006 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: ECOM proxy table for this plugin +* +*/ + + + + +// System includes +#include +#include + +// User includes +#include "XDMPlugin.h" + +// Constants +const TImplementationProxy KXDMPluginImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(0x10207429, CXDMPlugin::NewL) + }; + + +// --------------------------------------------------------------------------- +// ImplementationGroupProxy +// Gate/factory function +// +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(KXDMPluginImplementationTable) + / sizeof(TImplementationProxy); + return KXDMPluginImplementationTable; + } diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/src/XDMPluginSLContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/XDMPluginSLContainer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1035 @@ +/* +* Copyright (c) 2005-2010 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: XDM GS plugin Settins list container +* +*/ + + + + +// INCLUDE FILES +#include "XDMExternalInterface.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "XDMPluginSLContainer.h" +#include "XDMPluginSettinglist.h" +#include "SettingsData.h" + +#include + +// LOCAL CONSTANTS AND MACROS +_LIT(KFormatPostfix, "%S(%02d)"); +_LIT(KFormatNoPostfix, "%S"); +_LIT(KFormatLargePostfix, "%S(%d)"); +const TInt KMaxPostfixLength = 5; + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::CXDMPluginSLContainer() +// --------------------------------------------------------------------------- +// +CXDMPluginSLContainer::CXDMPluginSLContainer(CAknView* aView) : iView(aView) + { + SetComponentsToInheritVisibility( ETrue ); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::ConstructL(const TRect& aRect) +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::ConstructL( const TRect& aRect) + { + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginSLContainer] ConstructL()" ) ); + #endif + + CEikStatusPane* sp = static_cast + ( CEikonEnv::Static()->EikAppUi() )->StatusPane(); + CAknTitlePane* title = static_cast + ( sp->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) ) ); + + // Set the proper title of this list + TResourceReader rReader; + iCoeEnv->CreateResourceReaderLC( rReader, R_GS_XDM_MAIN_VIEW_TITLE ); + title->SetFromResourceL( rReader ); + CleanupStack::PopAndDestroy(); //rReader + + CreateWindowL(); // Makes the control a window-owning control + + // construct the data object the settings list will use + iData = CSettingsData::NewL(); + // construct control and set parent + iSettingList = CXDMPluginSettinglist::NewL(*iData); + iSettingList->SetContainerWindowL(*this); + + // CreateResourceReaderLC will allocate a buffer to be used by + // the TResourceReader. This buffer is pushed onto the cleanup + // stack - not the TResourceReader itself + CEikonEnv::Static()->CreateResourceReaderLC(rReader, R_SETTINGS); + iSettingList->ConstructFromResourceL(rReader); + + // Clean up the buffer allocated above, NOT the reader itself. + // Cannot use expected item overload of PopAndDestroy() as buffer + // is inaccessible. + CleanupStack::PopAndDestroy(); + iSettingList->ActivateL(); + + SetRect( aRect ); + ActivateL(); + + #ifdef _DEBUG + RDebug::Print( _L( "[CXDMPluginSLContainer] Construct done" ) ); + #endif + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::~CXDMPluginSLContainer() +// --------------------------------------------------------------------------- +// +CXDMPluginSLContainer::~CXDMPluginSLContainer() + { + if (iData) + delete iData; + if(iSettingList) // if setting list has been created + { + delete iSettingList; + iSettingList = NULL; + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SizeChanged() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::SizeChanged() + { + iSettingList->SetRect(Rect()); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::CountComponentControls() const +// --------------------------------------------------------------------------- +// +TInt CXDMPluginSLContainer::CountComponentControls() const + { + return 1; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::ComponentControl( TInt aIndex ) const +// --------------------------------------------------------------------------- +// +CCoeControl* CXDMPluginSLContainer::ComponentControl( TInt aIndex ) const + { + switch ( aIndex ) + { + case 0: + return iSettingList; + default: + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::EditCurrentItemL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::EditCurrentItemL() + { + iSettingList->EditCurrentItemL(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::OfferKeyEventL() +// --------------------------------------------------------------------------- +// +TKeyResponse CXDMPluginSLContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if (iSettingList) + return iSettingList->OfferKeyEventL(aKeyEvent, aType); + else + return EKeyWasNotConsumed; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::Draw(const TRect& aRect) const +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::Draw(const TRect& aRect) const + { + CWindowGc& gc = SystemGc(); + gc.Clear(aRect); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::HandleListBoxEventL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::HandleListBoxEventL(CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent) + { + // if the Select Key has been pressed + if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) || + (aListBoxEvent == MEikListBoxObserver::EEventItemClicked)) + { + iSettingList->EditCurrentItemL(); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::PrepareXDMSetForEditingL(TDesC& aXDMSetName) +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::PrepareXDMSetForEditingL(TDesC& aXDMSetName) + { + TLex16 myLex; + iData->Reset(); + + iData->iSettingName = aXDMSetName; + AknTextUtils::ConvertDigitsTo(iData->iSettingName, EDigitTypeWestern ); + iData->iSettingId = GetSettingIdL(iData->iSettingName); + + CXdmSettingsCollection* xDMSet = NULL; + + // read the source setting + xDMSet = TXdmSettingsApi::SettingsCollectionL(iData->iSettingId); + CleanupStack::PushL(xDMSet); + + iData->iSettingNameDisp = aXDMSetName; + iData->iServerAddress = xDMSet->Property(EXdmPropUri); + + // AccessPoint handling + iData->iAccessPointDes = xDMSet->Property(EXdmPropToNapId); + myLex.Assign(iData->iAccessPointDes); + myLex.Val(iData->iAccessPoint); + + iSettingList->GetAccessPointNameL(iData->iAccessPoint, iData->iAccessPointName); + if ( (iData->iAccessPointName) == KNullDesC) // if name is not found + { + iData->iAccessPoint = -1; + } + + TBuf username = xDMSet->Property( EXdmPropAuthName ); + + // to show special chars in UI correctly + _LIT( KProcent, "%" ); + if ( username.Find( KProcent ) != KErrNotFound ) + { + // convert to 8 bit + HBufC8* tmp = HBufC8::NewLC( username.Length() ); + tmp->Des().Copy( username ); + + // Decode encoded username + HBufC8* decodedUsername = EscapeUtils::EscapeDecodeL( *tmp ); + CleanupStack::PopAndDestroy( tmp ); + CleanupStack::PushL( decodedUsername ); + + // convert to unicode + HBufC* userName16 = + EscapeUtils::ConvertToUnicodeFromUtf8L( decodedUsername->Des() ); + CleanupStack::PopAndDestroy( decodedUsername ); + username = userName16->Des(); + delete userName16; + } + + iData->iUserID = username; + iData->iPassword = xDMSet->Property(EXdmPropAuthSecret); + + CleanupStack::PopAndDestroy(1); //xDMSet + iSettingList->LoadSettingsL(); + SetTitlePaneTextL(iData->iSettingName); + iSettingList->ResetItemIndex(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::PrepareXDMSetNewDefaultL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::PrepareXDMSetNewDefaultL() + { + iData->Reset(); + + HBufC* defName = StringLoader::LoadL( R_STR_XDM_NEW_SET ); + CleanupStack::PushL( defName ); + + TBool changed; + + HBufC* newName = DoMakeValidNameL(defName, changed); + + if ( newName ) + // name converted to unique + { + (iData->iSettingName).Copy(newName->Des()); + delete newName; + } + else + { + (iData->iSettingName).Copy(defName->Des()); + } + CleanupStack::PopAndDestroy( defName ); + + iData->iSettingNameDisp = iData->iSettingName; + AknTextUtils::LanguageSpecificNumberConversion(iData->iSettingNameDisp); + + iSettingList->LoadSettingsL(); + iSettingList->ResetItemIndex(); + iSettingList->DrawNow(); + SetTitlePaneTextL(iData->iSettingName); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::PrepareNewXDMSetFromExistingL(TDesC& aXDMSetName) +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::PrepareNewXDMSetFromExistingL(TDesC& aXDMSetName) + { + TLex16 myLex; + + // iData is already resetted in this case and iSettingId has id of + // existing list from which data to be copied + // we need to find the new name, from given name + HBufC* originalName = aXDMSetName.AllocL(); + CleanupStack::PushL( originalName ); + + // aXDMSetName is in disp format, need to convert to western format + TPtr corrFormat(originalName->Des()); + AknTextUtils::ConvertDigitsTo(corrFormat, EDigitTypeWestern ); + + TBool changed; + + HBufC* newName = DoMakeValidNameL(originalName, changed); + + if ( newName ) + // name converted to unique + { + (iData->iSettingName).Copy(newName->Des()); + delete newName; + } + else + { + (iData->iSettingName).Copy(originalName->Des()); + } + + CleanupStack::PopAndDestroy( originalName ); + + + CXdmSettingsCollection* xDMSet = NULL; + + // Displayable name + iData->iSettingNameDisp = iData->iSettingName; + AknTextUtils::LanguageSpecificNumberConversion(iData->iSettingNameDisp); + + // read the source setting + xDMSet = TXdmSettingsApi::SettingsCollectionL(iData->iSettingId); + CleanupStack::PushL(xDMSet); + + iData->iServerAddress = xDMSet->Property(EXdmPropUri); + + // AccessPoint handling + iData->iAccessPointDes = xDMSet->Property(EXdmPropToNapId); + myLex.Assign(iData->iAccessPointDes); + myLex.Val(iData->iAccessPoint); + + iSettingList->GetAccessPointNameL(iData->iAccessPoint, iData->iAccessPointName); + if ( (iData->iAccessPointName) == KNullDesC) // if name is not found + { + iData->iAccessPoint = -1; + } + + iData->iUserID = xDMSet->Property(EXdmPropAuthName); + iData->iPassword = xDMSet->Property(EXdmPropAuthSecret); + + // also overwrite the setting id now since we dont need it anymore + iData->iSettingId = -1; + CleanupStack::PopAndDestroy(1); //xDMSet + iSettingList->LoadSettingsL(); + SetTitlePaneTextL(iData->iSettingNameDisp); + iSettingList->ResetItemIndex(); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DisplayNewXDMSetOptions() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::DisplayNewXDMSetOptionsL() + { + // First phase construction of menu list + CAknSinglePopupMenuStyleListBox* newXDMsetMenuList = + new (ELeave) CAknSinglePopupMenuStyleListBox; + CleanupStack::PushL(newXDMsetMenuList); + + // Create a popuplist to show the menu list in + CAknPopupList* popupList = CAknPopupList::NewL( + newXDMsetMenuList, + R_AVKON_SOFTKEYS_OK_CANCEL); + + CleanupStack::PushL(popupList); + + // Second phase construction of menulist + newXDMsetMenuList->ConstructL(popupList,EAknListBoxMenuList); + // Set up scroll bars + newXDMsetMenuList->CreateScrollBarFrameL(ETrue); + newXDMsetMenuList->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + + // Set up menu items + CTextListBoxModel* model = newXDMsetMenuList->Model(); // not taking ownership + model->SetOwnershipType (ELbmOwnsItemArray); // list'll delete with listbox + RArray settingIDs; + CleanupClosePushL(settingIDs); + CDesCArray* newXDMsetMenuListArray = NULL; + + TRAPD(err, newXDMsetMenuListArray = LoadCollectionNamesL(settingIDs, ETrue)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(3); //newXDMsetMenuList, popupList, settingIDs + return EFalse; + } + CleanupStack::PushL(newXDMsetMenuListArray); + + newXDMsetMenuListArray->Sort(ECmpCollated); + model->SetItemTextArray(newXDMsetMenuListArray); + CleanupStack::Pop(1); // newXDMsetMenuListArray owned by model + CleanupStack::PopAndDestroy(1); //settingIDs + + // Set title + HBufC* title; + title = StringLoader::LoadLC(R_STR_XDM_USE_EXISTING); + popupList->SetTitleL(*title); + CleanupStack::PopAndDestroy(1); //title + + // Show the menu in the popup list + TInt popupOk = popupList->ExecuteLD(); + + CleanupStack::Pop(popupList); + + // if the user selected some set + if (popupOk) + { + iData->Reset(); + TPtrC setName = newXDMsetMenuListArray->MdcaPoint + (newXDMsetMenuList->CurrentItemIndex()); + + iData->iSettingId = GetSettingIdL(setName); + (iData->iSettingNameDisp).Copy(setName); + (iData->iSettingName).Copy(setName); + AknTextUtils::ConvertDigitsTo(iData->iSettingName, EDigitTypeWestern ); + CleanupStack::PopAndDestroy(newXDMsetMenuList); + return ETrue; + } + // otherwise return false + CleanupStack::PopAndDestroy(1); //newXDMsetMenuList + return EFalse; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::IsAccessPointInUseL(TDesC& aXDMSetName) +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::SettingsApInUseL(TDesC& aXDMSetName) + { + TBool inUse( EFalse ); + TLex16 myLex; + + iData->iSettingName = aXDMSetName; + AknTextUtils::ConvertDigitsTo(iData->iSettingName, EDigitTypeWestern ); + iData->iSettingId = GetSettingIdL(iData->iSettingName); + + CXdmSettingsCollection* xDMSet = NULL; + + // read the source setting + xDMSet = TXdmSettingsApi::SettingsCollectionL(iData->iSettingId); + CleanupStack::PushL(xDMSet); + iData->iAccessPointDes = xDMSet->Property(EXdmPropToNapId); + myLex.Assign(iData->iAccessPointDes); + myLex.Val(iData->iAccessPoint); + CleanupStack::PopAndDestroy(xDMSet); + + inUse = iSettingList->IsAccessPointInUseL( iData->iAccessPoint ); + + return inUse; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SetTitlePaneTextL( const TDesC& aTitleText ) const +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::SetTitlePaneTextL( const TDesC& aTitleText ) const + { + CAknTitlePane* title = static_cast< CAknTitlePane* > + ( CEikonEnv::Static()->AppUiFactory()->StatusPane()->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + if ( !title ) + { + User::Leave( KErrNotSupported ); + } + title->SetTextL( aTitleText ); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::AreCompulsoryItemsFilled() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::AreCompulsoryItemsFilled() + { + if ( (iData->iAccessPoint > -1) && ((iData->iServerAddress)!=KNullDesC) && + ((iData->iUserID)!=KNullDesC) ) + { + return ETrue; + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DisplayDeleteOrDontSaveDialog() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::DisplayDeleteOrDontSaveDialogL() + { + TBuf myDisplayMessage; + CAknQueryDialog* query = CAknQueryDialog::NewL + (CAknQueryDialog::EConfirmationTone); + StringLoader::Load ( myDisplayMessage, R_STR_XDM_CONF_COMPULSORY ); + return (query->ExecuteLD( R_CONFIRMATION_QUERY, myDisplayMessage )); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DeleteXDMSetIfExistL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::DeleteXDMSetIfExistL() + { + TRAPD(err, TXdmSettingsApi::RemoveCollectionL(iData->iSettingId)); + if ( (err!=KErrNone) && (err!=KErrNotFound) ) + { + User::LeaveIfError(err); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::IsExitProcessingOKL() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::IsExitProcessingOKL() + { + if (AreCompulsoryItemsFilled()) + { + return SaveOrCreateAndSaveXDMSetL(ETrue); + } + else + { + if (DisplayDeleteOrDontSaveDialogL()) + { + DeleteXDMSetIfExistL(); + } + else + { + return EFalse; + } + } + return ETrue; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SaveSettingsIfPossibleL() +// --------------------------------------------------------------------------- +// +void CXDMPluginSLContainer::SaveSettingsIfPossibleL() + { + if (AreCompulsoryItemsFilled()) + SaveOrCreateAndSaveXDMSetL(EFalse); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::SaveOrCreateAndSaveXDMSetL() +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::SaveOrCreateAndSaveXDMSetL(TBool aShowDialog) + { + TBool ret = ETrue; + CXdmSettingsCollection* myXDMSet(NULL); + TInt err(KErrNotFound); // Initialize such that id not found in settings API + + // take the saveable name + iData->iSettingName = iData->iSettingNameDisp; + AknTextUtils::ConvertDigitsTo(iData->iSettingName, EDigitTypeWestern ); + + // check whether this is a new set or an existing set was edited + if ((iData->iSettingId) > NULL) // is there is valid id + { + TRAP(err, myXDMSet = TXdmSettingsApi::SettingsCollectionL + (iData->iSettingId)); + } + if(myXDMSet) + { + delete myXDMSet; // we dont need it + } + + // check if the setting name is already exist + // ask user to change name + if (IsXDMSetNameExistL(iData->iSettingName, iData->iSettingId)) + { + if (!aShowDialog) // if we cant display dialog than return. + return EFalse; + HBufC* myDisplayMessage = NULL; + CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue ); + note->SetTimeout( CAknNoteDialog::ELongTimeout ); + myDisplayMessage = StringLoader::LoadLC(R_STR_XDM_NAME_ALREADY_EXIST, iData->iSettingNameDisp); + note->ExecuteLD( *myDisplayMessage ); + CleanupStack::PopAndDestroy(1); //myDisplayMessage + iSettingList->EditItemL(ESettingNameIndex,EFalse); + return EFalse; + } + + if(err == KErrNone) // if set exists update it + { + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iSettingName, EXdmPropName); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iAccessPointDes, EXdmPropToNapId); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iServerAddress, EXdmPropUri); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iUserID, EXdmPropAuthName); + TXdmSettingsApi::UpdatePropertyL(iData->iSettingId, + iData->iPassword, EXdmPropAuthSecret); + ret = ETrue; + } + + else if (err == KErrNotFound) // if set doenst exists create and save it + { + myXDMSet = new (ELeave) CXdmSettingsCollection(); + CleanupStack::PushL(myXDMSet); + myXDMSet->AppendL(iData->iSettingName, EXdmPropName); + myXDMSet->AppendL(iData->iServerAddress, EXdmPropUri); + myXDMSet->AppendL(iData->iAccessPointDes, EXdmPropToNapId); + myXDMSet->AppendL(iData->iUserID, EXdmPropAuthName); + myXDMSet->AppendL(iData->iPassword, EXdmPropAuthSecret); + TRAPD(err,TXdmSettingsApi::CreateCollectionL(*myXDMSet)); + err = err; //just to satisfy compiler + CleanupStack::PopAndDestroy(1); // myXDMSet + ret = ETrue; + } + + else + { + User::LeaveIfError(err); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetSettingIdL(TDesC& aXDMSetName) +// --------------------------------------------------------------------------- +// +TInt CXDMPluginSLContainer::GetSettingIdL(TDesC& aXDMSetName) + { + TInt myId(-1); + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList =NULL; + + TBuf setName = aXDMSetName; + AknTextUtils::ConvertDigitsTo(setName, EDigitTypeWestern ); + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds, EFalse)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return myId; + } + CleanupStack::PushL(xdmSetList); + + TInt xdmSetListCount = xdmSetList->Count(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((xdmSetList->MdcaPoint(i)).Compare(setName))) // if equal + { + myId = settingIds[i]; + break; + } + } + CleanupStack::PopAndDestroy(2); //xdmSetList,settingIds + return myId; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::IsXDMSetNameExistL(TDesC& aXDMSetName, TInt32& aSettingId) +// --------------------------------------------------------------------------- +// +TBool CXDMPluginSLContainer::IsXDMSetNameExistL(TDesC& aXDMSetName, TInt32& aSettingId) + { + TBool ret(EFalse); + RArray settingIds; + CleanupClosePushL(settingIds); + CDesCArray* xdmSetList = NULL; + + TBuf setName = aXDMSetName; + AknTextUtils::ConvertDigitsTo(setName, EDigitTypeWestern ); + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIds, EFalse)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(1); //settingIds + return EFalse; + } + CleanupStack::PushL(xdmSetList); + + TInt xdmSetListCount = xdmSetList->Count(); + for (TInt i = 0; i< xdmSetListCount; i++) + { + if (!((xdmSetList->MdcaPoint(i)).Compare(setName))) // if equal + { + if (settingIds[i] != aSettingId) // if the set is not itself + { + ret = ETrue; + } + } + } + CleanupStack::PopAndDestroy(2); //xdmSetList,settingIds + return ret; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::LoadCollectionNamesL +// --------------------------------------------------------------------------- +// +CDesCArray* CXDMPluginSLContainer::LoadCollectionNamesL(RArray& aSettingIDs + , TBool aDisp) + { + CDesCArray* myArray = TXdmSettingsApi::CollectionNamesLC(aSettingIDs); + TBuf name; + if(aDisp) // convert all names to disp names + { + TInt count = myArray->Count(); + CDesCArray* dispArray = new CDesCArrayFlat(count+1); + CleanupStack::PushL(dispArray); + for(TInt i=0;iMdcaPoint(i)); + AknTextUtils::LanguageSpecificNumberConversion(name); + TPtrC16 ptr = name; + dispArray->AppendL(ptr); + } + CleanupStack::Pop(2); + return dispArray; + } + CleanupStack::Pop(1); // myArray + return myArray; + } + +// --------------------------------------------------------- +// CXDMPluginSLContainer::GetHelpContext +// This function is called when Help application is launched +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CXDMPluginSLContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = KGSXDMPluginUid; + aContext.iContext = KXDM_HLP_EDIT_SET; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::HandleResourceChange() +// --------------------------------------------------------------------------- +void CXDMPluginSLContainer::HandleResourceChange( TInt aType ) + { + CCoeControl::HandleResourceChange( aType ); + if ( aType == KAknsMessageSkinChange || + aType == KEikDynamicLayoutVariantSwitch ) + { + CXDMPlugin* iTempView = static_cast (iView); + iTempView->HandleResourceChangeManual(aType); + } + } + + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::HandleResourceChangeManual() +// --------------------------------------------------------------------------- +void CXDMPluginSLContainer::HandleResourceChangeManual(TInt aType) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect); + SetRect( mainPaneRect ); + DrawDeferred(); + + iSettingList->HandleResourceChange(aType); + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::FocusChanged +// Set focus on the selected listbox. For animated skins feature. +// --------------------------------------------------------------------------- +void CXDMPluginSLContainer::FocusChanged(TDrawNow aDrawNow) + { + if(iSettingList) + { + iSettingList->SetFocus( IsFocused(), aDrawNow ); + } + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetCurrentSetName() +// See header for details. +// --------------------------------------------------------------------------- +// +TDes& CXDMPluginSLContainer::GetCurrentSetName() + { + return iData->iSettingName; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::DoMakeValidNameL() +// See header for details. +// --------------------------------------------------------------------------- +// +HBufC* CXDMPluginSLContainer::DoMakeValidNameL(HBufC* aName, TBool& aChanged) + { + aChanged = EFalse; + HBufC* temp = HBufC::NewLC( KMaxSettingSetNameLength ); + HBufC* temp2 = HBufC::NewLC( KMaxSettingSetNameLength ); + + HBufC* corrname = EnsureMaxLengthLC( aName, aChanged); + *temp = *corrname; + TInt postfix( 0 ); + TInt pf( 0 ); + TInt i( 0 ); + + + // Load the names + RArray settingIDs; + CleanupClosePushL(settingIDs); + CDesCArray* xdmSetList = NULL; + + TRAPD(err, xdmSetList = LoadCollectionNamesL(settingIDs, EFalse)); + if(err!=KErrNone) + { + CleanupStack::PopAndDestroy(4); //settingIds + return corrname; + } + CleanupStack::PushL(xdmSetList); + + // do the actual checking of name + TInt found(0); + TInt pos(0); + + TPtrC prefix = GetPrefix( *corrname ); + + postfix = GetPostfix( *temp, prefix ); + postfix = -1; + do + { + found = xdmSetList->Find( *temp, pos ); + if ( found == KErrNone ) + { + aChanged = ETrue; + postfix++; + // check the length of postfix, check text length accordingly + pf = postfix; + for (i=1; i<10; i++) + { + pf /= 10; + if ( !pf ) + break; + } + TPtr sgdptr( temp->Des() ); + TPtr sgdptr2( temp2->Des() ); + if ( postfix ) + { + if ( postfix < 10 ) + { + sgdptr2 = prefix.Left( KMaxSettingSetNameLength - i - 3 ); + } + else + { + sgdptr2 = prefix.Left( KMaxSettingSetNameLength - i - 2 ); + } + } + else + { + sgdptr2 = prefix.Left( KMaxSettingSetNameLength ); + } + if ( postfix ) + { + if ( postfix > 9 ) + { + sgdptr.Format( KFormatLargePostfix, &sgdptr2, + postfix ); + } + else + { + sgdptr.Format( KFormatPostfix, &sgdptr2, + postfix ); + } + } + else + { + sgdptr.Format( KFormatNoPostfix, &sgdptr2 ); + } + } + } while (found == KErrNone); + + CleanupStack::PopAndDestroy(xdmSetList); + CleanupStack::PopAndDestroy(1); //settingIds + CleanupStack::PopAndDestroy( corrname ); + CleanupStack::PopAndDestroy( temp2 ); + + if ( aChanged ) + { + CleanupStack::Pop( temp ); + } + else + { + CleanupStack::PopAndDestroy( temp ); + temp = NULL; + } + + return temp; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::EnsureMaxLengthLC() +// See header for details. +// --------------------------------------------------------------------------- +HBufC* CXDMPluginSLContainer::EnsureMaxLengthLC( const TDesC* aName, TBool& aChanged) + { + TInt length = aName->Length(); + + aChanged = EFalse; + + if ( !length ) + { + // Name is required. + User::Leave(KErrArgument); + } + + HBufC* corrname; + if ( KMaxSettingSetNameLength < length ) + { // name too long, truncate. + corrname = aName->Left( KMaxSettingSetNameLength ).AllocLC(); + aChanged = ETrue; + } + else + { + corrname = aName->AllocLC(); + corrname->Des().Trim(); + if ( corrname->Length() == 0 ) + { + User::Leave(KErrArgument); + } + // comes here only if name is valid + if ( corrname->Length() != aName->Length() ) + { + aChanged = ETrue; + } + } + + return corrname; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetPrefix() +// See header for details. +// --------------------------------------------------------------------------- +TPtrC CXDMPluginSLContainer::GetPrefix( const TDesC& aName ) + { + TPtrC prefix = aName; + TInt lastBrace = aName.LocateReverse('('); + if ( lastBrace != KErrNotFound ) + { + // aName looks like "". + // See if is an integer number. + TPtrC num = aName.Right( aName.Length() - lastBrace - 1 ); + TInt val; + TLex lex( num ); + if ( lex.Val( val ) == KErrNone ) + { + // Yes, the trailer is an integer. + prefix.Set( aName.Left( lastBrace ) ); + } + } + return prefix; + } + +// --------------------------------------------------------------------------- +// CXDMPluginSLContainer::GetPostfix() +// See header for details. +// --------------------------------------------------------------------------- +TInt CXDMPluginSLContainer::GetPostfix( const TDesC& aName, const TDesC& aPrefix ) + { + TInt postfix( KErrNotFound ); + TInt nameLength = aName.Length(); + TInt prefixLength = aPrefix.Length(); + if ( nameLength >= prefixLength && aName.FindF( aPrefix ) == 0 ) + { + // aName is longer or equal length, and + // aPrefix can be found in the beginning of aName. + if ( nameLength == prefixLength ) + { + // They have the same length; they equal. + postfix = 0; + } + else + { + if ( aName[ prefixLength ] == '(' ) + { + // (Now we know that aName is longer than aPrefix.) + // aName looks like "aPrefix". + // See if is an integer number. + TPtrC num = aName.Right( nameLength - prefixLength - 1 ); + TBuf< KMaxPostfixLength > pf; + if (num.Length() <= pf.Length()) + pf = num; + TInt val; + TLex lex( pf ); + if ( lex.Val( val ) == KErrNone ) + { + // Yes, the trailer is an integer. + if ( val > 0 ) + { + postfix = val; + } + else + { + // signal that it is invalid... + postfix = -1; + } + } + } + } + } + return postfix; + } +// end of file diff -r 2669f8761a99 -r fbd2e7cec7ef XDMSettingsUI/src/XDMPluginSettinglist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/XDMSettingsUI/src/XDMPluginSettinglist.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,338 @@ +/* +* Copyright (c) 2005-2010 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: XDM GS plugin, Setting List class implementation +* +*/ + + + + +// INCLUDE FILES +#include "XDMExternalInterface.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "XDMPlugin.hrh" +#include "XDMPluginSettinglist.h" +#include "SettingsData.h" + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::NewL(CSettingsData &aData) +// ----------------------------------------------------------------------------- +// +CXDMPluginSettinglist *CXDMPluginSettinglist::NewL(CSettingsData &aData) + { + CXDMPluginSettinglist* self = CXDMPluginSettinglist::NewLC(aData); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::NewLC(CSettingsData &aData) +// ----------------------------------------------------------------------------- +// +CXDMPluginSettinglist *CXDMPluginSettinglist::NewLC(CSettingsData &aData) + { + CXDMPluginSettinglist* self = new (ELeave) CXDMPluginSettinglist(aData); + CleanupStack::PushL(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::CXDMPluginSettinglist(CSettingsData &aData) +// ----------------------------------------------------------------------------- +// +CXDMPluginSettinglist::CXDMPluginSettinglist(CSettingsData &aData) : + CAknSettingItemList(), + iSettingsData(aData) + { + SetComponentsToInheritVisibility( ETrue ); + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::~CXDMPluginSettinglist() +// ----------------------------------------------------------------------------- +// +CXDMPluginSettinglist::~CXDMPluginSettinglist() + { + // no specific destruction code required - no owned data + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::SizeChanged() +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::SizeChanged() + { + // if size changes, make sure component takes whole available space + if (ListBox()) + { + ListBox()->SetRect(Rect()); + } + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::EditCurrentItemL() +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::EditCurrentItemL() + { + // invoke EditItemL on the current item + TInt index = ListBox()->CurrentItemIndex(); + + //Cause SIP setting is hidden + if(index >= 3) //ESipURLIndex == 3 + index++; + + // if access point need to be edit + if (index == EAccessPointIndex) + { + EditAccessPointL(); + SaveSettingL(index); + } + else + EditItemL(index,ETrue); // invoked from menu + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::EditItemL (TInt aIndex, TBool aCalledFromMenu) +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::EditItemL (TInt aIndex, TBool aCalledFromMenu) + { + if (aIndex == EAccessPointIndex) + { + EditAccessPointL(); + } + else + { + CAknSettingItemList::EditItemL(aIndex, aCalledFromMenu); + } + (*SettingItemArray())[aIndex]->StoreL(); + SaveSettingL(aIndex); + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::SaveSettingL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::SaveSettingL(TInt aIndex) + { + + switch (aIndex) + { + case ESettingNameIndex: + SetTitlePaneTextL(iSettingsData.iSettingNameDisp); + break; + + case EAccessPointIndex: + if (iSettingsData.iAccessPoint > -1) // if Valid AP number + { + (iSettingsData.iAccessPointDes).Num(iSettingsData.iAccessPoint); + GetAccessPointNameL(iSettingsData.iAccessPoint, + iSettingsData.iAccessPointName); + } + LoadSettingsL(); + break; + + case EServerAddressIndex: + break; + + + case ESipURLIndex: + break; + case EUserIDIndex: + break; + + case EPasswordIndex: + break; + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::CreateSettingItemL (TInt aIdentifier) +// ----------------------------------------------------------------------------- +// +CAknSettingItem * CXDMPluginSettinglist::CreateSettingItemL (TInt aIdentifier) + { + // method is used to create specific setting item as required at run-time. + // aIdentifier is used to determine what kind of setting item should be + // created + + CAknSettingItem* settingItem = NULL; + + switch (aIdentifier) + { + case ESettingItemSettingName: + + settingItem = new (ELeave) CAknTextSettingItem ( aIdentifier, + iSettingsData.iSettingNameDisp); + break; + + case ESettingItemAccessPoint: + GetAccessPointNameL(iSettingsData.iAccessPoint, iSettingsData.iAccessPointName); + settingItem = new (ELeave) CAknTextSettingItem ( + aIdentifier, iSettingsData.iAccessPointName); + break; + + case ESettingItemServerAddress: + settingItem = new (ELeave) CAknTextSettingItem ( + aIdentifier, + iSettingsData.iServerAddress); + break; + + + + case ESettingItemSipURL: + settingItem = new (ELeave) CAknTextSettingItem ( + aIdentifier, + iSettingsData.iSipURL); + settingItem->SetHidden(ETrue); + break; + + + case ESettingItemUserID: + settingItem = new (ELeave) CAknTextSettingItem ( + aIdentifier, + iSettingsData.iUserID); + break; + case ESettingItemPassword: + settingItem = new (ELeave) CAknPasswordSettingItem ( + aIdentifier, + CAknPasswordSettingItem::EAlpha, + iSettingsData.iPassword); + break; + default: + break; + } + return settingItem; + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::EditAccessPoint() +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::EditAccessPointL() + { + // After dialog server for access point selection (RGenConAgentDialogServer) + // has deprecated wins emulator mode needs a different technique to show + // emulator-lan access point. + + CCommsDatabase* commsDb = CCommsDatabase::NewL( EDatabaseTypeIAP ); + CleanupStack::PushL(commsDb); + CApUtils* aPUtils = CApUtils::NewLC( *commsDb ); + + CApSettingsHandler *apUi = CApSettingsHandler::NewLC( + ETrue, + EApSettingsSelListIsPopUp, + EApSettingsSelMenuSelectNormal, + KEApIspTypeAll, + EApBearerTypeAllBearers, + KEApSortNameAscending, + EIPv4 | EIPv6 + ); + TUint32 id; + + TRAP_IGNORE(id = aPUtils->WapIdFromIapIdL(iSettingsData.iAccessPoint)); + + //err can also be in case this is new set, iSettingsData.iAccessPoint = -1 + //so ignoring the error + + if ( apUi->RunSettingsL( id, id ) == KApUiEventSelected) + { + iSettingsData.iAccessPoint = aPUtils->IapIdFromWapIdL(id); + } + CleanupStack::PopAndDestroy(3, commsDb); //commsDb, aPUtils, apUi + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::GetAccessPointNameL(TInt32 aAP, TDes& aAccessPoint) +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::GetAccessPointNameL(TInt32 aAP, TDes& aAccessPoint) + { +#if defined __WINS__ && defined _DEBUG // handled differently in wins+debug + if (aAP != KErrNotFound) // if access point is defined take a general name + StringLoader::Load ( aAccessPoint, R_STR_XDM_AP_NAME_FOR_DEBUG_ONLY); +#else + CCommsDatabase* commsDb = CCommsDatabase::NewL( EDatabaseTypeIAP ); + CleanupStack::PushL(commsDb); + CApUtils* aPUtils = CApUtils::NewLC( *commsDb ); + TInt err(KErrNone); + // to remove id bug + TRAP(err, aAP = aPUtils->WapIdFromIapIdL(aAP)); + TRAP(err, aPUtils->NameL(aAP, aAccessPoint)); + // dont do anything if name not found or if some error occur + CleanupStack::PopAndDestroy(2); // commsDb, aPUtils +#endif + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::IsAccessPointInUseL(TInt32 aAP) +// ----------------------------------------------------------------------------- +// +TBool CXDMPluginSettinglist::IsAccessPointInUseL(TInt32 aAP) + { + TBool inUse( EFalse ); + + CCommsDatabase* commsDb = CCommsDatabase::NewL( EDatabaseTypeIAP ); + CleanupStack::PushL(commsDb); + CApUtils* aPUtils = CApUtils::NewLC( *commsDb ); + TInt err(KErrNone); + // to remove id bug + TRAP(err, aAP = aPUtils->WapIdFromIapIdL(aAP)); + inUse = aPUtils->IsAPInUseL( aAP ); + // dont do anything if name not found or if some error occur + CleanupStack::PopAndDestroy(2); // commsDb, aPUtils + + return inUse; + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::SetTitlePaneTextL( const TDesC& aTitleText ) const +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::SetTitlePaneTextL( const TDesC& aTitleText ) const + { + CAknTitlePane* title = static_cast< CAknTitlePane* > + ( CEikonEnv::Static()->AppUiFactory()->StatusPane()->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + if ( !title ) + { + User::Leave( KErrNotSupported ); + } + + title->SetTextL( aTitleText ); + } + +// ----------------------------------------------------------------------------- +// CXDMPluginSettinglist::ResetItemIndex() +// ----------------------------------------------------------------------------- +// +void CXDMPluginSettinglist::ResetItemIndex() + { + ListBox()->SetCurrentItemIndexAndDraw(NULL); + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef group/bld.inf --- a/group/bld.inf Tue Aug 31 15:35:50 2010 +0300 +++ b/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -19,4 +19,10 @@ #include "../pressrv_plat/group/bld.inf" #include "../XDMEngine/group/bld.inf" -//#include "../simpleengine/group/bld.inf" \ No newline at end of file +#include "../XDMSettingsUI/group/bld.inf" +#include "../xdmprotocols/group/bld.inf" +#include "../msgconnmanager/group/bld.inf" +#include "../presencesettingsui/group/bld.inf" +#include "../simpleengine/group/bld.inf" +#include "../presencefwsimpleadpt/group/bld.inf" +#include "../simpledatamodeladapter/group/bld.inf" diff -r 2669f8761a99 -r fbd2e7cec7ef inc/xcapappusagedef.h --- a/inc/xcapappusagedef.h Tue Aug 31 15:35:50 2010 +0300 +++ b/inc/xcapappusagedef.h Wed Sep 01 12:23:14 2010 +0100 @@ -48,6 +48,9 @@ _LIT8( KXdmPocGroupUsageAUID, "/org.openmobilealliance.poc-groups/" ); // add new AUID definitions here //_LIT8( KXdmTestAppUsageAUID, "/org.foo.bar/" ); +// PRES-CONTENT starts +_LIT8( KXdmPresContentAUID, "/org.openmobilealliance.pres-content/" ); +// PRES-CONTENT ends // ContentTypes _LIT8( KXdmResourceListsUsageContType, "application/resource-lists+xml" ); @@ -63,7 +66,10 @@ _LIT8( KXdmPocGroupUsageContType, "application/vnd.oma.poc.groups+xml" ); // add new content types here //_LIT8( KXdmTestAppUsageContType, "application/test-type+xml" ); - +// PRES-CONTENT starts +_LIT8( KXdmPresContentContType, "application/vnd.oma.pres-content+xml" ); +_LIT8( KXdmPresContentContTypeOld, "application/vnd.oma.content+xml" ); +// PRES-CONTENT ends // Namespaces _LIT8( KXdmResourceListsNamespace, "urn:ietf:params:xml:ns:resource-lists" ); @@ -78,6 +84,9 @@ _LIT8( KXdmPocUserAccessNamespace, "urn:oma:xml:poc:poc-rules" ); _LIT8( KXdmPocGroupNamespace, "urn:oma:xml:poc:list-service" ); // add new namespace definitions here +// PRES-CONTENT starts +_LIT8( KXdmPresContentNamespace, "urn:oma:xml:prs:pres-content" ); +// PRES-CONTENT ends // Namespace prefixes _LIT8( KXdmSharedXDMUriUsageNsPrefix, "ou" ); @@ -231,6 +240,15 @@ _LIT( KXdmPackage, "package" ); _LIT8( KXdmPresence, "presence" ); +// PRES-CONTENT starts +_LIT( KXdmMimeType, "mime-type"); +_LIT( KXdmEncoding, "encoding"); +_LIT( KXdmDescription, "description"); +_LIT( KXdmData, "data"); +_LIT( KXdmSvg, "svg"); +_LIT( KXdmRect, "rect"); +// PRES-CONTENT ends + #endif //__XCAPAPPUSAGEDEF__ // End of File diff -r 2669f8761a99 -r fbd2e7cec7ef inc/xdmlogwriter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/inc/xdmlogwriter.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,94 @@ +/* +* Copyright (c) 2007 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: XDM Engine log writer +* +*/ + + + + +#ifndef __XDMLOGWRITER__ +#define __XDMLOGWRITER__ + +#include + +_LIT( KXdmLogDir, "XDM" ); +_LIT( KXdmLogFileExt, ".txt" ); +_LIT( KXdmLogRoot, "C:\\logs\\" ); + +//Determines how many log file instances are +//retained until the directory is cleaned up +/* E.g. XdmEngine1.txt, XdmEngine2.txt ... XdmEngine10.txt */ +const TInt KMaxLogFiles = 10; + +/* Default size of the log buffer */ +const TInt KLogBufferMaxSize = 2000; + +// CLASS DECLARATION +class CXdmLogWriter : public CBase + { + public: + + /** + * Symbian OS constructor + * + * @param TDesC& The log file name + * @return CXdmLogWriter* A log writer instance + */ + IMPORT_C static CXdmLogWriter* NewL( const TDesC& aLogName ); + + /** + * Write a log string. + * + * @param TDesC& Log string in 16-bit + * @return void + */ + IMPORT_C void WriteToLog( const TDesC& aLogLine ) const; + + /** + * Write a log string. + * + * @param TDesC8& Log string in 8-bit + * @return void + */ + IMPORT_C void WriteToLog( const TDesC8& aLogLine ) const; + + /** + * Destructor + */ + virtual ~CXdmLogWriter(); + + private: + + /** + * C++ constructor is private + */ + CXdmLogWriter(); + + /** + * Symbian OS second-phase constructor + * @param TDesC& Name of the log file to write to + * @return void + */ + void ConstructL( const TDesC& aLogName ); + + private: //Data + + HBufC* iLogFileName; + + }; + +#endif //__XDMLOGWRITER__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef layers.sysdef.xml --- a/layers.sysdef.xml Tue Aug 31 15:35:50 2010 +0300 +++ b/layers.sysdef.xml Wed Sep 01 12:23:14 2010 +0100 @@ -1,10 +1,10 @@ - ]> - + diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/bwinscw/msgconnmanagerU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/bwinscw/msgconnmanagerU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + ?NewMsgConnManagerL@@YAPAVMMsgConnManager@@H@Z @ 1 NONAME ; class MMsgConnManager * NewMsgConnManagerL(int) + diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/eabi/msgconnmanagerU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/eabi/msgconnmanagerU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,7 @@ +EXPORTS + _Z18NewMsgConnManagerLi @ 1 NONAME + _ZTI13CMsgConnTimer @ 2 NONAME ; ## + _ZTI15CMsgConnManager @ 3 NONAME ; ## + _ZTV13CMsgConnTimer @ 4 NONAME ; ## + _ZTV15CMsgConnManager @ 5 NONAME ; ## + diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2005 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: Connection manager build file +* +*/ + + + +#include + +//-------------------- +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_EXPORTS +//-------------------- +// IBYs +../rom/msgconnmanager.iby CORE_MW_LAYER_IBY_EXPORT_PATH(msgconnmanager.iby) + +//-------------------- +PRJ_MMPFILES +//-------------------- +msgconnmanager.mmp diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/group/msgconnmanager.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/group/msgconnmanager.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2005 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: Connection manager +* +*/ + + + +#include + +TARGET msgconnmanager.dll +TARGETTYPE dll +UID 0x1000008d 0x101FB0C2 +CAPABILITY CAP_GENERAL_DLL + +SOURCEPATH ../src + +SOURCE msgconntimer.cpp +SOURCE msgconnmanager.cpp + +USERINCLUDE ../inc + +MW_LAYER_SYSTEMINCLUDE + +DEBUGLIBRARY flogger.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +LIBRARY commdb.lib +LIBRARY esock.lib + +#if defined( ARMCC ) + DEFFILE ../eabi/ +#elif defined ( WINSCW ) + deffile ../bwinscw/ +#elif defined (WINS ) + deffile ../bwins/ +#endif + + diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/inc/msgconnmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/inc/msgconnmanager.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,365 @@ +/* +* Copyright (c) 2005 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: Connection manager +* +*/ + + + + +#ifndef __MSGCONNMANAGER__ +#define __MSGCONNMANAGER__ + +// INCLUDES +#include +#include +#include +#include +#include "msgconntimercallback.h" + + +//CONSTANTS +_LIT( KConnManLogDir, "MsgConnMan" ); +_LIT( KConnManLogFile, "MsgConnManager.txt" ); +const TInt KConnManLogBufferMaxSize = 2000; + +//FORWARD DECLARATIONS +class CMsgConnTimer; +class MMsgBearerObsCallback; + +// CLASS DECLARATION +class CMsgConnManager : public CActive, + public MMsgConnManager, + public MMsgConnTimerCallback + { + public: // Constructors and destructor + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CMsgConnManager* + */ + static CMsgConnManager* NewL( const TInt aAccessPoint ); + + /** + * Destructor. + */ + virtual ~CMsgConnManager(); + + public: //New functions + + /** + * Symbian OS default constructor. + * @param TRequestStatus& Request status of the caller + * @return void + */ + virtual void StartConnection( TRequestStatus& aStatus ); + + /** + * Stop a connection, synchronous version + * @return void + */ + virtual void StopConnection(); + + /** + * Stop a connection, asynchronous version + * @return void + */ + virtual void StopConnection( TRequestStatus& aStatus ); + + /** + * Cancel StartConnection(). The method may leave with + * - KErrAbort if the TRequestStatus object the client + * supplied is not active, hence, there is no pending + * request that would require cancelling. + * In normal cases - when RConnection::Start() or its + * progress notifications are pending - ConnMan completes + * the client's request with the "error" KErrCancel. + */ + virtual void CancelStartL(); + + /** + * Set the ID of the Access Point to connect to. + * @param aAccessPointID + * @return void + */ + virtual void SetAccessPointIDL( const TInt aAccessPointID ); + + /** + * Returns the number of connections presently active + * @return TInt + */ + virtual TInt NumberOfActiveConns(); + + /** + * Read from the Comms Database + * @param const TMsgSupportedCommDbRecords& aParameter + * @return HBufC8* + */ + virtual HBufC* ReadFromCommsDbLC( const TSupportedCommDbRecords aParameter ); + + /** + * Returns a reference to the active socket server. + * @return RConnection& + */ + virtual RConnection& Connection(); + + /** + * Returns a reference to the active socket server. + * @return RSocketServ& + */ + virtual RSocketServ& SocketSession(); + + /** + * Add an object to the queue of listeners. The object to be added + * must inplement the interface MMsgBearerObsCallback in order + * to receive events from the system agent. It is important to note + * that the call to the notification handler (HandleBearerEventL()) + * takes place inside the RunL() method of this Connection Manager, + * so the listening object MUST return the control to the Manager + * AS SOON AS POSSIBLE in order not to clog the scheduler. + * @param MMsgBearerObsCallback* aClient + * @return void + */ + virtual void AddEventSubscriberL( MMsgBearerObsCallback* aClient ); + + /** + * Remove an object from the queue of listeners. It is no necessary + * to call this method at deletion time, as the destructor destroys + * the subscriber queue altogether. If, however, a listener object is + * destroyed before an instance of Connection Manager, it is mandatory + * to remove the listener from the queue prior to deleting the listener. + * @param MMsgBearerObsCallback* aClient + * @return void + */ + virtual void RemoveEventSubscriber( MMsgBearerObsCallback* aClient ); + + /** + * Returns the status of the ConnMan: ETrue if sending is OK, EFalse otherwise + * @return TBool + */ + virtual TBool Status() const; + + /** + * Destructor. + * @return void + */ + virtual void Destroy(); + + public: + + #ifdef _DEBUG + + /** + * A Global logging function + * @param TRefByValue aFmt,... + * @return void + */ + static void WriteToLog( TRefByValue aFmt,... ); + + #endif + + private: + + /** + * Start to keep an eye on the opened connection + * @return void + */ + void StartNetworkObserver(); + + /** + * Determine the state of the connection opening + * @return void + */ + void WatchConnectionOpening(); + + /** + * Determine the state of the (opened) connection + * @return void + */ + void DetermineConnectionStatusL(); + + /** + * Broadcast the bearer event to registered listeners + * @param TMsgBearerEvent aBearerEvent + * @return void + */ + void BroadcastBearerEventL( const TMsgBearerEvent aBearerEvent ); + + /** + * Determine which value is to be fetched from the CommsDb + * @param TPtrC& aDbView + * @param TPtrC& TPtrC& aDbColumn + * @param TMsgSupportedCommDbRecords aParameter + * @return TBool + */ + TInt DetermineRecordTypeLC( TPtrC& aDbColumn, + CCommsDbTableView*& aView, + const TSupportedCommDbRecords aParameter ); + + /** + * Broadcast the bearer event to registered listeners + * @param TMsgBearerEvent aBearerEvent + * @return void + */ + TInt InitCommDbViewLC( TPtrC& aDbRecord, + CCommsDbTableView*& aView, + const TSupportedCommDbRecords aParameter ); + + /** + * Broadcast the bearer event to registered listeners + * @param TMsgBearerEvent aBearerEvent + * @return void + */ + TBool CheckProxyUsageLC( CCommsDbTableView*& aView ); + + /** + * Issue a new asynchronous request + * @return void + */ + void IssueRequest(); + + /** + * Check the availability of GPRS Network + * @return TBool Available or not + */ + TBool IsValidApL( TUint32 aUid ); + + /** + * Handle the opening of a new connection + * @return void + */ + void HandleNewConnection(); + + /** + * Handle an existing connection + * @return void + */ + void HandleExistingConnection(); + + /** + * Symbian OS second-phase constructor + * @param TInt aAccessPoint + * @return void + */ + void ConstructL( const TInt aAccessPoint ); + + /** + * Delete the log files + * @return void + */ + void DeleteLogFileL(); + + /** + * C++ default constructor is private + * @return void + */ + CMsgConnManager(); + + /** + * From CActive + * @return void + */ + void RunL(); + + /** + * From CActive + * @return void + */ + void DoCancel(); + + private: //From MMsgConnectionTimerCallback + + /** + * Catch a timer event + * @param TInt aStatus + * @return void + */ + virtual void HandleTimerEvent( TInt aStatus ); + + private: //Data + + enum TMsgConnManState + { + EMsgConnManIdle = 0, + EMsgConnManWaitingForStartComplete, + EMsgConnManWaitingForNotifications, + EMsgConnManDisconnectingPrevious, + EMsgConnManObservingAccessPoint, + EMsgConnManBearerSuspended, + EMsgConnManBearerLost + }; + + TInt iAccessPointID; + TInt iLastConnectionStage; + TBool iProgressStarted; + TBool iConnectionClosed; + TNifProgressBuf iProgressBuffer; + TMsgConnManState iConnManStatus; + TRequestStatus* iClientStatus; + TRequestStatus* iPingRequestStatus; + TRequestStatus* iTimedCompleteStatus; + CCommsDatabase* iCommsDatabase; + CMsgConnTimer* iConnectionTimer; + RConnection iConnection; + TCommDbConnPref iAccessPointSettings; + RSocketServ iSocketSession; + RPointerArray iEventSubscribers; + }; + +// --------------------------------------------------------- +// CMsgConnManager::StartBearerObserver +// If the status is any other than EMsgConnManObservingAccessPoint +// there is something fishy going on => do not send/receive anything +// --------------------------------------------------------- +// +inline TBool CMsgConnManager::Status() const + { + return iConnManStatus == EMsgConnManObservingAccessPoint; + } + +// --------------------------------------------------------- +// CMsgConnManager::SocketSession +// +// --------------------------------------------------------- +// +inline RSocketServ& CMsgConnManager::SocketSession() + { + return iSocketSession; + } + +// --------------------------------------------------------- +// CMsgConnManager::Connection +// +// --------------------------------------------------------- +// +inline RConnection& CMsgConnManager::Connection() + { + return iConnection; + } + +// --------------------------------------------------------- +// CMsgConnManager::Destroy +// +// --------------------------------------------------------- +// +inline void CMsgConnManager::Destroy() + { + delete this; + } + +#endif + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/inc/msgconntimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/inc/msgconntimer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2005 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: Connection manager timer +* +*/ + + + + +#ifndef __MSGCONNTIMER__ +#define __MSGCONNTIMER__ + +#include + +class MMsgConnTimerCallback; + +// CLASS DECLARATION +class CMsgConnTimer : public CActive + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @return CMsgConnTimer* + */ + static CMsgConnTimer* NewL(); + + /** + * Two-phased constructor. + * @param MMsgConnectionTimerCallback* aClient + * @return CMsgConnTimer* + */ + static CMsgConnTimer* NewL( MMsgConnTimerCallback* aClient ); + + /** + * Destructor. + */ + virtual ~CMsgConnTimer(); + + public: // New functions + + /** + * Request to activate timer + * @param TRequestStatus& aStatus + * @param TTimeIntervalMicroSeconds32 aDelay + * @param TBool aCompleteIfCancel = EFalse + * @return void + */ + void ActivateTimer( TRequestStatus& aStatus, + TTimeIntervalMicroSeconds32 aDelay ); + + /** + * Request to activate timer + * @param TTimeIntervalMicroSeconds32 aDelay + * @param MMsgConnectionTimerCallback* aClient + * @return void + */ + void ActivateTimer( MMsgConnTimerCallback* aClient, + TTimeIntervalMicroSeconds32 aDelay ); + + private: + + /** + * From CActive. + * @return void + */ + void RunL(); + + /** + * From CActive. + * @return void + */ + void DoCancel(); + + /** + * By default Symbian OS constructor is private. + * @return void + */ + void ConstructL(); + + /** + * C++ constructor. + */ + CMsgConnTimer(); + + /** + * C++ constructor. + * @param MMsgConnectionTimerCallback* aClient + */ + CMsgConnTimer( MMsgConnTimerCallback* aClient ); + + private: // Data + + RTimer iTimer; + TRequestStatus* iClientStatus; + TBool iCompleteIfCancel; + MMsgConnTimerCallback* iClient; + }; + +#endif //MSGCONNTIMER_H + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/inc/msgconntimercallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/inc/msgconntimercallback.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2005 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: Connection manager timer callback +* +*/ + + + + +#ifndef __MSGCONNTIMERCALLBACK__ +#define __MSGCONNTIMERCALLBACK__ + +#include + +// CLASS DECLARATION + +class MMsgConnTimerCallback + { + public: + + /** + * Pure virtual callback function to be implemented in the + * derived class. This function is called when timer has + * compeleted. + * @param aStatus The integer value of iStatus of the timer class + * @return void + */ + virtual void HandleTimerEvent( TInt aStatus ) = 0; + }; + +#endif //__MSGCONNTIMERCALLBACK__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/rom/msgconnmanager.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/rom/msgconnmanager.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,41 @@ +/* +* Copyright (c) 2005 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: Connection manager rom file +* +*/ + + + + +#ifndef __MSGCONNMANAGER_IBY__ +#define __MSGCONNMANAGER_IBY__ + + #ifdef __XDM + #define __INCLUDE_CM__ + #endif //__XDM + + #ifdef __IM + #define __INCLUDE_CM__ + #endif //__IM + + #ifdef __PRESENCE + #define __INCLUDE_CM__ + #endif //__PRESENCE + + #ifdef __INCLUDE_CM__ + file=ABI_DIR/BUILD_DIR/msgconnmanager.dll SHARED_LIB_DIR/msgconnmanager.dll + #endif //__INCLUDE_CM__ + +#endif //__MSGCONNMANAGER_IBY__ + diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/src/msgconnmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/src/msgconnmanager.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1065 @@ +/* +* Copyright (c) 2005 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: Connection manager +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include "msgconntimer.h" +#include "msgconnmanager.h" + +// ================= MEMBER FUNCTIONS ======================= +// + + +// ---------------------------------------------------------- +// CMsgConnManager::CMsgConnManager +// +// ---------------------------------------------------------- +// +CMsgConnManager::CMsgConnManager() : CActive( EPriorityUserInput + 2 ), + iProgressStarted( EFalse ), + iConnectionClosed( ETrue ) + + { + + } + +// ---------------------------------------------------------- +// CMsgConnManager::NewL +// +// ---------------------------------------------------------- +// +CMsgConnManager* CMsgConnManager::NewL( const TInt aAccessPoint ) + { + CMsgConnManager* self = new ( ELeave ) CMsgConnManager(); + CleanupStack::PushL( self ); + self->ConstructL( aAccessPoint ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CMsgConnManager::ConstructL +// +// ---------------------------------------------------------- +// +void CMsgConnManager::ConstructL( const TInt aAccessPoint ) + { + DeleteLogFileL(); + iAccessPointID = aAccessPoint; + iConnectionTimer = CMsgConnTimer::NewL(); + iCommsDatabase = CCommsDatabase::NewL( EDatabaseTypeUnspecified ); + User::LeaveIfError( iSocketSession.Connect() ); + User::LeaveIfError( iConnection.Open( iSocketSession ) ); + iConnectionClosed = EFalse; + iAccessPointSettings.SetIapId( aAccessPoint ); + iAccessPointSettings.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + #ifdef _DEBUG + WriteToLog( _L8( "CONNMAN: LOGGING ENABLED" ) ); + #endif + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------- +// CMsgConnManager::~CMsgConnManager +// +// ---------------------------------------------------- +// +CMsgConnManager::~CMsgConnManager() + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::~CMsgConnManager(), Destructor." ) ); + #endif + Cancel(); + delete iCommsDatabase; + delete iConnectionTimer; + iConnection.Close(); + iSocketSession.Close(); + iEventSubscribers.Close(); + } + +// ---------------------------------------------------------- +// CMsgConnManager::DeleteLogFileL +// +// ---------------------------------------------------------- +// +void CMsgConnManager::DeleteLogFileL() + { + RFs session; + User::LeaveIfError( session.Connect() ); + CFileMan* manager = CFileMan::NewL( session ); + manager->Delete( _L("C:\\logs\\MsgConnMan\\*.*") ); + session.Close(); + delete manager; + manager = NULL; + } + +// --------------------------------------------------------- +// CMsgConnManager::StartBearerObserver +// +// --------------------------------------------------------- +// +void CMsgConnManager::StartNetworkObserver() + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::StartNetworkObserver() Closed: %d" ), iConnectionClosed ); + #endif + #ifdef __WINS__ + if( !iConnectionClosed ) + { + iStatus = KRequestPending; + SetActive(); + } + #else + if( !iConnectionClosed ) + { + if( !IsActive() ) + { + iStatus = KRequestPending; + iConnection.ProgressNotification( iProgressBuffer, iStatus ); + SetActive(); + } + } + #endif + } + +// --------------------------------------------------------- +// CMsgConnManager::RunL() +// +// --------------------------------------------------------- +// +void CMsgConnManager::RunL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::RunL(), iConnManStatus: %d iStatus: %d iStage: %d iError: %d" ), + iConnManStatus, iStatus.Int(), iProgressBuffer().iStage, iProgressBuffer().iError ); + #endif + switch( iConnManStatus ) + { + case EMsgConnManWaitingForStartComplete: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManWaitingForStartComplete." ) ); + #endif + WatchConnectionOpening(); + break; + case EMsgConnManWaitingForNotifications: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManWaitingForNotifications." ) ); + #endif + WatchConnectionOpening(); + break; + case EMsgConnManObservingAccessPoint: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManObservingAccessPoint." ) ); + #endif + DetermineConnectionStatusL(); + break; + case EMsgConnManBearerSuspended: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManBearerSuspended." ) ); + #endif + DetermineConnectionStatusL(); + break; + case EMsgConnManDisconnectingPrevious: + #ifdef _DEBUG + WriteToLog( _L8( " Timer expired, complete client's request." ) ); + #endif + User::RequestComplete( iTimedCompleteStatus, KErrNone ); + iConnManStatus = EMsgConnManIdle; + break; + case EMsgConnManIdle: + #ifdef _DEBUG + WriteToLog( _L8( " Idle, iStatus is %d." ), iStatus.Int() ); + #endif + break; + default: + #ifdef _DEBUG + WriteToLog( _L8( " Default case, should not be here." ) ); + #endif + break; + } + #ifdef _DEBUG + WriteToLog( _L8( " RunL() ends" ) ); + #endif + } + +// ---------------------------------------------------- +// CMsgConnManager::WatchConnectionOpening() +// +// ---------------------------------------------------- +// +void CMsgConnManager::WatchConnectionOpening() + { + #ifdef _DEBUG + WriteToLog( _L8( " CMsgConnManager::WatchConnectionOpening() - iProgressStarted: %d" ), iProgressStarted ); + #endif + //Lets quit right away if it is an error + if( iStatus != KErrNone ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Something wrong, complete with error: %d." ), iStatus.Int() ); + #endif + iConnectionTimer->Cancel(); + if( iConnManStatus == EMsgConnManWaitingForNotifications ) + iConnection.CancelProgressNotification(); + iConnection.Close(); + iConnectionClosed = ETrue; + User::RequestComplete( iClientStatus, iStatus.Int() ); + iConnManStatus = EMsgConnManIdle; + } + else + { + if( iProgressStarted ) + { + iLastConnectionStage = iProgressBuffer().iStage; + if( iLastConnectionStage == KLinkLayerOpen ) //we are done + { + #ifdef _DEBUG + WriteToLog( _L8( " Connected. Completing with KErrNone." ) ); + #endif + iConnectionTimer->Cancel(); + iConnManStatus = EMsgConnManObservingAccessPoint; + StartNetworkObserver(); + User::RequestComplete( iClientStatus, KErrNone ); + iProgressStarted = EFalse; + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Keep on waiting for progress." ) ); + #endif + IssueRequest(); + } + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Start complete, watch progress." ) ); + #endif + if( iConnManStatus == EMsgConnManWaitingForStartComplete ) + { + iProgressStarted = ETrue; + iConnManStatus = EMsgConnManWaitingForNotifications; + } + IssueRequest(); + } + } + } + +// ---------------------------------------------------- +// CMsgConnManager::DetermineConnectionStatus() +// +// ---------------------------------------------------- +// +void CMsgConnManager::DetermineConnectionStatusL() + { + #ifdef _DEBUG + WriteToLog( _L8( " CMsgConnManager::DetermineConnectionStatus()" ) ); + #endif + #ifdef __WINS__ + Cancel(); + switch( iStatus.Int() ) + #else + switch( iProgressBuffer().iStage ) + #endif + { + case KLinkLayerClosed: + case KConnectionUninitialised: + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( " KLinkLayerClosed, notify clients of EMsgBearerLost" ) ); + #endif + Cancel(); + iConnManStatus = EMsgConnManBearerLost; + BroadcastBearerEventL( EMsgBearerLost ); + iConnection.Close(); + iConnectionClosed = ETrue; + iEventSubscribers.Reset(); + iConnManStatus = EMsgConnManIdle; + break; + case KLinkLayerOpen: + #ifdef _DEBUG + WriteToLog( _L8( " KLinkLayerOpen -> GPRS Context Active." ) ); + #endif + if( iConnManStatus == EMsgConnManBearerSuspended ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Moving to active state." ) ); + #endif + iConnManStatus = EMsgConnManObservingAccessPoint; + BroadcastBearerEventL( EMsgBearerActive ); + StartNetworkObserver(); + } + break; + case KDataTransferTemporarilyBlocked: + #ifdef _DEBUG + WriteToLog( _L8( " KDataTransferTemporarilyBlocked -> GPRS Context Suspended." ) ); + #endif + if( iConnManStatus != EMsgConnManBearerSuspended ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Moving to suspended state." ) ); + #endif + iConnManStatus = EMsgConnManBearerSuspended; + BroadcastBearerEventL( EMsgBearerSuspended ); + } + StartNetworkObserver(); + break; + default: + #ifdef _DEBUG + #ifdef __WINS__ + if( iStatus.Int() == KErrCancel ) + WriteToLog( _L8( " Bearer event generation cancelled" ) ); + else + WriteToLog( _L8( " Some weird status: %d" ), iStatus.Int() ); + #else + WriteToLog( _L8( " Default case! WTF?!?" ) ); + #endif + #endif + StartNetworkObserver(); + break; + } + } + +// --------------------------------------------------------- +// CMsgConnManager::CancelStartL +// +// --------------------------------------------------------- +// +void CMsgConnManager::CancelStartL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::CancelStartL()" ) ); + #endif + if( iClientStatus != NULL && iClientStatus->Int() == KRequestPending ) + { + if( iConnManStatus == EMsgConnManWaitingForStartComplete || + iConnManStatus == EMsgConnManWaitingForNotifications ) + { + Cancel(); + iEventSubscribers.Reset(); + User::RequestComplete( iClientStatus, KErrCancel ); + iConnManStatus = EMsgConnManIdle; + iConnectionClosed = ETrue; + } + else User::Leave( KErrAbort ); + } + else User::Leave( KErrAbort ); + } + +// --------------------------------------------------------- +// CMsgConnManager::StopConnection +// +// --------------------------------------------------------- +// +void CMsgConnManager::StopConnection() + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::StopConnection()" ) ); + #endif + if( iConnManStatus == EMsgConnManWaitingForStartComplete || + iConnManStatus == EMsgConnManWaitingForNotifications || + iConnManStatus == EMsgConnManIdle ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Status is %d, wrong state for this operation. Abort." ), iConnManStatus ); + #endif + } + else + { + //If bearer has been lost, we're already closed + if( iConnManStatus != EMsgConnManBearerLost ) + { + Cancel(); + iConnection.Close(); + iConnectionClosed = ETrue; + iEventSubscribers.Reset(); + iConnManStatus = EMsgConnManIdle; + } + } + #ifdef _DEBUG + WriteToLog( _L8( " StopConnection() ends." ) ); + #endif + } + +// --------------------------------------------------------- +// CMsgConnManager::StopConnection +// +// --------------------------------------------------------- +// +void CMsgConnManager::StopConnection( TRequestStatus& aStatus ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CImpsConnectionManager::StopConnectionL()" ) ); + #endif + aStatus = KRequestPending; + iClientStatus = &aStatus; + iTimedCompleteStatus = &aStatus; + if( iConnManStatus == EMsgConnManWaitingForStartComplete || + iConnManStatus == EMsgConnManWaitingForNotifications || + iConnManStatus == EMsgConnManDisconnectingPrevious || + iConnManStatus == EMsgConnManIdle ) + { + #ifdef _DEBUG + WriteToLog( _L8( " Status is %d, wrong state for this operation. Abort." ), + iConnManStatus ); + #endif + User::RequestComplete( iClientStatus, KErrAbort ); + } + else + { + //If bearer has been lost, we're already closed + if( iConnManStatus != EMsgConnManBearerLost ) + { + Cancel(); + iConnection.Close(); + iConnectionClosed = ETrue; + iEventSubscribers.Reset(); + iConnectionTimer->ActivateTimer( iStatus, 4000000 ); + iConnManStatus = EMsgConnManDisconnectingPrevious; + SetActive(); + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Bearer lost, nothing to do. Complete with KErrNone" ) ); + #endif + User::RequestComplete( iClientStatus, KErrNone ); + } + } + #ifdef _DEBUG + WriteToLog( _L8( " StopConnectionL() ends" ) ); + #endif + } + +// ---------------------------------------------------- +// CMsgConnManager::BroadcastBearerEvent +// +// ---------------------------------------------------- +// +void CMsgConnManager::BroadcastBearerEventL( const TMsgBearerEvent aBearerEvent ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::BroadcastBearerEvent" ) ); + #endif + TInt subs = iEventSubscribers.Count(); + #ifdef _DEBUG + WriteToLog( _L8( " %d clients subscribed." ), subs ); + #endif + if( subs > 0 ) + { + TBool empty = EFalse; + MMsgBearerObsCallback* client = NULL; + for( TInt i = 0;i < subs && !empty;i++ ) + { + //Just in case: + //If a client has managed to remove a listener from the queue + //in the previous callback, "i" will index a bad handle. + subs = iEventSubscribers.Count(); + if( subs > 0 && i < subs ) + { + client = iEventSubscribers[i]; + __ASSERT_ALWAYS( client != NULL, User::Panic( _L( "ObserverNULL!" ), 1 ) ); + TInt error = iProgressBuffer().iError; + if( aBearerEvent == EMsgBearerLost ) + { + #ifdef _DEBUG + TInt stage = iProgressBuffer().iStage; + WriteToLog( _L8( " Event is EMsgBearerLost" ) ); + WriteToLog( _L8( " Stage: %d" ), stage ); + WriteToLog( _L8( " Error: %d" ), error ); + #endif + } + TBool authClose = error == KErrConnectionTerminated; + client->HandleBearerEventL( authClose, aBearerEvent ); + #ifdef _DEBUG + WriteToLog( _L8(" Client no. %d serviced" ), i ); + #endif + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( + " An event listener was removed inside the callback!" ) ); + #endif + //Leave the for loop + empty = ETrue; + } + } + } + #ifdef _DEBUG + WriteToLog( _L8( " BroadcastBearerEvent() ends" ) ); + #endif + } + +// ---------------------------------------------------- +// CMsgConnManager::IssueRequest +// +// ---------------------------------------------------- +// +void CMsgConnManager::IssueRequest() + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::IssueRequest(), status: %d" ), IsActive() ); + #endif + iStatus = KRequestPending; + iConnection.ProgressNotification( iProgressBuffer, iStatus ); + SetActive(); + } + +// --------------------------------------------------------- +// CMsgConnManager::StartConnection +// +// --------------------------------------------------------- +// +void CMsgConnManager::StartConnection( TRequestStatus& aStatus ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::StartConnection() iConnManStatus: %d" ), iConnManStatus ); + #endif + TInt error = 0; + aStatus = KRequestPending; + iClientStatus = &aStatus; + if( iConnectionClosed ) + { + error = iConnection.Open( iSocketSession ); + iConnectionClosed = EFalse; + } + TBool exists = EFalse; + TNifProgress progress; + error = iConnection.Progress( progress ); + #ifdef _DEBUG + WriteToLog( _L8( " Connection stage: %d error: %d" ), progress.iStage, error ); + #endif + TRAPD( err, exists = IsValidApL( iAccessPointID ) ); + if( ( error == KErrNone && err == KErrNone ) && exists ) + { + if( progress.iStage == KConnectionUninitialised ) + HandleNewConnection(); + else + HandleExistingConnection(); + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Something's wrong, complete with KErrUnknown. IAP exists: %d Error: %d Err: %d" ), exists, error, err ); + #endif + User::RequestComplete( iClientStatus, KErrUnknown ); + iConnectionClosed = ETrue; + } + } + +// --------------------------------------------------------- +// CMsgConnManager::HandleNewConnection +// +// --------------------------------------------------------- +// +void CMsgConnManager::HandleNewConnection() + { + #ifdef _DEBUG + WriteToLog( _L8( " CMsgConnManager::HandleNewConnection()" ) ); + #endif + switch( iConnManStatus ) + { + case EMsgConnManIdle: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManIdle," ) ); + WriteToLog( _L8( " starting to connect IAP: %d" ), iAccessPointSettings.IapId() ); + #endif + iLastConnectionStage = KConnectionUninitialised; + iConnection.Start( iAccessPointSettings, iStatus ); + iConnManStatus = EMsgConnManWaitingForStartComplete; + iConnectionTimer->ActivateTimer( this, 20000000 ); + SetActive(); + break; + case EMsgConnManDisconnectingPrevious: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManDisconnectingPrevious," ) ); + WriteToLog( _L8( " new connection cannot be started, ignore." ) ); + #endif + User::RequestComplete( iClientStatus, KErrNotReady ); + break; + default: + #ifdef _DEBUG + WriteToLog( _L8( " We're in some weird state, complete with KErrUnknown" ) ); + #endif + User::RequestComplete( iClientStatus, KErrUnknown ); + iConnManStatus = EMsgConnManIdle; + break; + } + } + +// --------------------------------------------------------- +// CMsgConnManager::HandleExistingConnection +// +// --------------------------------------------------------- +// +void CMsgConnManager::HandleExistingConnection() + { + #ifdef _DEBUG + WriteToLog( _L8( " CMsgConnManager::HandleOldConnection()" ) ); + #endif + switch( iConnManStatus ) + { + case EMsgConnManDisconnectingPrevious: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManDisconnectingPrevious," ) ); + WriteToLog( _L8( " attempting to open a connection while previous one is still disconnecting. Complete with KErrNotReady." ) ); + #endif + User::RequestComplete( iClientStatus, KErrNotReady ); + break; + case EMsgConnManObservingAccessPoint: + #ifdef _DEBUG + WriteToLog( _L8( " Current status is EMsgConnManObservingAccessPoint," ) ); + WriteToLog( _L8( " already connected" ) ); + #endif + User::RequestComplete( iClientStatus, KErrNone ); + break; + case EMsgConnManWaitingForStartComplete: + case EMsgConnManWaitingForNotifications: + #ifdef _DEBUG + WriteToLog( _L8( " Already connecting, ignore" ) ); + #endif + User::RequestComplete( iClientStatus, KErrAlreadyExists ); + break; + default: + #ifdef _DEBUG + WriteToLog( _L8( " Unknown state, complete with KErrUnknown." ) ); + #endif + User::RequestComplete( iClientStatus, KErrUnknown ); + } + } + +// --------------------------------------------------------- +// CMsgConnManager::HandleTimerEventL +// +// --------------------------------------------------------- +// +void CMsgConnManager::HandleTimerEvent( TInt /*aStatus*/ ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::HandleTimerEventL()" ) ); + #endif + switch( iConnManStatus ) + { + case EMsgConnManWaitingForNotifications: + case EMsgConnManWaitingForStartComplete: + Cancel(); + #ifdef _DEBUG + WriteToLog( _L8( " Connection initiation timed out, complete with error KErrTimedOut" ) ); + #endif + User::RequestComplete( iClientStatus, KErrTimedOut ); + iConnection.Close(); + iConnectionClosed = ETrue; + iConnManStatus = EMsgConnManIdle; + break; + default: + #ifdef _DEBUG + WriteToLog( _L8( " Default case, problems..." ) ); + #endif + break; + } + } + +// --------------------------------------------------------- +// CMsgConnManager::AddEventSubscriberL +// +// --------------------------------------------------------- +// +void CMsgConnManager::AddEventSubscriberL( MMsgBearerObsCallback* aClient ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::AddEventSubscriberL()" ) ); + #endif + if( iEventSubscribers.Count() < KMaxNumberOfSubscribers ) + User::LeaveIfError( iEventSubscribers.Append( aClient ) ); + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Not allowed to have more than %d clients" ), KMaxNumberOfSubscribers ); + #endif + User::Leave( KErrAlreadyExists ); + } + } + +// --------------------------------------------------------- +// CMsgConnManager::RemoveEventSubscriber +// +// --------------------------------------------------------- +// +void CMsgConnManager::RemoveEventSubscriber( MMsgBearerObsCallback* aClient ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::RemoveEventSubscriber()" ) ); + #endif + TInt index = iEventSubscribers.Find( aClient ); + if( index >= 0 ) + { + iEventSubscribers.Remove( index ); + } + } + +#ifdef _DEBUG +// ---------------------------------------------------- +// CMsgConnManager::WriteToLog +// +// ---------------------------------------------------- +// +void CMsgConnManager::WriteToLog( TRefByValue aFmt,... ) + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + RDebug::RawPrint( buf ); + RFileLogger::Write( KConnManLogDir, KConnManLogFile, EFileLoggingModeAppend, buf ); + } +#endif + +// ---------------------------------------------------- +// CMsgConnManager::SetAccessPointIDL +// +// ---------------------------------------------------- +// +void CMsgConnManager::SetAccessPointIDL( const TInt aAccessPointID ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::SetAccessPointIDL: %d" ), aAccessPointID ); + #endif + if( IsValidApL( aAccessPointID ) ) + { + iAccessPointID = aAccessPointID; + iAccessPointSettings.SetIapId( iAccessPointID ); + iAccessPointSettings.SetDialogPreference( ECommDbDialogPrefDoNotPrompt ); + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " The specified AP does not exist, leaves with KErrNotFound" ) ); + #endif + User::Leave( KErrNotFound ); + } + } + +// ---------------------------------------------------- +// CMsgConnManager::NumberOfActiveConns +// +// ---------------------------------------------------- +// +TInt CMsgConnManager::NumberOfActiveConns() + { + TUint count = 0; + TInt error = KErrNone; + if( !iConnectionClosed ) + { + error = iConnection.EnumerateConnections( count ); + } + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::NumberOfActiveConns() Conns: %d Error: %d" ), count, error ); + #endif + return KErrNone == error ? count : error; + } + +// --------------------------------------------------------- +// CMsgConnManager::ReadFromCommsDbLC +// +// --------------------------------------------------------- +// +HBufC* CMsgConnManager::ReadFromCommsDbLC( const TSupportedCommDbRecords aParameter ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::ReadFromCommsDbLC()" ) ); + #endif + TPtrC dbRecord; + HBufC* value = NULL; + CCommsDbTableView* view = NULL; + TInt error = InitCommDbViewLC( dbRecord, view, aParameter ); + if( error == KErrNone ) + { + TDbColType colType; + TUint32 attribute = 0; + view->ReadTypeAttribL( dbRecord, colType, attribute ); + switch( colType ) + { + case EDbColBit: + break; + case EDbColUint32: + { + TUint32 intValue = 0; + _LIT( KProxyPort,"%d" ); + view->ReadUintL( dbRecord, intValue ); + value = HBufC::NewLC( sizeof( KProxyPort ) ); + TPtr portPtr( value->Des() ); + portPtr.Format( KProxyPort, intValue ); + value->Des().Copy( portPtr ); + } + break; + case EDbColText8: + break; + case EDbColText16: + break; + case EDbColLongText16: + value = view->ReadLongTextLC( dbRecord ); + break; + default: + break; + } + if( value != NULL ) + { + #ifdef _DEBUG + HBufC8* temp = HBufC8::NewL( value->Des().Length() ); + TPtr8 ptr( temp->Des() ); + ptr.Copy( *value ); + WriteToLog( _L8( " Value was found: %S" ), &ptr ); + delete temp; + temp = NULL; + #endif + CleanupStack::Pop(); //value + CleanupStack::PopAndDestroy(); //view + CleanupStack::PushL( value ); //Put it back in + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " No proxy address defined in CommDb" ) ); + #endif + CleanupStack::PopAndDestroy(); //view + } + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Error: %d" ), error ); + #endif + } + return value; + } + +// --------------------------------------------------------- +// CMsgConnManager::InitCommDbViewLC +// +// --------------------------------------------------------- +// +TInt CMsgConnManager::InitCommDbViewLC( TPtrC& aDbRecord, + CCommsDbTableView*& aView, + const TSupportedCommDbRecords aParameter ) + { + #ifdef _DEBUG + WriteToLog( _L8( " CMsgConnManager::InitCommDbViewLC" ) ); + #endif + aView = iCommsDatabase->OpenViewMatchingUintLC + ( TPtrC( IAP ), TPtrC( COMMDB_ID ), iAccessPointID ); + TInt error = aView->GotoFirstRecord(); + if( error == KErrNone ) + { + error = DetermineRecordTypeLC( aDbRecord, aView, aParameter ); + #ifdef _DEBUG + if( error != KErrNone ) + WriteToLog( _L8( " DetermineRecordType() failed - Error: %d" ), error ); + #endif + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " No matching view found - Error: %d" ), error ); + #endif + CleanupStack::PopAndDestroy(); //aView + aView = NULL; + } + return error; + } + +// --------------------------------------------------------- +// CMsgConnManager::DetermineRecordType +// +// --------------------------------------------------------- +// +TInt CMsgConnManager::DetermineRecordTypeLC( TPtrC& aDbColumn, + CCommsDbTableView*& aView, + const TSupportedCommDbRecords aParameter ) + { + #ifdef _DEBUG + WriteToLog( _L8( " CMsgConnManager::DetermineRecordType()" ) ); + #endif + TInt error = KErrNotFound; + switch( aParameter ) + { + case EMsgProxyAddress: + #ifdef _DEBUG + WriteToLog( _L8( " Type is EImpsProxyAddress" ) ); + #endif + if( CheckProxyUsageLC( aView ) ) + { + error = KErrNone; + aDbColumn.Set( TPtrC( PROXY_SERVER_NAME ) ); + } + break; + case EMsgProxyPort: + #ifdef _DEBUG + WriteToLog( _L8( " Type is EImpsProxyPort" ) ); + #endif + if( CheckProxyUsageLC( aView ) ) + { + error = KErrNone; + aDbColumn.Set( TPtrC( PROXY_PORT_NUMBER ) ); + } + break; + default: + #ifdef _DEBUG + WriteToLog( _L8( " Default case, problems..." ) ); + #endif + error = KErrNotSupported; + break; + } + return error; + } + +// --------------------------------------------------------- +// CMsgConnManager::CheckProxyUsageLC +// +// --------------------------------------------------------- +// +TBool CMsgConnManager::CheckProxyUsageLC( CCommsDbTableView*& aView ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::CheckProxyUsageL()" ) ); + #endif + TBool useProxy = EFalse; + TUint32 serviceIdNumber = 0; + TBuf serviceIdText; + aView->ReadTextL( TPtrC( IAP_SERVICE_TYPE ), serviceIdText ); + aView->ReadUintL( TPtrC( IAP_SERVICE ), serviceIdNumber ); + CleanupStack::PopAndDestroy(); //aView + aView = NULL; + aView = iCommsDatabase->OpenViewOnProxyRecordLC( serviceIdNumber, serviceIdText ); + TInt error = aView->GotoFirstRecord(); + if( error == KErrNone ) + { + aView->ReadBoolL( TPtrC( PROXY_USE_PROXY_SERVER ), useProxy ); + if( !useProxy ) + { + CleanupStack::PopAndDestroy(); //aView + aView = NULL; + } + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " The AP does not use a proxy server." ) ); + #endif + CleanupStack::PopAndDestroy(); //aView + aView = NULL; + } + return useProxy; + } + +// --------------------------------------------------------- +// CMsgConnManager::IsValidApL +// +// --------------------------------------------------------- +// +TBool CMsgConnManager::IsValidApL( TUint32 aUid ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::IsValidApL()" ) ); + #endif + CCommsDbTableView* table = iCommsDatabase->OpenViewMatchingUintLC( TPtrC( IAP ), + TPtrC( COMMDB_ID ), + aUid ); + TInt res = table->GotoFirstRecord(); + CleanupStack::PopAndDestroy(); // table + return res == KErrNone; + } + +// --------------------------------------------------------- +// CMsgConnManager::DoCancel +// +// --------------------------------------------------------- +// +void CMsgConnManager::DoCancel() + { + #ifdef _DEBUG + WriteToLog( _L8( "CMsgConnManager::DoCancel()" ) ); + #endif + switch( iConnManStatus ) + { + case EMsgConnManWaitingForStartComplete: + #ifdef _DEBUG + WriteToLog( _L8( " Status is EMsgConnManWaitingForStartComplete" ) ); + #endif + iConnection.Close(); + iConnectionTimer->Cancel(); + break; + case EMsgConnManWaitingForNotifications: + #ifdef _DEBUG + WriteToLog( _L8( " Status is EMsgConnManWaitingForNotifications" ) ); + #endif + iConnection.CancelProgressNotification(); + iConnectionTimer->Cancel(); + iConnection.Close(); + break; + case EMsgConnManDisconnectingPrevious: + #ifdef _DEBUG + WriteToLog( _L8( " Status is EMsgConnManDisconnectingPrevious" ) ); + #endif + iConnectionTimer->Cancel(); + User::RequestComplete( iClientStatus, KErrCancel ); + #ifdef _DEBUG + WriteToLog( _L8( " StopConnection() terminated, client's request completed." ) ); + #endif + break; + case EMsgConnManObservingAccessPoint: + case EMsgConnManBearerSuspended: + { + #ifdef _DEBUG + WriteToLog( _L8( " Status is %d" ), iConnManStatus ); + #endif + iConnection.CancelProgressNotification(); + #ifdef __WINS__ + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrCancel ); + #endif + } + break; + case EMsgConnManIdle: + #ifdef _DEBUG + WriteToLog( _L8( " Status is EMsgConnManIdle" ) ); + #endif + break; + default: + #ifdef _DEBUG + WriteToLog( _L8( " Default case" ) ); + #endif + break; + } + } + +// ---------------------------------------------------- +// NewImpsConnManL +// Returns a ConnManager instance +// ---------------------------------------------------- +// +EXPORT_C MMsgConnManager* NewMsgConnManagerL( const TInt aDefaultAccessPoint ) + { + return CMsgConnManager::NewL( aDefaultAccessPoint ); + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef msgconnmanager/src/msgconntimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/msgconnmanager/src/msgconntimer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,193 @@ +/* +* Copyright (c) 2005 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: Connection manager timer +* +*/ + + + + +// INCLUDES +#include "msgconntimer.h" +#include "msgconnmanager.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CMsgConnTimer::CMsgConnTimer() : CActive( EPriorityStandard ), + iCompleteIfCancel( EFalse ) + + { + } + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CMsgConnTimer::CMsgConnTimer( MMsgConnTimerCallback* aClient ) : + CActive( EPriorityStandard ), + iClient( aClient ) + + + { + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +void CMsgConnTimer::ConstructL() + { + User::LeaveIfError( iTimer.CreateLocal() ); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CMsgConnTimer* CMsgConnTimer::NewL() + { + CMsgConnTimer* self = new ( ELeave ) CMsgConnTimer(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CMsgConnTimer* CMsgConnTimer::NewL( MMsgConnTimerCallback* aClient ) + { + CMsgConnTimer* self = new ( ELeave ) CMsgConnTimer( aClient ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CMsgConnTimer::~CMsgConnTimer() + { + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( "CMsgConnTimer::~CMsgConnTimer(), destructor called." ) ); + #endif + Cancel(); + iTimer.Close(); + } + +// --------------------------------------------------------- +// CMsgConnTimer::ActivateTimer +// +// --------------------------------------------------------- +// +void CMsgConnTimer::ActivateTimer( TRequestStatus& aStatus, + TTimeIntervalMicroSeconds32 aDelay ) + { + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( "CMsgConnTimer::ActivateTimer()." ) ); + #endif + __ASSERT_ALWAYS( !IsActive(), User::Panic( _L("ConnectionTimer"), 1 ) ); + iClient = NULL; + aStatus = KRequestPending; + iClientStatus = &aStatus; + iTimer.After( iStatus, aDelay ); + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( " Timer activated." ) ); + #endif + SetActive(); + } + +// --------------------------------------------------------- +// CMsgConnTimer::ActivateTimer +// +// --------------------------------------------------------- +// +void CMsgConnTimer::ActivateTimer( MMsgConnTimerCallback* aClient, + TTimeIntervalMicroSeconds32 aDelay ) + { + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( "CMsgConnTimer::ActivateTimer()" ) ); + #endif + __ASSERT_ALWAYS( !IsActive(), User::Panic( _L("ConnectionTimer"), 1 ) ); + iClient = aClient; + iClientStatus = NULL; + iTimer.After( iStatus, aDelay ); + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( " Timer activated (with client)" ) ); + #endif + SetActive(); + } + +// --------------------------------------------------------- +// CMsgConnTimer::RunL +// +// --------------------------------------------------------- +// +void CMsgConnTimer::RunL() + { + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( "CMsgConnTimer::RunL()." ) ); + #endif + if( iClient != NULL ) + { + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( " iClient != NULL, Callback interface in use." ) ); + #endif + iClient->HandleTimerEvent( iStatus.Int() ); + iClient = NULL; + } + else + { + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( " iClient == NULL, completing request." ) ); + #endif + User::RequestComplete( iClientStatus, iStatus.Int() ); + } + } + +// --------------------------------------------------------- +// CMsgConnTimer::DoCancel +// +// --------------------------------------------------------- +// +void CMsgConnTimer::DoCancel() + { + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( "CMsgConnTimer::DoCancel()" ) ); + #endif + iTimer.Cancel(); + if( iClientStatus != NULL ) + User::RequestComplete( iClientStatus, KErrCancel ); + #ifdef _DEBUG + CMsgConnManager::WriteToLog( _L8( " DoCancel() ends" ) ); + #endif + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef package_definition.xml --- a/package_definition.xml Tue Aug 31 15:35:50 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 2669f8761a99 -r fbd2e7cec7ef package_map.xml --- a/package_map.xml Tue Aug 31 15:35:50 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ - diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/Conf/presencefwsimpleadpt.confml Binary file presencefwsimpleadpt/Conf/presencefwsimpleadpt.confml has changed diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/Conf/presencefwsimpleadpt_10282C84.crml Binary file presencefwsimpleadpt/Conf/presencefwsimpleadpt_10282C84.crml has changed diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/cenrep/backup_registration.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/cenrep/backup_registration.xml Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,5 @@ + + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/cenrep/keys_presencefwsimpleadpt.xls Binary file presencefwsimpleadpt/cenrep/keys_presencefwsimpleadpt.xls has changed diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2007-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: Build information file for SIP/Simple Protocol Plugin +* +*/ + + + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS + +// CenRep config files +../Conf/presencefwsimpleadpt.confml MW_LAYER_CONFML(presencefwsimpleadpt.confml) +../Conf/presencefwsimpleadpt_10282C84.crml MW_LAYER_CRML(presencefwsimpleadpt_10282c84.crml) + + +// backup registry file +../cenrep/backup_registration.xml z:/private/10282c84/backup_registration.xml + +//ROM SIS stub +presencefwsimpleadptstub.SIS /epoc32/data/z/system/install/presencefwsimpleadptstub.sis + +// IBYs +../rom/presencefwsimpleadpt.iby CORE_MW_LAYER_IBY_EXPORT_PATH(presencefwsimpleadpt.iby) + +PRJ_MMPFILES +simpleplugin.mmp + +PRJ_TESTMMPFILES + +PRJ_TESTEXPORTS diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/group/make_StubSis.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/group/make_StubSis.bat Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,18 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: SIMPLE Protocol implementation for Presence Framework +rem + +if exist presencefwsimpleadptstub.sis (del presencefwsimpleadptstub.sis) +makesis -s presencefwsimpleadptstub.pkg presencefwsimpleadptstub.sis diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/group/presencefwsimpleadptstub.SIS Binary file presencefwsimpleadpt/group/presencefwsimpleadptstub.SIS has changed diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/group/presencefwsimpleadptstub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/group/presencefwsimpleadptstub.pkg Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,38 @@ +; +; Copyright (c) 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: SIMPLE Protocol implementation for Presence Framework +; +&EN + +;Header +#{"PresenceFwSimpleAdpt"}, (0x10282C84), 1, 0, 0, TYPE=SA + +;Localised VendorID +%{"Nokia"} + +;VendorID +:"Nokia" + +;Supports Series 60 v 3.0 +;This line indicates that this installation is for the Series 60 platform v3.0 +;This line must appear _exactly_ as shown below in the sis file +;If this line is missing or incorrect, the sis file will not be able +;to be installed on Series 60 v3.0 platforms +[0x101F7961], 0, 0, 0, {"Series60ProductID"} + +;Files +""-"z:\sys\bin\simpleplugin.dll" + +;resources +""-"z:\resource\plugins\simpleplugin.rsc" diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/group/prfwsimpleplugin.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/group/prfwsimpleplugin.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,39 @@ +/* +* Copyright (c) 2007 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: resource definitions +* +*/ + + + +#ifndef SIMPLEPLUGIN_RESOURCE_HRH +#define SIMPLEPLUGIN_RESOURCE_HRH + +/** + * System wide UID 2:s for ECom plugin dlls. + */ +#define SIMPLEPLUGIN_DLL_UID_ECOM_PLUGIN 0x10009D8D + +/** + * SIMPLE protocol dll. + */ +#define SIMPLEPLUGIN_DLL_UID_SIMPLE_PROTOCOL 0x10282C84 + +/** + * Resource file compatible defintions for PrFw test protocols. + */ +#define SIMPLEPLUGIN_1_IMPLEMENTATION_UID 0x10282C86 + +#endif // SIMPLEPLUGIN_RESOURCE_HRH + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/group/simpleplugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/group/simpleplugin.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2006 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: Project definition file for SIP/Simple Protocol Plugin +* +*/ + + + +// To get the MW_LAYER_SYSTEMINCLUDE-definition +#include + +#include "prfwsimpleplugin.hrh" + +TARGET simpleplugin.dll +TARGETTYPE plugin +UID SIMPLEPLUGIN_DLL_UID_ECOM_PLUGIN SIMPLEPLUGIN_DLL_UID_SIMPLE_PROTOCOL +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +// ECOM RESOURCE +START RESOURCE simpleplugin.rss +TARGET simpleplugin.rsc +END + + +SOURCEPATH ../src +SOURCE simpleplugin.cpp +SOURCE simplepluginauthorization.cpp +SOURCE simplepluginconnection.cpp +SOURCE simpleplugindata.cpp +SOURCE simplepluginentitywatcher.cpp +SOURCE simpleplugingroups.cpp +SOURCE simplepluginpublisher.cpp +SOURCE simplepluginsession.cpp +SOURCE simplepluginvariation.cpp +SOURCE simplepluginwatcher.cpp +SOURCE simplepluginwinfo.cpp +SOURCE simplepluginxdmutils.cpp +SOURCE simpleplugindebugutils.cpp + +USERINCLUDE . +USERINCLUDE ../inc + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY euser.lib // Base +LIBRARY ecom.lib +LIBRARY bafl.lib +LIBRARY xmlparser.lib +LIBRARY xmldom.lib +LIBRARY charconv.lib + +LIBRARY simpleengine.lib +LIBRARY rlspresxdm.lib +LIBRARY xdmengine.lib +LIBRARY xdmsettingsapi.lib +LIBRARY presencesettingsapi.lib +LIBRARY centralrepository.lib + +DEBUGLIBRARY flogger.lib // Sending trace data to log file +DEBUGLIBRARY efsrv.lib // file server +DEBUGLIBRARY apparc.lib + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/group/simpleplugin.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/group/simpleplugin.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2006 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: ECOM registery info for SIP/Simple Protocol Plugin +* +*/ + + + + +#include +#include +#include "prfwsimpleplugin.hrh" + +// --------------------------------------------------------------------------- +// ECOM registery info for Presence Framework ECOM hook +// --------------------------------------------------------------------------- +// +RESOURCE REGISTRY_INFO theInfo + { + resource_format_version = RESOURCE_FORMAT_VERSION_2; + dll_uid = SIMPLEPLUGIN_DLL_UID_SIMPLE_PROTOCOL; + + interfaces = + { + INTERFACE_INFO + { + // implemented interface + interface_uid = XIMP_ECOM_IF_UID_PROTOCOL_PLUGIN_BASE_INTERFACE; + + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = SIMPLEPLUGIN_1_IMPLEMENTATION_UID; + version_no = 1; + display_name = "SIMPLE Protocol"; + default_data = "SIMPLE"; + + // Protocol capabilities: "valuevalue..." + // + //

Provider + // Feature id + // Supported schema + // + // Example: + // "

Nokiafeat/pres/foofeat/pres/barsip" + // + opaque_data = "

Nokiafeat/pres/pubfeat/pres/fetchfeat/pres/subssip"; + } + }; + } + }; + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/msimplepluginconnectionobs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/msimplepluginconnectionobs.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,135 @@ +/* +* Copyright (c) 2007 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: Presence FW SIMPLE plugin engine connection observer +* +*/ + + + + +#ifndef MSIMPLEPLUGINCONNECTIONOBSERVER_H +#define MSIMPLEPLUGINCONNECTIONOBSERVER_H + +#include + +class TXIMPRequestId; +class MXIMPObjectFactory; +class MPresenceObjectFactory; +class MXIMPProtocolConnectionHost; + +class CSimplePluginWinfo; +class MSimpleWinfo; +class CSimplePluginXdmUtils; + + +/** + * MSimplePluginConnectionObs + * + * SIMPLE engine connection + * + * @lib simpleengine + * @since s60 v5.0 + */ + +class MSimplePluginConnectionObs + { + +public: + +enum TReqType + { + /** undefined */ + ENoReq = 0, + /** Connection initializing */ + EOpenSess + }; + + /** + * Coplete the request + * + * @since S60 3.2 + * @param aType request type + * @param aStatus status + */ + virtual void CompleteReq( TReqType aType, TInt aStatus ) = 0; + + /** + * Coplete the request + * + * @since S60 3.2 + * @param aReqId PrFw request id + * @param aStatus status + */ + virtual void CompleteReq( TXIMPRequestId aReqId, TInt aStatus ) = 0; + + /** + * Coplete the SIP watcher info request + * + * @since S60 3.2 + * @param aReqId PrFw request id + * @param aStatus status + */ + virtual void CompleteWinfoReq( TXIMPRequestId aReqId, TInt aStatus ) = 0; + + /** + * PrFw Object Factory accessor + * @since S60 3.2 + * @return PrFw Object Factory + */ + virtual MXIMPObjectFactory& ObjectFactory()=0; + + /** + * PrFw Object Factory accessor + * @since S60 3.2 + * @return PrFw Object Factory + */ + virtual MPresenceObjectFactory& PresenceObjectFactory()=0; + + /** + * CSimplePluginWinfo accessor + * @since S60 3.2 + * @return CSimplePluginWinfo, ownership is not transferred. + */ + virtual CSimplePluginWinfo* WinfoHandlerL()=0; + + /** + * CSimplePluginWinfoObserver is terminated + * @since S60 3.2 + * @param aReason reason code + */ + virtual void WinfoTerminatedL( TInt aReason )=0; + + /** + * Watcher info subscription notification is received + * @aWinfo notification content + */ + virtual void WinfoNotification( MSimpleWinfo& aWinfo ) = 0; + + /** + * Access CSimplePluginXdmUtils + * @return CSimplePluginXdmUtils entity + */ + virtual CSimplePluginXdmUtils* XdmUtilsL() = 0; + + /** + * Access connection host + * @return MXIMPProtocolConnectionHost + */ + virtual MXIMPProtocolConnectionHost* Host() = 0; + + }; + +#endif + +// End of File \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/msimplepluginsettings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/msimplepluginsettings.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,66 @@ +/* +* Copyright (c) 2007 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: Presence FW SIMPLE plugin engine settings +* +*/ + + + + +#ifndef MSIMPLEPLUGINCONNECTIONSETTINGS_H +#define MSIMPLEPLUGINCONNECTIONSETTINGS_H + +#include + +class CSimplePluginVariation; + +/** + * MSimplePluginConnectionObs + * + * SIMPLE engine connection + * + * @lib simpleengine + * @since s60 v5.0 + */ + +class MSimplePluginSettings + { + +public: + + /** + * Current registered SIP entity + */ + virtual TPtrC16 CurrentSipPresentity() = 0; + + /** + * Current registered SIP entity + */ + virtual TPtrC8 CurrentSipPresentity8() = 0; + + /** + * Current domain syntax accessor + */ + virtual TPtrC16 CurrentDomain() = 0; + + /** + * Variation + */ + virtual CSimplePluginVariation& Variation() = 0; + + }; + +#endif + +// End of File \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/msimpleplugintestobs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/msimpleplugintestobs.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2007 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: Presence FW SIMPLE plugin test suite +* +*/ + + + + +#ifndef MSIMPLEPLUGINTESTOBS_H +#define MSIMPLEPLUGINTESTOBS_H + +#include + + +/** + * MSimplePluginTestObs + * + * SIMPLE plugin tester observer for active object testing + * + * @lib simpleplugin + * @since s60 v5.0 + */ + +class MSimplePluginTestObs + { + +public: + + /** + * Test callback in the begin of RunL or callback + */ + virtual void TestCallbackInRunL( + TInt aStatus, TInt aState, TInt aAuxInt, const TDesC& aAuxStr) = 0; + + /** + * Test callback before new asynch request + */ + virtual void TestCallbackAsynchL( + TInt aStatus, TInt aState, TInt aAuxInt, const TDesC& aAuxStr) = 0; + + + }; + +#endif + +// End of File \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/msimpleplugtestobs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/msimpleplugtestobs.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2007 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: Presence FW SIMPLE plugin test suite +* +*/ + + + + +#ifndef MSIMPLEPLUGINTESTOBS_H +#define MSIMPLEPLUGINTESTOBS_H + +#include + + +/** + * MSimplePluginTestObs + * + * SIMPLE plugin tester observer for active object testing + * + * @lib simpleplugin + * @since S60 v3.2 + */ + +class MSimplePluginTestObs + { + +public: + + /** + * Current registered SIP entity + */ + virtual void TestCallback( + TInt aStatus, TInt aState, TInt aAuxInt, const TDesC& aAuxStr) = 0; + + }; + +#endif + +// End of File \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/presencefwsimpleadptprivatecrkeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/presencefwsimpleadptprivatecrkeys.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + +#ifndef PRESENCEFWSIMPLEADPTPRIVATECRKEYS_H +#define PRESENCEFWSIMPLEADPTPRIVATECRKEYS_H + +#include + +const TUid KCRUIDPresencefwSimpleadptVariation = {0x10282C84}; + +// Id for rule to grant all elements +const TUint32 KPrFwSimpleGrantAllRuleName = 0x00000001; +// Id for rule to grant own data +const TUint32 KPrFwSimpleGrantOwnRuleName = 0x00000002; +// Id for default rule +const TUint32 KPrFwSimpleDefaultRuleName = 0x00000003; +// Id for block rule +const TUint32 KPrFwSimpleBlockRuleName = 0x00000004; +// Default rule action, allow/confirm/block +const TUint32 KPrFwSimpleDefaultRuleAction = 0x00000005; +// Block rule action, block/polit +const TUint32 KPrFwSimpleBlockRuleAction = 0x00000006; +// Template for RLS service URI for a user group +const TUint32 KPrFwSimpleRlsGroupUriTemplate = 0x00000007; +// Top level for lists in shared XDM index document +const TUint32 KPrFwSimpleSharedXdmTop = 0x00000008; +// Name of the Shared XDM list for granted users +const TUint32 KPrFwSimpleGrantListName = 0x00000009; + +#endif // PRESENCEFWSIMPLEADPTPRIVATECRKEYS_H + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simpleplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simpleplugin.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGIN_H +#define CSIMPLEPLUGIN_H + +#include + +#include +#include + +class MXIMPProtocolConnection; +class MXIMPServiceInfo; +class MXIMPClientContextInfo; +class CSimplePluginConnection; + + +/** + * CSimplePlugin + * + * Implementation of CPrFwProtocolPluginBase + * + * @lib ?library + * @since s60 v5.0 + */ +class CSimplePlugin: public CXIMPProtocolPluginBase + { +public: + + static CSimplePlugin* NewL(); + static CSimplePlugin* NewLC(); + + virtual ~CSimplePlugin(); + +private: + + CSimplePlugin(); + void ConstructL(); + + +public: + +// from base class MXIMPProtocolPlugin + + /** + * Defined in a base class + */ + void PrimeHost( MXIMPProtocolPluginHost& aHost ); + + /** + * Defined in a base class + */ + MXIMPProtocolConnection& AcquireConnectionL( + const MXIMPServiceInfo& aService, + const MXIMPContextClientInfo& aContextClient ); + + /** + * Defined in a base class + */ + void ReleaseConnection( + MXIMPProtocolConnection& aConnection ); + +// from base class MXIMPBase + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + +private: // Data + + /* + * Prime host + * Not own. + */ + MXIMPProtocolPluginHost* iHost; + + /** + * Simple plugin connections + */ + RPointerArray< CSimplePluginConnection > iConnections; + + }; + +#endif // CSIMPLEPLUGIN_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginauthorization.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginauthorization.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,450 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINAUTHORIZATION_H +#define CSIMPLEPLUGINAUTHORIZATION_H + +#include + +#include +#include + +#include "simpleplugincommon.h" +#include "msimplepluginconnectionobs.h" + +class TXIMPRequestId; +class MXIMPIdentity; +class MPresenceInfoFilter; +class MProtocolPresenceAuthorizationDataHost; + +class MSimpleWinfo; +class CPresenceXDM; +class CRLSXDM; +class CXdmEngine; +class CXdmDocument; + + +/** + * CSimplePluginAuthorization + * + * Simple Engine Connection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginAuthorization ) : public CActive, + public MProtocolPresenceAuthorization + { +public: + + + /** + * Current operation + */ + enum TPluginAuthOperation + { + ENoOperation, + // XDM operations + EGrantPresenceForPresentity, + EGrantPresenceForPresentityGroupMembers, + EWithdrawFromPresentity, + EWithdrawFromGroupMembers, + EGrantForEveryone, + EWithdrawFromEveryone, + ESubscribeBlockList, + EUnsubscribeBlockList, + EBlockPresentity, + EUnblockPresentity, + // SIP and XDM operations + ESubscribePresenceGrantRequestList, + EUnsubscribePresenceGrantRequestList + }; + + /** + * Current default rule + */ + enum TPluginAuthDefRule + { + ERuleDef, + ERuleConfirm, + ERuleAllow + }; + + /** + * Constructor. + * @param aObs callback for complete requests + */ + static CSimplePluginAuthorization* NewL( + MSimplePluginConnectionObs& aObs ); + + virtual ~CSimplePluginAuthorization(); + + /** + * SetDataHost + * + * Set Data Host + * + * @lib ?library + * @since s60 v5.0 + */ + void SetDataHost( MProtocolPresenceAuthorizationDataHost& aDataHost ); + + /** + * WinfoTerminatedL + * + * SIMPLE Winfo watcher subscription is terminated + * @param aReason reason code + */ + void WinfoTerminatedL( TInt aReason ); + + /** + * WINFO received from SIMPLE + * @param aWinfo WINFO + */ + void WinfoNotificationL( MSimpleWinfo& aWinfo ); + + /** + * This is to ensure that WINFO watchers responses are detected. + * @param aPrFwId framework request id to be completed + * @param sStatus error code + */ + TBool HandleIfMine( TXIMPRequestId aPrFwId, TInt aStatus ); + + +private: + + CSimplePluginAuthorization( + MSimplePluginConnectionObs& aObs ); + + void ConstructL( ); + + +// from base class MXIMPBase +public: + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + +// from base class MProtocolPresenceAuthorization + + /** + * Defined in a base class + */ + void DoSubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ); + +// Granting presence information access to single presentities + + /** + * Defined in a base class + */ + void DoGrantPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresenceGrantPifForPresentityL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoWithdrawPresenceGrantFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + +// Granting presence information access to presentity group members + + /** + * Defined in a base class + */ + void DoGrantPresenceForPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresenceGrantPifForPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoWithdrawPresenceGrantFromPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + +// Granting presence information access to everyone + + /** + * Defined in a base class + */ + void DoGrantPresenceForEveryoneL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresenceGrantPifForEveryoneL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoWithdrawPresenceGrantFromEveryoneL( + TXIMPRequestId aReqId ); + +// Subscribe presence block list + + /** + * Defined in a base class + */ + void DoSubscribePresenceBlockListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresenceBlockListL( + TXIMPRequestId aReqId ); + +// Blocking presence information access from single presentities + + /** + * Defined in a base class + */ + void DoBlockPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoCancelPresenceBlockFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + + +protected: + +// from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + +private: + + /** + * Save presentity id + * @param aPresentityId presentity id + */ + void SetPresIdentityL( + const MXIMPIdentity& aPresentityId ); + + /** + * Calls MXIMPProtocolConnectionHost callback + * @param aStatus error status + */ + void CompletePrFwReq( TInt aStatus ); + + + /** + * Start XDM operation + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ); + + /** + * Start XDM operation. StartXdmOperationL calls this. + */ + void DoStartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ); + + /** + * Start XDM operation. HandleIfMine calls this. + */ + void DoStartXdmOperationL( + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ); + + /** + * Call CSimpleXdmUtils operation + */ + void CallActualXdmOperationL(); + + /** + * Copy data from aBlockers to aBlockedSouls + * @param aBlockers user ids + * @param aBlockedSouls user PrFwIdentities + * + */ + void CopyBlockersToArrayL( + CPtrCArray& aBlockers, RPointerArray& aBlockedSouls ); + + /** + * Handle full Winfo notification + * @param aWinfo WINFO + */ + void HandleFullWinfoNotificationL( MSimpleWinfo& aWinfo ); + + /** + * Handle partial Winfo notification + * @param aWinfo WINFO + */ + void HandlePartialWinfoNotificationL( MSimpleWinfo& aWinfo ); + + /** + * Call HandlePresenceGrantRequestReceivedL + * @param aUserId user id + */ + void CallHandlePresenceGrantRequestReceivedL( const TDesC& aUserId ); + + /** + * Call HandlePresenceGrantRequestObsoletedL( + * @param aUserId user id + */ + void CallHandlePresenceGrantRequestObsoletedL( const TDesC& aUserId ); + + /** + * Handle block list subscription routines + */ + void HandleSubscribeBlockListL(); + + +private: // Data + + /** + * PrFw Plugin connection observer + */ + MSimplePluginConnectionObs& iConnObs; + + /** + * PrFw Plugin Authorization Data Host + * Not own. + */ + MProtocolPresenceAuthorizationDataHost* iDataHost; + + /** + * XDM Settings id + */ + TInt iSettingsId; + + /** + * PrFW request id + */ + TXIMPRequestId iPrFwId; + + /** + * PrFW request id for own requests + */ + TXIMPRequestId iPrFwIdOwn; + + /** + * Simple Engine request id + */ + TInt iSimpleId; + + /** + * Current operation + */ + TPluginAuthOperation iOperation; + + /** + * Current presentity in progress + * Own. + */ + HBufC16* iPresIdentity; + + /** + * Whether XDM utility is initialized + */ + TBool iXdmOk; + + /** + * XDM Utils + * Not own. + */ + CSimplePluginXdmUtils* iXdmUtils; + + /** + * Current default rule + */ + TPluginAuthDefRule iDefRule; + + /** + * Active WINFO subscription + */ + TBool iWinfoSubs; + + + }; + +#endif // CSimplePluginAuthorization_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simpleplugincommon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simpleplugincommon.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,168 @@ +/* +* Copyright (c) 2006 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: C++ compatible definitions for PrFw SIMPLE protocol +* +*/ + + + +#ifndef SIMPLEPLUGINCOMMON_H +#define SIMPLEPLUGINCOMMON_H + +#include +#include + + +/** + * common definitions for SIMPLE Plugin + */ + +// Simple Plugin specifications + +/** Nothing subscribed */ +const TUint KSimplePluginSubsNone = 0x00000000; +/** Grant list subscribed */ +const TUint KSimplePluginSubsGrant = 0x00000001; + +/** max length of auth rule id in auth rules document */ +const TUint KSimplePluginMaxRuleLength = 100; + +/** the last general error code in e32err.h */ +const TInt KSimplePluginGeneralErrorLow = KErrCommsBreak; + +// OMA specifications + +/** OMA buddy list id */ +_LIT( KSimpleOMABuddyList, "oma_buddylist"); +/** OMA blocked list id */ +_LIT( KSimpleOMABlockedList, "oma_blockedcontacts"); + + +namespace NSimplePlugin + { + namespace NSimpleRls + { + _LIT( KOne, "http://"); // 7 + _LIT( KThree, "/resource-lists/users/"); // 22 + _LIT( KFive, "/index/~~/resource-lists/list%5b@name=%22"); // 41 + _LIT( KSeven, "%22%5d"); // 6 + const TInt totalSize = 76; + } + namespace NSimpleRlsBuddy + { + _LIT( KOne, "http://"); // 7 + _LIT( KThree, "/resource-lists/users/"); // 22 + _LIT( KFive, "/index/~~/resource-lists/list%5b@name=%22oma_buddylist%22%5d/list%5b@name=%22"); // 77 + _LIT( KSeven, "%22%5d"); // 6 + const TInt totalSize = 112; + } + namespace NSimpleOma + { + _LIT( KSimpleIndex, "index"); + _LIT( KSimpleResourceLists, "resource-lists"); + _LIT( KSimpleList, "list"); + _LIT( KSimpleName, "name"); + _LIT( KSimpleDisplayName, "display-name"); + _LIT( KSimpleEntry, "entry"); + _LIT( KSimpleExternal, "external"); + _LIT( KSimpleAnchor, "anchor"); + _LIT( KSimplePerson, "person"); + _LIT( KSimpleBlock, "block"); + _LIT( KSimplePoliteBlock, "polite-block"); + _LIT( KSimpleConfirm, "confirm"); + _LIT( KSimpleAllow, "allow"); + _LIT( KSimpleOpen, "open"); + _LIT( KSimpleClosed, "closed"); + _LIT( KSimpleUri, "uri"); + _LIT8( KSimplePerson8, "person"); + _LIT8( KSimpleWatcher8, "watcher"); + _LIT8( KSimpleWatherInfo8, "watcherinfo"); + _LIT8( KSimpleWatcherList8, "watcher-list"); + _LIT8( KSimpleStatus8, "status"); + _LIT8( KSimpleActive8, "active"); + _LIT8( KSimpleEvent8, "event"); + _LIT8( KSimplePending8, "pending"); + _LIT8( KSimpleOverridingwillingness8, "overriding-willingness"); + _LIT8( KSimpleBasic8, "basic"); + _LIT8( KSimpleStatusicon8, "status-icon"); + _LIT8( KSimpleNote8, "note"); + _LIT8( KSimpleSubscribe8, "subscribe"); + _LIT8( KSimpleList8, "list"); + _LIT8( KSimpleResource8, "resource"); + _LIT8( KSimpleInstance8, "instance"); + _LIT8( KSimpleState8, "state"); + _LIT8( KSimpleTerminated8, "terminated"); + _LIT8( KSimpleUri8, "uri"); + _LIT8( KSimpleFull8, "full"); + _LIT8( KSimpleFullState8, "fullState"); + _LIT8( KSimpleTrue8, "true"); + _LIT8( KSimpleId8, "id"); + _LIT8( KSimpleTimestamp8, "timestamp"); + } + } + + +// S60 specifications + +/** Presence XDM block rule id */ +_LIT( KSimpleXdmBlockRule, "blockall"); +/** Presence XDM grant rule id */ +_LIT( KSimpleXdmGrantRule, "allowall"); +/** Presence XDM grant rule id for own sbscribe*/ +_LIT( KSimpleXdmOwnGrantRule, "grantown"); +/** Presence XDM default rule id */ +_LIT( KSimpleXdmDefaultRule, "default"); + +/** S60 Shared XDM list for granted entities */ +_LIT( KSimpleS60GrantedList, "oma_grantlist"); + +/** S60 default RLS URI template */ +_LIT( KSimpleRlsGroupUriTemplate, "_@"); +_LIT16( KSimpleGroupTag, ""); +_LIT16( KSimpleUserTag, ""); +_LIT16( KSimpleDomainTag, ""); + +/** + example: + + + http://EXAMPLE.COM/resource-lists/users/ + sip:USER@EXAMPLE.COM/index/~~/resource-lists/list%5b@name=%22oma_buddylist%22%5d/list%5b@name=%22my_friends%22%5d + + + presence + + + + http://EXAMPLE.COM/resource-lists/users/ + sip:USER@EXAMPLE.COM/index/~~/resource-lists/list%5b@name=%22oma_buddylist%22%5d/list%5b@name=%22my_colleques%22%5d + + + presence + + + +#include +#include "msimplepluginconnectionobs.h" +#include "msimplepluginsettings.h" + +class MXIMPObjectFactory; +class MXIMPServiceInfo; +class CSimplePluginAuthorization; +class CSimplePluginSession; +class CSimplePluginPublisher; +class CSimplePluginWatcher; +class CSimplePluginGroups; +class CSimplePluginVariation; + +/** + * CSimplePluginConnection + * + * Implementation of MXIMPProtocolConnection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS(CSimplePluginConnection) : public CBase, + public MXIMPProtocolConnection, + public MProtocolPresenceFeatures, + public MSimplePluginConnectionObs, + public MSimplePluginSettings + { + +public: + + static CSimplePluginConnection* NewL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aClientCtxInfo ); + + ~CSimplePluginConnection(); + +private: + + CSimplePluginConnection(); + + + void ConstructL( const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aClientCtxInfo ); + +public: + + /** + * Convert error code into PrFW errors + * @param aStatus error code [IN] + * @return harmonized error code + */ + static TInt HarmonizeErrorCode( TInt aStatus ); + +// from base class MXIMPBase +public: + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + +// from base class MXIMPProtocolConnection +public: + + /** + * Defined in a base class + */ + void PrimeHost( MXIMPProtocolConnectionHost& aHost ); + + /** + * Defined in a base class + */ + void OpenSessionL( + const MXIMPContextClientInfo& aContextClient, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void OpenSessionL( + const TInt& aSettingsId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void CloseSession( + const MXIMPContextClientInfo& aContextClient, + TXIMPRequestId aOpId ); + + /** + * Defined in a base class + */ + void GetSupportedFeaturesL( CDesC8Array& aFeatures ) const; + + /** + * Defined in a base class + */ + MProtocolPresenceFeatures& ProtocolPresenceFeatures(); + +/* + +*/ +// BRANCH 08-06-06 : gronoff + TAny* GetProtocolInterface( TInt aInterfaceId ); +// BRANCH_END 08-06-06 : gronoff + + +// from base class MProtocolPresenceFeatures + + MProtocolPresenceWatching& PresenceWatching(); + + + MProtocolPresencePublishing& PresencePublishing(); + + + MProtocolPresentityGroups& PresentityGroups(); + + + MProtocolPresenceAuthorization& PresenceAuthorization(); + + + +// from base class MSimplePluginConnectionObs + + /** + * Defined in a base class + */ + void CompleteReq( TReqType aType, TInt aStatus ); + + /** + * Defined in a base class + */ + void CompleteReq( TXIMPRequestId aReqId, TInt aStatus ); + + /** + * Defined in a base class + */ + void CompleteWinfoReq( TXIMPRequestId aReqId, TInt aStatus ); + + /** + * Defined in a base class + */ + MXIMPObjectFactory& ObjectFactory(); + + /** + * Defined in a base class + */ + MPresenceObjectFactory& PresenceObjectFactory(); + + /** + * Defined in a base class + */ + CSimplePluginWinfo* WinfoHandlerL(); + + /** + * Defined in a base class + */ + void WinfoTerminatedL( TInt aReason ); + + /** + * Defined in a base class + */ + void WinfoNotification( MSimpleWinfo& aWinfo ); + + /** + * Defined in a base class + */ + CSimplePluginXdmUtils* XdmUtilsL(); + + /** + * Defined in a base class + */ + MXIMPProtocolConnectionHost* Host(); + + +// from base class MSimplePluginSettings + + /** + * Defined in a base class + */ + TPtrC16 CurrentSipPresentity(); + + /** + * Defined in a base class + */ + TPtrC8 CurrentSipPresentity8(); + + /** + * Defined in a base class + */ + TPtrC16 CurrentDomain(); + + /** + * Variation + */ + CSimplePluginVariation& Variation(); + +private: + + + +private: // data members + + /** + * Host for connection. + * Not own. + */ + MXIMPProtocolConnectionHost* iConnectionHost; + + /** + * Simple Engine session + * Own. + */ + CSimplePluginSession* iSession; + + /** + * current request id + */ + TXIMPRequestId iPrFwId; + + /** + * MProtocolPresenceAuthorization implementation. + * Own. + */ + CSimplePluginAuthorization* iAuth; + + /** + * CSimplePluginWinfo + * Own. + */ + CSimplePluginWinfo* iPluginWinfo; + + /** + * CSimplePluginPublisher + * Own. + */ + CSimplePluginPublisher* iPublisher; + + /** + * CSimplePluginWatcher + * Own. + */ + CSimplePluginWatcher* iWatcher; + + /** + * CSimplePluginGroups + * Own. + */ + CSimplePluginGroups* iGroups; + + /** + * Current user SIP identity + * Own. + */ + HBufC16* iSipPresentity; + + /** + * XDM utils + * Own. + */ + CSimplePluginXdmUtils* iXdmUtils; + + + /** + * Run time variation + * Own + */ + CSimplePluginVariation* iVariation; + + }; + + +#endif // CSIMPLEPLUGIN_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simpleplugindata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simpleplugindata.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,178 @@ +/* +* Copyright (c) 2007 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef C_SIMPLEPLUGINDATA_H +#define C_SIMPLEPLUGINDATA_H + + +// Includes +#include + +class MXIMPObjectFactory; +class MXIMPIdentity; + +class MPresenceObjectFactory; +class MSimpleDocument; +class MPresenceInfo; +class MSimplePresenceList; +class MPresenceInfoFieldCollection; +class MPersonPresenceInfo; +class MPresenceInfoFieldValueEnum; +class MSimpleElement; +class MPresenceInfoFieldValueText; + + +/** + * CSimplePluginData + * + * This provides data conversion between SIMPLE Engine and PrFw data strcutres. + * + * @lib simplexmlutils + * @since s60 v5.0 + */ +NONSHARABLE_CLASS(CSimplePluginData) : public CBase + { +public: + + static CSimplePluginData* NewL( ); + + static CSimplePluginData* NewLC(); + + virtual ~CSimplePluginData(); + + /** + * Convert to engine notification to MPresenceInfo + * @param aPresenceFactory PrFw Presence Factory + * @param aDocument notification + * @param aPrInfo PrFW info structure [out] + */ + static void NotifyToPrInfoL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleDocument& aDocument, + MPresenceInfo& aPrInfo ); + + /** + * Convert to engine list notification to MPresenceInfo elements + * @param aFactory PrFw Factory + * @param aPresenceFactory PrFw Presence Factory + * @param aList notification + * @param aEntities array of PrFW info structure [out] + * @param aTerminated array of PrFW info structure for terminated entities [out] + * @param aFullList ETrue if full state list [out] + */ + static void NotifyListToPrInfoL( + MXIMPObjectFactory& aFactory, + MPresenceObjectFactory& aPresenceFactory, + MSimplePresenceList& aList, + RPointerArray& aEntities, + RPointerArray& aActives, + RPointerArray& aTerminated, + TBool& aFullList ); + + /** + * Converts MPersonPresenceInfo to MSimpleDocument elements + * @param aInfo Person's presence info [in] + * @param aDocument PIDF document containing Person's presence info [out] + * @param aSipId Person's SIP indetity + */ + static void AddPrPersToSimpleDocumentL( + const MPersonPresenceInfo* aInfo, + MSimpleDocument& aDocument, + const TDesC8& aSipId ); + + +private: + + CSimplePluginData(); + + void ConstructL( ); + + static void UserOverridingWillingnessToPrFwL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection ); + + static void UserStatusIconToPrFwL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection, + MSimpleDocument& aDocument ); + + static void UserNoteToPrFwL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection ); + + static void CollectAllPresentitiesL( + RPointerArray& aEntities, + RPointerArray& aActives, + RPointerArray& aDocs, + MXIMPObjectFactory& aFactory, + MPresenceObjectFactory& aPresenceFactory ); + + /** + * Add terminated instances into array + * @param aTerminated list of PrFw indetities [OUT] + * @param aElems RLS meta data list entry elements + * @param aFactory PrFw Factory + */ + static void CollectTerminatedPresentitiesL( + RPointerArray& aTerminated, + RPointerArray& aElems, + MXIMPObjectFactory& aFactory ); + + /** + * Search the latest timestamp in the elements + * @param aElems element array + * @retun position of the latest element in the element array. KErrNotFound if not found. + */ + static TInt SearchLatestTimestampL( + RPointerArray& aElems ); + + /** + * Add availability info into SIMPLE document + * @param aText new value [IN] + * @param aPersElem personal data to be modified [OUT] + */ + static void AddPrPersAvailabilityToDocL( + const MPresenceInfoFieldValueText* aText, + MSimpleElement* aPersElem ); + + /** + * Check if the current element is terminated instance. + * If yes then add the aUri into aTerminated + * @param aTerminated list of PrFw indetities [OUT] + * @param aElem current element + * @param aUri8 corresponding sip entity URI + * @param aFactory PrFw Factory + */ + static void SearchTerminatedInstanceL( + RPointerArray& aTerminated, + MSimpleElement* aElem, + const TDesC8* aUri8, + MXIMPObjectFactory& aFactory ); + + + +}; + + + +#endif // C_SIMPLEPLUGINDATA_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simpleplugindebugutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simpleplugindebugutils.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2006 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: DEBUG utilities, for DEBUG version only +* +*/ + + + + +#ifndef SIMPLEPLUGINDEBUGUTILS_H +#define SIMPLEPLUGINDEBUGUTILS_H + +#ifdef _DEBUG + +#include +#include + +// FORWARD DECLARATION +class RFs; +class RFileReadStream; + + +//********************************** +// PluginLogger +//********************************** +NONSHARABLE_CLASS( PluginLogger ) + { +public: + static void Log(TRefByValue aFmt,...); + }; + +#endif // _DEBUG + +#endif // simpledebugutils_H + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simpleplugindef.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simpleplugindef.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2006 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: C++ compatible definitions for PrFw SIMPLE protocol +* +*/ + + + +#ifndef SIMPLEPLUGINDEF_H +#define SIMPLEPLUGINDEF_H + +#include +#include "prfwsimpleplugin.hrh" + + +/** + * C++ compatible definitions for PrFw SIMPLE protocol. + * + * This must be kept in-sync with definitions in + * "simpleplugin_resource.hrh" + */ + +//PrFw primary test protocol +const TInt K_SIMPLEPLUGIN_1_IMPLEMENTATION_UID = SIMPLEPLUGIN_1_IMPLEMENTATION_UID; +const TInt K_SIMPLEPLUGIN_1_VERSION_NO = 1; +_LIT( K_SIMPLEPLUGIN_1_DISPLAY_NAME, "PrFw SIMPLE protocol" ); +_LIT( K_SIMPLEPLUGIN_1_DEFAULT_DATA, "SIMPLE" ); +_LIT( K_SIMPLEPLUGIN_1_OPAQUE_DATA , " " ); + +#endif // SIMPLEPLUGINDEF_H + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginentitywatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginentitywatcher.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,225 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINENTITYWATCHER_H +#define CSIMPLEPLUGINENTITYWATCHER_H + +#include + +#include + +#include + +#include "simpleplugincommon.h" +#include "msimplepluginconnectionobs.h" + + +class TXIMPRequestId; +class MXIMPIdentity; +class MXIMPProtocolConnectionHost; +class MPersonPresenceInfo; + +class MSimpleDocument; +class MSimpleWatcher; + +class CSimplePluginWatcher; + +/** + * CSimplePluginEntityWatcher + * + * Simple Engine Connection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginEntityWatcher ): public CBase, + public MSimpleWatcherObserver + { + +private: + /** + * Current operation + */ + enum TPluginEntityWatcherOperation + { + EPluginIdle, + EPluginStop, + EPluginStart + }; + +public: + + /** + * Constructor. + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + * @param aHost PrFw connection host + */ + static CSimplePluginEntityWatcher* NewL( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CSimplePluginWatcher& aWatcher ); + + virtual ~CSimplePluginEntityWatcher(); + + + /** + * Access Request id + * @return PrFw request id + */ + TXIMPRequestId PrFwRequestId(); + + /** + * Access Presentity id + * @return Presentity id + */ + TPtrC8 PresentityId(); + + /** + * Start subscribe + * @param aPresentityId presentity id + */ + void StartSubscribeL( + const TDesC8& aPresentityId ); + + /** + * Start subscribe + * @param aPresentityId presentity id + */ + void StartSubscribeListL( + const TDesC8& aPresentityId ); + + /** + * Set simple name + * @param aPresentityId presentity id + */ + void SetSimpleNameL( + const TDesC8& aPresentityId ); + + void StopSubscribeL( ); + +private: + + CSimplePluginEntityWatcher( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CSimplePluginWatcher& aWatcher ); + + void ConstructL( ); + +public: + +// from base class MSimpleWatcherObserver + + /** + * Defined in a base class + */ + void WatcherReqCompleteL( TInt aOpId, TInt aStatus ); + + /** + * Defined in a base class + */ + void WatcherNotificationL( MSimpleDocument& aDocument ); + + /** + * Defined in a base class + */ + void WatcherListNotificationL( MSimplePresenceList& aList ); + + /** + * Defined in a base class + */ + void WatcherTerminatedL( + TInt aOpId, TInt aReason ); + +private: + + /** + * Calls caller active object + * @param aStatus error status + */ + void CompleteClientReq( TInt aStatus ); + + + +private: // Data + + /** + * host class + */ + CSimplePluginWatcher& iPluginWatcher; + + /** + * PrFw Plugin connection observer + */ + MSimplePluginConnectionObs& iConnObs; + + /** + * SIMPLE engine connection + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine watcher + * Own. + */ + MSimpleWatcher* iWatcher; + + /** + * PrFW request id + */ + TXIMPRequestId iPrFwId; + + /** + * Simple Engine request id + */ + TInt iSimpleId; + + /** + * client statutus. + * Not own. + */ + TRequestStatus* iClientStatus; + + /** + * Subscribed entity id + * Own. + */ + HBufC8* iEntityId; + + /** + * Subscribed entity id, pure group name + * Own. + */ + HBufC8* iSimpleEntityId; + + /** + * current pending operation + */ + TPluginEntityWatcherOperation iOperation; + + /** + * Whether subscription of list is pending + */ + TBool iListSubsActive; + + }; + +#endif // CSimplePluginEntityWatcher_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simpleplugingroups.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simpleplugingroups.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,441 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINGROUPS_H +#define CSIMPLEPLUGINGROUPS_H + +#include + +#include +#include + +#include + +#include "simpleplugincommon.h" +#include "msimplepluginconnectionobs.h" + + +class TXIMPRequestId; +class MXIMPIdentity; +class MPresenceInfoFilter; +class MProtocolPresentityGroupsDataHost; +class MXIMPObjectCollection; + +class MSimpleWinfo; +class CPresenceXDM; +class CRLSXDM; +class CXdmEngine; +class CXdmDocument; + + +/** + * CSimplePluginGroups + * + * Simple Engine Connection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginGroups ) : public CActive, + public MProtocolPresentityGroups + { +private: + + + /** + * Current operation + */ + enum TPluginGroupsOperation + { + ENoOperation, + ECreatePresentityGroup, + EDeletePresentityGroup, + EAddPresentityGroupMember, + ERemovePresentityGroupMember, + EGetListOfLists, + EGetListContent + }; + + /** + * Current actibe object state + */ + enum TPluginGroupsState + { + EPluginIdle, + EPluginInitXdm, + EPluginFetchRls, + EPluginAddGroupMember, + EPluginRemoveGroupMember, + EPluginCommitRls, + EPluginCommitXdm, + ERemoveGroupFromGranted + }; + +public: + /** + * Constructor. + * @param aObs callback for complete requests + */ + static CSimplePluginGroups* NewL( + MSimplePluginConnectionObs& aObs ); + + virtual ~CSimplePluginGroups(); + + + +private: + + CSimplePluginGroups( + MSimplePluginConnectionObs& aObs ); + + void ConstructL( ); + + +// from base class MXIMPBase +public: + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + +// from base class MProtocolPresentityGroups + + /** + * Defined in a base class + */ + void DoSubscribePresentityGroupListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityGroupListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoCreatePresentityGroupL( + const MXIMPIdentity& aGroupId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoDeletePresentityGroupL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityGroupDisplayNameL( + const MXIMPIdentity& aGroupId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribePresentityGroupContentL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityGroupContentL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoAddPresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + const TDesC16& aMemberDisplayName, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoRemovePresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityGroupMemberDisplayNameL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + const TDesC16& aMemberDisplayName, + TXIMPRequestId aReqId ); + +protected: + +// from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + +private: + + /** + * Save presentity id + * @param aPresentityId presentity id + */ + void SetPresIdentityL( + const MXIMPIdentity& aPresentityId ); + + /** + * Save presentity id + * @param aPresentityId presentity id + */ + void SetPresIdentity2L( + const MXIMPIdentity& aPresentityId ); + + /** + * Calls MXIMPProtocolConnectionHost callback + * @param aStatus error status + */ + void CompletePrFwReq( TInt aStatus ); + + /** + * Start XDM operation + */ + void StartXdmOperationL( + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ); + + /** + * Start XDM operation + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ); + + /** + * Start XDM operation + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ); + + /** + * Start XDM operation + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + const MXIMPIdentity& aMemberId, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ); + + /** + * Start XDM operation + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + const MXIMPIdentity& aMemberId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ); + + /** + * Start XDM operation + */ + void StartXdmOperationL(); + + /** + * Start XDM operation, StartXdmOperationL calls this. + */ + void DoStartXdmOperationL( ); + + /** + * Call CSimpleXdmUtils operation + */ + void CallActualXdmOperationL(); + + /** + * Get list of the entity lists + */ + void GetListOfListsL(); + + /** + * Get content of the entity list + */ + void GetListContentL(); + + /** + * Yields to active scheduler and runs next RunL loop + * @param aStatus error status + */ + void CompleteMe( TInt aStatus ); + + /** + * Copy data from aLists and from aNames into aCollection + * @param aNames group names [IN] + * @param aNames group display names [IN] + * @param aCollection collection of MPresentityGroupInfo [OUT] + */ + void CopyGroupArraysToCollectionL( + CDesCArrayFlat& aLists, CDesCArrayFlat& aNames, MXIMPObjectCollection& aCollection ); + + /** + * Copy data from aIds and from aNames into aCollection + * @param aNames group member names [IN] + * @param aNames group member display names [IN] + * @param aCollection collection of MPresentityGroupMemberInfo [OUT] + */ + void CopyGroupMembersToCollectionL( + CPtrCArray& aIds, CPtrCArray& aNames, MXIMPObjectCollection& aCollection); + + + /** + * Add presentity group + * @param aGroupId group id + * @param adispName display name + */ + void HandleCreatePresentityGroupL( + const TDesC& aGroupId, const TDesC& aDispName ); + + /** + * Delete presentity group + * @param aGroupId group id + */ + void HandleDeletePresentityGroupL( const TDesC& aGroupId ); + + /** + * Add presentity group member + */ + void HandleAddPresentityGroupMemberL(); + + /** + * Remove group member + */ + void HandleRemovePresentityGroupMemberL(); + + + +private: // Data + + /** + * PrFw Plugin connection observer + */ + MSimplePluginConnectionObs& iConnObs; + + /** + * XDM Settings id + */ + TInt iSettingsId; + + /** + * PrFW request id + */ + TXIMPRequestId iPrFwId; + + /** + * PrFW request id for own requests + */ + TXIMPRequestId iPrFwIdOwn; + + /** + * Simple Engine request id + */ + TInt iSimpleId; + + /** + * Subscribed items. Bitmask. + */ + TUint iSubscribed; + + /** + * Current operation + */ + TPluginGroupsOperation iOperation; + + /** + * Current presentity in progress + * Own. + */ + HBufC16* iPresIdentity; + + /** + * Current presentity in progress + * Own. + */ + HBufC16* iPresIdentity2; + + /** + * XDM Utils + * Not own. + */ + CSimplePluginXdmUtils* iXdmUtils; + + /** + * Display name + * Own + */ + HBufC* iDisplayName; + + /** + * Active object state + */ + TPluginGroupsState iState; + + TBool iCompleted; + + }; + +#endif // CSimplePluginGroups_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginpublisher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginpublisher.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,450 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINPUBLISHER_H +#define CSIMPLEPLUGINPUBLISHER_H + +#include + +#include +#include + +#include +#include + +#include "simpleplugincommon.h" +#include "msimplepluginconnectionobs.h" +#include "msimplepluginsettings.h" + +class TXIMPRequestId; +class MXIMPIdentity; +class MXIMPProtocolConnectionHost; + +class MPersonPresenceInfo; +class MServicePresenceInfo; +class MDevicePresenceInfo; + +class MSimplePublisher; +class MSimpleDocument; +class MSimpleWinfo; +class MSimpleWatcher; +class MSimpleElement; + + +/** + * CSimplePluginWatcherInfo + * + * watcher info. + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginWatcherInfo ): public CBase + { +public: + + /** + * Constructor. + * @param aId watcher id + * @param aSipId watcher SIP identity + */ + static CSimplePluginWatcherInfo* NewL( + const TDesC8& aId, + const TDesC& aSipId ); + + virtual ~CSimplePluginWatcherInfo(); + + /** + * Destructor + */ + void Destroy(); + + /** + * Match to given info + * @param aId watcher id + * @param aSipId watcher SIP identity + * @return ETrue if current entity matches to the parameters + */ + TBool Match( const TDesC8& aId, + const TDesC& aSipId ); + + TPtrC SipId(); + + inline static TInt LinkOffset(); + +private: + + CSimplePluginWatcherInfo( ); + + /** + * Constructor + * @param aId watcher id + * @param aSipId watcher SIP identity + */ + void ConstructL( + const TDesC8& aId, + const TDesC& aSipId ); + +public: // data + + TDblQueLink iLink; + +private: // data + + HBufC8* iId; + HBufC* iSipId; + + }; + +/** + * CSimplePluginPublisher + * + * publisher. + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginPublisher ): public CActive, + public MSimplePublishObserver, + public MSimpleWatcherObserver, + public MProtocolPresencePublishing + { +public: + + /** + * Current operation + */ + enum TPluginPublishOperation + { + ENoOperation, + EPublishOwn, + ESubscribeOwn, + EUnsubscribeOwn, + ESubscribeWinfo, + EUnsubscribeWinfo + }; + + /** + * Constructor. + * @param aConnSetts current settings + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CSimplePluginPublisher* NewL( + MSimplePluginSettings& aConnSetts, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + virtual ~CSimplePluginPublisher(); + + /** + * WinfoTerminatedL + * + * SIMPLE Winfo watcher sunscription is terminated + * @param aReason reason code + */ + void WinfoTerminatedL( TInt aReason ); + + /** + * WINFO received from SIMPLE + * @param aWinfo WINFO + */ + void WinfoNotificationL( MSimpleWinfo& aWinfo ); + +private: + + CSimplePluginPublisher( + MSimplePluginSettings& aConnSetts, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + void ConstructL( ); + + +public: + +// from base class MSimplePublishObserver + + /** + * Defined in a base class + */ + void PublishReqCompleteL( TInt aOpid, TInt aStatus); + + /** + * Defined in a base class + */ + void PublishTerminatedL( TInt aOpid ); + +// from base class MSimpleWatcherObserver + + /** + * Defined in a base class + */ + void WatcherReqCompleteL( TInt aOpId, TInt aStatus ); + + /** + * Defined in a base class + */ + void WatcherNotificationL( MSimpleDocument& aDocument ); + + /** + * Defined in a base class + */ + void WatcherListNotificationL( MSimplePresenceList& aList ); + + /** + * Defined in a base class + */ + void WatcherTerminatedL( + TInt aOpId, TInt aReason ); + + +// from base class MXIMPBase +public: + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + +// from base class MProtocolPresencePublishing +public: + + /** + * Defined in a base class + */ + void DoPublishOwnPresenceL( + const MPresenceInfo& aOwnPresence, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribeOwnPresenceL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdateOwnPresenceSubscriptionPifL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribeOwnPresenceL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribePresenceWatcherListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresenceWatcherListL( + TXIMPRequestId aReqId ); + + +protected: + +// from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + +private: + + + /** + * Calls MXIMPProtocolConnectionHost callback + * @param aStatus error status + */ + void CompletePrFwReq( TInt aStatus ); + + /** + * Initialize a document + */ + void InitializeSimpleDocumentL( ); + + /** + * Add person information to the document. + * @param aPersInfo personal information + */ + void AddSimpleDocumentPersL( + const MPersonPresenceInfo* aInfo ); + + void AddSimpleDocumentServiceL( + const MServicePresenceInfo& aInfo ); + + void AddSimpleDocumentDeviceL( + const MDevicePresenceInfo& aInfo ); + + /** + * Make a publish request + */ + void MakePublishReqL(); + + /** + * Start XDM initialization + */ + void StartXdmOperationL( TXIMPRequestId aReqId ); + + /** + * Start XDM initialization. StartXdmOperationL calls this. + */ + void DoStartXdmOperationL( TXIMPRequestId aReqId ); + + /** + * Delete watcher information + */ + void DeleteWatchers(); + + void AddWatcherIfNotExistsL( const TDesC8& aId, const TDesC& aSipId ); + + void RemoveWatcherIfExistsL( const TDesC8& aId, const TDesC& aSipId ); + + CDesCArrayFlat* MakeCurrentWatcherListLC(); + + + /** + * Update private data member of active watchers list + * @param aElems SIMPLE elements [IN] + */ + void UpdateActiveWatchersListL( + RPointerArray& aElems ); + + +private: // Data + + /** + * PrFw Plugin connection observer + */ + MSimplePluginConnectionObs& iConnObs; + + /** + * Current settings + */ + MSimplePluginSettings& iConnSets; + + /** + * SIMPLE engine connection + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine publisher + * Own. + */ + MSimplePublisher* iPublisher; + + /** + * SIMPLE engine watcher + * Own. + */ + MSimpleWatcher* iWatcher; + + /** + * PrFW request id + */ + TXIMPRequestId iPrFwId; + + /** + * Simple Engine request id + */ + TInt iSimpleId; + + /** + * Subscribed winfo + */ + TBool iSubscribed; + + /** + * Subscribed own data + */ + TBool iSubscribedOwn; + + /** + * Published own data + */ + TBool iPublished; + + /** + * Current operation + */ + TPluginPublishOperation iOperation; + + /** + * Simple publish document + * Own. + */ + MSimpleDocument* iDocument; + + /** + * XDM Utils + * Not own. + */ + CSimplePluginXdmUtils* iXdmUtils; + + /** + * WINFO watchers + * Own. + */ + TDblQue iWatcherList; + + }; + + TInt CSimplePluginWatcherInfo::LinkOffset() + { + return _FOFF(CSimplePluginWatcherInfo, iLink); + } + +#endif // CSimplePluginPublisher_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginsession.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINSESSION_H +#define CSIMPLEPLUGINSESSION_H + + +#include +#include +#include "msimplepluginconnectionobs.h" + +class MXIMPContextClientInfo; +class MXIMPProtocolConnection; +class MXIMPServiceInfo; + + +class MSimpleConnection; + +/** + * CSimplePluginSession + * + * Simple Engine Connection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginSession ) : public CBase, + public MSimpleConnectionObserver + { +public: + + static CSimplePluginSession* NewL( + const MXIMPServiceInfo& aService, + MSimplePluginConnectionObs& aObs ); + + virtual ~CSimplePluginSession(); + + /** + * OpenSessionL + * + * Opens the SIP connection (registers when needed) + * + */ + void OpenSessionL(); + + /** + * OpenSessionL + * + * Opens the SIP connection (registers when needed) + * @param aSettingsId settings id + * + */ + void OpenSessionL( TInt aSettingsId ); + + /** + * MSimpleConnection accessor + * @return MSImpleConnection instance + */ + MSimpleConnection* SimpleConnection(); + + /** + * XDMSettings accessor + * @return XDM Settings ID + */ + TInt XdmSettingsId(); + + /** + * Current registered SIP entity + */ + TPtrC8 CurrentSipPresentity(); + + /** + * Domain syntax for current settings + */ + TPtrC16 CurrentDomain(); + +private: + + CSimplePluginSession( MSimplePluginConnectionObs& aObs ); + + void ConstructL( + const MXIMPServiceInfo& aService ); + + +public: + +// from base class MSimpleConnectionObserver + + /** + * Defined in a base class + */ + void ConnectionStatusL( MSimpleConnection::TSimpleState aState ); + + /** + * Defined in a base class + */ + void RequestCompleteL( TInt aOpId, TInt aStatus ); + +// from base class CActive + +protected: + + +private: // Data + + /** + * PrFw Plugin connection observer + */ + MSimplePluginConnectionObs& iObs; + + /** + * Simple Engine connection. + * Own. + */ + MSimpleConnection* iConnection; + + /** + * Current Simple Engine operation id + */ + TInt iOpId; + + /** + * IAP Id + */ + TInt32 iIap; + + /** + * XDM Settings id + */ + TInt iXdmSetting; + + /** + * Request type + */ + MSimplePluginConnectionObs::TReqType iType; + + /** + * Current User ID, User's SIP identity + * Own. + */ + HBufC8* iUserId8; + + /** + * Domain syntax for current settings + * Own, + */ + HBufC16* iDomain; + + /** + * Whether conncted to network + */ + TBool iConnected; + + }; + +#endif // CSIMPLEPLUGINSESSION_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginvariation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginvariation.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,201 @@ +/* +* Copyright (c) 2007 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: CSimplePluginVariation implementation. +* +*/ + + + + +#ifndef CSIMPLEPLUGINVARIATION_H +#define CSIMPLEPLUGINVARIATION_H + +#include + +class CRepository; + +/** + * CSimplePluginVariation + * + * Implementation of MXIMPProtocolConnection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS(CSimplePluginVariation) : public CBase + { + +public: + + enum TSimplePluginAuthRule + { + ERuleNone, + ERulePoliteBlock, + ERuleBlock, + ERuleConfirm, + ERuleAllow + }; + + static CSimplePluginVariation* NewL( ); + + ~CSimplePluginVariation(); + +private: + + CSimplePluginVariation(); + + + void ConstructL( ); + + +public: + + /** + * Get data from CenRep + */ + void InitL(); + + /** + * Grant rule name + * @return rule name + */ + TPtrC GrantRuleName(); + + /** + * Grant own rule name + * @return rule name + */ + TPtrC GrantOwnRuleName(); + + /** + * Default rule name + * @return rule name + */ + TPtrC DefaultRuleName(); + + /** + * Block rule name + * @return rule name + */ + TPtrC BlockRuleName(); + + /** + * Default rule action + * @return action + */ + TSimplePluginAuthRule DefaultRuleAction(); + + /** + * Block rule action + * @return action + */ + TSimplePluginAuthRule BlockRuleAction(); + + /** + * RlsGroupUriTemplate + * @return RlsGroupUriTemplate + */ + TPtrC RlsGroupUriTemplate(); + + /** + * SharedXdmTop + * @return SharedXdmTop + */ + TPtrC SharedXdmTop(); + + /** + * GrantListName + * @return GrantListName + */ + TPtrC GrantListName(); + +private: + + void InitGrantRuleNameL( CRepository* aRepository ); + + void InitGrantOwnRuleNameL( CRepository* aRepository ); + + void InitDefaultRuleNameL( CRepository* aRepository ); + + void InitBlockRuleNameL( CRepository* aRepository ); + + void InitDefaultRuleActionL( CRepository* aRepository ); + + void InitBlockRuleActionL( CRepository* aRepository ); + + void InitRlsGroupUriTemplateL( CRepository* aRepository ); + + void InitSharedXdmTopL( CRepository* aRepository ); + + void InitGrantListNameL( CRepository* aRepository ); + + +private: // data members + + /** + * Id for rule to grant all elements + * Own + */ + HBufC* iGrantAllRuleName; + + /** + * Id for rule to grant own data + * Own + */ + HBufC* iGrantOwnRuleName; + + /** + * Id for default rule + * Own + */ + HBufC* iDefaultRuleName; + + /** + * Id for block rule + * Own + */ + HBufC* iBlockRuleName; + + /** + * Default rule action, allow/confirm/block/polite-block + */ + TSimplePluginAuthRule iDefaultRuleAction; + + /** + * Block rule action, block/polite-block + */ + TSimplePluginAuthRule iBlockRuleAction; + + /** + * Template for RLS service URI for a user group + * Own + */ + HBufC* iRlsGroupUriTemplate; + + /** + * Top level for lists in shared XDM index document + * Own + */ + HBufC* iSharedXdmTop; + + /** + * Name of list for granted users in XDM list + * Own + */ + HBufC* iGrantListName; + + }; + + +#endif // CSIMPLEPLUGINVARIATION_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginwatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginwatcher.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,366 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINWATCHER_H +#define CSIMPLEPLUGINWATCHER_H + +#include + +#include + +#include + +#include "simpleplugincommon.h" +#include "msimplepluginconnectionobs.h" +#include "msimplepluginsettings.h" + + +class TXIMPRequestId; +class MXIMPIdentity; +class MXIMPProtocolConnectionHost; +class MPersonPresenceInfo; +class MXIMPObjectCollection; + +class MSimpleDocument; +class MSimpleWatcher; + +class CSimplePluginEntityWatcher; +class CSimplePluginXdmUtils; + +/** + * CSimplePluginWatcher + * + * Simple Engine Connection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginWatcher ): public CActive, + public MProtocolPresenceWatching + { + +private: + + /** + * Current operation + */ + enum TPluginWatcherOperation + { + EPluginUndef, + EPluginSubscribeGroup, + EPluginUnsubscribeGroup + }; + + /** + * Current actibe object state + */ + enum TPluginXdmState + { + EPluginIdle, + EPluginInitXdm, + EPluginFetchRls, + EPluginAddGroupMember, + EPluginRemoveGroupMember + // EPluginCommitRls, + // EPluginCommitXdm + }; + +public: + + /** + * Constructor. + * @param aconnSets current settings + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CSimplePluginWatcher* NewL( + MSimplePluginSettings& aConnSets, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + virtual ~CSimplePluginWatcher(); + + /** + * SetHost + * + * Set PrFw Host + * + * @lib ?library + * @since s60 v5.0 + * @patam aHost PrFW Host + */ + void SetHost( MXIMPProtocolConnectionHost* aHost ); + + /** + * SIP Watcher is complets it's task. + * @param aStatus error status + */ + void CompleteWatcher( TInt aStatus ); + + /** + * Delete a single entity watcher + * @param aPresentityid presentity id + */ + void DeleteWatcher( + const TDesC8& aPresentityid ); + + /** + * Get Block list + * @param aList list name + * @param aMembers blocked users [OUT] + */ + void GetEntitiesInListL( + const TDesC& aList, + MXIMPObjectCollection& aMembers ); + + +private: + + CSimplePluginWatcher( + MSimplePluginSettings& aConnSets, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + void ConstructL( ); + + /** + * Calls MXIMPProtocolConnectionHost callback + * @param aStatus error status + */ + void CompletePrFwReq( TInt aStatus ); + + /** + * Handles RunL routines for subscription + */ + void DoRunForSubscriptionL(); + + /** + * Handles RunL routines for unsubscription + */ + void DoRunForUnsubscriptionL(); + + +public: + + +// from base class MXIMPBase +public: + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + +// from base class MProtocolPresenceWatching +public: + + /** + * Defined in a base class + */ + void DoSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityPresenceSubscriptionPifL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityGroupMembersPresenceSubscriptionPifL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + +protected: + +// from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + +private: + + /** + * Match existing watcher + * @param aPresentityId presentity id + * @return watcher or NULL when not found + */ + CSimplePluginEntityWatcher* MatchWatcher2L( + const TDesC8& aPresentityId, TBool aCreate ); + + /** + * Save presentity id + * @param aPresentityId presentity id + */ + void SetPresIdentityL( + const MXIMPIdentity& aPresentityId ); + + /** + * Start watching service in RLS + */ + void StartWatchingRlsL(); + + void StartXdmOperationL(); + + /** + * StartXdmoperationL calls this + */ + void DoStartXdmOperationL(); + + void GetListContentL(); + + /** + * Copy data from aIds and from aNames into aCollection + * @param aNames group member names [IN] + * @param aNames group member display names [IN] + * @param aCollection collection of MPresentityGroupMemberInfo [OUT] + */ + void CopyGroupMembersToCollectionL( + CPtrCArray& aIds, CPtrCArray& aNames, MXIMPObjectCollection& aCollection); + + /** + * DoSubscribePresentityPresenceL calls this. + */ + void DoDoSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + /** + * DoUnsubscribePresentityPresenceL calls this. + */ + void DoDoUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + /** + * DoDoUnsubscribePresentityGroupMembersPresenceL calls this + */ + void DoDoUnsubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + +private: // Data + + /** + * Current settings + */ + MSimplePluginSettings& iConnSets; + + /** + * PrFw Plugin connection observer + */ + MSimplePluginConnectionObs& iConnObs; + + /** + * SIMPLE engine connection + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine watchers + */ + RPointerArray iWatchers; + + /** + * Current PrFW request id + */ + TXIMPRequestId iPrFwId; + + /** + * Current presentity in progress + * Own. + */ + HBufC16* iPresIdentity; + + /** + * XDM Utils + * Not own. + */ + CSimplePluginXdmUtils* iXdmUtils; + + /** + * Whether the request is completed + */ + TBool iCompleted; + + TPluginWatcherOperation iOperation; + + TPluginXdmState iXdmState; + + }; + +#endif // CSimplePluginWatcher_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginwinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginwinfo.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,177 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINWINFO_H +#define CSIMPLEPLUGINWINFO_H + +#include + +#include + +#include "simpleplugincommon.h" +#include "msimplepluginconnectionobs.h" + +#include + +class MSimpleWinfo; +class MXIMPIdentity; +class MPresenceInfoFilter; +class MSimpleWinfoWatcher; +class MXIMPProtocolConnectionHost; +class MSimpleConnection; + + + + +/** + * CSimplePluginWinfo + * + * Simple Engine Connection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginWinfo ) : public CBase, + public MSimpleWinfoObserver + { +public: + + /** + * Constructor. + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CSimplePluginWinfo* NewL( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + virtual ~CSimplePluginWinfo(); + + /** + * SetHost + * + * Set PrFw Host + * + * @lib ?library + * @since s60 v5.0 + * @patam aHost PrFW Host + */ + void SetHost( MXIMPProtocolConnectionHost* aHost ); + + /** + * SubscribeWinfoListL + * + * + * @lib ?library + * @since s60 v5.0 + * @param aReqId PrFw req id + */ + void SubscribeWinfoListL( TXIMPRequestId aReqId ); + + /** + * UnsubscribeWinfoListL + * + * + * @lib ?library + * @since s60 v5.0 + * @param aReqId PrFw req id + */ + void UnsubscribeWinfoListL( TXIMPRequestId aReqId ); + +private: + + CSimplePluginWinfo( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + void ConstructL( ); + + +public: + +// from base class MSimpleWinfoObserver + +// Subscribe presence grant request list + + /** + * Defined in a base class + */ + void WinfoReqCompleteL( TInt aOpid, TInt aStatus ); + + /** + * Defined in a base class + */ + void WinfoTerminatedL( + TInt aOpid, TInt aReason ); + + /** + * Defined in a base class + */ + void WinfoNotificationL( MSimpleWinfo& aWinfo ); + + +private: // Data + + /** + * PrFw Plugin connection observer + */ + MSimplePluginConnectionObs& iConnObs; + + /** + * PrFw Host. + * Not Own. + */ + MXIMPProtocolConnectionHost* iHost; + + /** + * SIMPLE engine connection + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine winfo watcher. + * Own. + */ + MSimpleWinfoWatcher* iWinfoWatcher; + + /** + * PrFW request id + */ + TXIMPRequestId iPrFwId; + + /** + * Simple Engine request id + */ + TInt iSimpleId; + + /** + * Subscribed + */ + TInt iSubscribed; + + /** + * Winfo subscribe completed + */ + TBool iWinfoCompleted; + + + }; + +#endif // CSimplePluginWinfo_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/inc/simplepluginxdmutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/inc/simplepluginxdmutils.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,747 @@ +/* +* Copyright (c) 2006 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: Simple Protocol implementation for Presence Framework +* +*/ + + + + +#ifndef CSIMPLEPLUGINXDMUTILS_H +#define CSIMPLEPLUGINXDMUTILS_H + +#include + +#include + +#include + +#include "simpleplugincommon.h" + +// Test suite +class MSimplePluginTestObs; + +class MSimplePluginSettings; + +class CPresenceXDM; +class CRLSXDM; +class CXdmEngine; +class CXdmDocument; +class CXdmDocumentNode; + +class TPresenceActionXDM; +class TPresenceTransformXDM; +class TPresCondMisc; + + +// notice: class CPtrCArray; after PrFw headers fixed. + +class TRequestStatus; + + +/** + * CSimplePluginXdmUtils + * + * Simple Engine Connection + * + * @lib ?library + * @since s60 v5.0 + */ +NONSHARABLE_CLASS( CSimplePluginXdmUtils ) : public CActive, + public MRLSPresXDMAsyncHandler + { +public: + + + /** + * Active object asynch states + */ + enum TPluginXdmState + { + EStateIdle, + /** Get OMA XDM lists */ + EGetXdmOMALists, + /** Create OMA XDM lists */ + ECreateXdmOMALists, + /** Get OMA XDM lists only, no rules later */ + EGetXdmOMAListsOnly, + /** Create OMA XDM lists only, no rules later */ + ECreateXdmOMAListsOnly, + /** Get RLS service */ + EGetRlsServices, + /** Update RLS service */ + EUpdateRlsServices, + /** Get rules from server for GrantPresenceForPresentity */ + EGetXdmRules, + /** Update rules to server for GrantPresenceForPresentity */ + EUpdateXdmRules, + /** Update XDM OMA List */ + EUpdateXdmOMAList, + /** Cancel XDM document operation */ + ECancelDocument, + /** Re-Update RLS service - 409 HTTP error handling*/ + EReUpdateRlsServices + }; + + /** + * Current operation + */ + enum TPluginXdmOperation + { + ENoOperation, + EXdmInit, + EXdmInitXdmsOnly, + EXdmDeleteAll, + EXdmCancel, + EXdmAddUserToGroup, + EXdmAddGroupToGroup, + EXdmRemoveUserFromGroup, + EXdmRemoveGroupFromGroup, + EXdmGrantForAll, + EXdmWithdrawFromAll, + EXdmGetBlockedList, + EXdmCreateGroup, + EXdmDeleteGroup, + EXdmRlsFetch, + EXdmRlsAdd, + EXdmRlsRemove, + EXdmGrantGroup, + EXdmWithdrawGroup, + EXdmSetReactiveAuth, + EXdmSetProactiveAuth + }; + + + /** + * Constructor. + * @param aConnSets connection settings + * @param aXdmId XDm settings id + */ + static CSimplePluginXdmUtils* NewL( + MSimplePluginSettings& aConnSets, + TInt aXdmId); + + virtual ~CSimplePluginXdmUtils(); + + /** + * Cancel non active wrappers + */ + void CancelWrappers(); + + /** + * Initialize XDMS and Presence XDM structures in network. + * @param aStatus Request status of the caller + */ + void InitializeXdmL( TRequestStatus& aStatus ); + + /** + * Initialize XDMS in network + * @param aStatus Request status of the caller + */ + void InitializeXdmsOnlyL( TRequestStatus& aStatus ); + + /** + * Add resource-list into RLS document, overwrite old document + * @param aStatus Request status of the caller + */ + void FetchRlsL( TRequestStatus& aStatus ); + + /** + * Add resource-list into RLS document. + * FetchRlsL must be called before this method. + * @param aName list name + */ + void AddRlsGroupL( + const TDesC& aName ); + + /** + * Remove resource-list in RLS document + * FetchRlsL must be called before this method. + * Use RemoveRlsServiceByResourceListL instead when possible. + * @param aName list name + */ + void RemoveRlsGroupL( const TDesC& aName ); + + /** + * Remove service URI in RLS document by corresponding shared XDM document entry. + * The document in the server is updated when needed. + * FetchRlsL must be called before this method. + * This completes without error if the service was not found. + * @param aGroup user's group name, that's converted to resource-list value and used + * to match the service resource-list in the rls-services document. + * @param aStatus Request status of the caller. + */ + void RemoveRlsServiceByResourceListL( const TDesC& aGroup, TRequestStatus& aStatus ); + + + /** + * Access service URI in RLS document by corresponding shared XDM document entry. + * FetchRlsL must be called before this method. + * Leaves with KErrNotFound if RLS service is not found. + * @param aGroup user's group name, that's converted to resource-list value and used + * to match the service resource-list in the rls-services document. + * @return Access service URI in RLS document, ownership is transferred. May be NULL. + */ + HBufC* RlsServiceByResourceListLC( const TDesC& aGroup ); + + /** + * Add entity to granted list. + * InitializeXdmL must be called before this method. + * @param aUri entity URI to be granted + * @param aStatus Request status of the caller + */ + void AddEntityToGrantedL( const TDesC& aUri, TRequestStatus& aStatus ); + + /** + * Remove entity from granted list. + * InitializeXdmL must be called before this method. + * @param aUri entity URI to be removed + * @param aStatus Request status of the caller + */ + void RemoveEntityFromGrantedL( + const TDesC& aUri, TRequestStatus& aStatus ); + + /** + * Add entity to blocked list. + * InitializeXdmL must be called before this method. + * @param aUri entity URI to be blocked + * @param aStatus Request status of the caller + */ + void AddEntityToBlockedL( const TDesC& aUri, TRequestStatus& aStatus ); + + /** + * Remove entity from blocked list. + * InitializeXdmL must be called before this method. + * @param aUri entity URI to be removed + * @param aStatus Request status of the caller + */ + void RemoveEntityFromBlockedL( + const TDesC& aUri, TRequestStatus& aStatus ); + + /** + * Add group to granted. + * InitializeXdmL must be called before this method. + * @param aName a group to be granted + * @param aStatus Request status of the caller + */ + void AddGroupToGrantedL( const TDesC& aName, TRequestStatus& aStatus ); + + /** + * Remove group from granted list. + * InitializeXdmL must be called before this method. + * @param aName a group to be removed from granted list + * @param aStatus Request status of the caller + */ + void RemoveGroupFromGrantedL( + const TDesC& aName, TRequestStatus& aStatus ); + + /** + * Grant right for everyone, proactive authorization is set on. + * InitializeXdmL must be called before this method. + * @param aStatus Request status of the caller + */ + void GrantForEveryoneL( TRequestStatus& aStatus ); + + /** + * Withdraw right from eveyone, reactive authorization is set on. + * InitializeXdmL must be called before this method. + * @param aStatus Request status of the caller + */ + void WithdrawFromEveryoneL( TRequestStatus& aStatus ); + + /** + * Set reactive authorization policy. + * Default rule is set to CONFIRM. + */ + void SetReactiveAuthL( TRequestStatus& aStatus ); + + /** + * Set proactive authorization policy. + * Default rule is set to ALLOW if it was CONFIRM. + */ + void SetProactiveAuthL( TRequestStatus& aStatus ); + + /** + * Get (subscribe) Block List. + * InitializeXdmL must be called before this method. + * @param aMembers blocked users [OUT]. + */ + void SubscribeBlockListL( CPtrCArray& aMembers ); + + /** + * Unsubscribe Block List. + * @param aStatus Request status of the caller + */ + void UnsubscribeBlockListL( TRequestStatus& aStatus ); + + /** + * Create entity's own group + * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method. + * @param aName group name + * @param aDisplayName group's display name + */ + void CreateEntityGroupL( + const TDesC& aName, + const TDesC& aDisplayName ); + + /** + * Delete entity's own group + * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method. + */ + void DeleteEntityGroupL( const TDesC& aName ); + + /** + * Add group member + * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method. + * @param aGroup group name + * @param aUser member + * @param aDispName display name + * @param aStatus Request status of the caller + */ + void AddPresentityGroupMemberL( + const TDesC& aGroup, + const TDesC& aUser, + const TDesC& aDispName, + TRequestStatus& aStatus ); + + /** + * Remove group member + * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method. + * @param aGroup group name + * @param aUser member + * @param aStatus Request status of the caller + */ + void RemovePresentityGroupMemberL( + const TDesC& aGroup, + const TDesC& aUser, + TRequestStatus& aStatus ); + + /** + * GetUserListsL + * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method. + * The size of the parameter arrays are same. + * @param aIds sip id array [OUT] + * @param aDispNames display name array [OUT] + */ + void GetUserListsL( CDesCArrayFlat& aIds, CDesCArrayFlat& aDispNames ); + + /** + * GetEntitiesInListL + * InitializeXdmL or InitilaizeXdmsOnlyL must be called before this method. + * The size of the parameter arrays are same. + * @param aList naem of the user's list [IN] + * @param aIds sip id array [OUT] + * @param aDispNames display name array [OUT] + */ + void GetEntitiesInListL( + const TDesC& aList, CPtrCArray& aIds, CPtrCArray& aDispNames); + + /** + * Updates XDM reource lists into server + * @param aStatus Request status of the caller + */ + void CommitXdmL( TRequestStatus& aStatus ); + + /** + * Updates RLS reource lists into server + * @param aStatus Request status of the caller + */ + void CommitRlsL( TRequestStatus& aStatus ); + + /** + * Test Suite setter + * @param aObs test observer, may be NULL + */ + void SetTestObserver( MSimplePluginTestObs* aObs ); + + /** + * Generate RLS document URI based on URI template located in CentRep variation definition. + * @param aGroup grouup name + * @param aPresentityUri presntity's URI, may be SIP or TEL URI. Domain part is stripped from SIP URI. + * @param aDomain domain part of the URI, + Leading '@' is stripped off and it must be hard coded in a template when needed. + * @return RLS document URI + */ + HBufC16* CreateRlsDocumentUri16LC( + const TDesC16& aGroup, + const TDesC16& aPresentityUri, + const TDesC16& aDomain ); + +private: + + CSimplePluginXdmUtils( + MSimplePluginSettings& aObs, TInt aXdmId ); + + void ConstructL( ); + + TBool DoesUserListExistsL( const TDesC& aName ); + + +public: + +// from base class MRLSPresXDMAsyncHandler + + /** + * Defined in a base class + */ + void HandleRLSUpdateDocumentL(TInt aErrorCode); + + /** + * Defined in a base class + */ + void HandleRLSUpdateCancelL(TInt aErrorCode); + + /** + * Defined in a base class + */ + void HandleRLSDeleteAllEmptyListsL(TInt aErrorCode); + + /** + * Defined in a base class + */ + void HandlePresUpdateDocumentL(TInt aErrorCode); + + /** + * Defined in a base class + */ + void HandlePresUpdateCancelL(TInt aErrorCode); + + + +protected: + +// from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + +private: + + /** + * Complete client request + * @param aStatus return code + */ + void CompleteClientReq( TInt aStatus ); + + /** + * Get XDm OMA lists from a server + */ + void GetXdmOMAListsL(); + + /** + * Create OMA Shared Xdm Lists when needed. + * @return true if a list is created. + */ + TBool CreateXdmOMAListsIfNeededL( ); + + /** + * Create a specified OMA Shared Xdm List when needed. + * + * @param aRoot parent for the new list + * @param aName name for the new list + * Leave with KErrAlreadyExists if all the lists already exist. + * @return true is list was added into root node. + */ + TBool CreateXdmOMAListIfNeededL( CXdmDocumentNode* aRoot, const TDesC& aName ); + + /** + * Create Resource List in shared xdm document + * @param aParent parent for the new list + * @param aName name for the new list + */ + void CreateResourceListL( + CXdmDocumentNode* aParent, const TDesC& aName ); + + /** + * Search List under a parent list, one level only + * @param aParent parent list node + * @param aName list to be searched for + * @return child node found or NULL if not found. + */ + CXdmDocumentNode* SearchListUnderParentL( + CXdmDocumentNode* aParent, const TDesC& aName ); + + void GetXdmRulesL(); + + /** + * Make Rls list URI + * @param aXCapUri XCAP URI + * @param aListName a list to be referred + * @return URI, ownerhisp is transferred + */ + HBufC* MakeRlsUriL( + const TDesC& aXcapUri, const TDesC& aListName ); + + /** + * Make Rls list URI + * @param aXCapUri XCAP URI + * @param aListName a list to be referred + * @return URI, ownerhisp is transferred + */ + HBufC* MakeRlsBuddyUriL( + const TDesC& aXcapUri, const TDesC& aListName ); + + void MakeInitialXdmsDocumentL(); + + /** + * Updates XDM rules into server + */ + void UpdateXdmRulesL(); + + /** + * Updates XDMS reource lists into server + */ + void UpdateXdmsL(); + + /** + * Updates RLS document into server + */ + void UpdateRlsL(); + + /** + * Handles pres auth rules document callback method + * @param aErrorCode returned error code + */ + void DoHandlePresUpdateDocumentL( TInt aErrorCode ); + + /** + * Handles RLS document callback method + * @param aErrorCode returned error code + */ + void DoHandleRLSUpdateDocumentL(TInt aErrorCode); + + void DoAddUserToListL( + const TDesC& aList, const TDesC& aName ); + + void DoAddUserToUserListL( + const TDesC& aList, const TDesC& aUser, const TDesC& aDispName ); + + void DoAddListIntoGrantRuleL( const TDesC& aListUri ); + + void DoRemoveListFromGrantRuleL( const TDesC& aListUri ); + + void DoRemoveUserFromListL( + const TDesC& aList, const TDesC& aName ); + + void DoRemoveUserFromUserListL( const TDesC& aList, const TDesC& aUser ); + + void DoGrantForAllL(); + + void DoWithdrawFromAllL(); + + void DoSetReactiveAuthL(); + + /** + * Set Proactive authorization + */ + void DoSetProactiveAuthL(); + + void DoGetListMembersL( + const TDesC& aList, CPtrCArray& aMembers ); + + void DoCreateEntityGroupL( const TDesC& aList, const TDesC& aDisName ); + + void DoDeleteEntityGroupL( const TDesC& aList ); + + /** + * Search OMA Buddy List + * Leaves with KErrNotFound if not found + * @return list node + */ + CXdmDocumentNode* DoGetBuddyListL(); + + /** + * Search a specific user XDM list + * Leaves with KErrNotFound if not found + * @param aList list name + * @param aBuddyList parent buddy list + * @return list node + */ + CXdmDocumentNode* DoGetUserListL( + const TDesC& aList, CXdmDocumentNode* aBuddyList ); + + /** + * Remove service URI in RLS document by corresponding shared XDM document entry. + * FetchRlsL must be called before this method. + * @param aResourceList resource-list entry value, a reference to Shared XDM document. + * @return ETrue if service is found and removed. + */ + TBool DoRemoveRlsServiceByResourceListL( const TDesC& aResourceList ); + + /** + * Access service URI in RLS document by corresponding shared XDM document entry. + * FetchRlsL must be called before this method. + * @param aResourceList resource-list entry value, a reference to Shared XDM document. + * @return service URI, ownership is transferred. + */ + HBufC* DoGetRlsServiceByResourceListL( const TDesC& aResourceList ); + + /** + * Accesor for iAuxBuffer that contains last negotiated RLS service URI + * @return buffer content + */ + TPtrC AuxBuffer(); + + /** + * Run next XDM routines + * @param aOrigState original XDM state + * @param aStatus error status + */ + void DoXdmRunL( TPluginXdmState aOrigState, TInt aStatus ); + + /** + * Handle RLS service URI negatioation + */ + void RlsServiceUriNegotiationL(); + + /** + * Make default auth rule + * @param aRuleId Rule id + * @param aAction action class initialized + * @param aTransform transform class initialized + */ + void MakeDefaultRuleL( + TDes& aRuleId, + TPresenceActionXDM& aAction, + TPresenceTransformXDM& aTransform, + TPresCondMisc& aMisc ); + + /** + * Replace Group tag in URI + * @param aBuf URI buffer [IN,OUT] + * @param aGroup Group name + */ + static void ReplaceGroupTag( HBufC16* aBuf, const TDesC16& aGroup ); + + /** + * Replace Domain tag in URI + * @param aBuf URI buffer [IN,OUT] + * @param aDomain Domain value + */ + static void ReplaceDomainTag( HBufC16* aBuf, const TDesC16& aDomain ); + + /** + * Replace User tag in URI + * @param aBuf URI buffer [IN,OUT] + * @param aPresentityUri User URI value + */ + static void ReplaceUserTag( + HBufC16* aBuf, const TDesC16& aPresentityUri ); + + +private: // Data + + /** + * PrFw Plugin connection observer + */ + MSimplePluginSettings& iConnSets; + + /** + * XDM Settings id + */ + TInt iSettingsId; + + /** + * Simple Engine request id + */ + TInt iSimpleId; + + /** + * Subscribed items. Bitmask. + */ + TUint iSubscribed; + + /** + * Presence XDM Client + * Own. + */ + CPresenceXDM* iPresenceXdm; + + /** + * RlsXDM Client + * Own. + */ + CRLSXDM* iRlsXdm; + + /** + * XDM Engine + * Own. + */ + CXdmEngine* iXdmEngine; + + /** + * XDM document for resource-lists + * Own. + */ + CXdmDocument* iXdmDoc; + + /** + * Current state + */ + TPluginXdmState iXdmState; + + /** + * Current operation + */ + TPluginXdmOperation iOperation; + + /** + * Whether Presence XDM is up-to-date + */ + TBool iPresXdmOk; + + /** + * Whether XDM is up-to-date + */ + TBool iXdmOk; + + /** + * client statutus. + * Not own. + */ + TRequestStatus* iClientStatus; + + /** + * Test suite observer + * Not own. + */ + MSimplePluginTestObs* iTestObs; + + /** + * Auxiliary buffer for for Negotiated RLS service URI + */ + HBufC* iAuxBuffer; + + /** + * Auxiliary buffer for for Negotiated RLS service URI + */ + HBufC* iAuxBuffer2; + + }; + + + +#endif // CSimplePluginXdmUtils_H diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/rom/presencefwsimpleadpt.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/rom/presencefwsimpleadpt.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2007 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: Image description file for SIMPLE Adaptation +* +*/ + + + + +#ifndef PRESENCEFW_SIMPLE_IBY +#define PRESENCEFW_SIMPLE_IBY + +#ifdef __PRESENCE_FRAMEWORK +#ifdef __SIP_SIMPLE_PRESENCE_PROTOCOL + +#include + +// Presence ECOM plugin +ECOM_PLUGIN( simpleplugin.dll, simpleplugin.rss ) + +// stub SIS, provides support for SIS upgrading +data=DATAZ_/system/install/presencefwsimpleadptstub.sis system/install/presencefwsimpleadptstub.sis + +#endif // __SIP_SIMPLE_PRESENCE_PROTOCOL +#endif // __PRESENCE_FRAMEWORK + +#endif // PRESENCEFW_SIMPLE_IBY diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simpleplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simpleplugin.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,214 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include + +#include +#include +#include +#include +#include + +#include "simpleplugin.h" +#include "simpleplugindef.h" +#include "simplepluginconnection.h" + + + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +// Key value pair table to identify correct constructor +// function for the requested interface. +// --------------------------------------------------------------------------- +// +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( K_SIMPLEPLUGIN_1_IMPLEMENTATION_UID, CSimplePlugin::NewL ) + }; + +// --------------------------------------------------------------------------- +// Exported function to return the implementation proxy table +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::CSimplePlugin() +// --------------------------------------------------------------------------- +// +CSimplePlugin::CSimplePlugin() + { + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::ConstructL() +// --------------------------------------------------------------------------- +// +void CSimplePlugin::ConstructL() + { + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::NewLC() +// --------------------------------------------------------------------------- +// +CSimplePlugin* CSimplePlugin::NewLC() + { + CSimplePlugin* self = new( ELeave ) CSimplePlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::NewL() +// --------------------------------------------------------------------------- +// +CSimplePlugin* CSimplePlugin::NewL() + { + CSimplePlugin* self = CSimplePlugin::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::~CSimplePlugin() +// --------------------------------------------------------------------------- +// +CSimplePlugin::~CSimplePlugin() + { + iConnections.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::PrimeHost() +// --------------------------------------------------------------------------- +// +void CSimplePlugin::PrimeHost( MXIMPProtocolPluginHost& aHost ) + { + iHost = &aHost; + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::AcquireConnectionL() +// --------------------------------------------------------------------------- +// +MXIMPProtocolConnection& CSimplePlugin::AcquireConnectionL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aContextClient ) + { + + // TODO: singleton takes place here. Change name to CSimplePluginImp??? + // CSimplePluginConnection reflects to Singleton. This should compare PresenceID + // and share a single entity with identical ids.HOW DOES PrFW work in this case??? + + // support multiple connections + // always create a new connection - no connection sharing, it takes place in SIP Stack. + CSimplePluginConnection* connection = + CSimplePluginConnection::NewL( aServiceInfo, aContextClient ); + CleanupStack::PushL( connection ); + iConnections.AppendL( connection ); + CleanupStack::Pop( connection ); + return *connection; + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::ReleaseConnection() +// --------------------------------------------------------------------------- +// +void CSimplePlugin::ReleaseConnection( MXIMPProtocolConnection& aConnection ) + { + TInt connectionsCount = iConnections.Count(); + + for( TInt i( connectionsCount - 1 ); i >= 0; i-- ) + { + MXIMPProtocolConnection* tmp = iConnections[i]; + if( tmp == &aConnection ) + { + delete iConnections[i]; + iConnections.Remove( i ); + } + } + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CSimplePlugin::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MXIMPProtocolPlugin* myIf = this; + return myIf; + } + if( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CSimplePlugin::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MXIMPProtocolPlugin* myIf = this; + return myIf; + } + if( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePlugin::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CSimplePlugin::GetInterfaceId() const + { + return MXIMPProtocolPlugin::KInterfaceId; + } + + + + + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginauthorization.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginauthorization.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1071 @@ +/* +* Copyright (c) 2007 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "simplepluginauthorization.h" +#include "simpleplugindebugutils.h" +#include "simplepluginwinfo.h" +#include "simplepluginxdmutils.h" +#include "simpleplugincommon.h" +#include "simplepluginconnection.h" + +/** + The design is the following one + + 1. DoGrantPresenceForEveryOneL + modify default rule to ALLOW. + + 2. DoWithdrawPresenceFromEveryOneL + if current rule is ALLOW then + { BLOCK } + otherwise no action. + + 3. DoSubscribePresenceGrantRequestListL + modify default rule to CONFIRM. + + 4. DoUnsubscribePresenceGrantRequestListL + if current rule is CONFIRM then + { go to ALLOW } + otherwise no action. +*/ + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::CSimplePluginAuthorization +// --------------------------------------------------------------------------- +// +CSimplePluginAuthorization::CSimplePluginAuthorization( + MSimplePluginConnectionObs& aObs ) +: CActive( CActive::EPriorityStandard ), + iConnObs(aObs), + iOperation(ENoOperation), + iXdmOk(EFalse), iDefRule(ERuleDef), iWinfoSubs( EFalse ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::ConstructL( ) + { + + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginAuthorization* CSimplePluginAuthorization::NewL( + MSimplePluginConnectionObs& aObs ) + { + CSimplePluginAuthorization* self = + new( ELeave ) CSimplePluginAuthorization( aObs ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: NewL this=%d"), (TInt)self ); +#endif + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::~CSimplePluginAuthorization +// --------------------------------------------------------------------------- +// +CSimplePluginAuthorization::~CSimplePluginAuthorization() + { + delete iPresIdentity; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::SetDataHost +// We assume that this method is given by PrFw right after +// constrcution. +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::SetDataHost( + MProtocolPresenceAuthorizationDataHost& aDataHost ) + { + iDataHost = &aDataHost; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::WinfoTerminatedL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::WinfoTerminatedL( TInt /*aReason*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: WinfoTerminatedL") ); +#endif + + if ( iWinfoSubs ) + { + MXIMPDataSubscriptionState* myState = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC(); + // Notice: consider error codes + myStatus->SetResultCode( KErrCompletion ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + // parameters' OWNERSHIP is taken + iDataHost->SetPresenceGrantRequestDataSubscriptionStateL( + myState, + myStatus ); + + iWinfoSubs = EFalse; + + CleanupStack::Pop( /*myStatus*/ ); + CleanupStack::Pop( /*myState*/ ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoSubscribePresenceGrantRequestListL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoSubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoSubscribePresenceGrantRequestListL")); +#endif + + /* + This means Reactive authorization, i.e. modify default rule as CONFIRM. + Also this starts the WINFO subscription. + + Once the authorization request is received the + MProtocolPresenceAuthorizationDataHost::HandlePresenceGrantRequestReceivedL shall + be called in the host API. + + First make the watcher list SIP subscription and after that is completed + in HandleIfMine then continue and modify XDMS authentication rule. + HandleIfMine can be called also immediately if there already exists an WINFO subscrption. + */ + + iOperation = ESubscribePresenceGrantRequestList; + iPrFwId = aReqId; + TRAPD( err, iConnObs.WinfoHandlerL()->SubscribeWinfoListL( aReqId )); + if ( err ) + { + iOperation = ENoOperation; + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + else + { + iWinfoSubs = ETrue; + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoUnsubscribePresenceGrantRequestListL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoUnsubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoUnsubscribePresenceGrantRequestListL TEST COVERS 4")); +#endif + + // First modify XDMS authentication rule and then unsubscribe + // SIP watcher list subscription. + TRAPD( err, DoStartXdmOperationL( aReqId, EUnsubscribePresenceGrantRequestList )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + iPrFwId = aReqId; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoGrantPresenceForPresentityL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoGrantPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& /*aPif*/, // notice: pif not supported + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoGrantPresenceForPresentityL")); +#endif + StartXdmOperationL( aPresentityId, aReqId, EGrantPresenceForPresentity ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL( + const MXIMPIdentity& /*aPresentityId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoUpdatePresenceGrantPifForPresentityL")); +#endif + // Notice: aPif filter not supported. + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoWithdrawPresenceGrantFromPresentityL")); +#endif + StartXdmOperationL( aPresentityId, aReqId, EWithdrawFromPresentity ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoGrantPresenceForPresentityGroupMembersL")); +#endif + StartXdmOperationL( aGroupId, aReqId, EGrantPresenceForPresentityGroupMembers ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityGroupMembersL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityGroupMembersL( + const MXIMPIdentity& /*aGroupId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoUpdatePresenceGrantPifForPresentityGroupMembersL")); +#endif + // Notice: aPif filter not supported + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityGroupMembersL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoWithdrawPresenceGrantFromPresentityGroupMembersL")); +#endif + StartXdmOperationL( aGroupId, aReqId, EWithdrawFromGroupMembers ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoGrantPresenceForEveryoneL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoGrantPresenceForEveryoneL( + const MPresenceInfoFilter& /*aPif*/, // // Notice: aPif filter not supported + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoGrantPresenceForEveryoneL")); +#endif + MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC(); // << nobody + StartXdmOperationL( *nobody, aReqId, EGrantForEveryone ); + CleanupStack::PopAndDestroy( ); // >> nobody + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL( + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoUpdatePresenceGrantPifForEveryoneL")); +#endif + // Notice: aPif filter not supported + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoWithdrawPresenceGrantFromEveryoneL")); +#endif + MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC(); // << nobody + StartXdmOperationL( *nobody, aReqId, EWithdrawFromEveryone ); + CleanupStack::PopAndDestroy( ); // >> nobody + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoSubscribePresenceBlockListL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoSubscribePresenceBlockListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoSubscribePresenceBlockListL")); +#endif + MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC(); // << nobody + StartXdmOperationL( *nobody, aReqId, ESubscribeBlockList ); + CleanupStack::PopAndDestroy( ); // >> nobody + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoUnsubscribePresenceBlockListL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoUnsubscribePresenceBlockListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoUnsubscribePresenceBlockListL")); +#endif + MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC(); // << nobody + StartXdmOperationL( *nobody, aReqId, EUnsubscribeBlockList ); + CleanupStack::PopAndDestroy( ); // >> nobody + } + +// Blocking presence information access from single presentities + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoBlockPresenceForPresentityL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoBlockPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoBlockPresenceForPresentityL")); +#endif + StartXdmOperationL( aPresentityId, aReqId, EBlockPresentity ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoCancelPresenceBlockFromPresentityL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoCancelPresenceBlockFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: DoCancelPresenceBlockFromPresentityL")); +#endif + StartXdmOperationL( aPresentityId, aReqId, EUnblockPresentity ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoCancel() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoCancel( ) + { + iXdmUtils->Cancel(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::RunL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::RunL( ) + { + TInt myStatus = iStatus.Int(); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: RunL %d"), myStatus ); +#endif + + if ( iOperation == EUnsubscribePresenceGrantRequestList && !myStatus ) + { + // unsubscribe watcher list after successful default rule modification. + TRAPD( err, iConnObs.WinfoHandlerL()->UnsubscribeWinfoListL( iPrFwId )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + else + { + // This will end to HandleIfMine. + } + } + else if ( !iXdmOk && !myStatus ) + { + iXdmOk = ETrue; + CallActualXdmOperationL(); + } + else // iXdmOK or myStatus + { + CompletePrFwReq( myStatus ); + } + + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::CallActualXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::CallActualXdmOperationL() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: CallActualXdmOperationL") ); +#endif + switch ( iOperation ) + { + case EGrantPresenceForPresentity: + // iPresIdentity can't be null in this case + iXdmUtils->AddEntityToGrantedL( iPresIdentity->Des(), iStatus ); + SetActive(); + break; + case EWithdrawFromPresentity: + // iPresIdentity can't be null in this case + iXdmUtils->RemoveEntityFromGrantedL( iPresIdentity->Des(),iStatus ); + SetActive(); + break; + case EGrantPresenceForPresentityGroupMembers: + // iPresIdentity can't be null in this case + iXdmUtils->AddGroupToGrantedL( iPresIdentity->Des(), iStatus ); + SetActive(); + break; + case EWithdrawFromGroupMembers: + // iPresIdentity can't be null in this case + iXdmUtils->RemoveGroupFromGrantedL( iPresIdentity->Des(), iStatus ); + SetActive(); + break; + case EGrantForEveryone: + iXdmUtils->GrantForEveryoneL( iStatus ); + SetActive(); + break; + case EWithdrawFromEveryone: + iXdmUtils->WithdrawFromEveryoneL( iStatus ); + SetActive(); + break; + case ESubscribeBlockList: + HandleSubscribeBlockListL(); + break; + case EUnsubscribeBlockList: + iXdmUtils->UnsubscribeBlockListL( iStatus ); + SetActive(); + break; + case EBlockPresentity: + // iPresIdentity can't be null in this case + iXdmUtils->AddEntityToBlockedL( iPresIdentity->Des(), iStatus ); + SetActive(); + break; + case EUnblockPresentity: + // iPresIdentity can't be null in this case + iXdmUtils->RemoveEntityFromBlockedL( iPresIdentity->Des(), iStatus ); + SetActive(); + break; + case ESubscribePresenceGrantRequestList: + iXdmUtils->SetReactiveAuthL( iStatus ); + SetActive(); + break; + case EUnsubscribePresenceGrantRequestList: + default: + iXdmUtils->SetProactiveAuthL( iStatus ); + SetActive(); + break; + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::CopyBlockersToArrayL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::CopyBlockersToArrayL( + CPtrCArray& aBlockers, RPointerArray& aBlockedSouls ) + { + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + + aBlockedSouls.Reset(); + + TInt nodeCount = aBlockers.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + MXIMPIdentity* entity = myFactory.NewIdentityLC(); // << entity + entity->SetIdentityL( aBlockers[i] ); + aBlockedSouls.AppendL( entity ); + CleanupStack::Pop(); // >> entity + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::RunError +// --------------------------------------------------------------------------- +// +TInt CSimplePluginAuthorization::RunError( TInt aError ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: RunError %d"), aError ); +#endif + // complete the open request + CompletePrFwReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CSimplePluginAuthorization::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MProtocolPresenceAuthorization* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CSimplePluginAuthorization::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MProtocolPresenceAuthorization* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CSimplePluginAuthorization::GetInterfaceId() const + { + return MProtocolPresenceAuthorization::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::SetPresIdentityL() +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::SetPresIdentityL( + const MXIMPIdentity& aPresentityId ) + { + delete iPresIdentity; + iPresIdentity = NULL; + iPresIdentity = aPresentityId.Identity().AllocL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::WinfoNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::WinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + if ( !iWinfoSubs ) + { + return; + } +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: WinfoNotificationL starts")); +#endif + + using namespace NSimplePlugin::NSimpleOma; + + RPointerArray elems; + CleanupClosePushL( elems ); + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + if ( !count ) + { + // stop parsing empty notification + User::Leave( KErrArgument ); + } + + __ASSERT_DEBUG( count == 1, User::Leave( KErrCorrupt ) ); + + const TDesC8* stateVal = aWinfo.AttrValue( KSimpleState8 ); + if ( stateVal && !stateVal->CompareF( KSimpleFull8 )) + { + // Call full list method + HandleFullWinfoNotificationL( aWinfo ); + } + else + { + // Indicate changes in WINFO list one by one. + HandlePartialWinfoNotificationL( aWinfo ); + } + CleanupStack::PopAndDestroy( &elems ); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: WinfoNotificationL ends")); +#endif + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ) + { + TRAPD( err, DoStartXdmOperationL(aId, aReqId, aOperation )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoStartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoStartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ) + { + SetPresIdentityL( aId ); + DoStartXdmOperationL( aReqId, aOperation ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::DoStartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::DoStartXdmOperationL( + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + iPrFwId = aReqId; + iOperation = aOperation; + if ( !iXdmUtils ) + { + iXdmUtils = iConnObs.XdmUtilsL(); + } + if ( iXdmOk ) + { + CallActualXdmOperationL(); + } + else + { + iXdmUtils->InitializeXdmL( iStatus ); + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::HandleFullWinfoNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::HandleFullWinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: HandleFullWinfoNotificationL starts")); +#endif + + // Search for pending watchers and call HandlePresenceGrantRequestListL + using namespace NSimplePlugin::NSimpleOma; + + RPointerArray elems; + CleanupClosePushL( elems ); + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + MSimpleElement* elem = elems[0]; + TPtrC8 p8 = elem->LocalName(); + err = p8.CompareF( KSimpleWatcherList8 ); + User::LeaveIfError( err ); + + err = elem->SimpleElementsL( elems ); + User::LeaveIfError( err ); + count = elems.Count(); + + // Search watchers who are pending (status = pending) + HBufC* nodeContent = NULL; + MXIMPObjectCollection *pendings = iConnObs.ObjectFactory().NewObjectCollectionLC(); + + TBool pendingFound(EFalse); + + for ( TInt i = 0; i < count; i++ ) + { + elem = elems[i]; + p8.Set( elem->LocalName()); + if (!( p8.CompareF( KSimpleWatcher8 ))) + { + const TDesC8* pp8 = elem->AttrValue( KSimpleStatus8 ); + if ( pp8 && !pp8->CompareF( KSimplePending8 )) + { + // Build collection of grant requests + // Find the child node containing the SIP entity + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + // create the collection entry here + MPresenceGrantRequestInfo* grInfo = + iConnObs.PresenceObjectFactory().NewPresenceGrantRequestInfoLC(); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + identity->SetIdentityL( nodeContent->Des()); + grInfo->SetRequestorIdL( identity ); // ownership is taken + CleanupStack::Pop( ); // identity +#ifdef _DEBUG + TBuf<200> debug_buffer; + debug_buffer = nodeContent->Des(); + PluginLogger::Log( + _L("PluginAuth: add pending into collection: %S"), &debug_buffer ); +#endif + pendings->AddObjectL( grInfo ); // ownership is taken + CleanupStack::Pop( ); // grInfo + pendingFound = ETrue; + CleanupStack::PopAndDestroy( nodeContent ); + } + } + } + + if ( pendingFound ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: callback HandlePresenceGrantRequestListL")); +#endif + iPrFwIdOwn = iDataHost->HandlePresenceGrantRequestListL( pendings ); + CleanupStack::Pop(); // >> pendings + } + else + { + CleanupStack::PopAndDestroy( ); // >> pendings + } + + CleanupStack::PopAndDestroy( &elems ); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: HandleFullWinfoNotificationL ends")); +#endif + + /* example: + + + + + sip:watcherA@example.com" + + */ + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::HandlePartialWinfoNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::HandlePartialWinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: HandlePartialWinfoNotificationL starts")); +#endif + + using namespace NSimplePlugin::NSimpleOma; + + RPointerArray elems; + CleanupClosePushL( elems ); + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + MSimpleElement* elem = elems[0]; + TPtrC8 p8 = elem->LocalName(); + err = p8.CompareF( KSimpleWatcherList8 ); + User::LeaveIfError( err ); + + err = elem->SimpleElementsL( elems ); + User::LeaveIfError( err ); + count = elems.Count(); + + HBufC* nodeContent = NULL; + + for ( TInt i = 0; i < count; i++ ) + { + elem = elems[i]; + p8.Set( elem->LocalName()); + if (!( p8.CompareF( KSimpleWatcher8 ))) + { + const TDesC8* pp8 = elem->AttrValue( KSimpleStatus8 ); + if ( pp8 && !pp8->CompareF( KSimplePending8 )) + { + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + CallHandlePresenceGrantRequestReceivedL( nodeContent->Des() ); + CleanupStack::PopAndDestroy( nodeContent ); + } + else if ( pp8 && !pp8->CompareF( KSimpleTerminated8 )) + { + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + CallHandlePresenceGrantRequestObsoletedL( nodeContent->Des() ); + CleanupStack::PopAndDestroy( nodeContent ); + } + } + } + CleanupStack::PopAndDestroy( &elems ); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: HandlePartialWinfoNotificationL ends")); +#endif + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::CallHandlePresenceGrantRequestReceivedL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::CallHandlePresenceGrantRequestReceivedL( + const TDesC& aUserId ) + { + // create the collection entry here + MPresenceGrantRequestInfo* grInfo = + iConnObs.PresenceObjectFactory().NewPresenceGrantRequestInfoLC(); // +grInfo + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); // +identity + identity->SetIdentityL( aUserId ); + grInfo->SetRequestorIdL( identity ); // ownership is taken + CleanupStack::Pop( ); // -identity +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: callback HandlePresenceGrantRequestReceivedL")); +#endif + iPrFwIdOwn = iDataHost->HandlePresenceGrantRequestReceivedL( grInfo ); // ownership is taken + CleanupStack::Pop( ); // -grInfo + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL( + const TDesC& aUserId) + { + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + identity->SetIdentityL( aUserId ); +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: callback HandlePresenceGrantRequestObsoletedL")); +#endif + iPrFwIdOwn = iDataHost->HandlePresenceGrantRequestObsoletedL( identity); // ownership is taken + CleanupStack::Pop( ); // >> identity + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::HandleSubscribeBlockListL +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::HandleSubscribeBlockListL() + { + RPointerArray blockedSouls; + CleanupClosePushL( blockedSouls ); + + const TInt KMyGran = 10; + CPtrCArray* blockers = new (ELeave) CPtrCArray( KMyGran ); + CleanupStack::PushL( blockers ); // << blockers + + iXdmUtils->SubscribeBlockListL( *blockers ); + + CopyBlockersToArrayL( *blockers, blockedSouls ); + + CleanupStack::PopAndDestroy( blockers ); + + MXIMPObjectCollection* coll = + iConnObs.ObjectFactory().NewObjectCollectionLC(); // << coll + TInt count = blockedSouls.Count(); + for ( TInt i = count-1; i >= 0; i-- ) + { + MXIMPIdentity* currId = blockedSouls[i]; + MPresenceBlockInfo* bInfo = iConnObs.PresenceObjectFactory().NewPresenceBlockInfoLC(); + bInfo->SetBlockedEntityIdL( currId ); // ownership is taken + bInfo->SetBlockedEntityDisplayNameL( currId->Identity() ); + blockedSouls.Remove( i ); + coll->AddObjectL( bInfo ); // ownership is taken + CleanupStack::Pop(); // >> bInfo + } + CompletePrFwReq( KErrNone ); +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuth: callback HandlePresenceBlockListL")); +#endif + // Callback for subscription result + iDataHost->HandlePresenceBlockListL( coll ); + + CleanupStack::Pop(); // >> coll + CleanupStack::PopAndDestroy( &blockedSouls ); + + // Callback for subscription state (terminated). + MXIMPDataSubscriptionState* myState = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC(); + // Notice: consider error codes + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: callback SetPresenceBlockDataSubscriptionStateL")); +#endif + iDataHost->SetPresenceBlockDataSubscriptionStateL( + myState, myStatus ); + CleanupStack::Pop( 2 ); // >> myState, myStatus + + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::CompletePrFwReq +// --------------------------------------------------------------------------- +// +void CSimplePluginAuthorization::CompletePrFwReq( TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: CompletePrFwReq status=%d"), aStatus ); +#endif + iOperation = ENoOperation; + iConnObs.CompleteReq( iPrFwId, aStatus ); + iPrFwId = TXIMPRequestId(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginAuthorization::HandleIfMine +// --------------------------------------------------------------------------- +// +TBool CSimplePluginAuthorization::HandleIfMine( TXIMPRequestId aReqId, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: HandleIfMine aStatus=%d iOper=%d"), aStatus, iOperation); +#endif + TInt err = KErrNone; + TBool ret = EFalse; + + // We check wheter the request is made by this entity. + if ( iPrFwId != aReqId ) + { + // Nothing to do, request was not orginated by this entity. + } + else + { + if ( !aStatus ) + { + switch ( iOperation ) + { + case ESubscribePresenceGrantRequestList: + // Modify rule to CONFIRM +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: HandleIfMine TEST COVERS 7")); +#endif + TRAP( err, DoStartXdmOperationL( aReqId, iOperation )); + err = CSimplePluginConnection::HarmonizeErrorCode( err ); + ret = ETrue; + break; + // In UnsubscribePresenceGrantRequestList case the rule modifcation + // has been made first before SIP unsubscribe operation. + case EUnsubscribePresenceGrantRequestList: + default: + iWinfoSubs = EFalse; + break; + } + } + else + { + CompletePrFwReq( err ); + ret = ETrue; + } + if ( err ) + { + CompletePrFwReq( err ); + ret = ETrue; + } + else + { + } + } + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginAuthorization: HandleIfMine returns %d"), ret ); +#endif + return ret; + } + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginconnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginconnection.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,573 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "simplepluginconnection.h" +#include "simplepluginsession.h" +#include "simpleplugindebugutils.h" +#include "simplepluginauthorization.h" +#include "simplepluginwinfo.h" +#include "simplepluginpublisher.h" +#include "simplepluginwatcher.h" +#include "simpleplugingroups.h" +#include "simplepluginxdmutils.h" +#include "simplepluginvariation.h" +#include "msimplepluginconnectionobs.h" +#include "msimplepluginsettings.h" +#include "simpleerrors.h" + +class MXIMPObjectFactory; + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CSimplePluginConnection +// --------------------------------------------------------------------------- +// +CSimplePluginConnection::CSimplePluginConnection() +: iSipPresentity(NULL) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginConnection* CSimplePluginConnection::NewL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aClientCtxInfo ) + { + CSimplePluginConnection* self = new( ELeave ) CSimplePluginConnection( ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceInfo, aClientCtxInfo ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::ConstructL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& /* aClientCtxInfo */ ) + { + iSession = CSimplePluginSession::NewL( aServiceInfo, *this ); + + iAuth = CSimplePluginAuthorization::NewL( *this ); + + iPublisher = CSimplePluginPublisher::NewL( + *this, *this, + *iSession->SimpleConnection() ); + + iWatcher = CSimplePluginWatcher::NewL( + *this, *this, + *iSession->SimpleConnection() ); + + iGroups = CSimplePluginGroups::NewL( + *this ); + + iPluginWinfo = CSimplePluginWinfo::NewL( + *this, *(iSession->SimpleConnection())); + + iVariation = CSimplePluginVariation::NewL(); + iVariation->InitL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::~CSimplePluginConnection +// --------------------------------------------------------------------------- +// +CSimplePluginConnection::~CSimplePluginConnection() + { + + delete iSipPresentity; + + delete iVariation; + delete iPluginWinfo; + delete iWatcher; + delete iPublisher; + delete iAuth; + delete iGroups; + delete iSession; + + delete iXdmUtils; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::PrimeHost +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::PrimeHost( MXIMPProtocolConnectionHost& aHost ) + { + iConnectionHost = &aHost; + iAuth->SetDataHost( iConnectionHost->ProtocolPresenceDataHost().AuthorizationDataHost() ); + } + + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::ProtocolPresenceFeatures +// --------------------------------------------------------------------------- +// +MProtocolPresenceFeatures& CSimplePluginConnection::ProtocolPresenceFeatures() + { + return *this; + } + +/* + +*/ +// BRANCH 08-06-17 : gronoff +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetProtocolInterface() +// --------------------------------------------------------------------------- +// +TAny* CSimplePluginConnection::GetProtocolInterface( TInt /*aInterfaceId*/ ) + { + return NULL; + } +// BRANCH_END 08-06-17 : gronoff + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::PresenceWatching +// --------------------------------------------------------------------------- +// +MProtocolPresenceWatching& CSimplePluginConnection::PresenceWatching() + { + return *iWatcher; + } +// --------------------------------------------------------------------------- +// CSimplePluginConnection::PresencePublishing +// --------------------------------------------------------------------------- +// +MProtocolPresencePublishing& CSimplePluginConnection::PresencePublishing() + { + return *iPublisher; + } +// --------------------------------------------------------------------------- +// CSimplePluginConnection::PresentityGroups +// --------------------------------------------------------------------------- +// +MProtocolPresentityGroups& CSimplePluginConnection::PresentityGroups() + { + return *iGroups; + } +// --------------------------------------------------------------------------- +// CSimplePluginConnection::PresenceAuthorization +// --------------------------------------------------------------------------- +// +MProtocolPresenceAuthorization& CSimplePluginConnection::PresenceAuthorization() + { + return *iAuth; + } + + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::OpenSessionL +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::OpenSessionL( + const TInt& aSettingsId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: OpenSessionL")); +#endif + iPrFwId = aReqId; + TRAPD( err, iSession->OpenSessionL( aSettingsId )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::OpenSessionL +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::OpenSessionL( + const MXIMPContextClientInfo& /*aClientCtxInfo*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: OpenSessionL - error: not supported")); +#endif + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CloseSession +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::CloseSession( + const MXIMPContextClientInfo& /*aClientCtxInfo*/, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: CloseSession")); +#endif + iPrFwId = aReqId; + + delete iPluginWinfo; + iPluginWinfo = NULL; + delete iWatcher; + iWatcher = NULL; + delete iPublisher; + iPublisher = NULL; + delete iAuth; + iAuth = NULL; + delete iSession; + iSession = NULL; + delete iGroups; + iGroups = NULL; + delete iXdmUtils; + iXdmUtils = NULL; + + CompleteReq( iPrFwId, KErrNone ); + } +// --------------------------------------------------------------------------- +// CSimplePluginConnection::GetSupportedFeaturesL +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::GetSupportedFeaturesL( CDesC8Array& aFeatures ) const + { + // first empty the whole array + aFeatures.Reset(); + using namespace NXIMPFeature::Presence; + aFeatures.AppendL( KPublish ); + aFeatures.AppendL( KFetch ); + aFeatures.AppendL( KSubscribe ); + aFeatures.AppendL( KUnsubscribe ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CompleteReq +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::CompleteReq( TReqType aType, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: CompleteReq stat=%d"), aStatus); +#endif + + TInt retVal = HarmonizeErrorCode( aStatus ); + + // Return immediately if PrimeHost() is not called. This is for testing purposes. + if ( !iConnectionHost ) + { + iPrFwId = TXIMPRequestId(); + return; + } + + switch ( aType ) + { + case EOpenSess: +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginConnection: callback HandleRequestCompleted stat=%d"), retVal); + PluginLogger::Log( + _L("PluginConnection: ------------------------------------------------1")); +#endif + iConnectionHost->HandleRequestCompleted( iPrFwId, retVal ); + iPrFwId = TXIMPRequestId(); + break; + default: + break; + }; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CompleteReq +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::CompleteReq( TXIMPRequestId aReqId, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: CompleteReq stat=%d"), aStatus); +#endif + + TInt retVal = HarmonizeErrorCode( aStatus ); + + // Return immediately if PrimeHost() is not called. This is for testing purposes. + if ( !iConnectionHost ) + { + return; + } +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginConnection: callback HandleRequestCompleted stat=%d"), retVal); + PluginLogger::Log( + _L("PluginConnection: ------------------------------------------------2")); +#endif + iConnectionHost->HandleRequestCompleted( aReqId, retVal ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CompleteWinfoReq +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::CompleteWinfoReq( TXIMPRequestId aReqId, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: CompleteWinfoReq stat=%d"), aStatus); +#endif + + if ( iAuth && iAuth->HandleIfMine( aReqId, aStatus )) + { + // Nothing to do, the request in not complete yet +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: CompleteWinfoReq waits ***"), aStatus); +#endif + } + else + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginConnection: CompleteWinfoReq completes ***"), aStatus); +#endif + CompleteReq( aReqId, aStatus ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::ObjectFactory +// --------------------------------------------------------------------------- +// +MXIMPObjectFactory& CSimplePluginConnection::ObjectFactory() + { + return iConnectionHost->ObjectFactory(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::PresenceObjectFactory +// --------------------------------------------------------------------------- +// +MPresenceObjectFactory& CSimplePluginConnection::PresenceObjectFactory() + { + return iConnectionHost->ProtocolPresenceDataHost().PresenceObjectFactory(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::Host +// --------------------------------------------------------------------------- +// +MXIMPProtocolConnectionHost* CSimplePluginConnection::Host() + { + return iConnectionHost; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CurrentDomain +// --------------------------------------------------------------------------- +// +TPtrC16 CSimplePluginConnection::CurrentDomain() + { + return iSession->CurrentDomain(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::Variation +// --------------------------------------------------------------------------- +// +CSimplePluginVariation& CSimplePluginConnection::Variation() + { + return *iVariation; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CurrentSipPresentity +// --------------------------------------------------------------------------- +// +TPtrC16 CSimplePluginConnection::CurrentSipPresentity() + { + delete iSipPresentity; + iSipPresentity = NULL; + TRAPD( err, iSipPresentity = HBufC16::NewL( iSession->CurrentSipPresentity().Length() )); + + if ( !err ) + { + iSipPresentity->Des().Copy( iSession->CurrentSipPresentity() ); + return iSipPresentity->Des(); + } + else + { + return TPtrC16(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::CurrentSipPresentit8 +// --------------------------------------------------------------------------- +// +TPtrC8 CSimplePluginConnection::CurrentSipPresentity8() + { + return iSession->CurrentSipPresentity(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::XdmUtilsL +// --------------------------------------------------------------------------- +// +CSimplePluginXdmUtils* CSimplePluginConnection::XdmUtilsL() + { + if ( !iXdmUtils ) + { + iXdmUtils = CSimplePluginXdmUtils::NewL( + *this, iSession->XdmSettingsId() ); + } + return iXdmUtils; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::WinfoHandlerL +// --------------------------------------------------------------------------- +// +CSimplePluginWinfo* CSimplePluginConnection::WinfoHandlerL() + { + if ( !iPluginWinfo ) + { + iPluginWinfo = CSimplePluginWinfo::NewL( + *this, *(iSession->SimpleConnection() )); + } + iPluginWinfo->SetHost( iConnectionHost ); + return iPluginWinfo; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::WinfoTerminatedL +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::WinfoTerminatedL( TInt aReason ) + { + // Pass the information to iAuth and iPublisher, + // so that they can call PrFw Plugin Data Host callbacks. + iAuth->WinfoTerminatedL( aReason ); + iPublisher->WinfoTerminatedL( aReason ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::WinfoNotification +// --------------------------------------------------------------------------- +// +void CSimplePluginConnection::WinfoNotification( MSimpleWinfo& aWinfo ) + { + TRAP_IGNORE( iPublisher->WinfoNotificationL( aWinfo )); + TRAP_IGNORE( iAuth->WinfoNotificationL( aWinfo )); + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::GetInterface +// --------------------------------------------------------------------------- +// +TAny* CSimplePluginConnection::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MXIMPProtocolConnection* myIf = this; + return myIf; + } + if( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::GetInterface +// --------------------------------------------------------------------------- +// +const TAny* CSimplePluginConnection::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MXIMPProtocolConnection* myIf = this; + return myIf; + } + if( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::GetInterfaceId +// --------------------------------------------------------------------------- +// +TInt32 CSimplePluginConnection::GetInterfaceId() const + { + return MXIMPProtocolConnection::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CSimplePluginConnection::HarmonizeErrorCode +// --------------------------------------------------------------------------- +// +TInt CSimplePluginConnection::HarmonizeErrorCode( TInt aStatus ) + { + + TInt retVal = aStatus; + + // Convert error codes outsise e32err.h error range into PrFw errors. + + switch ( aStatus ) + { + case KSimpleErrAuthorization: + retVal = KPresenceErrNotEnoughCredits; + break; + case KSimpleErrTimeout: + case KErrTimedOut: + retVal = KXIMPErrServicRequestTimeouted; + break; + default: + { + if ( aStatus < KSimplePluginGeneralErrorLow ) + { + retVal = KXIMPErrServiceGeneralError; + } + } + break; + }; + + return retVal; + } + + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simpleplugindata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simpleplugindata.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,776 @@ +/* +* Copyright (c) 2007 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + + +// *** system include files go here: +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "simpleplugindata.h" +#include "simpleplugincommon.h" +#include "simpleplugindebugutils.h" + + +// ---------------------------------------------------------- +// CSimplePluginData::CSimplePluginData +// ---------------------------------------------------------- +// +CSimplePluginData::CSimplePluginData( ) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::~CSimplePluginData +// --------------------------------------------------------------------------- +// +CSimplePluginData::~CSimplePluginData() + { + + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginData* CSimplePluginData::NewL( ) + { + CSimplePluginData* self = CSimplePluginData::NewLC( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::NewLC +// --------------------------------------------------------------------------- +// +CSimplePluginData* CSimplePluginData::NewLC( ) + { + CSimplePluginData* self = new( ELeave ) CSimplePluginData; + CleanupStack::PushL( self ); + self->ConstructL( ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::ConstructL( ) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::NotifyToPrInfoL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::NotifyToPrInfoL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleDocument& aDocument, + MPresenceInfo& aPrInfo ) + { + MPersonPresenceInfo* persInfo = aPresenceFactory.NewPersonPresenceInfoLC(); + MPresenceInfoFieldCollection& coll = persInfo->Fields(); + + // Search own person info. Notice: Extend supported attributes later + + RPointerArray elems; + CleanupClosePushL( elems ); + TInt err = aDocument.SimpleElementsL( elems ); + + if ( !err ) + { + TInt myLatestPosition = SearchLatestTimestampL( elems ); + + if ( myLatestPosition != KErrNotFound ) + { + MSimpleElement* elem = elems[myLatestPosition]; + + using namespace NSimplePlugin::NSimpleOma; + + // person element found + RPointerArray elems2; + CleanupClosePushL( elems2 ); + elem->SimpleElementsL( elems2 ); + TInt count2 = elems2.Count(); + + for ( TInt j = 0; j < count2; j++ ) + { + MSimpleElement* elem2 = elems2[j]; + if ( !elem2->LocalName().CompareF( KSimpleOverridingwillingness8 )) + { + UserOverridingWillingnessToPrFwL( aPresenceFactory, elem2, coll ); + } + else if ( !elem2->LocalName().CompareF( KSimpleStatusicon8 )) + { + UserStatusIconToPrFwL( aPresenceFactory, elem2, coll, aDocument ); + } + else if ( !elem2->LocalName().CompareF( KSimpleNote8 )) + { + UserNoteToPrFwL( aPresenceFactory, elem2, coll ); + } + } + + CleanupStack::PopAndDestroy( &elems2 ); + } + } + + CleanupStack::PopAndDestroy( &elems ); + + aPrInfo.SetPersonPresenceL( persInfo ); + CleanupStack::Pop(); // >> persInfo + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::UserOverridingWillingnessToPrFwL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::UserOverridingWillingnessToPrFwL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection ) + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: UserOverridingWillingnessToPrFwL") ); +#endif + using namespace NSimplePlugin::NSimpleOma; + + RPointerArray elems; + CleanupClosePushL( elems ); + User::LeaveIfError( aElement->SimpleElementsL( elems )); + MSimpleElement* elem3 = elems[0]; // notice: we assume that there is no other sub-elements + if ( !elem3->LocalName().CompareF( KSimpleBasic8 )) + { + // write the data into text field. + HBufC* nodeContent = elem3->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + if ( nodeContent ) + { + // Save availability + using namespace NPresenceInfo::NFieldType; + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KAvailability ); + MPresenceInfoFieldValueText* text = aPresenceFactory.NewTextInfoFieldLC(); + text->SetTextValueL( nodeContent->Des() ); + field->SetFieldValue( text ); + CleanupStack::Pop(); // >> text + aCollection.AddOrReplaceFieldL( field ); + CleanupStack::Pop(); // >> field + } + CleanupStack::PopAndDestroy( nodeContent ); + } + CleanupStack::PopAndDestroy( &elems ); // close the array, do not delete the content + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::UserStatusIconToPrFwL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::UserStatusIconToPrFwL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection, + MSimpleDocument& aDocument ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: UserStatusIconToPrFwL") ); +#endif + using namespace NSimpleDocument; + + using namespace NPresenceInfo::NFieldType; + + HBufC* nodeContent = aElement->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + if ( nodeContent ) + { + RPointerArray contents; + CleanupClosePushL( contents ); + + // Search the corresponding direct content + aDocument.GetDirectContentsL( contents ); + + TInt contCount = contents.Count(); + for ( TInt i = 0; iContentID(); + // nodecontent = "cid:simple.avatar.com" + // content-id: simple.avatar.com + HBufC8* cid8 = NULL; + cid8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( nodeContent->Des() ); + CleanupStack::PushL( cid8 ); // << cid8 + + TInt contentLen = cid8->Des().Length() - 4; // "cid:" + TInt headLen = id.Length(); + TPtrC8 pUnquoted( KNullDesC8 ); + if ( id.Locate('"') == 0 ) + { + // remove "..." characters + pUnquoted.Set( id.Mid( 1, headLen-2 )); + } + else + { + pUnquoted.Set( id ); + } + TInt foundPos = cid8->Des().Find( pUnquoted ); + if ( contentLen == headLen && foundPos >= 0 ) + { + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KAvatar ); + MPresenceInfoFieldValueBinary* val = aPresenceFactory.NewBinaryInfoFieldLC(); + val->SetMimeTypeL( (contents[i])->ContentType() ); + // Body is not BASE64 encoded internally + val->SetBinaryValueL( (contents[i])->Body() ); + field->SetFieldValue( val ); + CleanupStack::Pop(); // >> val + aCollection.AddOrReplaceFieldL( field ); + CleanupStack::Pop(); // >> field + } + CleanupStack::PopAndDestroy( cid8 ); // >> cid8 + } + CleanupStack::PopAndDestroy( &contents ); + } + CleanupStack::PopAndDestroy( nodeContent ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::UserNoteToPrFwL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::UserNoteToPrFwL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: UserNoteToPrFwL") ); +#endif + // using namespace NSimplePlugin::NSimpleOma; + HBufC* nodeContent = aElement->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + if ( nodeContent ) + { + // Save note, convert from unicode + // notice: consider xml::lang-attribute + // note <-> KStatusMessage + using namespace NPresenceInfo::NFieldType; + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KStatusMessage ); + MPresenceInfoFieldValueText* text = aPresenceFactory.NewTextInfoFieldLC(); + text->SetTextValueL( nodeContent->Des() ); + field->SetFieldValue( text ); + CleanupStack::Pop(); // >> text + aCollection.AddOrReplaceFieldL( field ); + CleanupStack::Pop(); // >> field + } + CleanupStack::PopAndDestroy( nodeContent ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::NotifyListToPrInfoL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::NotifyListToPrInfoL( + MXIMPObjectFactory& aFactory, + MPresenceObjectFactory& aPresenceFactory, + MSimplePresenceList& aList, + RPointerArray& aEntities, + RPointerArray& aActives, + RPointerArray& aTerminated, + TBool& aFullList ) + { + // Split array into individual prInfos + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: NotifyListToPrInfoL") ); +#endif + + RPointerArray docs; + CleanupClosePushL( docs ); + // get documents, ownership is not transferred. + aList.GetDocuments( docs ); + + CollectAllPresentitiesL( aEntities, aActives, docs, aFactory, aPresenceFactory ); + + using namespace NSimplePlugin::NSimpleOma; + + MSimpleMeta* meta = aList.MetaData(); + +#ifdef _DEBUG + // TODO: remove + if ( meta == NULL ) + PluginLogger::Log(_L("PluginData: META Is NULL !!! *****")); +#endif + + + + // ownership in not transferred + if ( meta && !meta->LocalName().CompareF( KSimpleList8 )) + { + // list element found, find out if fullstate + const TDesC8* fullStateVal = meta->AttrValue( KSimpleFullState8 ); + if ( fullStateVal && !fullStateVal->CompareF( KSimpleTrue8 )) + { + aFullList = ETrue; + } + else + { + aFullList = EFalse; + } + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: fullState === %d"), aFullList ); +#endif + + // Search "terminated" presentities + RPointerArray elems2; + CleanupClosePushL( elems2 ); + meta->SimpleElementsL( elems2); + CollectTerminatedPresentitiesL( aTerminated, elems2, aFactory ); + CleanupStack::PopAndDestroy( &elems2 ); + } + + CleanupStack::PopAndDestroy( &docs ); + } + + /* + example: + Content-Transfer-Encoding: binary + Content-ID: + Content-Type: application/rlmi+xml;charset="UTF-8" + + + + Buddy List at COM + Liste der Freunde an COM + <------- note + Bob Smith + + + + Dave Jones + + + + Ed at NET + + + My Friends at ORG + Meine Freunde an ORG + + + */ + +// --------------------------------------------------------------------------- +// CSimplePluginData::AddPrPersToSimpleDocumentL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::AddPrPersToSimpleDocumentL( + const MPersonPresenceInfo* aInfo, + MSimpleDocument& aDocument, + const TDesC8& aSipId ) + { + using namespace NSimpleDocument; + + TPtrC8 p8( KSimpleAvatarCIDURI8 ); + TInt bufSize = p8.Length(); + + HBufC16* CIDcontent = HBufC16::NewLC( bufSize ); // << CID + CIDcontent->Des().Copy( KSimpleAvatarCIDURI8 ); + + // notice: we do not generate random id but a static one. + + using namespace NSimplePlugin::NSimpleOma; + + aDocument.SetEntityURIL( aSipId ); + + MSimpleElement* persElem = aDocument.AddSimpleElementL( + KSimpleNsPDM, KSimplePerson8 ); + CleanupClosePushL( *persElem ); // << persElem + + using namespace NPresenceInfo::NFieldType; + + const MPresenceInfoFieldCollection& coll = aInfo->Fields(); + + TInt myCount = coll.FieldCount(); + for ( TInt i = 0; i < myCount; i++ ) + { + const MPresenceInfoField& field = coll.FieldAt( i ); + const TDesC8& fieldType = field.FieldType(); + const MXIMPBase& storage = field.FieldValue(); + + // Notice: tuple id saving for partial data in future. + + /* + Mapping: + Avatar -> Person/status-icon + status-msg -> Person/note + Availability -> Person/overriding-willingness + */ + + if ( !fieldType.CompareF( KAvatar ) ) + { + const MPresenceInfoFieldValueBinary* bin = + TXIMPGetInterface< const MPresenceInfoFieldValueBinary >::From( storage, + MXIMPBase::EReturnNullIfUnknown ); + if ( bin ) + { + MSimpleElement* elem = persElem->AddSimpleElementL( + KSimpleNsRPID, + KSimpleStatusicon8 ); + CleanupClosePushL( *elem ); // << elem + elem->SetContentUnicodeL( CIDcontent->Des()); + // Create the MIME multipart content + MSimpleContent* content = TSimpleFactory::NewContentL( + KSimpleAvatarContent8, bin->MimeType() ); + CleanupClosePushL( *content ); // << content + content->CopyBodyL( bin->BinaryValue( ) ); + aDocument.AddDirectContentL( *content, EFalse ); + CleanupStack::PopAndDestroy( content ); // >> content + CleanupStack::PopAndDestroy( elem ); // >> elem + } + } + else if ( !fieldType.CompareF( KStatusMessage ) ) + { + const MPresenceInfoFieldValueText* text = + TXIMPGetInterface< const MPresenceInfoFieldValueText >::From( storage, + MXIMPBase::EReturnNullIfUnknown ); + if ( text ) + { + MSimpleElement* elem = persElem->AddSimpleElementL( + KSimpleNsPDM, + KSimpleNote8 ); + CleanupClosePushL( *elem ); // << elem + elem->SetContentUnicodeL( text->TextValue() ); + CleanupStack::PopAndDestroy( elem ); // >> elem + } + } + else if ( !fieldType.CompareF( KAvailability )) + { + const MPresenceInfoFieldValueText* text = + TXIMPGetInterface< const MPresenceInfoFieldValueText >::From( storage, + MXIMPBase::EReturnNullIfUnknown ); + if ( text ) + { + AddPrPersAvailabilityToDocL( text, persElem ); + } + } + else + { + // Notice: currently all the fields in the namespace are supported, + // but this ensures that if namespace is extended later, it is + // handled right way in the adaptation + User::Leave( KPresenceErrPresenceInfoFieldTypeNotSupported ); + } + } + CleanupStack::PopAndDestroy( persElem ); + CleanupStack::PopAndDestroy( CIDcontent ); + } + + +// --------------------------------------------------------------------------- +// CSimplePluginData::CollectAllPresentitiesL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::CollectAllPresentitiesL( + RPointerArray& aEntities, + RPointerArray& aActives, + RPointerArray& aDocs, + MXIMPObjectFactory& aFactory, + MPresenceObjectFactory& aPresenceFactory ) + { + TInt count = aDocs.Count(); + + // active presentities + for ( TInt i = 0; i < count; i++ ) + { + MPresenceInfo* info = aPresenceFactory.NewPresenceInfoLC(); // << info + aEntities.AppendL( info ); + // aEntities may contain entries even this method leaves + CleanupStack::Pop(); // >> info + + NotifyToPrInfoL( aPresenceFactory, *aDocs[i], *info ); + + // Add SIP identity to active users list + MXIMPIdentity* active = aFactory.NewIdentityLC(); // << active + aActives.AppendL( active ); + CleanupStack::Pop(); // >> active + + // Convert SIP entity URI from UTF to Unicode. + const TDesC8* pUri8 = (aDocs[i])->EntityURI(); + HBufC16* uri16 = NULL; + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *pUri8 ); + CleanupStack::PushL( uri16 ); // << uri16 + active->SetIdentityL( uri16->Des() ); + +#ifdef _DEBUG + // --------------------------------------------------------- + TBuf<200> buffer2; + buffer2.Copy(uri16->Des()); + const MPersonPresenceInfo* pers_debug = info->PersonPresence(); + const MPresenceInfoFieldCollection& coll_debug = pers_debug->Fields(); + TInt count_debug = coll_debug.FieldCount(); + PluginLogger::Log(_L("PluginData: nbr of fields received =%d"), count_debug ); + PluginLogger::Log(_L("PluginData: User added to actives: %S"), &buffer2 ); + // --------------------------------------------------------- +#endif + CleanupStack::PopAndDestroy( uri16 ); // >> uri16 + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::CollectTerminatedPresentitiesL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::CollectTerminatedPresentitiesL( + RPointerArray& aTerminated, + RPointerArray& aElems, + MXIMPObjectFactory& aFactory ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: CollectTerminatedPresentitiesL")); +#endif + using namespace NSimplePlugin::NSimpleOma; + + TInt count2 = aElems.Count(); + for ( TInt i = 0; i < count2; i++ ) + { + MSimpleElement* elem2 = aElems[i]; + if ( !elem2->LocalName().CompareF( KSimpleResource8 )) + { + // resource element + RPointerArray elems3; + CleanupClosePushL( elems3 ); + elem2->SimpleElementsL( elems3 ); + TInt count3 = elems3.Count(); + const TDesC8* uri8 = elem2->AttrValue( KSimpleUri8 ); + if ( !uri8 ) + { + continue; + } + for ( TInt j=0; j < count3; j++ ) + { + MSimpleElement* elem3 = elems3[j]; + SearchTerminatedInstanceL( aTerminated, elem3, uri8, aFactory ); + } + CleanupStack::PopAndDestroy( &elems3 ); + } // resource element + }// for (i); list element subelement + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: CollectTerminatedPresentitiesL ends")); +#endif + } + + +// --------------------------------------------------------------------------- +// CSimplePluginData::SearchLatestTimestampL +// --------------------------------------------------------------------------- +// +TInt CSimplePluginData::SearchLatestTimestampL( + RPointerArray& aElems ) + { + TInt ret = KErrNotFound; + + const TInt KMaxTimestamp = 40; + TBuf myTimestamp; + + // Timestamp to save the latest one person data + myTimestamp = KNullDesC; + + // They want to get empty notifications too. + TInt count = aElems.Count(); + + using namespace NSimplePlugin::NSimpleOma; + + MSimpleElement* elem = NULL; + TPtrC8 p8; + + for ( TInt i = 0; i < count; i++ ) + { + elem = aElems[i]; + p8.Set( elem->LocalName()); + if (!( p8.CompareF( KSimplePerson8 ))) + { + + if ( ret == KErrNotFound ) + { + // Save since the time stamp is optional, this is first . + // the whole may also be missing. + ret = i; + } + + // person element found + RPointerArray elems2; + CleanupClosePushL( elems2 ); + elem->SimpleElementsL( elems2 ); + TInt count2 = elems2.Count(); + + // Search optional timestamp element first, the latest one + for ( TInt j = 0; j < count2; j++ ) + { + // + MSimpleElement* elem2 = elems2[j]; + // Search optional timestamp element + if ( !elem2->LocalName().CompareF( KSimpleTimestamp8 )) + { + HBufC* nodeContent = elem2->ContentUnicodeL(); + // Notice: Timestamp comparision assumes now + // that all the timestamps have a similar format. + if ( myTimestamp.Compare( nodeContent->Des() ) < 0 ) + { + // Save latest timestamp + myTimestamp.Copy( nodeContent->Des() ); + ret = i; + } + delete nodeContent; + } + } + CleanupStack::PopAndDestroy( &elems2 ); + } + } // for + + return ret; + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::AddPrPersAvailabilityToDocL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::AddPrPersAvailabilityToDocL( + const MPresenceInfoFieldValueText* aText, MSimpleElement* aPersElem ) + { + using namespace NSimplePlugin::NSimpleOma; + + MSimpleElement* elem = aPersElem->AddSimpleElementL( + KSimpleNsOP, + KSimpleOverridingwillingness8 ); + CleanupClosePushL( *elem ); // << elem + MSimpleElement* elem2 = elem->AddSimpleElementL( + KSimpleNsOP, + KSimpleBasic8 ); + CleanupClosePushL( *elem2 ); // << elem2 + if ( !aText->TextValue().CompareF( KSimpleOpen ) ) + { + elem2->SetContentUnicodeL( KSimpleOpen ); + } + else + { + elem2->SetContentUnicodeL( KSimpleClosed ); + } + CleanupStack::PopAndDestroy( elem2 ); // >> elem2 + CleanupStack::PopAndDestroy( elem ); // >> elem + } + +// --------------------------------------------------------------------------- +// CSimplePluginData::SearchTerminatedInstanceL +// --------------------------------------------------------------------------- +// +void CSimplePluginData::SearchTerminatedInstanceL( + RPointerArray& aTerminated, + MSimpleElement* aElem, + const TDesC8* uri8, + MXIMPObjectFactory& aFactory ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginData: SearchTerminatedInstanceL")); +#endif + + using namespace NSimplePlugin::NSimpleOma; + if ( !aElem->LocalName().CompareF( KSimpleInstance8 )) + { + // instance element + const TDesC8* stateVal = aElem->AttrValue( KSimpleState8 ); + if ( stateVal && !stateVal->CompareF( KSimpleTerminated8 )) + { + // Add presentity into terminated list + MXIMPIdentity* terminated = aFactory.NewIdentityLC(); // +terminated + aTerminated.AppendL( terminated ); + CleanupStack::Pop(); // -terminated + + // Convert SIP entity URI from UTF to Unicode. + HBufC16* uri16 = NULL; + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *uri8 ); + CleanupStack::PushL( uri16 ); // +uri16 + terminated->SetIdentityL( uri16->Des() ); + +#ifdef _DEBUG + // Debug buffer size + const TInt KMyBufSize = 200; + // --------------------------------------------------------- + TBuf buffer3; + buffer3.Copy(uri16->Des()); + PluginLogger::Log(_L("PluginData: SearchTerminatedInstanceL TERMINATED INSTANCE FOUND ***")); + PluginLogger::Log(_L("PluginData: User added to terminated: %S"), &buffer3 ); + // --------------------------------------------------------- +#endif + CleanupStack::PopAndDestroy( uri16 ); // -uri16 + } + else + { + // ------------------------------------------------------------- +#ifdef _DEBUG + if ( stateVal != NULL ) + { + // Debug buffer size + const TInt KMyBufSize = 100; + HBufC16* uri16 = NULL; + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *stateVal ); + CleanupStack::PushL( uri16 ); // +uri16 + TBuf buffer4; + buffer4.Copy(uri16->Des()); + PluginLogger::Log(_L(" STATEVAL: %S"), &buffer4 ); + CleanupStack::PopAndDestroy( uri16 ); // -uri16 + } +#endif + // ------------------------------------------------------------- + } + } + } + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simpleplugindebugutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simpleplugindebugutils.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2006 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: DEBUG utilities, for DEBUG version only +* +*/ + + + + +// INCLUDE FILES +#include + +#ifdef _DEBUG +#include +#include +#include +#include + +#include "simpleplugindebugutils.h" + +//********************************** +// PluginLogger +//********************************** +const TInt KLogBufferLength = 256; + +// --------------------------------------------------------- +// PluginLogger::Log +// --------------------------------------------------------- +// +void PluginLogger::Log(TRefByValue aFmt,...) + { + VA_LIST list; + VA_START(list, aFmt); + + // Print to log file + TBuf buf; + buf.FormatList(aFmt, list); + + _LIT(KLogDir, "simple"); + _LIT(KLogFile, "simple.txt"); + // Write to log file + RFileLogger::Write(KLogDir, KLogFile, EFileLoggingModeAppend, buf); + } + +#endif // _DEBUG + + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginentitywatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginentitywatcher.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,459 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "simpleplugincommon.h" +#include "simplepluginentitywatcher.h" +#include "simpleplugindebugutils.h" +#include "simpleplugindata.h" +#include "simpleutils.h" +#include "simplepluginwatcher.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::CSimplePluginEntityWatcher +// --------------------------------------------------------------------------- +// +CSimplePluginEntityWatcher::CSimplePluginEntityWatcher( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CSimplePluginWatcher& aWatcher + ) + : iPluginWatcher(aWatcher), iConnObs(aObs), iConnection(aConn), + iOperation(EPluginIdle) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::ConstructL( ) + { + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginEntityWatcher* CSimplePluginEntityWatcher::NewL( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CSimplePluginWatcher& aWatcher ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: NewL")); +#endif + CSimplePluginEntityWatcher* self = + new( ELeave ) CSimplePluginEntityWatcher( aObs, aConn, aWatcher ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::~CSimplePluginEntityWatcher +// --------------------------------------------------------------------------- +// +CSimplePluginEntityWatcher::~CSimplePluginEntityWatcher() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: DESTRUCTOR")); +#endif + if ( iWatcher ) + { + iWatcher->Close(); + } + delete iEntityId; + delete iSimpleEntityId; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::StartSubscribeL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::StartSubscribeL( + const TDesC8& aPresentityId ) + { + delete iEntityId; + iEntityId = NULL; + + iListSubsActive = EFalse; + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: -> SubscribeL")); +#endif + iSimpleId = iWatcher->SubscribeL( aPresentityId, NULL, ETrue, EFalse ); + + // Save entity id after successful call + iEntityId = aPresentityId.AllocL(); + + iOperation = EPluginStart; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::StartSubscribeListL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::StartSubscribeListL( + const TDesC8& aPresentityId ) + { + delete iEntityId; + iEntityId = NULL; + + iListSubsActive = ETrue; + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: -> SubscribeListL")); +#endif + iSimpleId = iWatcher->SubscribeListL( aPresentityId, NULL, ETrue, EFalse ); + + // Save entity id after successful call + iEntityId = aPresentityId.AllocL(); + + iOperation = EPluginStart; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::SetSimpleNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::SetSimpleNameL( + const TDesC8& aPresentityId ) + { + delete iSimpleEntityId; + iSimpleEntityId = NULL; + + + // Save entity id after successful call + iSimpleEntityId = aPresentityId.AllocL(); + + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::StopSubscribeL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::StopSubscribeL( + ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: -> UnsubscribeL")); +#endif + iSimpleId = iWatcher->UnsubscribeL( ); + iOperation = EPluginStop; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherReqCompleteL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherReqCompleteL( + TInt /*aOpId*/, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherReqCompleteL")); +#endif + TPluginEntityWatcherOperation orig = iOperation; + iOperation = EPluginIdle; + + CompleteClientReq( aStatus ); + + if ( aStatus && ( orig == EPluginStop || orig == EPluginStart) ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: calls DeleteWatcher **")); +#endif + // Delete this entity as useless + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + // Do not call anything, since the method call above deletes this instance. + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherNotificationL( + MSimpleDocument& aDocument ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherNotificationL" )); +#endif + + // No need to check the expiration here since WatcherTerminatedL + // is called then too. + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + MPresenceInfo* prInfo = iConnObs.PresenceObjectFactory().NewPresenceInfoLC(); + + CSimplePluginData::NotifyToPrInfoL( iConnObs.PresenceObjectFactory(), aDocument, *prInfo ); + +#ifdef _DEBUG + // --------------------------------------------------------- + const MPersonPresenceInfo* pers_debug = prInfo->PersonPresence(); + const MPresenceInfoFieldCollection& coll_debug = pers_debug->Fields(); + TInt count_debug = coll_debug.FieldCount(); + PluginLogger::Log(_L("PluginEntityWatcher: nbr of fields received =%d"), count_debug ); + // --------------------------------------------------------- +#endif + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( *aDocument.EntityURI() ); + CleanupStack::PushL( uniBuffer ); // << uniBuffer + identity2->SetIdentityL( uniBuffer->Des() ); + CleanupStack::PopAndDestroy( uniBuffer ); // >> uniBuffer + + if ( iListSubsActive ) + { + // Set Group Id + HBufC* uniBuffer2 = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( iEntityId->Des() ); + CleanupStack::PushL( uniBuffer2 ); + MXIMPIdentity* gId = iConnObs.ObjectFactory().NewIdentityLC(); // << gId + gId->SetIdentityL( uniBuffer2->Des() ); + + MXIMPObjectCollection* coll = + iConnObs.ObjectFactory().NewObjectCollectionLC(); // << coll + + iPluginWatcher.GetEntitiesInListL( uniBuffer2->Des(), *coll ); + + MProtocolPresentityGroupsDataHost& groupHost = + iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost(); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginEntityWatcher: callback HandlePresentityGroupContentL")); +#endif + groupHost.HandlePresentityGroupContentL( gId, coll ); + + CleanupStack::Pop( 2 ); // >> gId, coll + CleanupStack::PopAndDestroy( uniBuffer2 ); + + // This is done only for first notification for group subscription + iListSubsActive = EFalse; + } + + // PrFw Host API callback +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginEntityWatcher: callback HandleSubscribedPresentityPresenceL")); +#endif + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop(); // >> prInfo + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherListNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherListNotificationL( + MSimplePresenceList& aList ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherListNotificationL" )); +#endif + + // call all the necessary callbacks, for new data + teminated ones. + + // check out whether fullstate list or not + TBool fullState( EFalse ); + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + + RPointerArray entities; + RPointerArray terminated; + RPointerArray allEntities; + + TRAPD( err, CSimplePluginData::NotifyListToPrInfoL( + iConnObs.ObjectFactory(), iConnObs.PresenceObjectFactory(), + aList, entities, allEntities, terminated, fullState )); + if ( err ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherListNotificationL error *" )); +#endif + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + allEntities.ResetAndDestroy(); + entities.Close(); + terminated.Close(); + allEntities.Close(); + return; + } + + CompleteClientReq( KErrNone ); + + // Call HandleSubscribedPresentityPresenceL for all users + TInt counter = entities.Count(); + for ( TInt i = counter-1 ; i>=0; i-- ) + { + // --------------------------------------------------------- +#ifdef _DEBUG + const MPersonPresenceInfo* info = entities[i]->PersonPresence(); + const MPresenceInfoFieldCollection& coll_debug = info->Fields(); + TInt count_debug = coll_debug.FieldCount(); + + PluginLogger::Log( + _L("PluginWatcher: callback HandleSubscribedPresentityPresenceL nbrFields=%d"), count_debug ); +#endif + // --------------------------------------------------------- + + watcherHost.HandleSubscribedPresentityPresenceL( + allEntities[i], entities[i] ); + // Owenership is transferred + allEntities.Remove(i); + entities.Remove(i); + } + + // call SetPresentityPresenceDataSubscriptionStateL for terminated users + counter = terminated.Count(); + for ( TInt i = counter-1 ; i>=0; i-- ) + { + MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: TEST COVERS 1")); + PluginLogger::Log( + _L("PluginWatcher: callback SetPresentityPresenceDataSubscriptionStateL")); +#endif + watcherHost.SetPresentityPresenceDataSubscriptionStateL( + terminated[i], state, NULL ); + CleanupStack::Pop( 1 ); // state + // Owenership is transferred + terminated.Remove(i); + } + + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + allEntities.ResetAndDestroy(); + + entities.Close(); + terminated.Close(); + allEntities.Close(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherTerminatedL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherTerminatedL( + TInt /*aOpId*/, TInt /*aReason*/ ) + { + // Call PrFw Host and tell to CSimplePluginWatcher that + // this entity can be deleted. + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherTerminatedL" )); +#endif + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + status->SetResultCode( KErrCompletion ); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + + HBufC16* buf16 = HBufC16::NewLC( PresentityId().Length()); + buf16->Des().Copy( PresentityId() ); + identity->SetIdentityL( buf16->Des() ); + CleanupStack::PopAndDestroy( buf16 ); + +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: callback SetPresentityPresenceDataSubscriptionStateL")); +#endif + watcherHost.SetPresentityPresenceDataSubscriptionStateL( + identity, state, status ); + CleanupStack::Pop( 3 ); // identity, status, state + + // Delete this entity as useless + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + // Do not call anything, since the method call above deletes this instance. + + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::CompleteClientReq +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::CompleteClientReq( TInt aStatus ) + { + // complete the open PrFw request immediately here! + iPluginWatcher.CompleteWatcher( aStatus ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::PresentityId +// --------------------------------------------------------------------------- +// +TPtrC8 CSimplePluginEntityWatcher::PresentityId( ) + { + return iEntityId ? iEntityId->Des() : TPtrC8(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::PrFwRequestId +// --------------------------------------------------------------------------- +// +TXIMPRequestId CSimplePluginEntityWatcher::PrFwRequestId( ) + { + return iPrFwId; + } + + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simpleplugingroups.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simpleplugingroups.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,893 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "simpleplugingroups.h" +#include "simpleplugindebugutils.h" +#include "simplepluginxdmutils.h" +#include "simpleplugincommon.h" +#include "simplepluginconnection.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::CSimplePluginGroups +// --------------------------------------------------------------------------- +// +CSimplePluginGroups::CSimplePluginGroups( + MSimplePluginConnectionObs& aObs ) +: CActive( CActive::EPriorityStandard ), + iConnObs(aObs), iSubscribed(KSimplePluginSubsNone), + iOperation( ENoOperation), + iState( EPluginIdle ), iCompleted( ETrue ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::ConstructL( ) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginGroups* CSimplePluginGroups::NewL( + MSimplePluginConnectionObs& aObs ) + { + CSimplePluginGroups* self = + new( ELeave ) CSimplePluginGroups( aObs ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::~CSimplePluginGroups +// --------------------------------------------------------------------------- +// +CSimplePluginGroups::~CSimplePluginGroups() + { + delete iPresIdentity; + delete iPresIdentity2; + delete iDisplayName; + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoSubscribePresentityGroupListL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoSubscribePresentityGroupListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoSubscribePresentityGroupListL")); +#endif + + iCompleted = EFalse; + + // List of lists under OMa buddylist + StartXdmOperationL( aReqId, EGetListOfLists ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoUnsubscribePresentityGroupListL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoUnsubscribePresentityGroupListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoUnsubscribePresentityGroupListL")); +#endif + iPrFwId = aReqId; + iCompleted = EFalse; + CompletePrFwReq( KErrNone ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoCreatePresentityGroupL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoCreatePresentityGroupL( + const MXIMPIdentity& aGroupId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoCreatePresentityGroupL")); +#endif + iCompleted = EFalse; + StartXdmOperationL( + aGroupId, aDisplayName, aReqId, ECreatePresentityGroup ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoDeletePresentityGroupL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoDeletePresentityGroupL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoDeletePresentityGroupL")); +#endif + iCompleted = EFalse; + StartXdmOperationL( aGroupId, aReqId, EDeletePresentityGroup ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoUpdatePresentityGroupDisplayNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoUpdatePresentityGroupDisplayNameL( + const MXIMPIdentity& /*aGroupId*/, + const TDesC16& /*aDisplayName*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoUpdatePresentityGroupDisplayNameL")); +#endif + // Notice: not supported. + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoSubscribePresentityGroupContentL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoSubscribePresentityGroupContentL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoSubscribePresentityGroupContentL")); +#endif + iCompleted = EFalse; + + // List of lists under OMa buddylist + StartXdmOperationL( aGroupId, aReqId, EGetListContent ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoUnsubscribePresentityGroupContentL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoUnsubscribePresentityGroupContentL( + const MXIMPIdentity& /*aGroupId*/, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoUnsubscribePresentityGroupContentL")); +#endif + iCompleted = EFalse; + iPrFwId = aReqId; + CompletePrFwReq( KErrNone ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoAddPresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoAddPresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + const TDesC16& aMemberDisplayName, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoAddPresentityGroupMemberL")); +#endif + iCompleted = EFalse; + StartXdmOperationL( + aGroupId, aMemberId, aMemberDisplayName, + aReqId, EAddPresentityGroupMember ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoRemovePresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoRemovePresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoRemovePresentityGroupMemberL")); +#endif + iCompleted = EFalse; + StartXdmOperationL( + aGroupId, aMemberId, + aReqId, ERemovePresentityGroupMember ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL( + const MXIMPIdentity& /*aGroupId*/, + const MXIMPIdentity& /*aMemberId*/, + const TDesC16& /*aMemberDisplayName*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginGroups: DoUpdatePresentityGroupMemberDisplayNameL")); +#endif + // Notice: Not supported. + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoCancel() +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoCancel( ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: DoCancel")); +#endif + if ( iOperation != ENoOperation ) + { + iXdmUtils->Cancel(); + } + else + { + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::RunL() +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::RunL( ) + { + TInt myStatus = iStatus.Int(); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: RunL status=%d active=%d"), myStatus, IsActive() ); +#endif + + if ( !myStatus ) + { + // OK resposne + CallActualXdmOperationL(); + } + else + { + if ( iOperation == EDeletePresentityGroup && iState == EPluginCommitRls ) + { + // Igonere RLS deletion failure and contine Shared XDM deletion + CallActualXdmOperationL(); + } + else + { + // Other errors terminated the show + CompletePrFwReq( myStatus ); + } + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::CallActualXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::CallActualXdmOperationL() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: CallActualXdmOperationL operation=%d"), iOperation ); +#endif + + switch ( iOperation ) + { + case ECreatePresentityGroup: + HandleCreatePresentityGroupL( iPresIdentity->Des(), iDisplayName->Des() ); + break; + case EDeletePresentityGroup: + HandleDeletePresentityGroupL( iPresIdentity->Des() ); + break; + case EAddPresentityGroupMember: + HandleAddPresentityGroupMemberL(); + break; + case ERemovePresentityGroupMember: + HandleRemovePresentityGroupMemberL(); + break; + case EGetListOfLists: + GetListOfListsL(); + break; + case EGetListContent: + GetListContentL(); + break; + default: + User::Leave( KErrNotSupported ); + break; + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::RunError +// --------------------------------------------------------------------------- +// +TInt CSimplePluginGroups::RunError( TInt aError ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: RunError %d active=%d"), aError, IsActive()); +#endif + // complete the open request + CompletePrFwReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CSimplePluginGroups::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MProtocolPresentityGroups* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CSimplePluginGroups::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MProtocolPresentityGroups* myIf = this; + return myIf; + } + else if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CSimplePluginGroups::GetInterfaceId() const + { + return MProtocolPresentityGroups::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::SetPresIdentityL() +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::SetPresIdentityL( + const MXIMPIdentity& aPresentityId ) + { + delete iPresIdentity; + iPresIdentity = NULL; + iPresIdentity = aPresentityId.Identity().AllocL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::SetPresIdentity2L() +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::SetPresIdentity2L( + const MXIMPIdentity& aPresentityId ) + { + delete iPresIdentity2; + iPresIdentity2 = NULL; + iPresIdentity2 = aPresentityId.Identity().AllocL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::StartXdmOperationL( + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + iPrFwId = aReqId; + iOperation = aOperation; + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + SetPresIdentityL( aId ); + iPrFwId = aReqId; + iOperation = aOperation; + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::StartXdmOperationL( + const MXIMPIdentity& aId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + SetPresIdentityL( aId ); + + delete iDisplayName; + iDisplayName = NULL; + iDisplayName = aDisplayName.AllocL(); + + iPrFwId = aReqId; + iOperation = aOperation; + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::StartXdmOperationL( + const MXIMPIdentity& aId, + const MXIMPIdentity& aMemberId, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + SetPresIdentityL( aId ); + SetPresIdentity2L( aMemberId ); + iPrFwId = aReqId; + iOperation = aOperation; + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::StartXdmOperationL( + const MXIMPIdentity& aId, + const MXIMPIdentity& aMemberId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + SetPresIdentityL( aId ); + SetPresIdentity2L( aMemberId ); + + delete iDisplayName; + iDisplayName = NULL; + iDisplayName = aDisplayName.AllocL(); + + iPrFwId = aReqId; + iOperation = aOperation; + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::StartXdmOperationL() + { + TRAPD( err, DoStartXdmOperationL() ); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + else + { + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::DoStartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::DoStartXdmOperationL() + { + if ( !iXdmUtils ) + { + iXdmUtils = iConnObs.XdmUtilsL(); + } + else + { + } + + // Delete Group is the only method that access XDM rules, + // others access shared lists only. + if ( iOperation != EDeletePresentityGroup ) + { + iXdmUtils->InitializeXdmsOnlyL( iStatus ); + } + else + { + iXdmUtils->InitializeXdmL( iStatus ); + } + + iState = EPluginInitXdm; + SetActive(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::GetListOfListsL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::GetListOfListsL() + { + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresentityGroupsDataHost& dataHost = + iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost(); + + // This searches data from the local cache only. + MXIMPObjectCollection* userLists = + myFactory.NewObjectCollectionLC(); // << userLists + + const TInt KMyGran = 10; + CDesCArrayFlat* lists = new (ELeave) CDesCArrayFlat( KMyGran ); + CleanupStack::PushL( lists ); // << lists + + CDesCArrayFlat* dNames = new (ELeave) CDesCArrayFlat( KMyGran ); + CleanupStack::PushL( dNames ); // << dNames + + iXdmUtils->GetUserListsL( *lists, *dNames ); + + CopyGroupArraysToCollectionL( *lists, *dNames, *userLists ); + + CleanupStack::PopAndDestroy( dNames ); // >> dNames + CleanupStack::PopAndDestroy( lists ); // >> lists + + CompletePrFwReq( KErrNone ); + + // Callback for subscription state (terminated). + MXIMPDataSubscriptionState* myState = + myFactory.NewDataSubscriptionStateLC(); + MXIMPStatus* myStatus = myFactory.NewStatusLC(); + // Notice: consider error codes + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + myState->SetDataStateL( MXIMPDataSubscriptionState::EDataUnavailable ); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginGroups: callback SetPresentityGroupListDataSubscriptionStateL")); +#endif + dataHost.SetPresentityGroupListDataSubscriptionStateL( + myState, myStatus ); + + + CleanupStack::Pop( 2 ); // >> myState, myStatus + + // callback for data +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: callback HandlePresentityGroupListL")); +#endif + dataHost.HandlePresentityGroupListL( userLists ); + CleanupStack::Pop(); // >> userLists + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::GetListContentL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::GetListContentL() + { + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresentityGroupsDataHost& dataHost = + iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost(); + + MXIMPObjectCollection* entities = + myFactory.NewObjectCollectionLC(); // << entities + + const TInt KMyGran = 10; + CPtrCArray* ids = new (ELeave) CPtrCArray( KMyGran ); + CleanupStack::PushL( ids ); // << ids + + CPtrCArray* dispNames = new (ELeave) CPtrCArray( KMyGran ); + CleanupStack::PushL( dispNames ); // << dispNames + + + iXdmUtils->GetEntitiesInListL( iPresIdentity->Des(), *ids, *dispNames ); + + CopyGroupMembersToCollectionL( *ids, *dispNames, *entities ); + + CleanupStack::PopAndDestroy( dispNames ); + CleanupStack::PopAndDestroy( ids ); + + // Complete the PrFw request + CompletePrFwReq( KErrNone ); + + // callback for data + MXIMPIdentity* id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( iPresIdentity->Des() ); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginGroups: callback HandlePresentityGroupContentL .")); +#endif + dataHost.HandlePresentityGroupContentL( id, entities ); + CleanupStack::Pop(); // >> id + CleanupStack::Pop(); // >> entities + + // Callback for subscription state (terminated). + id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( iPresIdentity->Des() ); + MXIMPDataSubscriptionState* myState = + myFactory.NewDataSubscriptionStateLC(); // << myState + MXIMPStatus* myStatus = myFactory.NewStatusLC(); // << myStatus + // Notice: consider error codes + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginGroups: callback SetPresentityGroupContentDataSubscriptionStateL")); +#endif + dataHost.SetPresentityGroupContentDataSubscriptionStateL( + id, myState, myStatus ); + CleanupStack::Pop( 3 ); // >> myStatus, myState, id + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::CompletePrFwReq +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::CompletePrFwReq( TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: CompletePrFwReq status=%d"), aStatus ); +#endif + + if ( iCompleted ) + { + return; + } + + iCompleted = ETrue; + iOperation = ENoOperation; + iConnObs.CompleteReq( iPrFwId, aStatus ); + iPrFwId = TXIMPRequestId(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::CompleteMe +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::CompleteMe( TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginGroups: CompleteMe status=%d"), aStatus ); +#endif + + iStatus = KRequestPending; + TRequestStatus* s= &iStatus; + User::RequestComplete( s, aStatus ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::CopyGroupArraysToCollectionL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::CopyGroupArraysToCollectionL( + CDesCArrayFlat& aLists, CDesCArrayFlat& aNames, MXIMPObjectCollection& aCollection ) + { + TInt count = aLists.Count(); + for ( TInt i=0; i < count; i++ ) + { + // create here the PrFW group info + MPresentityGroupInfo* info = + iConnObs.PresenceObjectFactory().NewPresentityGroupInfoLC(); // << info + MXIMPIdentity* id = iConnObs.ObjectFactory().NewIdentityLC(); // << id + id->SetIdentityL( aLists[i] ); + info->SetGroupIdL( id ); + CleanupStack::Pop(); // >> id + + info->SetGroupDisplayNameL( aNames[i] ); + aCollection.AddObjectL( info ); + CleanupStack::Pop(); // >> info + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::CopyGroupMembersToCollectionL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::CopyGroupMembersToCollectionL( + CPtrCArray& aIds, CPtrCArray& aNames, MXIMPObjectCollection& aCollection) + { + TInt count = aIds.Count(); + for ( TInt i=0; i < count; i++ ) + { + // create here MPresentityGroupMemberInfo + MPresentityGroupMemberInfo* info = + iConnObs.PresenceObjectFactory().NewPresentityGroupMemberInfoLC(); // << info + MXIMPIdentity* id = iConnObs.ObjectFactory().NewIdentityLC(); // << id + id->SetIdentityL( aIds[i] ); + info->SetGroupMemberIdL( id ); + CleanupStack::Pop(); // >> id + + info->SetGroupMemberDisplayNameL( aNames[i] ); + aCollection.AddObjectL( info ); + CleanupStack::Pop(); // >> info + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::HandleCreatePresentityGroupL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::HandleCreatePresentityGroupL( + const TDesC& aGroupId, const TDesC& aDispName ) + { + if ( iState == EPluginInitXdm ) + { + iState = EPluginCommitXdm; + iXdmUtils->CreateEntityGroupL( aGroupId, aDispName ); + iXdmUtils->CommitXdmL( iStatus ); + SetActive(); + } + else + { + // We are ready + CompletePrFwReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::HandleDeletePresentityGroupL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::HandleDeletePresentityGroupL( const TDesC& aGroupId ) + { + if ( iState == EPluginInitXdm ) + { + iState = EPluginFetchRls; + iXdmUtils->FetchRlsL( iStatus ); + SetActive(); + } + else if ( iState == EPluginFetchRls ) + { + iState = EPluginCommitRls; + // Remove RLS service + iXdmUtils->RemoveRlsServiceByResourceListL( aGroupId, iStatus ); + SetActive(); + } + else if ( iState == EPluginCommitRls ) + { + iState = EPluginCommitXdm; + iXdmUtils->DeleteEntityGroupL( aGroupId ); + iXdmUtils->CommitXdmL( iStatus ); + SetActive(); + } + else if ( iState == EPluginCommitXdm ) + { + // Delete the group from a granted rule. The following won't leave if + // it does not locate under the rule. +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: TEST COVERS 2 **")); +#endif + iState = ERemoveGroupFromGranted; + iXdmUtils->RemoveGroupFromGrantedL( aGroupId, iStatus ); + SetActive(); + } + else + { + // We are ready + CompletePrFwReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::HandleAddPresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::HandleAddPresentityGroupMemberL( ) + { + if ( iState == EPluginInitXdm ) + { + iXdmUtils->AddPresentityGroupMemberL( + iPresIdentity->Des(), iPresIdentity2->Des(), + iDisplayName->Des(), iStatus ); + iState = EPluginAddGroupMember; + SetActive(); + } + else + { + // We are ready + CompletePrFwReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginGroups::HandleRemovePresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CSimplePluginGroups::HandleRemovePresentityGroupMemberL() + { + if ( iState == EPluginInitXdm ) + { + iXdmUtils->RemovePresentityGroupMemberL( + iPresIdentity->Des(), iPresIdentity2->Des(), iStatus ); + iState = EPluginRemoveGroupMember; + SetActive(); + } + else + { + // We are ready + CompletePrFwReq( KErrNone ); + } + } + + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginpublisher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginpublisher.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1071 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +#include "simpleplugincommon.h" +#include "simplepluginpublisher.h" +#include "simpleplugindebugutils.h" +#include "simpleutils.h" +#include "simplepluginwinfo.h" +#include "simpleplugindata.h" +#include "simplepluginxdmutils.h" +#include "simplepluginconnection.h" + + +// ======== MEMBER FUNCTIONS ======== + + +// ----------------------------------------------------------------------------- +// CSimplePluginWatcherInfo::CSimplePluginWatcherInfo +// ----------------------------------------------------------------------------- +CSimplePluginWatcherInfo::CSimplePluginWatcherInfo( ) + {} + +// ----------------------------------------------------------------------------- +// CSimplePluginWatcherInfo::~CSimplePluginWatcherInfo +// ----------------------------------------------------------------------------- +CSimplePluginWatcherInfo::~CSimplePluginWatcherInfo() + { + delete iId; + delete iSipId; + } + +// ---------------------------------------------------------- +// CSimplePluginWatcherInfo::NewL +// ---------------------------------------------------------- +// +CSimplePluginWatcherInfo* CSimplePluginWatcherInfo::NewL( + const TDesC8& aId, const TDesC& aSipId ) + { + CSimplePluginWatcherInfo* self = new (ELeave) CSimplePluginWatcherInfo( ); + CleanupStack::PushL( self ); + self->ConstructL( aId, aSipId ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------- +// CSimplePluginWatcherInfo::ConstructL +// ---------------------------------------------------------- +// +void CSimplePluginWatcherInfo::ConstructL( + const TDesC8& aId, const TDesC& aSipId ) + { + iId = aId.AllocL(); + iSipId = aSipId.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CSimplePluginWatcherInfo::Destroy +// ----------------------------------------------------------------------------- +void CSimplePluginWatcherInfo::Destroy() + { + iLink.Deque(); + delete this; + } + +// ----------------------------------------------------------------------------- +// CSimplePluginWatcherInfo::Match +// ----------------------------------------------------------------------------- +TBool CSimplePluginWatcherInfo::Match( const TDesC8& aId, const TDesC& aSipId ) + { + if ( (!iId->Des().CompareF( aId )) && (!iSipId->Des().CompareF( aSipId)) ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CSimplePluginWatcherInfo::SipId +// ----------------------------------------------------------------------------- +TPtrC CSimplePluginWatcherInfo::SipId( ) + { + return iSipId ? iSipId->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::CSimplePluginPublisher +// --------------------------------------------------------------------------- +// +CSimplePluginPublisher::CSimplePluginPublisher( + MSimplePluginSettings& aConnSets, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ) +: CActive( CActive::EPriorityStandard ), + iConnObs(aObs), iConnSets( aConnSets), iConnection(aConn), + iSubscribed(EFalse), iSubscribedOwn(EFalse), iPublished(EFalse), + iWatcherList( CSimplePluginWatcherInfo::LinkOffset()) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::ConstructL( ) + { + iPublisher = TSimpleFactory::NewPublisherL( iConnection, *this ); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginPublisher* CSimplePluginPublisher::NewL( + MSimplePluginSettings& aConnSets, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ) + { + CSimplePluginPublisher* self = + new( ELeave ) CSimplePluginPublisher( aConnSets, aObs, aConn ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::~CSimplePluginPublisher +// --------------------------------------------------------------------------- +// +CSimplePluginPublisher::~CSimplePluginPublisher() + { + if ( iDocument ) + { + iDocument->Close(); + } + + if ( iPublisher ) + { + iPublisher->Close(); + } + + if ( iWatcher ) + { + iWatcher->Close(); + } + + // delete iWatchers; + DeleteWatchers(); + + } + +// ----------------------------------------------------------------------------- +// CSimplePluginPublisher::DeleteWatchers +// ----------------------------------------------------------------------------- +void CSimplePluginPublisher::DeleteWatchers() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: DeleteWatchers" ) ); +#endif + // Delete all buffered transaction requests + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + while ( rIter ) + { + CSimplePluginWatcherInfo* w = rIter; + rIter++; + // delete wathcer info + w->Destroy(); + } + } + +// ----------------------------------------------------------------------------- +// CSimplePluginPublisher::AddWatcherIfNotExistsL +// ----------------------------------------------------------------------------- +void CSimplePluginPublisher::AddWatcherIfNotExistsL( const TDesC8& aId, const TDesC& aSipId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: AddWatcherIfNotExistsL" ) ); +#endif + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + TBool found(EFalse); + + while ( rIter ) + { + CSimplePluginWatcherInfo* w = rIter; + rIter++; + found = w->Match( aId, aSipId ); + if ( found ) + { + break; + } + else + { + // continue searching + } + } + if ( !found ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: AddWatcherIfNotExistsL adds a watcher" ) ); +#endif + CSimplePluginWatcherInfo* w = CSimplePluginWatcherInfo::NewL( aId, aSipId ); + iWatcherList.AddLast( *w ); + } + } + +// ----------------------------------------------------------------------------- +// CSimplePluginPublisher::RemoveWatcherIfExistsL +// ----------------------------------------------------------------------------- +void CSimplePluginPublisher::RemoveWatcherIfExistsL( const TDesC8& aId, const TDesC& aSipId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: RemoveWatcherIfExistsL" ) ); +#endif + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + TBool found(EFalse); + + while ( rIter ) + { + CSimplePluginWatcherInfo* w = rIter; + rIter++; + // delete wathcer info + found = w->Match( aId, aSipId ); + if ( found ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: RemoveWatcherIfExistsL removes a watcher" ) ); +#endif + w->Destroy(); + break; + } + else + { + // continue searching + } + } + } +// ----------------------------------------------------------------------------- +// CSimplePluginPublisher::MakeCurrentWatcherListLC +// ----------------------------------------------------------------------------- +CDesCArrayFlat* CSimplePluginPublisher::MakeCurrentWatcherListLC() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: MakeCurrentWatcherListL" ) ); +#endif + // No one should be added more than once + const TInt KMyGran = 10; + CDesCArrayFlat* watchers = new (ELeave) CDesCArrayFlat( KMyGran ); + CleanupStack::PushL( watchers ); // << watchers + + // add user only once here. + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + while ( rIter ) + { + CSimplePluginWatcherInfo* w = rIter; + rIter++; + + TInt dummy = 0; + if ( watchers->Find( w->SipId(), dummy )) + { + watchers->AppendL( w->SipId() ); + } + else + { + // continue searching + } + } + + return watchers; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoPublishOwnPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoPublishOwnPresenceL( + const MPresenceInfo& aOwnPresence, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: DoPublishOwnPresenceL")); +#endif + + const MPersonPresenceInfo* persInfo = aOwnPresence.PersonPresence(); + + // convert data format from PrFW to internal + if ( !persInfo ) + { + // Notice: error codes + CompletePrFwReq( KErrArgument ); + return; + } + InitializeSimpleDocumentL( ); + AddSimpleDocumentPersL( persInfo ); + + TInt myCount = aOwnPresence.ServicePresenceCount(); + for ( TInt i=0; i < myCount; i++ ) + { + const MServicePresenceInfo& servInfo = aOwnPresence.ServicePresenceAt(i); + AddSimpleDocumentServiceL( servInfo ); + } + myCount = aOwnPresence.DevicePresenceCount(); + for ( TInt i=0; i < myCount; i++ ) + { + const MDevicePresenceInfo& devInfo = aOwnPresence.DevicePresenceAt(i); + AddSimpleDocumentDeviceL( devInfo ); + } + + // Ensure that XDM rules exists, the show continues in RunL + StartXdmOperationL(aReqId ); + iOperation = EPublishOwn; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoSubscribeOwnPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoSubscribeOwnPresenceL( + const MPresenceInfoFilter& /*aPif*/, // notice: aPif filter not supported + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: DoSubscribeOwnPresenceL")); +#endif + + StartXdmOperationL( aReqId ); + + iOperation = ESubscribeOwn; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoUpdateOwnPresenceSubscriptionPifL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoUpdateOwnPresenceSubscriptionPifL( + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: DoUpdateOwnPresenceSubscriptionPifL")); +#endif + // Notice: aPif filter not supported + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoUnsubscribeOwnPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoUnsubscribeOwnPresenceL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: DoUnsubscribeOwnPresenceL")); +#endif + iSubscribedOwn = EFalse; + TRAPD( err, iSimpleId = iWatcher->UnsubscribeL()); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + iPrFwId = aReqId; + iOperation = EUnsubscribeOwn; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoSubscribePresenceWatcherListL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoSubscribePresenceWatcherListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: DoSubscribePresenceWatcherListL")); +#endif + + if ( !iSubscribed ) + { + TRAPD( err, iConnObs.WinfoHandlerL()->SubscribeWinfoListL( aReqId )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + iSubscribed = ETrue; + iPrFwId = aReqId; + iOperation = ESubscribeWinfo; + } + else + { + iPrFwId = aReqId; + CompletePrFwReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoUnsubscribePresenceWatcherListL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoUnsubscribePresenceWatcherListL( + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: DoUnsubscribePresenceWatcherListL")); +#endif + if ( iSubscribed ) + { + TRAPD( err, iConnObs.WinfoHandlerL()->UnsubscribeWinfoListL( aReqId )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + iSubscribed = EFalse; + iPrFwId = aReqId; + iOperation = EUnsubscribeWinfo; + } + else + { + iPrFwId = aReqId; + CompletePrFwReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::PublishReqCompleteL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::PublishReqCompleteL( TInt /*aOpid*/, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: PublishReqCompleteL(")); +#endif + if ( !aStatus ) + { + iPublished = ETrue; + } + else + { + } + + CompletePrFwReq( aStatus ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::PublishTerminatedL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::PublishTerminatedL( TInt /*aOpid*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: PublishTerminatedL")); +#endif + // Notice: nothing to do now in Host APi. + iPublished = EFalse; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::WatcherReqCompleteL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::WatcherReqCompleteL( TInt /*aOpid*/, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: WatcherReqCompleteL")); +#endif + if ( !aStatus ) + { + iSubscribedOwn = ETrue; + } + else + { + } + CompletePrFwReq( aStatus ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::WatcherNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::WatcherNotificationL( MSimpleDocument& aDocument ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: WatcherNotificationL")); +#endif + + // Notice: Do not need to check the expiration here since WatcherTerminatedL + // is called then too. + + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); + MPresenceInfo* prInfo = iConnObs.PresenceObjectFactory().NewPresenceInfoLC(); // << prInfo + CSimplePluginData::NotifyToPrInfoL( iConnObs.PresenceObjectFactory(), aDocument, *prInfo ); + +#ifdef _DEBUG + // --------------------------------------------------------- + const MPersonPresenceInfo* pers_debug = prInfo->PersonPresence(); + const MPresenceInfoFieldCollection& coll_debug = pers_debug->Fields(); + TInt count_debug = coll_debug.FieldCount(); + PluginLogger::Log(_L("PluginPublisher: nbr of fields received =%d"), count_debug ); + // --------------------------------------------------------- +#endif + + // PrFw Host API callbacks + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: callback HandleSubscribedOwnPresenceL")); +#endif + publishHost.HandleSubscribedOwnPresenceL( prInfo ); + CleanupStack::Pop(); // >> prInfo + + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::WatcherListNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::WatcherListNotificationL( MSimplePresenceList& /*aList*/ ) + { + // Notice: not needed. + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::WatcherTerminatedL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::WatcherTerminatedL( + TInt /*aOpId*/, TInt /*aReason*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: WatcherTerminatedL")); +#endif + iSubscribedOwn = EFalse; + + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); + MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); + state->SetSubscriptionStateL( MXIMPDataSubscriptionState::ESubscriptionInactive ); + status->SetResultCode( KErrCompletion ); +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: callback SetOwnPresenceDataSubscriptionStateL")); +#endif + publishHost.SetOwnPresenceDataSubscriptionStateL( state, status ); + CleanupStack::Pop( 2 ); // status, state + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::CompletePrFwReq +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::CompletePrFwReq( TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: CompletePrFwReq status=%d"), aStatus ); +#endif + if ( iOperation != ENoOperation ) + { + iOperation = ENoOperation; + iConnObs.CompleteReq( iPrFwId, aStatus ); + iPrFwId = TXIMPRequestId(); + } + else + { + } + return; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoCancel +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoCancel( ) + { + iXdmUtils->Cancel(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::RunL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::RunL( ) + { + + TInt status = iStatus.Int(); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: RunL %d"), status ); +#endif + + if ( !status ) + { + if ( iOperation == ESubscribeOwn ) + { + iSimpleId = iWatcher->SubscribeL( + iConnSets.CurrentSipPresentity8(), + NULL, // aFilter <-> aPif + ETrue, EFalse ); + } + else + { + MakePublishReqL(); + } + } + else + { + CompletePrFwReq( status ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::RunError +// --------------------------------------------------------------------------- +// +TInt CSimplePluginPublisher::RunError( TInt aError ) + { + CompletePrFwReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::GetInterface +// --------------------------------------------------------------------------- +// +TAny* CSimplePluginPublisher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MProtocolPresencePublishing* myIf = this; + return myIf; + } + else if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::GetInterface +// --------------------------------------------------------------------------- +// +const TAny* CSimplePluginPublisher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MProtocolPresencePublishing* myIf = this; + return myIf; + } + else if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::GetInterfaceId +// --------------------------------------------------------------------------- +// +TInt32 CSimplePluginPublisher::GetInterfaceId() const + { + return MProtocolPresencePublishing::KInterfaceId; + } + + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::InitializeSimpleDocumentL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::InitializeSimpleDocumentL( ) + { + if ( iDocument ) + { + iDocument->Close(); + iDocument = NULL; + } + iDocument = TSimpleFactory::NewDocumentL(); + iDocument->AddNamespaceL( KSimplePDM, KSimpleNsPDM ); + iDocument->AddNamespaceL( KSimpleRPID, KSimpleNsRPID ); + iDocument->AddNamespaceL( KSimpleOP, KSimpleNsOP ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::AddSimpleDocumentPersL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::AddSimpleDocumentPersL( + const MPersonPresenceInfo* aInfo ) + { + CSimplePluginData::AddPrPersToSimpleDocumentL( + aInfo, *iDocument, iConnSets.CurrentSipPresentity8() ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::AddSimpleDocumentServiceL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::AddSimpleDocumentServiceL( + const MServicePresenceInfo& aInfo ) + { + if ( aInfo.Fields().FieldCount() > 0 || aInfo.ServiceType().Length() ) + { + // Notice: currently all the fields in the namespace are supported, + // but this ensures that if namespace is extended later, it is + // handled right way in the adaptation + User::Leave( KPresenceErrPresenceInfoFieldTypeNotSupported ); + } + else + { + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::AddSimpleDocumentDeviceL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::AddSimpleDocumentDeviceL( + const MDevicePresenceInfo& aInfo ) + { + if ( aInfo.Fields().FieldCount() > 0 || aInfo.DeviceName().Length() ) + { + // Notice: currently all the fields in the namespace are supported, + // but this ensures that if namespace is extended later, it is + // handled right way in the adaptation + User::Leave( KPresenceErrPresenceInfoFieldTypeNotSupported ); + } + else + { + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::MakePublishReqL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::MakePublishReqL( ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: -> MakePublishReqL")); +#endif + // Send the iDocument + if ( !iPublished ) + { + iSimpleId = iPublisher->StartPublishL( *iDocument, ETrue ); + } + else + { + iSimpleId = iPublisher->ModifyPublishL( *iDocument); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::StartXdmOperationL( + TXIMPRequestId aReqId ) + { + TRAPD( err, DoStartXdmOperationL( aReqId )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::DoStartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::DoStartXdmOperationL( + TXIMPRequestId aReqId ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + iPrFwId = aReqId; + if ( !iXdmUtils ) + { + iXdmUtils = iConnObs.XdmUtilsL(); + } + iXdmUtils->InitializeXdmL( iStatus ); + SetActive(); + } + + + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::WinfoNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::WinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + // ignore if not subscribed + if ( !iSubscribed ) + { + return; + } + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: WinfoNotificationL")); +#endif + + // Handle full-state and partial state notifications + // - If terminated -> remove from iWatcherList + // - If active -> add into iWatcherList if does not already exist + // WinfoTerminatedL handles termination of subscription. + + // Notice: CSimplePluginWinfo has completed the open request if needed before this. + + + /* example: + + // active/pending/terminated + + + + + sip:watcherA@example.com" + + */ + + RPointerArray elems; + CleanupClosePushL( elems ); // << elems + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + __ASSERT_DEBUG( count == 1, User::Leave( KErrCorrupt ) ); + + using namespace NSimplePlugin::NSimpleOma; + + const TDesC8* stateVal = aWinfo.AttrValue( KSimpleState8 ); + if ( stateVal && !stateVal->CompareF( KSimpleFull8 )) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: fullstate = TRUE") ); +#endif + // full winfo-list is received + DeleteWatchers(); + } + else + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: fullstate = FALSE") ); +#endif + } + + MSimpleElement* elem = elems[0]; + TPtrC8 p8 = elem->LocalName(); + err = p8.CompareF( KSimpleWatcherList8 ); + User::LeaveIfError( err ); + + err = elem->SimpleElementsL( elems ); + User::LeaveIfError( err ); + + // Collect the active watchers only. + UpdateActiveWatchersListL( elems ); + + CDesCArrayFlat* watchers = MakeCurrentWatcherListLC(); // << watchers + MXIMPObjectCollection *actives = + iConnObs.ObjectFactory().NewObjectCollectionLC(); // << actives + + // Create MPresenceWatcherInfo entities for + // all active watchers and add to actives. + TInt wCount = watchers->MdcaCount(); + for ( TInt j = 0; j < wCount; j++ ) + { + // create MPresenceWatcherInfo object + MPresenceWatcherInfo* wInfo = + iConnObs.PresenceObjectFactory().NewPresenceWatcherInfoLC(); // << wInfo + + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); // << identity +#ifdef _DEBUG + TBuf<200> debug_buffer; + debug_buffer = watchers->MdcaPoint( j ); + PluginLogger::Log(_L("PluginPublisher: add watcher into collection: %S"), &debug_buffer); +#endif + identity->SetIdentityL( watchers->MdcaPoint( j ) ); + wInfo->SetWatcherIdL( identity ); + CleanupStack::Pop( ); // >> identity + + wInfo->SetWatcherDisplayNameL( watchers->MdcaPoint( j ) ); + wInfo->SetWatcherTypeL( MPresenceWatcherInfo::EPresenceSubscriber ); + + actives->AddObjectL( wInfo ); + CleanupStack::Pop( ); // >> wInfo + } + + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: callback HandlePresenceWatcherListL")); +#endif + publishHost.HandlePresenceWatcherListL( actives ); + CleanupStack::Pop(); // >> actives + CleanupStack::PopAndDestroy( watchers ); // >> watchers + CleanupStack::PopAndDestroy( &elems ); // >> elems + + } + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::WinfoTerminatedL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::WinfoTerminatedL( TInt /*aReason*/ ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: WinfoTerminatedL") ); +#endif + + if ( !iSubscribed ) + { + return; + } + + // call SetPresenceWatcherListDataSubscriptionStateL + iSubscribed = EFalse; + + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); + MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); + state->SetSubscriptionStateL( MXIMPDataSubscriptionState::ESubscriptionInactive ); + state->SetDataStateL( MXIMPDataSubscriptionState::EDataUnavailable ); + status->SetResultCode( KErrCompletion ); +#ifdef _DEBUG + PluginLogger::Log(_L("PluginPublisher: callback SetPresenceWatcherListDataSubscriptionStateL")); +#endif + publishHost.SetPresenceWatcherListDataSubscriptionStateL( state, status ); + CleanupStack::Pop( 2 ); // status, state + } + + +// --------------------------------------------------------------------------- +// CSimplePluginPublisher::UpdateActiveWatchersListL +// --------------------------------------------------------------------------- +// +void CSimplePluginPublisher::UpdateActiveWatchersListL( + RPointerArray& aElems ) + { + // Collect active users. + using namespace NSimplePlugin::NSimpleOma; + + HBufC* nodeContent = NULL; + + TInt count = aElems.Count(); + + for ( TInt i = 0; i < count; i++ ) + { + MSimpleElement* elem = aElems[i]; + TPtrC8 p8( elem->LocalName()); + if (!( p8.CompareF( KSimpleWatcher8 ))) + { + const TDesC8* pp8 = elem->AttrValue( KSimpleStatus8 ); + // Active wathers here + if ( pp8 && !pp8->CompareF( KSimpleActive8 )) + { + + // save id since there may be multiple subscriptions + // from a single watcher SIP identity. + const TDesC8* pId8 = elem->AttrValue( KSimpleId8 ); + + // Build collection of grant requests + // Find the child node containing the SIP entity + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); // << nodeContent + + AddWatcherIfNotExistsL( pId8 ? *pId8 : KNullDesC8, nodeContent->Des() ); + + CleanupStack::PopAndDestroy( nodeContent ); // >> nodeContent + } + // Terminated wathers here, remove them from active list + else if ( pp8 && !pp8->CompareF( KSimpleTerminated8 )) + { + + const TDesC8* pId8 = elem->AttrValue( KSimpleId8 ); + + // Remove terminated from iWatcherList + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); // << nodeContent + + RemoveWatcherIfExistsL( pId8 ? *pId8 : KNullDesC8, nodeContent->Des() ); + + CleanupStack::PopAndDestroy( nodeContent ); // >> nodeContent + } + } + } + + } + + + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginsession.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "simplepluginsession.h" +#include "simpleplugindebugutils.h" +#include "msimplepluginconnectionobs.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginSession::CSimplePluginSession() +// --------------------------------------------------------------------------- +// +CSimplePluginSession::CSimplePluginSession( MSimplePluginConnectionObs& aObs) +: // CActive( CActive::EPriorityStandard ) , + iObs(aObs), iType( MSimplePluginConnectionObs::ENoReq ), iConnected( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::ConstructL() +// --------------------------------------------------------------------------- +// +void CSimplePluginSession::ConstructL( + const MXIMPServiceInfo& aService ) + { + // iIap is needed only + iIap = aService.IapId(); + + iConnection = TSimpleFactory::NewConnectionL( *this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::NewL() +// --------------------------------------------------------------------------- +// +CSimplePluginSession* CSimplePluginSession::NewL( + const MXIMPServiceInfo& aServiceInfo, + MSimplePluginConnectionObs& aObs ) + { + CSimplePluginSession* self = new( ELeave ) CSimplePluginSession( aObs ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceInfo ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::~CSimplePluginSession() +// --------------------------------------------------------------------------- +// +CSimplePluginSession::~CSimplePluginSession() + { + delete iUserId8; + delete iDomain; + if ( iConnection ) + { + iConnection->Close(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::SimpleConnection() +// --------------------------------------------------------------------------- +// +MSimpleConnection* CSimplePluginSession::SimpleConnection( ) + { + return iConnection; + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::XdmSettingsId() +// --------------------------------------------------------------------------- +// +TInt CSimplePluginSession::XdmSettingsId( ) + { + return iXdmSetting; + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::CurrentDomain() +// --------------------------------------------------------------------------- +// +TPtrC16 CSimplePluginSession::CurrentDomain( ) + { + return iDomain ? iDomain->Des() : TPtrC16(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::OpenSessionL() +// Notice: MXIMPServiceInfo::IapId supported only +// --------------------------------------------------------------------------- +// +void CSimplePluginSession::OpenSessionL() + { + TPresSettingsSet mySet; + +#ifdef _DEBUG + + PluginLogger::Log(_L("PluginSession: OpenSessionL") ); + + RArray setIds; + CDesCArray* carr = PresSettingsApi::GetAllSetsNamesLC( setIds ); + TInt myCount = setIds.Count(); + for (TInt i=0; i buffer2; buffer2.Copy(carr->MdcaPoint(i)); + PluginLogger::Log(_L("PluginSession: ID:%d = %S"), setIds[i], &buffer2); + } + setIds.Reset(); + CleanupStack::PopAndDestroy( carr ); +#endif + + iConnected = EFalse; + + User::LeaveIfError( PresSettingsApi::SettingsSetL( iIap, mySet )); + iXdmSetting = mySet.iXDMSetting; + + iDomain = mySet.iDomainSyntax.AllocL(); + + // SIP register + iOpId = iConnection->LoginL( iIap ); + iType = MSimplePluginConnectionObs::EOpenSess; + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::OpenSessionL() +// Notice: Multiple connections support to be done. +// --------------------------------------------------------------------------- +// +void CSimplePluginSession::OpenSessionL( TInt aSettingsId ) + { + iIap = aSettingsId; + OpenSessionL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::ConnectionStatusL() +// --------------------------------------------------------------------------- +// +void CSimplePluginSession::ConnectionStatusL( MSimpleConnection::TSimpleState aState ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginSession: ConnectionStatusL %d"), aState ); +#endif + + if ( (aState == MSimpleConnection::EInactive || aState == MSimpleConnection::EUnavailable ) && + iConnected ) + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginSession: ConnectionStatusL callback HandleConnectionTerminated") ); +#endif + iConnected = EFalse; + iObs.Host()->HandleConnectionTerminated( NULL ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::RequestCompleteL() +// --------------------------------------------------------------------------- +// +void CSimplePluginSession::RequestCompleteL( TInt /*aOpId*/, TInt aStatus ) + { + MSimplePluginConnectionObs::TReqType current = iType; + iType = MSimplePluginConnectionObs::ENoReq; + if ( !aStatus ) + { + iConnected = ETrue; + } + iObs.CompleteReq( current, aStatus ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginSession::CurrentSipPresentity() +// --------------------------------------------------------------------------- +// +TPtrC8 CSimplePluginSession::CurrentSipPresentity() + { + // Get from Simple engine + delete iUserId8; + iUserId8 = NULL; + TRAP_IGNORE( iUserId8 = iConnection->CurrentSIPIdentityL().AllocL() ); + return iUserId8 ? iUserId8->Des() : TPtrC8(); + } + + + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginvariation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginvariation.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,373 @@ +/* +* Copyright (c) 2007 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include +#include + +#include "simpleplugincommon.h" +#include "simplepluginvariation.h" +#include "presencefwsimpleadptprivatecrkeys.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::CSimplePluginVariation +// --------------------------------------------------------------------------- +// +CSimplePluginVariation::CSimplePluginVariation( ) +: iDefaultRuleAction(ERuleConfirm), iBlockRuleAction(ERulePoliteBlock) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::ConstructL( ) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginVariation* CSimplePluginVariation::NewL( ) + { + CSimplePluginVariation* self = + new( ELeave ) CSimplePluginVariation(); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::~CSimplePluginVariation +// --------------------------------------------------------------------------- +// +CSimplePluginVariation::~CSimplePluginVariation() + { + delete iGrantAllRuleName; + delete iGrantOwnRuleName; + delete iDefaultRuleName; + delete iBlockRuleName; + delete iRlsGroupUriTemplate; + delete iSharedXdmTop; + delete iGrantListName; + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitL() + { + // Read Central Repository settings + CRepository* repository = NULL; + + TBuf myBuffer; + + TRAP_IGNORE( repository = + CRepository::NewL( KCRUIDPresencefwSimpleadptVariation )); + + CleanupStack::PushL( repository ); + + // initialize strings + delete iGrantAllRuleName; + iGrantAllRuleName = NULL; + delete iGrantOwnRuleName; + iGrantOwnRuleName = NULL; + delete iDefaultRuleName; + iDefaultRuleName = NULL; + delete iBlockRuleName; + iBlockRuleName = NULL; + delete iRlsGroupUriTemplate; + iRlsGroupUriTemplate = NULL; + delete iSharedXdmTop; + iSharedXdmTop = NULL; + delete iGrantListName; + iGrantListName = NULL; + + // Read values from CenRep + InitGrantRuleNameL( repository ); + InitGrantOwnRuleNameL( repository ); + InitDefaultRuleNameL( repository ); + InitBlockRuleNameL( repository ); + InitDefaultRuleActionL( repository ); + InitBlockRuleActionL( repository ); + InitRlsGroupUriTemplateL( repository ); + InitSharedXdmTopL( repository ); + InitGrantListNameL( repository ); + + CleanupStack::PopAndDestroy( repository ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::GrantRuleName +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginVariation::GrantRuleName() + { + return iGrantAllRuleName ? iGrantAllRuleName->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::GrantOwnRuleName +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginVariation::GrantOwnRuleName() + { + return iGrantOwnRuleName ? iGrantOwnRuleName->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::DefaultRuleName +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginVariation::DefaultRuleName() + { + return iDefaultRuleName ? iDefaultRuleName->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::BlockRuleName +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginVariation::BlockRuleName() + { + return iBlockRuleName ? iBlockRuleName->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::DefaultRuleAction +// --------------------------------------------------------------------------- +// +CSimplePluginVariation::TSimplePluginAuthRule CSimplePluginVariation::DefaultRuleAction() + { + return iDefaultRuleAction; + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::BlockRuleAction +// --------------------------------------------------------------------------- +// +CSimplePluginVariation::TSimplePluginAuthRule CSimplePluginVariation::BlockRuleAction() + { + return iBlockRuleAction; + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::RlsGroupUriTemplate +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginVariation::RlsGroupUriTemplate() + { + return iRlsGroupUriTemplate ? iRlsGroupUriTemplate->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::SharedXdmTop +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginVariation::SharedXdmTop() + { + return iSharedXdmTop ? iSharedXdmTop->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::GrantListName +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginVariation::GrantListName() + { + return iGrantListName ? iGrantListName->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitGrantRuleNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitGrantRuleNameL( CRepository* aRepository ) + { + TBuf myBuffer; + + if ( !aRepository || aRepository->Get( KPrFwSimpleGrantAllRuleName, myBuffer )) + { + // Use deault value when not found in Central Repository + myBuffer = KSimpleXdmGrantRule; + } + iGrantAllRuleName = myBuffer.AllocL( ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitGrantOwnRuleNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitGrantOwnRuleNameL( CRepository* aRepository ) + { + TBuf myBuffer; + + if ( !aRepository || aRepository->Get( KPrFwSimpleGrantOwnRuleName, myBuffer )) + { + // Use deault value when not found in Central Repository + myBuffer = KSimpleXdmOwnGrantRule; + } + iGrantOwnRuleName = myBuffer.AllocL( ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitDefaultRuleNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitDefaultRuleNameL( CRepository* aRepository ) + { + TBuf myBuffer; + + if ( !aRepository || aRepository->Get( KPrFwSimpleDefaultRuleName, myBuffer )) + { + // Use deault value when not found in Central Repository + myBuffer = KSimpleXdmDefaultRule; + } + iDefaultRuleName = myBuffer.AllocL( ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitBlockRuleNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitBlockRuleNameL( CRepository* aRepository ) + { + TBuf myBuffer; + + if ( !aRepository || aRepository->Get( KPrFwSimpleBlockRuleName, myBuffer )) + { + // Use deault value when not found in Central Repository + myBuffer = KSimpleXdmBlockRule; + } + iBlockRuleName = myBuffer.AllocL( ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitDefaultRuleActionL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitDefaultRuleActionL( CRepository* aRepository ) + { + TBuf myBuffer; + + using namespace NSimplePlugin::NSimpleOma; + + iDefaultRuleAction = ERuleAllow; + if ( aRepository && !aRepository->Get( KPrFwSimpleDefaultRuleAction, myBuffer )) + { + if ( !myBuffer.CompareF( KSimpleBlock )) + { + iDefaultRuleAction = ERuleBlock; + } + else if ( !myBuffer.CompareF( KSimplePoliteBlock )) + { + iDefaultRuleAction = ERulePoliteBlock; + } + else if ( !myBuffer.CompareF( KSimpleConfirm )) + { + iDefaultRuleAction = ERuleConfirm; + } + else if ( !myBuffer.CompareF( KSimpleAllow )) + { + iDefaultRuleAction = ERuleAllow; + } + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitBlockRuleActionL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitBlockRuleActionL( CRepository* aRepository ) + { + TBuf myBuffer; + + using namespace NSimplePlugin::NSimpleOma; + + iBlockRuleAction = ERuleBlock; + if ( aRepository && !aRepository->Get( KPrFwSimpleBlockRuleAction, myBuffer )) + { + if ( myBuffer.CompareF( KSimpleBlock )) + { + iBlockRuleAction = ERulePoliteBlock; + } + else + { + // default value is used + } + } + else + { + // default value is used + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitRlsGroupUriTemplateL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitRlsGroupUriTemplateL( CRepository* aRepository ) + { + TBuf myBuffer; + + if ( !aRepository || aRepository->Get( KPrFwSimpleRlsGroupUriTemplate, myBuffer )) + { + myBuffer = KSimpleRlsGroupUriTemplate; + } + iRlsGroupUriTemplate = myBuffer.AllocL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitSharedXdmTopL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitSharedXdmTopL( CRepository* aRepository ) + { + TBuf myBuffer; + + if ( !aRepository || aRepository->Get( KPrFwSimpleSharedXdmTop, myBuffer )) + { + myBuffer = KSimpleOMABuddyList; + } + iSharedXdmTop = myBuffer.AllocL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginVariation::InitGrantListNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginVariation::InitGrantListNameL( CRepository* aRepository ) + { + TBuf myBuffer; + + if ( !aRepository || aRepository->Get( KPrFwSimpleGrantListName, myBuffer )) + { + myBuffer = KSimpleS60GrantedList; + } + iGrantListName = myBuffer.AllocL(); + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginwatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginwatcher.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,784 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "simpleplugincommon.h" +#include "simplepluginwatcher.h" +#include "simplepluginentitywatcher.h" +#include "simpleplugindebugutils.h" +#include "simpleutils.h" +#include "simplepluginxdmutils.h" +#include "simpleplugindata.h" +#include "simplepluginconnection.h" + + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::CSimplePluginWatcher +// --------------------------------------------------------------------------- +// +CSimplePluginWatcher::CSimplePluginWatcher( + MSimplePluginSettings& aConnSets, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ) +: CActive( CActive::EPriorityStandard ), + iConnSets( aConnSets), iConnObs(aObs), iConnection(aConn), iCompleted( ETrue ), + iOperation( EPluginUndef ), iXdmState( EPluginIdle ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::ConstructL( ) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginWatcher* CSimplePluginWatcher::NewL( + MSimplePluginSettings& aConnSets, + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ) + { + CSimplePluginWatcher* self = + new( ELeave ) CSimplePluginWatcher( aConnSets, aObs, aConn ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::~CSimplePluginWatcher +// --------------------------------------------------------------------------- +// +CSimplePluginWatcher::~CSimplePluginWatcher() + { + iWatchers.ResetAndDestroy(); + iWatchers.Close(); + delete iPresIdentity; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoSubscribePresentityPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& /*aPif*/, // notice: aPif filter not supported + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWatcher: DoSubscribePresentityPresenceL")); +#endif + + TRAPD( err, DoDoSubscribePresentityPresenceL(aPresentityId, aReqId )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoDoSubscribePresentityPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoDoSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { + iOperation = EPluginUndef; + iXdmState = EPluginIdle; + + SetPresIdentityL( aPresentityId ); + iPrFwId = aReqId; + iCompleted = EFalse; + + HBufC8* pres8 = NULL; + pres8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); + CleanupStack::PushL( pres8 ); // << pres8 + + CSimplePluginEntityWatcher* watcher = MatchWatcher2L( pres8->Des(), ETrue ); + watcher->StartSubscribeL( pres8->Des() ); + CleanupStack::PopAndDestroy( pres8 ); // >> pres8 + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoUpdatePresentityPresenceSubscriptionPifL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoUpdatePresentityPresenceSubscriptionPifL( + const MXIMPIdentity& /*aPresentityId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: DoUpdatePresentityPresenceSubscriptionPifL")); +#endif + + iOperation = EPluginUndef; + + // notice: aPif filter not supported + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoUnsubscribePresentityPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWatcher: DoUnsubscribePresentityPresenceL")); +#endif + + TRAPD( err, DoDoUnsubscribePresentityPresenceL( aPresentityId, aReqId ) ); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoDoUnsubscribePresentityPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoDoUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { + + iOperation = EPluginUndef; + iXdmState = EPluginIdle; + + SetPresIdentityL( aPresentityId ); + iPrFwId = aReqId; + iCompleted = EFalse; + + HBufC8* pres8 = NULL; + pres8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); + CleanupStack::PushL( pres8 ); // << pres8 + + CSimplePluginEntityWatcher* watcher = MatchWatcher2L( pres8->Des(), EFalse ); + if ( !watcher ) + { + User::Leave( KErrNotFound ); // Notice: error code + } + else + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWatcher: -> StopSubscribeL")); +#endif + watcher->StopSubscribeL(); + } + CleanupStack::PopAndDestroy( pres8 ); // >> pres8 + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoSubscribePresentityGroupMembersPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoSubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& /*aPif*/, // notice: aPif filter not supported + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: DoSubscribePresentityGroupMembersPresenceL")); +#endif + + iOperation = EPluginSubscribeGroup; + iXdmState = EPluginIdle; + + SetPresIdentityL( aGroupId ); + iPrFwId = aReqId; + iCompleted = EFalse; + + // Get Shared XDM lists first and create RLS service first + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoUpdatePresentityGroupMembersPresenceSubscriptionPifL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoUpdatePresentityGroupMembersPresenceSubscriptionPifL( + const MXIMPIdentity& /*aGroupId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: DoUpdatePresentityGroupMembersPresenceSubscriptionPifL")); +#endif + // notice: aPif filter not supported + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoUnsubscribePresentityGroupMembersPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoUnsubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ) + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: DoUnsubscribePresentityGroupMembersPresenceL")); +#endif + TRAPD( err, DoDoUnsubscribePresentityGroupMembersPresenceL( aGroupId, aReqId )); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoDoUnsubscribePresentityGroupMembersPresenceL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoDoUnsubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ) + { + iOperation = EPluginUnsubscribeGroup; + iXdmState = EPluginIdle; + + SetPresIdentityL( aGroupId ); + iPrFwId = aReqId; + iCompleted = EFalse; + + HBufC* buf16 = iXdmUtils->RlsServiceByResourceListLC( iPresIdentity->Des() ); // << buf16 + + HBufC8* buf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( buf16->Des() ); + CleanupStack::PushL( buf ); // << buf + + CSimplePluginEntityWatcher* watcher = MatchWatcher2L( buf->Des(), EFalse ); + + CleanupStack::PopAndDestroy( buf ); // >> buf + CleanupStack::PopAndDestroy( buf16 ); // >> buf16 + + if ( !watcher ) + { + User::Leave( KErrNotFound ); // Notice: error code + } + else + { + watcher->StopSubscribeL(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::GetInterface +// --------------------------------------------------------------------------- +// +TAny* CSimplePluginWatcher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MProtocolPresenceWatching* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::GetInterface +// --------------------------------------------------------------------------- +// +const TAny* CSimplePluginWatcher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MProtocolPresenceWatching* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::GetInterfaceId +// --------------------------------------------------------------------------- +// +TInt32 CSimplePluginWatcher::GetInterfaceId() const + { + return MProtocolPresenceWatching::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::MatchWatcher2L +// --------------------------------------------------------------------------- +// +CSimplePluginEntityWatcher* CSimplePluginWatcher::MatchWatcher2L( + const TDesC8& aPresentityid, TBool aCreate ) + { + TInt count = iWatchers.Count(); + for ( TInt i = 0; i < count; i++ ) + { + CSimplePluginEntityWatcher* temp = (iWatchers[i]); + if ( !temp->PresentityId().CompareF( aPresentityid )) + { + return temp; + } + } + + // If watcher was not found, crete it when wanted so. + if ( !aCreate ) + { + return NULL; + } + else + { + CSimplePluginEntityWatcher* watcher = CSimplePluginEntityWatcher::NewL( + iConnObs, iConnection, *this ); + iWatchers.AppendL( watcher ); + return watcher; + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DeleteWatcher +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DeleteWatcher( + const TDesC8& aPresentityid ) + { + +#ifdef _DEBUG + PluginLogger::Log( _L("PluginWatcher: DeleteWatcher **")); +#endif + + TInt count = iWatchers.Count(); + for ( TInt i = 0; i < count; i++ ) + { + CSimplePluginEntityWatcher* temp = (iWatchers[i]); + if ( !temp->PresentityId().CompareF( aPresentityid ) ) + { + iWatchers.Remove( i ); + iWatchers.GranularCompress(); + delete temp; + break; + } + else + { + } + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::GetEntitiesInListL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::GetEntitiesInListL( + const TDesC& aList, MXIMPObjectCollection& aMembers ) + { + __ASSERT_DEBUG( iXdmUtils, User::Leave( KErrCorrupt ) ); + + const TInt KMyGran = 10; + CPtrCArray* ids = new (ELeave) CPtrCArray( KMyGran ); + CleanupStack::PushL( ids ); // << ids + + CPtrCArray* dispNames = new (ELeave) CPtrCArray( KMyGran ); + CleanupStack::PushL( dispNames ); // << dispNames + + iXdmUtils->GetEntitiesInListL( aList, *ids, *dispNames ); + + CopyGroupMembersToCollectionL( *ids, *dispNames, aMembers ); + + CleanupStack::PopAndDestroy( dispNames ); + CleanupStack::PopAndDestroy( ids ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::StartWatchingRlsL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::StartWatchingRlsL() + { + HBufC* buf = iXdmUtils->RlsServiceByResourceListLC( iPresIdentity->Des() ); // << buf + + HBufC8* buf2 = NULL; + buf2 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( buf->Des() ); + CleanupStack::PushL( buf2 ); // << buf2 + + CSimplePluginEntityWatcher* watcher = MatchWatcher2L( buf2->Des(), ETrue ); + + watcher->StartSubscribeListL( buf2->Des() ); + + watcher->SetSimpleNameL( buf2->Des() ); + + CleanupStack::PopAndDestroy( buf2 ); // >> buf2 + CleanupStack::PopAndDestroy( buf ); // >> buf + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::SetPresIdentityL() +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::SetPresIdentityL( + const MXIMPIdentity& aPresentityId ) + { + delete iPresIdentity; + iPresIdentity = NULL; + iPresIdentity = aPresentityId.Identity().AllocL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::CompletePrFwReq +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::CompletePrFwReq( TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWatcher: CompletePrFwReq status=%d"), aStatus ); +#endif + iXdmState = EPluginIdle; + + if ( !iCompleted ) + { + iCompleted = ETrue; + // Convert error code when needed + if ( aStatus == KSimpleErrNotFound && + ( iOperation == EPluginSubscribeGroup || + iOperation == EPluginUnsubscribeGroup )) + { + aStatus = KPresenceErrUnknownPresentityGroup; + } + else if ( aStatus == KSimpleErrNotFound ) + { + aStatus = KPresenceErrUnknownPresentity; + } + else + { + } + iConnObs.CompleteReq( iPrFwId, aStatus ); + iPrFwId = TXIMPRequestId(); + iOperation = EPluginUndef; + } + else + { + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::CompleteWatcher +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::CompleteWatcher( TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWatcher: CompleteWatcher status=%d"), aStatus ); +#endif + // start to remove RLS service when needed. + if ( iOperation == EPluginUnsubscribeGroup && iXdmState == EPluginIdle ) + { + TRAPD( err, iXdmUtils->FetchRlsL( iStatus )); + if ( err ) + { + CompletePrFwReq( err ); + } + else + { + iXdmState = EPluginFetchRls; + SetActive(); + } + } + else + { + CompletePrFwReq( aStatus ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::StartXdmOperationL() + { + TRAPD( err, DoStartXdmOperationL() ); + if ( err ) + { + User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoStartXdmOperationL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoStartXdmOperationL() + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + if ( !iXdmUtils ) + { + iXdmUtils = iConnObs.XdmUtilsL(); + } + iXdmUtils->InitializeXdmsOnlyL( iStatus ); + + iXdmState = EPluginInitXdm; + + SetActive(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoCancel +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoCancel( ) + { + iXdmUtils->Cancel(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::RunL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::RunL( ) + { + + TInt status = iStatus.Int(); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWatcher: RunL %d"), status ); +#endif + if ( !status ) + { + // create RLS service first here + if ( iOperation == EPluginSubscribeGroup ) + { + DoRunForSubscriptionL(); + } + // remove RLS service when needed. + else if ( iOperation == EPluginUnsubscribeGroup ) + { + DoRunForUnsubscriptionL(); + } + else + { + // Idle state should not be completed. We should not come here + // because of PrFw core makes one request at a time. + } + } + else + { + CompletePrFwReq( status ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::RunError +// --------------------------------------------------------------------------- +// +TInt CSimplePluginWatcher::RunError( TInt aError ) + { + CompletePrFwReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::GetListContentL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::GetListContentL() + { + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresentityGroupsDataHost& dataHost = + iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost(); + + MXIMPObjectCollection* entities = + myFactory.NewObjectCollectionLC(); // << entities + GetEntitiesInListL( iPresIdentity->Des(), *entities ); + + // callback for data + MXIMPIdentity* id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( iPresIdentity->Des() ); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: callback HandlePresentityGroupContentL")); +#endif + dataHost.HandlePresentityGroupContentL( id, entities ); + CleanupStack::Pop(); // >> id + CleanupStack::Pop(); // >> entities + + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::CopyGroupMembersToCollectionL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::CopyGroupMembersToCollectionL( + CPtrCArray& aIds, CPtrCArray& aNames, MXIMPObjectCollection& aCollection) + { + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MPresenceObjectFactory& myPresenceFactory = iConnObs.PresenceObjectFactory(); + TInt count = aIds.Count(); + for ( TInt i=0; i < count; i++ ) + { + // create here MPresentityGroupMemberInfo + MPresentityGroupMemberInfo* info = myPresenceFactory.NewPresentityGroupMemberInfoLC(); // << info + MXIMPIdentity* id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( aIds[i] ); + info->SetGroupMemberIdL( id ); + CleanupStack::Pop(); // >> id + + info->SetGroupMemberDisplayNameL( aNames[i] ); + aCollection.AddObjectL( info ); + CleanupStack::Pop(); // >> info + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoRunForSubscriptionL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoRunForSubscriptionL( ) + { + if ( iXdmState == EPluginInitXdm ) + { + // get members of the list first + GetListContentL(); + + // Fetch RLS document first before modifying the data. + TRAPD( err, iXdmUtils->FetchRlsL( iStatus )); + if ( err ) + { + CompletePrFwReq( err ); + } + else + { + iXdmState = EPluginFetchRls; + SetActive(); + } + } + else if ( iXdmState == EPluginFetchRls ) + { + // Create RLS document service + iXdmUtils->AddRlsGroupL( iPresIdentity->Des() ); + iXdmState = EPluginAddGroupMember; + iXdmUtils->CommitRlsL( iStatus ); + SetActive(); + } + else + { + StartWatchingRlsL(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWatcher::DoRunForUnsubscriptionL +// --------------------------------------------------------------------------- +// +void CSimplePluginWatcher::DoRunForUnsubscriptionL( ) + { + TInt status = iStatus.Int(); + if ( iXdmState == EPluginIdle ) + { + TRAPD( err, iXdmUtils->FetchRlsL( iStatus )); + if ( err ) + { + CompletePrFwReq( err ); + } + else + { + iXdmState = EPluginFetchRls; + SetActive(); + } + } + else if ( iXdmState == EPluginFetchRls ) + { + TRAPD( err, iXdmUtils->RemoveRlsServiceByResourceListL( iPresIdentity->Des(), iStatus )); + if ( err ) + { + CompletePrFwReq( err ); + } + else + { + iXdmState = EPluginRemoveGroupMember; + SetActive(); + } + } + else + { + CompletePrFwReq( status ); + } + } + + + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginwinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginwinfo.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include + +#include +#include + +#include +#include + +#include "simpleplugincommon.h" +#include "simplepluginwinfo.h" +#include "simpleplugindebugutils.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::CSimplePluginWinfo() +// --------------------------------------------------------------------------- +// +CSimplePluginWinfo::CSimplePluginWinfo( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ) + : iConnObs(aObs), iConnection(aConn), iSubscribed(0), iWinfoCompleted(EFalse) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::ConstructL() +// --------------------------------------------------------------------------- +// +void CSimplePluginWinfo::ConstructL( ) + { + iWinfoWatcher = TSimpleFactory::NewWinfoWatcherL( iConnection, *this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::NewL() +// --------------------------------------------------------------------------- +// +CSimplePluginWinfo* CSimplePluginWinfo::NewL( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn ) + { + CSimplePluginWinfo* self = + new( ELeave ) CSimplePluginWinfo( aObs, aConn ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::~CSimplePluginWinfo() +// --------------------------------------------------------------------------- +// +CSimplePluginWinfo::~CSimplePluginWinfo() + { + if ( iWinfoWatcher ) + { + iWinfoWatcher->Close(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::SetHost() +// --------------------------------------------------------------------------- +// +void CSimplePluginWinfo::SetHost( + MXIMPProtocolConnectionHost* aHost ) + { + iHost = aHost; + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::SubscribeWinfoListL() +// --------------------------------------------------------------------------- +// +void CSimplePluginWinfo::SubscribeWinfoListL( TXIMPRequestId aReqId ) + { + iWinfoCompleted = EFalse; + iSubscribed++; + if ( iSubscribed == 1 ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWinfo: -> SubscribeWatcherListL") ); +#endif + iSimpleId = iWinfoWatcher->SubscribeWatcherListL( NULL ); + iSubscribed = ETrue; + iPrFwId = aReqId; + } + else + { + iSimpleId = 0; + iPrFwId = aReqId; + WinfoReqCompleteL( iSimpleId, KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::UnsubscribeWinfoListL() +// --------------------------------------------------------------------------- +// +void CSimplePluginWinfo::UnsubscribeWinfoListL( TXIMPRequestId aReqId ) + { + iWinfoCompleted = EFalse; + TInt orig = iSubscribed; + iSubscribed--; + if ( iSubscribed < 0 ) + { + iSubscribed = 0; + } + + if ( !iSubscribed && orig ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWinfo: -> UnsubscribeL") ); +#endif + iSubscribed++; + iSimpleId = iWinfoWatcher->UnsubscribeL(); + iSubscribed--; + iPrFwId = aReqId; + } + else + { + iSimpleId = 0; + iPrFwId = aReqId; + WinfoReqCompleteL( iSimpleId, KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::WinfoReqCompleteL() +// --------------------------------------------------------------------------- +// +void CSimplePluginWinfo::WinfoReqCompleteL( TInt /*aOpId*/, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWinfo: WinfoReqCompleteL status=%d"), aStatus ); +#endif + + if ( !iWinfoCompleted ) + { + iWinfoCompleted = ETrue; + iSimpleId = 0; + iConnObs.CompleteWinfoReq( iPrFwId, aStatus ); + // Do not wait MXIMPProtocolConnectionHostObserver callback, this + // class is ready to serve the next request now. + iPrFwId = TXIMPRequestId(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::WinfoTerminatedL() +// --------------------------------------------------------------------------- +// +void CSimplePluginWinfo::WinfoTerminatedL( + TInt aOpId, TInt aReason ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWinfo: WinfoTerminatedL opid=%d"), aOpId ); +#endif + + if ( iSimpleId == aOpId ) + { + iSimpleId = 0; + iConnObs.WinfoTerminatedL( aReason ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginWinfo::WinfoNotificationL() +// --------------------------------------------------------------------------- +// +void CSimplePluginWinfo::WinfoNotificationL( + MSimpleWinfo& aWinfo ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWinfo: WinfoNotificationL starts")); +#endif + + WinfoReqCompleteL( iSimpleId, KErrNone ); + iConnObs.WinfoNotification( aWinfo ); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWinfo: WinfoNotificationL ends")); +#endif + } + + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginxdmutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginxdmutils.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,2522 @@ +/* +* Copyright (c) 2006 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: SIMPLE Protocol implementation for Presence Framework +* +*/ + + + + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "simpleplugindebugutils.h" +#include "simpleplugincommon.h" +#include "simplepluginxdmutils.h" +#include "simpleplugindata.h" +#include "simplepluginvariation.h" +#include "msimplepluginsettings.h" + +// Test suite +#include "msimpleplugintestobs.h" + +// This is for debugging and local test mode oly +#include + +// URI prefixies +const TInt KMyLenPrefix = 4; +_LIT16( KMySip, "sip:" ); +_LIT16( KMyTel, "tel:" ); + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CSimplePluginXdmUtils +// --------------------------------------------------------------------------- +// +CSimplePluginXdmUtils::CSimplePluginXdmUtils( + MSimplePluginSettings& aConnSets, TInt aXmdId ) +: CActive( EPriorityStandard ), + iConnSets(aConnSets), iSettingsId(aXmdId), + iXdmState(EStateIdle), iOperation( ENoOperation), iTestObs( NULL ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::ConstructL( ) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginXdmUtils* CSimplePluginXdmUtils::NewL( + MSimplePluginSettings& aConnSets, + TInt aXmdId ) + { + CSimplePluginXdmUtils* self = + new( ELeave ) CSimplePluginXdmUtils( aConnSets, aXmdId ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: NewL this=%d"), (TInt)self); +#endif + + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::~CSimplePluginXdmUtils() +// --------------------------------------------------------------------------- +// +CSimplePluginXdmUtils::~CSimplePluginXdmUtils() + { + + Cancel(); + + CancelWrappers(); + + if ( iXdmDoc && iXdmEngine ) + { + TRAP_IGNORE( iXdmEngine->DeleteDocumentModelL( iXdmDoc )); + } + delete iRlsXdm; + delete iPresenceXdm; + delete iXdmEngine; + delete iAuxBuffer; + + delete iAuxBuffer2; + + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::InitializeXdmL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::InitializeXdmL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: InitializeXdmL") ); +#endif + + iOperation = EXdmInit; + iClientStatus = &aStatus; + + if ( !iXdmOk ) + { + GetXdmOMAListsL(); + iXdmState = EGetXdmOMALists; + *iClientStatus = KRequestPending; + } + else if ( !iPresXdmOk ) + { + GetXdmRulesL(); + *iClientStatus = KRequestPending; + } + else + { + // All is ok + *iClientStatus = KRequestPending; + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::InitializeXdmsOnlyL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::InitializeXdmsOnlyL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: InitializeXdmsOnlyL") ); +#endif + + iOperation = EXdmInitXdmsOnly; + iClientStatus = &aStatus; + + if ( !iXdmOk ) + { + GetXdmOMAListsL(); + iXdmState = EGetXdmOMAListsOnly; + *iClientStatus = KRequestPending; + } + else + { + // All is ok + *iClientStatus = KRequestPending; + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RunL() +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RunL( ) + { + TPluginXdmState origState = iXdmState; + iXdmState = EStateIdle; + TInt myStatus = iStatus.Int(); + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RunL %d"), myStatus ); +#endif + + if ( iTestObs ) + { + // Test suite + iTestObs->TestCallbackInRunL( + myStatus, origState, iOperation, KNullDesC ); + } + +#ifdef FAKE_XDM_OK +#ifdef _DEBUG + // -191 = KErrHostUnreach in_sock.h + if ( myStatus == KErrTimedOut || myStatus == KXcapErrorNetworkNotAvailabe || -191 ) + { + PluginLogger::Log(_L("PluginXdmUtils : RunL FAKE_XDM_OK resets error code %d"), myStatus ); + myStatus = 0; + } +#endif +#endif + + DoXdmRunL( origState, myStatus ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoXdmRunL() +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoXdmRunL( TPluginXdmState aOrigState, TInt aStatus ) + { + + switch ( aOrigState ) + { + case EGetXdmOMALists: + case EGetXdmOMAListsOnly: + { + // no OMA resource-list, let's start to create it. + if ( CreateXdmOMAListsIfNeededL() ) + { + iXdmState = aOrigState == EGetXdmOMALists ? ECreateXdmOMALists : ECreateXdmOMAListsOnly; + } + else + { + iXdmOk = ETrue; + if ( !iPresXdmOk && aOrigState == EGetXdmOMALists ) + { + GetXdmRulesL(); + } + else + { + CompleteClientReq( KErrNone ); + } + } + } + break; + case ECreateXdmOMALists: + { + if ( aStatus ) + { + CompleteClientReq( aStatus ); + } + else + { + iXdmOk = ETrue; + GetXdmRulesL(); + } + } + break; + case ECreateXdmOMAListsOnly: + { + if ( !aStatus ) + { + iXdmOk = ETrue; + } + CompleteClientReq( aStatus ); + } + break; + default: + // complete reqular request + CompleteClientReq( aStatus ); + break; + }; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CancelWrappers() +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::CancelWrappers( ) + { + iOperation = EXdmCancel; + + // Cancel M-class interface methods that calls callback method. + if ( iXdmState == EGetRlsServices || + iXdmState == EUpdateRlsServices || + iXdmState == EReUpdateRlsServices ) + { + iXdmState = ECancelDocument; +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: -> iRlsXdm->Cancel")); +#endif + // Better call Cancel() instead of CancelUpdateL(). + // It works and is easier to implement. Otherwise we should have here + // SetActive(); iStatus=KRequestPending; User::WaitForRequest(iStatus) + // and we should have implemented HandleRLSUpdateCancelL that completes + // own iStatus. + iRlsXdm->Cancel(); + } + else if ( iXdmState == EGetXdmRules || + iXdmState == EUpdateXdmRules ) + { + iXdmState = ECancelDocument; +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: -> iPresenceXdm->Cancel")); +#endif + iPresenceXdm->Cancel(); + } + else + { + } + } +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoCancel() +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoCancel( ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: DoCancel")); +#endif + iOperation = EXdmCancel; + + if ( iXdmState == EGetXdmOMALists || iXdmState == ECreateXdmOMALists || + iXdmState == EGetXdmOMAListsOnly || iXdmState == ECreateXdmOMAListsOnly || + iXdmState == EUpdateXdmOMAList ) + { + // Cancel a request made to XDM Engine. + iXdmState = ECancelDocument; +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: iXdmEngine->CancelUpdate")); +#endif + iXdmEngine->CancelUpdate( iXdmDoc ); + CompleteClientReq( KErrCancel ); + } + else + { + // Cancel a request where we have completed our own iStatus. + // Very rare posibility that this happens when GetXdmOMALists is not ready. + // It's very hard to make it happen in test suite. + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RunError +// --------------------------------------------------------------------------- +// +TInt CSimplePluginXdmUtils::RunError( TInt aError ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RunError")); +#endif + // complete the open request + CompleteClientReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::FetchRlsL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::FetchRlsL( + TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: FetchRlsL")); +#endif + _LIT( KMyOper, "FetchRlsL"); + + iClientStatus = &aStatus; + + iOperation = EXdmRlsFetch; + + if ( !iRlsXdm ) + { + iRlsXdm = CRLSXDM::NewL( iSettingsId ); + } + + if ( iTestObs ) + { + // Test suite + iTestObs->TestCallbackAsynchL( + KErrNone, iXdmState, iOperation, KMyOper ); + } + + // The following returns in MRLSPresXDMAsyncHandler callback +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: -> iRlsXdm->UpdateAllFromServerL")); +#endif + User::LeaveIfError( iRlsXdm->UpdateAllFromServerL( this )); + + *iClientStatus = KRequestPending; + + iXdmState = EGetRlsServices; + + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::AddRlsGroupL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::AddRlsGroupL( + const TDesC& aName ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: AddRlsGroupL")); +#endif + iOperation = EXdmRlsAdd; + + HBufC16* buf = CreateRlsDocumentUri16LC( + aName, iConnSets.CurrentSipPresentity(), iConnSets.CurrentDomain() ); + + // KErrAlreadyExists + TInt errx = iRlsXdm->AddServiceURIL( buf->Des() ); + if ( errx && errx != KErrAlreadyExists ) + { + User::Leave( errx ); + } + User::LeaveIfError( iRlsXdm->SwitchToServiceURIL( buf->Des() )); + + HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri ); + CleanupStack::PushL( xcapUri ); // << xcapUri + + HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aName ); + CleanupStack::PushL( listUri ); // << listUri + + TInt err = iRlsXdm->AddElementL( KPresResourceList, + listUri->Des(), aName ); + if ( err && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + + // Save aName for RLS Service URI negoriation handling (HTTP error 409). + // Notice: We assume that only one AddRlsGroupL is called between CommitRlsL methods. + + delete iAuxBuffer; + iAuxBuffer = NULL; + iAuxBuffer = aName.AllocL(); + + CleanupStack::PopAndDestroy( listUri ); // >> listUri + CleanupStack::PopAndDestroy( xcapUri ); // >> xcapUri + CleanupStack::PopAndDestroy( buf ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RemoveRlsGroupL +// Use RemoveRlsServiceByResourceListL when possible +// +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RemoveRlsGroupL( + const TDesC& aName ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RemoveRlsGroupL")); +#endif + + iOperation = EXdmRlsRemove; + + HBufC16* buf = CreateRlsDocumentUri16LC( + aName, iConnSets.CurrentSipPresentity(), iConnSets.CurrentDomain() ); + + User::LeaveIfError( iRlsXdm->RemoveServiceURIL( buf->Des())); + CleanupStack::PopAndDestroy( buf ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::AddEntityToGrantedL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::AddEntityToGrantedL( + const TDesC& aUri, TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: AddEntityToGrantedL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmAddUserToGroup; + + DoAddUserToListL( iConnSets.Variation().GrantListName(), aUri ); + + // send to the server and start wait a response + UpdateXdmsL(); + iXdmState = EUpdateXdmOMAList; + + *iClientStatus = KRequestPending; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::AddEntityToBlockedL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::AddEntityToBlockedL( + const TDesC& aUri, TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: AddEntityToBlockedL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmAddUserToGroup; + DoAddUserToListL( KSimpleOMABlockedList, aUri ); + + // send to the server and start wait a response + UpdateXdmsL(); + iXdmState = EUpdateXdmOMAList; + + *iClientStatus = KRequestPending; + } + +// ---------------------------------------------------- +// CSimplePluginXdmUtils::DoAddUserToListL +// ---------------------------------------------------- +// +void CSimplePluginXdmUtils::DoAddUserToListL( + const TDesC& aList, const TDesC& aUri ) + { + + using namespace NSimplePlugin::NSimpleOma; + + RPointerArray lists; + CleanupClosePushL( lists ); // << lists + + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aList ); + + if ( foundNode ) + { + if ( foundNode->IsEmptyNode() ) + { + foundNode->SetEmptyNode( EFalse ); + } + + CXdmDocumentNode* newNode = foundNode->CreateChileNodeL( KSimpleEntry ); + CXdmNodeAttribute* attributeEntryUri = newNode->CreateAttributeL( KSimpleUri ); + attributeEntryUri->SetAttributeValueL( aUri ); + iXdmDoc->AppendL( newNode ); + } + else + { + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy( &lists ); // >> lists + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RemoveEntityFromGrantedL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RemoveEntityFromGrantedL( + const TDesC& aUri, TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RemoveEntityFromGrantedL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmRemoveUserFromGroup; + DoRemoveUserFromListL( iConnSets.Variation().GrantListName(), aUri ); + + // send to the server and start wait a response + UpdateXdmsL(); + iXdmState = EUpdateXdmOMAList; + + *iClientStatus = KRequestPending; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RemoveEntityFromBlockedL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RemoveEntityFromBlockedL( + const TDesC& aUri, TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RemoveEntityFromBlockedL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmRemoveUserFromGroup; + DoRemoveUserFromListL( KSimpleOMABlockedList, aUri ); + + // send to the server and start wait a response + UpdateXdmsL(); + iXdmState = EUpdateXdmOMAList; + + *iClientStatus = KRequestPending; + } + +// ---------------------------------------------------- +// CSimplePluginXdmUtils::DoRemoveUserFromListL +// ---------------------------------------------------- +// +void CSimplePluginXdmUtils::DoRemoveUserFromListL( + const TDesC& aList, const TDesC& aUri ) + { + CXdmNodeAttribute* attr = NULL; + + using namespace NSimplePlugin::NSimpleOma; + + RPointerArray lists; + CleanupClosePushL( lists ); + + RPointerArray nodes; + CleanupClosePushL( nodes ); + + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aList ); + if ( foundNode ) + { + User::LeaveIfError( foundNode->Find( KSimpleEntry, nodes )); + TInt nodeCount = nodes.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + CXdmDocumentNode* currNode = nodes[i]; + attr = ( currNode )->Attribute( KSimpleUri ); + if ( attr && !attr->AttributeValue().CompareF( aUri )) + { + // This is the user we are looking for deletion. + iXdmDoc->DeleteDataL( currNode ); + break; + } + } + } + else + { + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + CleanupStack::PopAndDestroy( &lists ); // >>> lists + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RemoveGroupFromGrantedL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RemoveGroupFromGrantedL( + const TDesC& aName, TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RemoveGroupFromGrantedL")); +#endif + iClientStatus = &aStatus; + + HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri ); + CleanupStack::PushL( xcapUri ); // << xcapUri + + HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aName ); + CleanupStack::PushL( listUri ); // << listUri + + DoRemoveListFromGrantRuleL( listUri->Des() ); + + CleanupStack::PopAndDestroy( listUri ); + CleanupStack::PopAndDestroy( xcapUri ); + + iOperation = EXdmWithdrawGroup; + } + +// ---------------------------------------------------- +// CSimplePluginXdmUtils::DoRemoveListFromGrantRuleL +// ---------------------------------------------------- +// +void CSimplePluginXdmUtils::DoRemoveListFromGrantRuleL( + const TDesC& aListUri ) + { + TPresCondMisc misc; + misc.Init( iPresenceXdm ); + + if ( !misc.DeleteExternalListL( iConnSets.Variation().GrantRuleName(), aListUri )) + { + // update document in the server only if there was a modification. + UpdateXdmRulesL(); + *iClientStatus = KRequestPending; + } + else + { + // Complete without server operation + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::AddGroupToGrantedL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::AddGroupToGrantedL( + const TDesC& aName, TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: AddGroupToGrantedL")); +#endif + + iClientStatus = &aStatus; + + if ( !DoesUserListExistsL( aName ) ) + { + User::Leave( KErrNotFound ); + } + + HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri ); + CleanupStack::PushL( xcapUri ); // << xcapUri + + HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aName ); + CleanupStack::PushL( listUri ); // << listUri + + iOperation = EXdmGrantGroup; + + DoAddListIntoGrantRuleL( listUri->Des() ); + + CleanupStack::PopAndDestroy( listUri ); // >> listUri + CleanupStack::PopAndDestroy( xcapUri ); // >> xcapUri + + *iClientStatus = KRequestPending; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoAddListIntoGrantRuleL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoAddListIntoGrantRuleL( + const TDesC& aListUri) + { + TPresCondMisc misc; + misc.Init( iPresenceXdm ); + + User::LeaveIfError( misc.AddExternListL( iConnSets.Variation().GrantRuleName(), aListUri )); + + UpdateXdmRulesL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::GrantForEveryoneL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::GrantForEveryoneL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: GrantForEveryoneL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmGrantForAll; + DoGrantForAllL(); + + *iClientStatus = KRequestPending; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::WithdrawFromEveryoneL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::WithdrawFromEveryoneL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: WithdrawFromEveryoneL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmWithdrawFromAll; + DoWithdrawFromAllL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::SetReactiveAuthL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::SetReactiveAuthL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: SetReactiveAuthL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmSetReactiveAuth; + DoSetReactiveAuthL(); + + *iClientStatus = KRequestPending; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::SetProactiveAuthL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::SetProactiveAuthL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: SetProactiveAuthL")); +#endif + iClientStatus = &aStatus; + + iOperation = EXdmSetProactiveAuth; + DoSetProactiveAuthL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::SubscribeBlockListL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::SubscribeBlockListL( CPtrCArray& aMembers ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: SubscribeBlockListL")); +#endif + iOperation = EXdmGetBlockedList; + DoGetListMembersL( KSimpleOMABlockedList, aMembers ); + // The cient will call a method GetEntitiesL that access those arrays + // Those member arrays will be emptied after the call. + in destrcutor. + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::UnsubscribeBlockListL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::UnsubscribeBlockListL( TRequestStatus& aStatus ) + { + iClientStatus = &aStatus; + *iClientStatus = KRequestPending; + // Subscription state is always terminated + CompleteClientReq( KErrNone ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoGetListMembersL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoGetListMembersL( + const TDesC& aList, CPtrCArray& aMembers ) + { + using namespace NSimplePlugin::NSimpleOma; + + aMembers.Reset(); + + RPointerArray nodes; + CleanupClosePushL( nodes ); + + CXdmNodeAttribute* attr = NULL; + + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( buddylist, aList ); + if ( foundNode ) + { + nodes.Reset(); + // Do not leave if there is nobody blocked + TRAP_IGNORE( foundNode->Find( KSimpleEntry, nodes )); + TInt nodeCount = nodes.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + attr = (nodes[i])->Attribute( KSimpleUri ); + if ( attr ) + { + aMembers.AppendL( attr->AttributeValue() ); + } + } + } + + CleanupStack::PopAndDestroy( &nodes ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::HandleRLSUpdateDocumentL +// RLS Callback +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::HandleRLSUpdateDocumentL( TInt aErrorCode ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: HandleRLSUpdateDocumentL %d"), aErrorCode); +#ifdef FAKE_XDM_OK + + if ( aErrorCode == KErrTimedOut || aErrorCode == KXcapErrorNetworkNotAvailabe || aErrorCode == KErrHostUnreach ) + { + PluginLogger::Log( + _L("PluginXdm : HandleRLSUpdateDocumentL FAKE_XDM_OK resets error code %d"), + aErrorCode ); + aErrorCode = 0; + } +#endif +#endif + + TRAPD( err, DoHandleRLSUpdateDocumentL( aErrorCode )); + if ( err ) + { + // Complete with ok or error the last initial opreration + CompleteClientReq( err ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoHandleRLSUpdateDocumentL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoHandleRLSUpdateDocumentL( TInt aErrorCode ) + { + + if ( iTestObs ) + { + // Test suite + iTestObs->TestCallbackInRunL( aErrorCode, iXdmState, iOperation, KNullDesC ); + } + + // Resend 409 failed request only if the server sent a preposal for the right URI + // and only once, so that this do not remain in endless loop between server and + // a client. + if ( aErrorCode == KXcapErrorHttpConflict && + iOperation == EXdmRlsAdd && + iRlsXdm->NegotiatedServiceUri().Length() ) + { + RlsServiceUriNegotiationL(); + return; + } + + switch ( iXdmState ) + { + case EGetRlsServices: + if ( aErrorCode == KXcapErrorHttpNotFound || aErrorCode == KErrNotFound ) + { + aErrorCode = KErrNone; + } + break; + default: + break; + } + + CompleteClientReq( aErrorCode ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::HandleRLSUpdateCancelL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::HandleRLSUpdateCancelL( TInt /*aErrorCode*/ ) + { + // notice: not needed + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::HandleRLSDeleteAllEmptyListsL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::HandleRLSDeleteAllEmptyListsL( TInt /*aErrorCode*/ ) + { + // Notice: Not needed + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::HandlePresUpdateDocumentL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::HandlePresUpdateDocumentL( TInt aErrorCode ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: HandlePresUpdateDocumentL %d"), aErrorCode); +#ifdef FAKE_XDM_OK + if ( aErrorCode == KErrTimedOut || aErrorCode == KXcapErrorNetworkNotAvailabe || aErrorCode == KErrHostUnreach ) + { + PluginLogger::Log(_L("PluginXdm : HandlePresUpdateDocumentL FAKE_XDM_OK resets error code %d"), aErrorCode ); + aErrorCode = 0; + } +#endif +#endif + + TRAPD( err, DoHandlePresUpdateDocumentL( aErrorCode )); + if ( err ) + { + // Complete with ok or error the last initial opreration + CompleteClientReq( err ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoHandlePresUpdateDocumentL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoHandlePresUpdateDocumentL( TInt aErrorCode ) + { + + if ( iTestObs ) + { + // Test suite + iTestObs->TestCallbackInRunL( + aErrorCode, iXdmState, iOperation, KNullDesC ); + } + + if ( iXdmState == EGetXdmRules ) + { + iXdmState = EStateIdle; + if ( aErrorCode && aErrorCode != KXcapErrorHttpNotFound && + aErrorCode != KErrNotFound ) + { + User::Leave( aErrorCode ); + } + // check and create the rules when needed + MakeInitialXdmsDocumentL(); + } + else + { + iPresXdmOk = ETrue; + // Complete with ok or error the last initial opreration + CompleteClientReq( aErrorCode ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::HandlePresUpdateCancelL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::HandlePresUpdateCancelL( TInt /*aErrorCode*/ ) + { + // notice: not needed + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::GetXdmOMAListsL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::GetXdmOMAListsL() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: GetXdmOMAListsL")); +#endif + if ( !iXdmEngine ) + { + // get data from a network if not done so yet + CXdmProtocolInfo* info = CXdmProtocolInfo::NewL( iSettingsId ); + CleanupStack::PushL( info ); + // Notice: we don't use cache for XDM + info->SetCacheUsage( EFalse ); + iXdmEngine = CXdmEngine::NewL( *info ); + CleanupStack::PopAndDestroy( info ); + } + if ( !iXdmOk ) + { + using namespace NSimplePlugin::NSimpleOma; + if ( iXdmDoc ) + { + // Clean a document from s previous failed case. + iXdmEngine->DeleteDocumentModelL( iXdmDoc ); + iXdmDoc = NULL; + } + + // Get data from network + iXdmDoc = iXdmEngine->CreateDocumentModelL( KSimpleIndex, EXdmSharedXdm ); + iXdmDoc->FetchDataL(); + UpdateXdmsL(); + iXdmState = EGetXdmOMALists; + } + else + { + // Document already exists, no need to search from a server + iStatus = KRequestPending; + TRequestStatus* s= &iStatus; + User::RequestComplete( s, KErrNone ); + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CreateXdmOMAListsIfNeededL +// Notice: separate CheckXdmOMAListsL method (validity) +// --------------------------------------------------------------------------- +// +TBool CSimplePluginXdmUtils::CreateXdmOMAListsIfNeededL( ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: CreateXdmOMAListsIfNeededL")); +#endif + + using namespace NSimplePlugin::NSimpleOma; + + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + if ( !root ) + { + root = iXdmDoc->CreateRootL(); + root->SetNameL( KSimpleResourceLists ); + } + + if ( root->IsEmptyNode() ) + { + root->SetEmptyNode( EFalse ); + } + + TInt isCreated = 0; + + // add all the list nodes + + isCreated += CreateXdmOMAListIfNeededL( root, iConnSets.Variation().SharedXdmTop() ); + + isCreated += CreateXdmOMAListIfNeededL( root, KSimpleOMABlockedList ); + + // grant-list name is variable issue + isCreated += CreateXdmOMAListIfNeededL( root, iConnSets.Variation().GrantListName() ); + + if ( !isCreated ) + { + return EFalse; + } + + // send to the server and start wait a response + iXdmDoc->AppendL( root ); + UpdateXdmsL(); + iXdmState = ECreateXdmOMALists; + + return ETrue; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CreateXdmOMAListIfNeededL +// --------------------------------------------------------------------------- +// +TBool CSimplePluginXdmUtils::CreateXdmOMAListIfNeededL( + CXdmDocumentNode* aRoot, const TDesC& aName ) + { + TBool isCreated( EFalse ); + CXdmDocumentNode* nodeFound = SearchListUnderParentL( aRoot, aName ); + if ( !nodeFound ) + { + CreateResourceListL( aRoot, aName ); + isCreated = ETrue; + } + return isCreated; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CreateResourceListL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::CreateResourceListL( + CXdmDocumentNode* aParent, const TDesC& aName ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: CreateResourceListL")); +#endif + using namespace NSimplePlugin::NSimpleOma; + CXdmDocumentNode* child1 = aParent->CreateChileNodeL( KSimpleList ); + CXdmNodeAttribute* name = child1->CreateAttributeL( KSimpleName ); + name->SetAttributeValueL( aName ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::SearchListUnderParentL +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CSimplePluginXdmUtils::SearchListUnderParentL( + CXdmDocumentNode* aParent, const TDesC& aName ) + { + using namespace NSimplePlugin::NSimpleOma; + + if ( !aParent ) + { + return NULL; + } + + RPointerArray resultArray; + RPointerArray attributeArray; + + CleanupClosePushL( resultArray ); // <<< resultArray + CleanupClosePushL( attributeArray ); // <<< attributeArray + + SXdmAttribute16 attr; + attr.iName.Set( KSimpleName ); + attr.iValue.Set( aName ); + attributeArray.AppendL( &attr ); + + CXdmDocumentNode* currNode = NULL; + + aParent->Find( KSimpleList, resultArray, attributeArray ); + + TInt count = resultArray.Count(); + for ( TInt i=0; i < count; i++ ) + { + currNode = resultArray[i]; + CXdmDocumentNode* parent = currNode->Parent(); + if ( parent == aParent ) + { + break; + } + currNode = NULL; + } + + CleanupStack::PopAndDestroy( &attributeArray); // >>> attributeArray + CleanupStack::PopAndDestroy( &resultArray ); // >>> resultArray + + return currNode; + + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::MakeRlsUriL +// --------------------------------------------------------------------------- +// +HBufC* CSimplePluginXdmUtils::MakeRlsUriL( + const TDesC& aXcapUri, const TDesC& aListName ) + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: MakeRlsUriL")); +#endif + + /* example: + "http://XCAP.EXAMPLE.COM/resource-lists/users/ + sip:USER@EXAMPLE.COM/index/~~/resource-lists/list%5b@name=%22oma_blockedlist%22%5d" + */ + + using namespace NSimplePlugin::NSimpleRls; + + TInt myLen = totalSize; + myLen += aXcapUri.Length(); + myLen += aListName.Length(); + myLen += iConnSets.CurrentSipPresentity().Length(); + HBufC* myBuf = HBufC::NewL( myLen ); + + myBuf->Des().Append( KOne ); + myBuf->Des().Append( aXcapUri); + myBuf->Des().Append( KThree ); + myBuf->Des().Append( iConnSets.CurrentSipPresentity() ); + myBuf->Des().Append( KFive ); + myBuf->Des().Append( aListName ); + myBuf->Des().Append( KSeven ); + + return myBuf; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::MakeRlsBuddyUriL +// --------------------------------------------------------------------------- +// +HBufC* CSimplePluginXdmUtils::MakeRlsBuddyUriL( + const TDesC& aXcapUri, const TDesC& aListName ) + { + /* example: + "http://XCAP.EXAMPLE.COM/resource-lists/users/ + sip:USER@EXAMPLE.COM/~~/resource-lists/list%5b@name=%22oma_buddylist%22%5d/ + list5d@name=%22my_friends%22%5d" + */ + + using namespace NSimplePlugin::NSimpleRlsBuddy; + + TInt myLen = totalSize + aXcapUri.Length() + aListName.Length() + + iConnSets.CurrentSipPresentity().Length(); + + HBufC* myBuf = HBufC::NewL( myLen ); + TPtr temp = myBuf->Des(); + + temp.Append( KOne ); + temp.Append( aXcapUri); + temp.Append( KThree ); + temp.Append( iConnSets.CurrentSipPresentity() ); + temp.Append( KFive ); + temp.Append( aListName ); + temp.Append( KSeven ); + + return myBuf; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::GetXdmRulesL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::GetXdmRulesL() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: GetXdmRulesL")); +#endif + if ( !iPresenceXdm ) + { + // get data from a network if not done so yet + iPresenceXdm = CPresenceXDM::NewL( iSettingsId ); + } + User::LeaveIfError( iPresenceXdm->UpdateAllFromServerL( this )); + iXdmState = EGetXdmRules; + // The is completed in a callback method, not in RunL + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::MakeInitialXdmsDocumentL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::MakeInitialXdmsDocumentL() + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: MakeInitialXdmsDocumentL")); +#endif + TBuf myRuleId; + + TBool ruleAdded( EFalse ); + + TPresenceActionXDM action; + action.Init( iPresenceXdm ); + + TPresenceTransformXDM transform; + transform.Init( iPresenceXdm ); + + TPresCondMisc misc; + misc.Init( iPresenceXdm ); + + TPresCondIdentityOne one; + one.Init( iPresenceXdm ); + + HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri ); + CleanupStack::PushL( xcapUri ); + HBufC* listUri = MakeRlsUriL( xcapUri->Des(), KSimpleOMABlockedList ); + CleanupStack::PushL( listUri ); + + // Default rule + // get the rule id, use run-time variation + myRuleId = iConnSets.Variation().DefaultRuleName(); // KSimpleXdmDefaultRule; + if ( myRuleId.Length() && !iPresenceXdm->IsRuleExist( myRuleId )) + { + // If default rule does not exist in the variation then do not create it. + MakeDefaultRuleL( myRuleId, action, transform, misc ); + ruleAdded = ETrue; + } + + // Block rule + // get the rule id, use run-time variation + myRuleId = iConnSets.Variation().BlockRuleName(); + // ruleCreate = EFalse; + + if ( !iPresenceXdm->IsRuleExist( myRuleId )) + { + iPresenceXdm->CreateNewRuleL( myRuleId ); + ruleAdded = ETrue; + + // use run-time variation for rule action + CSimplePluginVariation::TSimplePluginAuthRule authRule = + iConnSets.Variation().BlockRuleAction(); + + User::LeaveIfError( misc.AddExternListL( myRuleId, listUri->Des() )); + + switch (authRule) + { + case CSimplePluginVariation::ERulePoliteBlock: + User::LeaveIfError( action.AddOrReplaceActionL(myRuleId, KPresPoliteBlock )); + break; + default: + User::LeaveIfError( action.AddOrReplaceActionL(myRuleId, KPresBlock )); + }; + } + + // Grant rule + // get the rule id, use run-time variation + myRuleId = iConnSets.Variation().GrantRuleName(); + if ( !iPresenceXdm->IsRuleExist( myRuleId )) + { + iPresenceXdm->CreateNewRuleL( myRuleId ); + ruleAdded = ETrue; + CleanupStack::PopAndDestroy( listUri ); + listUri = NULL; + listUri = MakeRlsUriL( xcapUri->Des(), iConnSets.Variation().GrantListName() ); + CleanupStack::PushL( listUri ); + User::LeaveIfError( misc.AddExternListL( myRuleId, listUri->Des() )); + User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvideAllAttributes )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvidePersons )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvideDevices )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvideServices )); + } + + // Grant own subscription rule + // get the rule id, use run-time variation + myRuleId = iConnSets.Variation().GrantOwnRuleName(); + if ( !iPresenceXdm->IsRuleExist( myRuleId )) + { + iPresenceXdm->CreateNewRuleL( myRuleId ); + ruleAdded = ETrue; + User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvideAllAttributes )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvidePersons )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvideDevices )); + User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL( + myRuleId, KPresProvideServices )); + // own sip identity + User::LeaveIfError( one.AddIdentityL( + myRuleId, iConnSets.CurrentSipPresentity() )); + } + + // Update into server only when needed. + if ( ruleAdded ) + { + UpdateXdmRulesL(); + } + else + { + iXdmState = EUpdateXdmRules; + iPresXdmOk = ETrue; + // Complete with ok or error the last initial opreration + CompleteClientReq( KErrNone ); + } + + CleanupStack::PopAndDestroy( listUri ); + CleanupStack::PopAndDestroy( xcapUri ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoGrantForAllL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoGrantForAllL() + { + const TInt KMyPresRuleIDLength(30); + TBuf myRuleId; + + TInt err( KErrNone ); + + TPresenceActionXDM action; + action.Init( iPresenceXdm ); + + // Default rule id is searched + myRuleId = iConnSets.Variation().DefaultRuleName(); // KSimpleXdmDefaultRule; + TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) ); + if ( err && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + + // modify the rule in the server. + User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow )); + UpdateXdmRulesL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoWithdrawFromAllL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoWithdrawFromAllL() + { + const TInt KMyPresRuleIDLength(30); + TBuf myRuleId; + + /* pseudo code: + if current rule is ALLOW then { BLOCK } + otherwise no action. + */ + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginWatcher: DoWithdrawFromAllL TEST COVERS 3")); +#endif + + + TInt err( KErrNone ); + + TPresenceActionXDM action; + action.Init( iPresenceXdm ); + + // Default rule id is searched + myRuleId = iConnSets.Variation().DefaultRuleName(); + TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) ); + if ( err && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + + TBuf myActionBuf; + err = action.GetActionL( myRuleId, myActionBuf); + + if ( !myActionBuf.CompareF( KPresAllow ) ) + { + User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresPoliteBlock )); + UpdateXdmRulesL(); + *iClientStatus = KRequestPending; + } + else + { + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoSetReactiveAuthL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoSetReactiveAuthL() + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: DoSetReactiveAuthL TEST COVERS 5")); +#endif + + // Default rule is modified to CONFIRM + + const TInt KMyPresRuleIDLength(30); + TBuf myRuleId; + + TInt err( KErrNone ); + + TPresenceActionXDM action; + action.Init( iPresenceXdm ); + + // Default rule id is searched + myRuleId = iConnSets.Variation().DefaultRuleName(); + TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) ); + if ( err && err != KErrAlreadyExists ) + { +#ifdef _DEBUG + PluginLogger::Log( _L("PluginWatcher: TEST COVERS 5b")); +#endif + User::Leave( err ); + } + + // modify the rule in the server. + User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresConfirm )); + UpdateXdmRulesL(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoSetProactiveAuthL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DoSetProactiveAuthL() + { +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: DoSetProactiveAuthL TEST COVERS 6")); +#endif + + /* pseudo code: + if current rule is CONFIRM then { ALLOW } + otherwise no action. + */ + + const TInt KMyPresRuleIDLength(30); + TBuf myRuleId; + + TInt err( KErrNone ); + + TPresenceActionXDM action; + action.Init( iPresenceXdm ); + + // Default rule id is searched + myRuleId = iConnSets.Variation().DefaultRuleName(); + TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) ); + if ( err && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + + // modify the rule in the server. + TBuf myActionBuf; + err = action.GetActionL( myRuleId, myActionBuf); + + if ( !myActionBuf.CompareF( KPresConfirm ) ) + { + User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow )); + UpdateXdmRulesL(); + *iClientStatus = KRequestPending; + } + else + { + CompleteClientReq( KErrNone ); + } + + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CreateEntityGroupL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::CreateEntityGroupL( + const TDesC& aName, const TDesC& aDisplayName ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: CreateEntityGroupL")); +#endif + iOperation = EXdmCreateGroup; + DoCreateEntityGroupL( aName, aDisplayName ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DeleteEntityGroupL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::DeleteEntityGroupL( + const TDesC& aName) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: DeleteEntityGroupL")); +#endif + + iOperation = EXdmDeleteGroup; + DoDeleteEntityGroupL( aName ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::AddPresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::AddPresentityGroupMemberL( + const TDesC& aGroup, + const TDesC& aUser, + const TDesC& aDispName, + TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: AddPresentityGroupMemberL")); +#endif + + iClientStatus = &aStatus; + + iOperation = EXdmAddUserToGroup; + DoAddUserToUserListL( aGroup, aUser, aDispName ); + + // send to the server and start wait a response + UpdateXdmsL(); + + *iClientStatus = KRequestPending; + iXdmState = EUpdateXdmOMAList; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RemovePresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RemovePresentityGroupMemberL( + const TDesC& aGroup, + const TDesC& aUser, + TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RemovePresentityGroupMemberL")); +#endif + + iClientStatus = &aStatus; + + iOperation = EXdmAddUserToGroup; + DoRemoveUserFromUserListL( aGroup, aUser ); + + // send to the server and start wait a response + UpdateXdmsL(); + + *iClientStatus = KRequestPending; + iXdmState = EUpdateXdmOMAList; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::GetUserListsL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::GetUserListsL( + CDesCArrayFlat& aIds, CDesCArrayFlat& aDispNames ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: GetUserListsL")); +#endif + using namespace NSimplePlugin::NSimpleOma; + + aIds.Reset(); + aDispNames.Reset(); + + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + CXdmDocumentNode* entry = NULL; + + RPointerArray lists; + CleanupClosePushL( lists ); // <<< lists + + RPointerArray lists2; + CleanupClosePushL( lists2 ); // <<< lists2 + + buddylist->Find( KSimpleList, lists ); + TInt count = lists.Count(); + for ( TInt i=0; i < count; i++ ) + { + // Name + entry = lists[i]; + CXdmNodeAttribute* attr = entry->Attribute( KSimpleName ); + if ( attr ) + { + aIds.AppendL( attr->AttributeValue() ); +#ifdef _DEBUG + TBuf<200> debug_buffer; + debug_buffer = attr->AttributeValue(); + PluginLogger::Log(_L("PluginXdm: add group id into aIds : %S"), &debug_buffer ); +#endif + } + else + { + continue; + } + // Display name + TInt err = entry->Find( KSimpleDisplayName, lists2 ); + // Notice: assume there is only one display-name. + // Always when an item is added into aIds we have to add an itmem also into aDispNames. + if ( !err ) + { + CXdmDocumentNode* disName = lists2[0]; + if ( !disName->IsEmptyNode() ) + { + // Convert Display-Name to Unicode. + HBufC16* uri16 = NULL; + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( disName->LeafNodeContent() ); + CleanupStack::PushL( uri16 ); // << uri16 + aDispNames.AppendL( uri16->Des() ); + CleanupStack::PopAndDestroy( uri16 ); // >> uri16 + } + else + { + aDispNames.AppendL( KNullDesC ); + } + } + else + { + aDispNames.AppendL( KNullDesC ); + } + } + + CleanupStack::PopAndDestroy( &lists2 ); // >>> lists2 + CleanupStack::PopAndDestroy( &lists ); // >>> lists + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::GetEntitiesInListL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::GetEntitiesInListL( + const TDesC& aList, CPtrCArray& aIds, CPtrCArray& aDispNames ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: GetEntitiesInListL")); +#endif + + using namespace NSimplePlugin::NSimpleOma; + + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + CXdmDocumentNode* target = DoGetUserListL( aList, buddylist ); + + // make a collection of MPresentityGroupMemberInfo + RPointerArray entries; + CleanupClosePushL(entries); // <<< entries + + RPointerArray nodes; + CleanupClosePushL(nodes); // <<< nodes + + target->Find( KSimpleEntry, entries ); + TInt count = entries.Count(); + for ( TInt i=0; i < count; i++ ) + { + // ID + CXdmDocumentNode* entry = entries[i]; + CXdmNodeAttribute* attr = entry->Attribute( KSimpleUri ); + if ( attr ) + { + aIds.AppendL( attr->AttributeValue() ); +#ifdef _DEBUG + TBuf<200> debug_buffer; + debug_buffer = attr->AttributeValue(); + PluginLogger::Log(_L("PluginXdm: add member into collection : %S"), &debug_buffer ); +#endif + } + else + { + continue; + } + + // Display name + TInt err = entry->Find( KSimpleDisplayName, nodes ); + // Notice: assume there is only one display-name + if ( !err ) + { + CXdmDocumentNode* disName = nodes[0]; + HBufC16* uri16 = NULL; + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( disName->LeafNodeContent() ); + CleanupStack::PushL( uri16 ); // << uri16 + aDispNames.AppendL( uri16->Des() ); + CleanupStack::PopAndDestroy( uri16 ); // >> uri16 + } + else + { + aDispNames.AppendL( TPtrC() ); + } + } + + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + CleanupStack::PopAndDestroy( &entries ); // >>> entries + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CommitXdmL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::CommitXdmL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: CommitXdmL")); +#endif + iClientStatus = &aStatus; + + UpdateXdmsL(); + + *iClientStatus = KRequestPending; + iXdmState = EUpdateXdmOMAList; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CommitRlsL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::CommitRlsL( TRequestStatus& aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: CommitRlsL")); +#endif + iClientStatus = &aStatus; + *iClientStatus = KRequestPending; + UpdateRlsL(); + + iXdmState = EUpdateRlsServices; + } + +// ---------------------------------------------------- +// CSimplePluginXdmUtils::DoCreateEntityGroupL +// ---------------------------------------------------- +// +void CSimplePluginXdmUtils::DoCreateEntityGroupL( + const TDesC& aList, const TDesC& aDisName ) + { + using namespace NSimplePlugin::NSimpleOma; + + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + if ( buddylist->IsEmptyNode() ) + { + buddylist->SetEmptyNode( EFalse ); + } + + CXdmDocumentNode* foundNode = SearchListUnderParentL( + buddylist, aDisName ); + + if ( foundNode ) + { + User::Leave( KErrAlreadyExists ); + } + + CXdmDocumentNode* newNode = buddylist->CreateChileNodeL( KSimpleList ); + CXdmNodeAttribute* attributeName = newNode->CreateAttributeL( KSimpleName ); + attributeName->SetAttributeValueL( aList ); + + // Display name + CXdmDocumentNode* displayName = newNode->CreateChileNodeL( KSimpleDisplayName ); + displayName->SetLeafNode( ETrue ); + displayName->SetLeafNodeContentL( aDisName ); + + iXdmDoc->AppendL( newNode ); + } + +// ---------------------------------------------------- +// CSimplePluginXdmUtils::DoDeleteEntityGroupL +// ---------------------------------------------------- +// +void CSimplePluginXdmUtils::DoDeleteEntityGroupL( + const TDesC& aList ) + { + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + CXdmDocumentNode* target = DoGetUserListL( aList, buddylist ); + iXdmDoc->DeleteDataL( target ); + // iXdmEngine is asked to be updated to a server by CSimplePlugingGroups later. + } + +// ---------------------------------------------------- +// CSimplePluginXdmUtils::DoAddUserToUserListL +// ---------------------------------------------------- +// +void CSimplePluginXdmUtils::DoAddUserToUserListL( + const TDesC& aList, const TDesC& aUser, const TDesC& aDisName ) + { + RPointerArray resultArray; + RPointerArray attributeArray; + + CleanupClosePushL( resultArray ); // << resultArray + CleanupClosePushL( attributeArray ); // << attributeArray + + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + CXdmDocumentNode* target = DoGetUserListL( aList, buddylist ); + + if ( target->IsEmptyNode() ) + { + target->SetEmptyNode( EFalse ); + } + + using namespace NSimplePlugin::NSimpleOma; + + SXdmAttribute16 attr; + attr.iName.Set( KSimpleUri ); + attr.iValue.Set( aUser ); + attributeArray.AppendL( &attr ); + + // If member already exists then leave + target->Find( KSimpleEntry, resultArray, attributeArray ); + if ( resultArray.Count() > 0 ) + { + User::Leave( KErrAlreadyExists ); + } + + CXdmDocumentNode* newNode = target->CreateChileNodeL( KSimpleEntry ); + CXdmNodeAttribute* attributeName = newNode->CreateAttributeL( KSimpleUri ); + attributeName->SetAttributeValueL( aUser ); + + // Display name + CXdmDocumentNode* displayName = newNode->CreateChileNodeL( KSimpleDisplayName ); + displayName->SetLeafNode( ETrue ); + displayName->SetLeafNodeContentL( aDisName ); + + iXdmDoc->AppendL( newNode ); + + CleanupStack::PopAndDestroy( &attributeArray ); + CleanupStack::PopAndDestroy( &resultArray ); + } + +// ---------------------------------------------------- +// CSimplePluginXdmUtils::DoRemoveUserFromUserListL +// ---------------------------------------------------- +// +void CSimplePluginXdmUtils::DoRemoveUserFromUserListL( + const TDesC& aList, const TDesC& aUri ) + { + CXdmNodeAttribute* attr = NULL; + TBool myFound( EFalse ); + + using namespace NSimplePlugin::NSimpleOma; + + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + CXdmDocumentNode* target = DoGetUserListL( aList, buddylist ); + + RPointerArray entries; + CleanupClosePushL( entries ); // <<< entries + + User::LeaveIfError( target->Find( KSimpleEntry, entries )); + TInt nodeCount = entries.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + CXdmDocumentNode* currNode = entries[i]; + attr = currNode->Attribute( KSimpleUri ); + if ( attr && !attr->AttributeValue().CompareF( aUri )) + { + // This is the user we are looking for deletion. + iXdmDoc->DeleteDataL( currNode ); + myFound = ETrue; + break; + } + } + + CleanupStack::PopAndDestroy( &entries ); // >>> entries + + if ( !myFound ) + { + // If the member is not found then leave + User::Leave( KErrNotFound ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoGetBuddyListL +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CSimplePluginXdmUtils::DoGetBuddyListL() + { + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + CXdmDocumentNode* ret = SearchListUnderParentL( root, iConnSets.Variation().SharedXdmTop() ); + if ( !ret ) + { + User::Leave( KErrNotFound ); + } + return ret; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoGetUserListL +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CSimplePluginXdmUtils::DoGetUserListL( + const TDesC& aList, CXdmDocumentNode* aBuddyList ) + { + CXdmDocumentNode* listNode = NULL; + CXdmNodeAttribute* attr = NULL; + TBool found( EFalse ); + + using namespace NSimplePlugin::NSimpleOma; + + RPointerArray lists; + CleanupClosePushL( lists ); + + User::LeaveIfError( aBuddyList->Find( KSimpleList, lists )); + TInt count = lists.Count(); + for ( TInt i=0; i < count; i++ ) + { + listNode = lists[i]; + attr = listNode->Attribute( KSimpleName ); + if ( attr && !attr->AttributeValue().CompareF( aList )) + { + // List is found + found = ETrue; + break; + } + } + if ( !found ) + { + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy( &lists ); + return listNode; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::UpdateXdmRulesL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::UpdateXdmRulesL() + { + _LIT( KMyOper, "UpdateXdmRulesL"); + if ( iTestObs ) + { + // Test suite + iTestObs->TestCallbackAsynchL( + KErrNone, iXdmState, iOperation, KMyOper ); + } + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: UpdateXdmRulesL -> iPresenceXdm->UpdateToServerL")); +#endif + User::LeaveIfError( iPresenceXdm->UpdateToServerL( this )); + iXdmState = EUpdateXdmRules; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::UpdateXdmsL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::UpdateXdmsL() + { + _LIT( KMyOper, "UpdateXdmsL"); + if ( iTestObs ) + { + // Test suite + iTestObs->TestCallbackAsynchL( + KErrNone, iXdmState, iOperation, KMyOper ); + } + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: UpdateXdmsL -> iXdmEngine->UpdateToServerL")); +#endif + iXdmEngine->UpdateL( iXdmDoc, iStatus ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::UpdateRlsL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::UpdateRlsL() + { + _LIT( KMyOper, "UpdateRlsL"); + + if ( iTestObs ) + { + // Test suite + iTestObs->TestCallbackAsynchL( + KErrNone, iXdmState, iOperation, KMyOper ); + } +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: -> iRlsXdm->UpdateToServerL")); +#endif + User::LeaveIfError( iRlsXdm->UpdateToServerL( this )); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::SetTestObserver +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::SetTestObserver( MSimplePluginTestObs* aObs ) + { + iTestObs = aObs; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CreateRlsDocumentUri16LC +// --------------------------------------------------------------------------- +// +HBufC16* CSimplePluginXdmUtils::CreateRlsDocumentUri16LC( + const TDesC16& aGroup, + const TDesC16& aPresentityUri, + const TDesC16& aDomain ) + { + + TPtrC uriTemplate( iConnSets.Variation().RlsGroupUriTemplate() ); + + // Calculate URI length + TInt uriSize = uriTemplate.Length() + KMyLenPrefix; + if ( uriTemplate.Find( KSimpleGroupTag ) != KErrNotFound ) + { + TPtrC p8( KSimpleGroupTag ); + uriSize = uriSize - p8.Length() + aGroup.Length(); + } + if ( uriTemplate.Find( KSimpleUserTag ) != KErrNotFound ) + { + TPtrC p8( KSimpleUserTag ); + uriSize = uriSize - p8.Length() + aPresentityUri.Length(); + } + if ( uriTemplate.Find( KSimpleDomainTag ) != KErrNotFound ) + { + TPtrC p8( KSimpleDomainTag ); + uriSize = uriSize - p8.Length() + aDomain.Length(); + } + + // allocate new buffer for URI + // Temporarily the buffer might need more space then the final URI length + // (when tags are longer than the real values replacing them). + if ( uriSize < uriTemplate.Length() + KMyLenPrefix ) + { + uriSize = uriTemplate.Length() + KMyLenPrefix + + aGroup.Length() + aPresentityUri.Length() + aDomain.Length(); + } + HBufC16* buf = HBufC16::NewLC( uriSize ); + TPtr16 pBuf(buf->Des()); + + // Append "sip:" prefix + pBuf.Append( KMySip ); + + // Append template + pBuf.Append( uriTemplate ); + + // Replace tags in URI template with the real values. + ReplaceGroupTag( buf, aGroup ); + ReplaceDomainTag( buf, aDomain ); + ReplaceUserTag( buf, aPresentityUri ); + + return buf; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoesUserListExistsL +// --------------------------------------------------------------------------- +// +TBool CSimplePluginXdmUtils::DoesUserListExistsL( const TDesC& aName ) + { + CXdmDocumentNode* buddylist = DoGetBuddyListL(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( buddylist, aName ); + return foundNode ? ETrue : EFalse; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::AuxBuffer +// --------------------------------------------------------------------------- +// +TPtrC CSimplePluginXdmUtils::AuxBuffer( ) + { + return iAuxBuffer ? iAuxBuffer->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RemoveRlsServiceByResourceListL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RemoveRlsServiceByResourceListL( + const TDesC& aGroup, TRequestStatus& aStatus ) + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: RemoveRlsServiceByResourceListL")); +#endif + + TBool ret( EFalse ); + + iOperation = EXdmRlsRemove; + iClientStatus = &aStatus; + + // convert a Group into resource-list value + HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri ); + CleanupStack::PushL( xcapUri ); // << xcapUri + + HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aGroup ); + CleanupStack::PushL( listUri ); // << listUri + + // remove service-uri in the rls-services document + ret = DoRemoveRlsServiceByResourceListL( listUri->Des() ); + + CleanupStack::PopAndDestroy( listUri ); + CleanupStack::PopAndDestroy( xcapUri ); + + *iClientStatus = KRequestPending; + + if ( ret ) + { + // Update RLS document when needed. + UpdateRlsL(); + iXdmState = EUpdateRlsServices; + } + else + { + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoRemoveRlsServiceByResourceListL +// --------------------------------------------------------------------------- +// +TBool CSimplePluginXdmUtils::DoRemoveRlsServiceByResourceListL( const TDesC& aResourceList ) + { + TBool ret( EFalse ); + + CDesC16Array* myArray = new (ELeave) CDesC16ArraySeg(10); + CleanupStack::PushL( myArray ); + + CDesC16Array* myValues = new (ELeave) CDesC16ArraySeg(10); + CleanupStack::PushL( myValues ); + + iRlsXdm->GetServiceUrisL( *myArray ); + TInt myCount = myArray->MdcaCount(); + + for ( TInt i=0; i < myCount && !ret; i++ ) + { + iRlsXdm->SwitchToServiceURIL( myArray->MdcaPoint( i )); + iRlsXdm->GetElementsL( KPresResourceList, *myValues); + TInt myValuesCount = myValues->MdcaCount(); + for ( TInt j=0; j < myValuesCount; j++ ) + { + if ( !myValues->MdcaPoint( i ).Compare( aResourceList ) ) + { + // delete service with the URI + iRlsXdm->RemoveServiceURIL( myArray->MdcaPoint( i ) ); + ret = ETrue; + break; + } + } + } + + CleanupStack::PopAndDestroy( myValues ); + CleanupStack::PopAndDestroy( myArray ); + + return ret; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RlsServiceByResourceListL +// --------------------------------------------------------------------------- +// +HBufC* CSimplePluginXdmUtils::RlsServiceByResourceListLC( + const TDesC& aGroup ) + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: :RlsServiceByResourceListLC")); +#endif + + HBufC* myRet = NULL; + + // convert a Group into resource-list value + HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri ); + CleanupStack::PushL( xcapUri ); // << xcapUri + + HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aGroup ); + CleanupStack::PushL( listUri ); // << listUri + + // remove service-uri in the rls-services document + myRet = DoGetRlsServiceByResourceListL( listUri->Des() ); + + CleanupStack::PopAndDestroy( listUri ); + CleanupStack::PopAndDestroy( xcapUri ); + + CleanupStack::PushL( myRet ); + + return myRet; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::DoGetRlsServiceByResourceListL +// --------------------------------------------------------------------------- +// +HBufC* CSimplePluginXdmUtils::DoGetRlsServiceByResourceListL( const TDesC& aResourceList ) + { + + HBufC* ret = NULL; + + CDesC16Array* myArray = new (ELeave) CDesC16ArraySeg(10); + CleanupStack::PushL( myArray ); + + CDesC16Array* myValues = new (ELeave) CDesC16ArraySeg(10); + CleanupStack::PushL( myValues ); + + iRlsXdm->GetServiceUrisL( *myArray ); + TInt myCount = myArray->MdcaCount(); + + for ( TInt i=0; i < myCount && !ret; i++ ) + { + iRlsXdm->SwitchToServiceURIL( myArray->MdcaPoint( i )); + iRlsXdm->GetElementsL( KPresResourceList, *myValues); + TInt myValuesCount = myValues->MdcaCount(); + for ( TInt j=0; j < myValuesCount; j++ ) + { + if ( !myValues->MdcaPoint( i ).Compare( aResourceList ) ) + { + // save the URI + ret = myArray->MdcaPoint( i ).AllocL(); + break; + } + } + } + + CleanupStack::PopAndDestroy( myValues ); + CleanupStack::PopAndDestroy( myArray ); + + if ( !ret ) + { + User::Leave( KErrNotFound ); + } + return ret; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::RlsServiceUriNegotiationL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::RlsServiceUriNegotiationL() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: :RlsServiceUriNegotiationL")); +#endif + // Handle RLS Service URI negotiation + + HBufC16* buf = CreateRlsDocumentUri16LC( + AuxBuffer(), iConnSets.CurrentSipPresentity(), iConnSets.CurrentDomain() ); + + TRAP_IGNORE( iRlsXdm->RemoveServiceURIL( buf->Des() )); + + TInt errx = iRlsXdm->AddServiceURIL( iRlsXdm->NegotiatedServiceUri() ); + if ( errx && errx != KErrAlreadyExists ) + { + User::Leave( errx ); + } + User::LeaveIfError( iRlsXdm->SwitchToServiceURIL( iRlsXdm->NegotiatedServiceUri() )); + + HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri ); + CleanupStack::PushL( xcapUri ); // << xcapUri + + HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), AuxBuffer() ); + CleanupStack::PushL( listUri ); // << listUri + + TInt err = iRlsXdm->AddElementL( KPresResourceList, listUri->Des(), AuxBuffer() ); + if ( err && err != KErrAlreadyExists ) + { + User::Leave( err ); + } + + CleanupStack::PopAndDestroy( listUri ); // >> listUri + CleanupStack::PopAndDestroy( xcapUri ); // >> xcapUri + CleanupStack::PopAndDestroy( buf ); + + delete iAuxBuffer; + iAuxBuffer = NULL; + iAuxBuffer = iRlsXdm->NegotiatedServiceUri().AllocL(); + + UpdateRlsL(); + iXdmState = EReUpdateRlsServices; + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::MakeDefaultRuleL +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::MakeDefaultRuleL( + TDes& aRuleId, + TPresenceActionXDM& aAction, + TPresenceTransformXDM& aTransform, + TPresCondMisc& aMisc ) + { + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginXdm: :MakeDefaultRuleL")); +#endif + + iPresenceXdm->CreateNewRuleL( aRuleId ); + User::LeaveIfError( aMisc.AddOtherIdentityL(aRuleId) ); + + // use run-time variation for rule action + CSimplePluginVariation::TSimplePluginAuthRule authRule = + iConnSets.Variation().DefaultRuleAction(); + + switch (authRule) + { + case CSimplePluginVariation::ERuleConfirm: + User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresConfirm )); + break; + case CSimplePluginVariation::ERulePoliteBlock: + User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresPoliteBlock )); + break; + case CSimplePluginVariation::ERuleBlock: + User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresBlock )); + break; + default: + User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresAllow )); + }; + User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL( + aRuleId, KPresProvideAllAttributes )); + User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL( + aRuleId, KPresProvidePersons )); + User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL( + aRuleId, KPresProvideDevices )); + User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL( + aRuleId, KPresProvideServices )); + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::ReplaceGroupTag +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::ReplaceGroupTag( HBufC16* aBuf, const TDesC16& aGroup ) + { + // Replace group if found + TPtr pBuf( aBuf->Des() ); + TInt pos = pBuf.Find( KSimpleGroupTag ); + if ( pos != KErrNotFound ) + { + TPtrC p8( KSimpleGroupTag ); + pBuf.Replace( pos, p8.Length(), aGroup ); + } + else + { + // No tag + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::ReplaceDomainTag +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::ReplaceDomainTag( HBufC16* aBuf, const TDesC16& aDomain ) + { + // Replace domain if found + TPtr pBuf( aBuf->Des() ); + TInt pos = pBuf.Find( KSimpleDomainTag ); + if ( pos != KErrNotFound ) + { + // remove leading "@" + TPtrC p8( KSimpleDomainTag ); + if ( aDomain[0] == '@') + { + pBuf.Replace( pos, p8.Length(), aDomain.Mid( 1 )); + } + else + { + pBuf.Replace( pos, p8.Length(), aDomain ); + } + } + else + { + // No tag + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::ReplaceUserTag +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::ReplaceUserTag( + HBufC16* aBuf, const TDesC16& aPresentityUri ) + { + TPtr pBuf( aBuf->Des() ); + TInt presentityUriLen = aPresentityUri.Length(); + // Replace user if found + TInt pos = pBuf.Find( KSimpleUserTag ); + if ( pos != KErrNotFound ) + { + TPtrC p8( KSimpleUserTag ); + + // Remove leading "sip:" or "tel:" prefix and strip off domain part from aPresentityUri. + TInt domainPos = presentityUriLen; + TInt userIdPos = 0; + + if ( !aPresentityUri.Left( KMyLenPrefix ).CompareF( KMySip ) || + !aPresentityUri.Left( KMyLenPrefix ).CompareF( KMyTel )) + { + userIdPos = KMyLenPrefix; + } + + for ( TInt i = userIdPos; i < presentityUriLen; i++ ) + { + if ( aPresentityUri[i] == '@' ) + { + domainPos = i; + break; + } + } + + TPtrC userId( aPresentityUri.Mid( userIdPos, domainPos - userIdPos )); + pBuf.Replace( pos, p8.Length(), userId ); + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginXdmUtils::CompleteClientReq +// --------------------------------------------------------------------------- +// +void CSimplePluginXdmUtils::CompleteClientReq( TInt aStatus ) + { + iXdmState = EStateIdle; + iOperation = ENoOperation; + TRequestStatus* s = iClientStatus; + User::RequestComplete( s, aStatus ); + } + + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/data/10281ef0.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/data/10281ef0.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 1028 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: ECOM plugin resource file for Presence Settings UI GS plugin. +* +*/ + + + +#include +#include "psuigspluginids.hrh" + +RESOURCE REGISTRY_INFO theInfo + { + dll_uid = PSUIGSPluginDllUid; + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10207236;//KGSPluginInterfaceUid + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = PSUIGSPluginImplUid; + version_no = 1; + display_name = "Presence Settings GS plugin"; + default_data = "0x10283341";//KGSAdminPluginUid; + opaque_data = "30"; // Order number + } + }; + } + }; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/data/psuigspluginrsc.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/data/psuigspluginrsc.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,496 @@ +/* +* Copyright (c) 2006-2010 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: Resource file for Presence Settings UI GS plugin +* +*/ + + + + +// RESOURCE IDENTIFIER +NAME UIPS // 4 letter ID + +// INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Common GS resource structures +#include +#include +#include "psuigsplugin.hrh" + +// CONSTANTS +#define KPSUICompulsoryChar "*" +#define KPSUIMaxServerNameLength 100 +#define KPSUIURILength 255 +#define KPSUIMaxObjectSize 999999999 +#define KPSUIObjectSizeEditorLength 9 +#define KPSUIPublIntervalEditorLength 6 +#define KPSUISubscriptionsEditorLength 4 + +// RESOURCE DEFINITIONS + +// --------------------------------------------------------------------------- +// RSS_SIGNATURE +// --------------------------------------------------------------------------- +// +RESOURCE RSS_SIGNATURE {} + +// --------------------------------------------------------------------------- +// r_psui_mainview_menubar - menubar +// Settings mainview's titles +// --------------------------------------------------------------------------- +// +RESOURCE MENU_BAR r_psui_mainview_menubar + { + titles = + { + MENU_TITLE { menu_pane = r_psui_mainview_menupane; } + }; + } + +// --------------------------------------------------------------------------- +// r_psui_mainview_menupane - menupane +// Settings mainview's menuitems +// --------------------------------------------------------------------------- +// +RESOURCE MENU_PANE r_psui_mainview_menupane + { + items = + { + MENU_ITEM + { + command = EPSUICmdEdit; + txt = qtn_presence_settings_edit; + flags = EEikMenuItemAction; + }, + MENU_ITEM + { + command = EPSUICmdNewSettings; + txt = qtn_presence_settings_new; + cascade = r_psui_newsettings_menu; + }, + MENU_ITEM + { + command = EPSUICmdDelete; + txt = qtn_presence_settings_delete; + }, + MENU_ITEM + { + command = EAknCmdHelp; + txt = qtn_options_help; + }, + MENU_ITEM + { + command = EAknCmdExit; + txt = qtn_options_exit; + } + }; + } + +// --------------------------------------------------------------------------- +// r_psui_newsettings_menu - titlepane +// Settings mainview's menuitems in New Settings cascade menu +// --------------------------------------------------------------------------- +// +RESOURCE MENU_PANE r_psui_newsettings_menu + { + items = + { + MENU_ITEM + { + command = EPSUICmdNewSettingsDefault; + txt = qtn_presence_settings_new_default; + }, + MENU_ITEM + { + command = EPSUICmdNewSettingsExisting; + txt = qtn_presence_settings_new_existing; + } + }; + } + +// --------------------------------------------------------------------------- +// r_psui_mainview_title - titlepane +// Settings mainview's title +// --------------------------------------------------------------------------- +// +RESOURCE TITLE_PANE r_psui_mainview_title + { + txt = qtn_presence_settings_title; + } + +// --------------------------------------------------------------------------- +// r_psui_main_view - view +// Settings mainview's menubar and command button area definitions +// --------------------------------------------------------------------------- +// +RESOURCE AVKON_VIEW r_psui_main_view + { + menubar = r_psui_mainview_menubar; + cba = r_psui_mainview_softkeys; + } + +// --------------------------------------------------------------------------- +// r_psui_mainview_softkeys - cba +// Settings mainview's command button area definitions +// --------------------------------------------------------------------------- +// +RESOURCE CBA r_psui_mainview_softkeys + { + flags = 0; + buttons = + { + CBA_BUTTON {id=EAknSoftkeyOptions; txt= text_softkey_option;}, + CBA_BUTTON {id=EAknSoftkeyBack; txt= text_softkey_back;}, + CBA_BUTTON {id=EPSUICmdEdit; txt= qtn_msk_edit ;} + }; + } + +// --------------------------------------------------------------------------- +// r_psui_setting_view - view +// Setting view's menubar and command button area definitions +// --------------------------------------------------------------------------- +// +RESOURCE AVKON_VIEW r_psui_setting_view + { + menubar = r_psui_settingview_menubar; + cba = r_psui_settingview_softkeys; + } + +// --------------------------------------------------------------------------- +// r_psui_settingview_softkeys - cba +// Settings mainview's command button area definitions +// --------------------------------------------------------------------------- +// +RESOURCE CBA r_psui_settingview_softkeys + { + flags = 0; + buttons = + { + CBA_BUTTON {id=EAknSoftkeyOptions; txt= text_softkey_option;}, + CBA_BUTTON {id=EAknSoftkeyBack; txt= text_softkey_back;}, + CBA_BUTTON {id=EPSUICmdChange; txt= qtn_msk_change ;} + }; + } + +// --------------------------------------------------------------------------- +// r_psui_settingview_menubar - menubar +// Settingview's titles +// --------------------------------------------------------------------------- +// +RESOURCE MENU_BAR r_psui_settingview_menubar + { + titles = + { + MENU_TITLE { menu_pane = r_psui_settingview_menupane; } + }; + } + +// --------------------------------------------------------------------------- +// r_psui_settingview_menupane - menupane +// Settingview's menuitems +// --------------------------------------------------------------------------- +// +RESOURCE MENU_PANE r_psui_settingview_menupane + { + items = + { + MENU_ITEM + { + command = EPSUICmdChange; + txt = qtn_presence_settings_change; + flags = EEikMenuItemAction; + }, + MENU_ITEM + { + command = EAknCmdHelp; + txt = qtn_options_help; + }, + MENU_ITEM + { + command = EEikCmdExit; + txt = qtn_options_exit; + } + }; + } + +// --------------------------------------------------------------------------- +// r_psui_setting_items - AVKON_SETTING_ITEM_LIST +// Setting items for presence settings +// --------------------------------------------------------------------------- +// +RESOURCE AVKON_SETTING_ITEM_LIST r_psui_setting_items + { + items = + { + AVKON_SETTING_ITEM + { + identifier = EPSUIServerNameId; + setting_page_resource = r_psui_server_name_setting_page; + name = qtn_presence_settings_name; + compulsory_ind_string = KPSUICompulsoryChar; + empty_item_text = qtn_selec_setting_compulsory; + }, + AVKON_SETTING_ITEM + { + identifier = EPSUISIPProfileId; + setting_page_resource = r_radiobutton_setting_page; + name = qtn_presence_settings_sip_profile; + compulsory_ind_string = KPSUICompulsoryChar; + empty_item_text = qtn_selec_setting_compulsory; + }, + AVKON_SETTING_ITEM + { + identifier = EPSUIXDMSettingsId; + setting_page_resource = r_radiobutton_setting_page; + name = qtn_presence_settings_xdm_settings; + }, + AVKON_SETTING_ITEM + { + identifier = EPSUIObjectSizeId; + setting_page_resource = r_psui_object_size_setting_page; + name = qtn_presence_settings_object_size; + compulsory_ind_string = KPSUICompulsoryChar; + empty_item_text = qtn_selec_setting_compulsory; + }, +/* server address disabled + AVKON_SETTING_ITEM + { + identifier = EPSUIServerAddrId; + setting_page_resource = r_psui_server_addr_setting_page; + name = qtn_presence_settings_url; + },*/ + AVKON_SETTING_ITEM + { + identifier = EPSUIPublishingIntervalId; + setting_page_resource = r_psui_publ_interval_setting_page; + name = qtn_presence_settings_time_interval; + }, + AVKON_SETTING_ITEM + { + identifier = EPSUIMaxSubscriptionsId; + setting_page_resource = r_psui_subscriptions_setting_page; + name = qtn_presence_settings_number_subscriptions; + }, + AVKON_SETTING_ITEM + { + identifier = EPSUIMaxContactsInListId; + setting_page_resource = r_psui_subscriptions_list_setting_page; + name = qtn_presence_settings_number_subsc_lists; + }, + AVKON_SETTING_ITEM + { + identifier = EPSUIDomainSyntaxId; + setting_page_resource = r_psui_domain_syntax_setting_page; + name = qtn_presence_settings_domain; + compulsory_ind_string = KPSUICompulsoryChar; + empty_item_text = qtn_selec_setting_compulsory; + } + }; + } + +// --------------------------------------------------------------------------- +// r_psui_server_name_setting_page +// --------------------------------------------------------------------------- +RESOURCE AVKON_SETTING_PAGE r_psui_server_name_setting_page + { + label= qtn_presence_settings_name; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EEikCtEdwin; + editor_resource_id = r_psui_server_name_editor; + } + +RESOURCE EDWIN r_psui_server_name_editor + { + flags = EEikEdwinNoLineOrParaBreaks; + width = 0; + lines = 0; + maxlength = KPSUIMaxServerNameLength; + } + +// --------------------------------------------------------------------------- +// r_radiobutton_setting_page +// --------------------------------------------------------------------------- +RESOURCE AVKON_SETTING_PAGE r_radiobutton_setting_page + { + number = EAknSettingPageNoOrdinalDisplayed; + label = qtn_presence_settings_sip_profile; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EAknSetListBox; + editor_resource_id = r_setting_listbox; + } + +RESOURCE LISTBOX r_setting_listbox + { + flags = EAknListBoxMultiselectionList;//no actual multiselection, just to make radiobutton visible in previously chosen item + } + +// --------------------------------------------------------------------------- +// r_psui_object_size_setting_page +// --------------------------------------------------------------------------- +RESOURCE AVKON_SETTING_PAGE r_psui_object_size_setting_page + { + label= qtn_presence_settings_object_size; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EAknCtIntegerEdwin; + editor_resource_id = r_psui_object_size_editor; + } + +RESOURCE AVKON_INTEGER_EDWIN r_psui_object_size_editor + { + maxlength = KPSUIObjectSizeEditorLength; + min = 1; + max = KPSUIMaxObjectSize;// needed since default value is smaller + unset_value = -1;//KErrNotFound + } + +// --------------------------------------------------------------------------- +// r_server_addr_setting_page +// --------------------------------------------------------------------------- +/* server address disabled +RESOURCE AVKON_SETTING_PAGE r_psui_server_addr_setting_page + { + label= qtn_presence_settings_url; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EEikCtEdwin; + editor_resource_id = r_psui_uri_editor; + }*/ + +RESOURCE EDWIN r_psui_uri_editor + { + width = 0; + lines = 0; + maxlength = KPSUIURILength; + flags = EEikEdwinAutoSelection | EAknEditorLowerCase | EEikEdwinNoLineOrParaBreaks; + allowed_case_modes = EAknEditorLowerCase | EAknEditorUpperCase; + numeric_keymap=EAknEditorCalculatorNumberModeKeymap; + allowed_input_modes = EAknEditorTextInputMode | EAknEditorNumericInputMode; + default_input_mode = EAknEditorTextInputMode; + special_character_table = R_AVKON_URL_SPECIAL_CHARACTER_TABLE_DIALOG; + default_case = EAknEditorLowerCase; + avkon_flags = EAknEditorFlagLatinInputModesOnly; + } + +// --------------------------------------------------------------------------- +// r_psui_publ_interval_setting_page +// --------------------------------------------------------------------------- +RESOURCE AVKON_SETTING_PAGE r_psui_publ_interval_setting_page + { + label= qtn_presence_settings_time_interval; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EAknCtIntegerEdwin; + editor_resource_id = r_psui_publ_interval_editor; + } + +RESOURCE AVKON_INTEGER_EDWIN r_psui_publ_interval_editor + { + maxlength = KPSUIPublIntervalEditorLength; + min = 1; + unset_value = -1;//KErrNotFound + } + +// --------------------------------------------------------------------------- +// r_psui_subscriptions_setting_page +// --------------------------------------------------------------------------- +RESOURCE AVKON_SETTING_PAGE r_psui_subscriptions_setting_page + { + label= qtn_presence_settings_number_subscriptions; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EAknCtIntegerEdwin; + editor_resource_id = r_psui_subscriptions_editor; + } + +RESOURCE AVKON_INTEGER_EDWIN r_psui_subscriptions_editor + { + maxlength = KPSUISubscriptionsEditorLength; + min = 0; + unset_value = -1;//KErrNotFound + } + +// --------------------------------------------------------------------------- +// r_psui_subscriptions_setting_page +// --------------------------------------------------------------------------- +RESOURCE AVKON_SETTING_PAGE r_psui_subscriptions_list_setting_page + { + label= qtn_presence_settings_number_subsc_lists; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EAknCtIntegerEdwin; + editor_resource_id = r_psui_subscriptions_editor; + } + +// --------------------------------------------------------------------------- +// r_psui_domain_syntax_setting_page +// --------------------------------------------------------------------------- +RESOURCE AVKON_SETTING_PAGE r_psui_domain_syntax_setting_page + { + label= qtn_presence_settings_domain; + softkey_resource = R_AVKON_SOFTKEYS_OK_CANCEL__OK; + invalid_contents_softkey_resource = R_AVKON_SOFTKEYS_CANCEL; + type = EEikCtEdwin; + editor_resource_id = r_psui_uri_editor; + } + +// --------------------------------------------------------- +// r_deletesettingsconf_query - query +// Query when deleting settings +// --------------------------------------------------------- +// +RESOURCE DIALOG r_psui_conf_query + { + flags=EGeneralQueryFlags; + buttons=R_AVKON_SOFTKEYS_YES_NO; + items= + { + DLG_LINE + { + type=EAknCtQuery; + id=EGeneralQuery; + control= AVKON_CONFIRMATION_QUERY + { + layout = EConfirmationLayout; + }; + } + }; + } + +// --------------------------------------------------------------------------- +// resource texts +// --------------------------------------------------------------------------- +// +RESOURCE TBUF r_qtn_presence_settings_empty_primary { buf = qtn_presence_settings_empty_primary; } +RESOURCE TBUF r_qtn_presence_settings_empty_secondary { buf = qtn_presence_settings_empty_secondary; } +RESOURCE TBUF r_qtn_presence_propmt_use_exist { buf = qtn_presence_propmt_use_exist; } +RESOURCE TBUF r_qtn_presence_name_default { buf = qtn_presence_name_default; } +RESOURCE TBUF r_qtn_presence_name_default_number { buf = qtn_presence_name_default_number; } +RESOURCE TBUF r_qtn_query_common_conf_delete { buf = qtn_query_common_conf_delete; } +RESOURCE TBUF r_qtn_presence_settings_delete_last { buf = qtn_presence_settings_delete_last; } +RESOURCE TBUF r_qtn_presence_settings_not_filled { buf = qtn_presence_settings_not_filled; } +RESOURCE TBUF r_qtn_presence_settings_name_exists { buf = qtn_presence_settings_name_exists; } +RESOURCE TBUF r_qtn_set_folder_presence { buf = qtn_set_folder_presence; } + +//End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2006-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: Build information file for Presence Settings UI GS plugin. +* +*/ + + + + +#include + +PRJ_PLATFORMS +DEFAULT +// Help exports +#include "../help/group/bld.inf" + +PRJ_EXPORTS +// IBYs +../rom/psuigsplugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(psuigsplugin.iby) +../rom/psuigspluginresources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH(psuigspluginresources.iby) +// LOC +../loc/psuigsplugin.loc MW_LAYER_LOC_EXPORT_PATH(psuigsplugin.loc) + +PRJ_EXTENSIONS +START EXTENSION s60/mifconv + OPTION TARGETFILE psuigsplugin.mif + OPTION HEADERFILE psuigsplugin.mbg + OPTION SOURCES -c8,8 qgn_prop_set_conn_presence +END + +PRJ_MMPFILES +psuigsplugin.mmp + +PRJ_TESTMMPFILES +//../internal/tsrc/test/group/ut_presencesettingsui.mmp + +PRJ_TESTEXPORTS +// none diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/group/psuigsplugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/group/psuigsplugin.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2006-2010 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: This is project specification file for Presence UI Settings GS plugin. +* +*/ + + + +#include +#include + +// definitions +CAPABILITY CAP_ECOM_PLUGIN +TARGET psuigsplugin.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x10281EF0 //PSUIGSPluginDllUid +VENDORID VID_DEFAULT + +// sources +SOURCEPATH ../data +SOURCEPATH ../src +SOURCE psuigspluginimplementationtable.cpp +SOURCE psuigsplugin.cpp +SOURCE psuigsplugincontainer.cpp +SOURCE psuigspluginmodel.cpp +SOURCE psuigspluginsettingview.cpp +SOURCE psuigspluginsettingviewcontainer.cpp +SOURCE psuisipxdmsettingitem.cpp +SOURCE psuiintegersettingitem.cpp + +// includes +USERINCLUDE ../inc +USERINCLUDE ../data +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom + +//ECOM resource definition +START RESOURCE ../data/10281ef0.rss +TARGET psuigsplugin.rsc +END + +// resources +START RESOURCE ../data/psuigspluginrsc.rss +HEADER +TARGETPATH RESOURCE_FILES_DIR +LANGUAGE_IDS +END + +// dependancies +LIBRARY euser.lib +LIBRARY avkon.lib +LIBRARY bafl.lib +LIBRARY cone.lib +LIBRARY eikcoctl.lib +LIBRARY eikcore.lib +LIBRARY commonengine.lib +LIBRARY featmgr.lib +LIBRARY hlplch.lib +LIBRARY gsframework.lib +LIBRARY gsecomplugin.lib +LIBRARY aknskins.lib +LIBRARY sipprofilecli.lib +LIBRARY inetprotutil.lib +LIBRARY xdmsettingsapi.lib +LIBRARY presencesettingsapi.lib +LIBRARY serviceprovidersettings.lib + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/group/psuigspluginicons.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/group/psuigspluginicons.mk Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,55 @@ +# +# Copyright (c) 2006 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: Icons for presence settings ui gs plugin +# + +ifeq (WINS,$(findstring WINS, $(PLATFORM))) +ZDIR=\epoc32\release\$(PLATFORM)\$(CFG)\Z +else +ZDIR=\epoc32\data\z +endif + +TARGETDIR=$(ZDIR)\resource\apps +HEADERDIR=\epoc32\include +ICONTARGETFILENAME=$(TARGETDIR)\psuigsplugin.mif +HEADERFILENAME=$(HEADERDIR)\psuigsplugin.mbg + +do_nothing : + @rem do_nothing + +MAKMAKE : do_nothing + +BLD : do_nothing + +CLEAN : + if exist $(ICONTARGETFILENAME) erase $(ICONTARGETFILENAME) + if exist $(HEADERFILENAME) erase $(HEADERFILENAME) + +LIB : do_nothing + +CLEANLIB : do_nothing + +RESOURCE : + mifconv $(ICONTARGETFILENAME) /h$(HEADERFILENAME) \ + /c8,8 qgn_prop_set_conn_presence.bmp + +FREEZE : do_nothing + +SAVESPACE : do_nothing + +RELEASABLES : + @echo $(HEADERFILENAME)&& \ + @echo $(ICONTARGETFILENAME) + +FINAL : do_nothing diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/help/data/xhtml.zip Binary file presencesettingsui/help/data/xhtml.zip has changed diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/help/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/help/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 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: +* Export help related files. +* +*/ + +#include +PRJ_EXPORTS +:zip ../data/xhtml.zip /epoc32/data/z/resource/ overwrite +:zip ../data/xhtml.zip /epoc32/winscw/c/resource/ overwrite + +../inc/pre.hlp.hrh MW_LAYER_PLATFORM_EXPORT_PATH(csxhelp/pre.hlp.hrh) +../rom/presencesettingsuihelps_variant.iby CUSTOMER_APP_LAYER_IBY_EXPORT_PATH(presencesettingsuihelps_variant.iby) diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/help/inc/pre.hlp.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/help/inc/pre.hlp.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 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: +* +*/ + +// +// pre.hlp.hrh generated by CSXHelp Utilities. +// + +#ifndef __PRE_HLP_HRH__ +#define __PRE_HLP_HRH__ + +_LIT(KPRE_HLP_EDIT_SET, "PRE_HLP_EDIT_SET"); // +_LIT(KPRE_HLP_LIST_VIEW, "PRE_HLP_LIST_VIEW"); // + +#endif \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/help/rom/presencesettingsuihelps_variant.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/help/rom/presencesettingsuihelps_variant.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 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: +* +*/ + +#ifndef __PRESENCESETTINGSUIHELPS_VARIANT_IBY__ +#define __PRESENCESETTINGSUIHELPS_VARIANT_IBY__ + +#if defined(FF_S60_HELPS_IN_USE) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10281EF0/contents.zip, RESOURCE_FILES_DIR/xhtml/%02d/0x10281EF0/contents.zip) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10281EF0/index.xml, RESOURCE_FILES_DIR/xhtml/%02d/0x10281EF0/index.xml) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10281EF0/keywords.xml, RESOURCE_FILES_DIR/xhtml/%02d/0x10281EF0/keywords.xml) + data=LOCALISE(DATAZ_/resource/xhtml/%02d/0x10281EF0/meta.xml, RESOURCE_FILES_DIR/xhtml/%02d/0x10281EF0/meta.xml) +#endif + +#endif \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuigsplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuigsplugin.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,226 @@ +/* +* Copyright (c) 2006 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: GSFW plugin header for Presence Settings UI GS plugin. +* +*/ + + + + +#ifndef PSUIGSPLUGIN_H +#define PSUIGSPLUGIN_H + +// INCLUDES +#include +#include +#include + +// FORWARD DECLARATIONS +class CPSUIGSPluginContainer; +class CPSUIGSPluginModel; + +// CLASS DECLARATION + +/** +* Header of CPSUIGSPlugin which implements the CGSPluginInterface. +* +* @lib PSUIGSPlugin.lib +* @since Series60_3.2 +*/ +class CPSUIGSPlugin : + public CGSBaseView, + public MCoeViewDeactivationObserver, + public MEikListBoxObserver + { + + public: // Constructors and destructor + + /** + * Symbian OS two-phased constructor + */ + static CPSUIGSPlugin* NewL( TAny* aAppUi ); + + /** + * Destructor. + */ + ~CPSUIGSPlugin(); + + private: // Functions from base classes + + /** + * From CAknView + * See base class. + */ + TUid Id() const; + + /** + * From CAknView + * See base class. + */ + void DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ); + + /** + * From CAknView + * See base class. + */ + void DoDeactivate(); + + /** + * From CAknView + * See base class. + */ + void HandleCommandL( TInt aCommand ); + + /** + * From CGSBaseView + * See base class. + */ + void NewContainerL(); + + /** + * From CGSBaseView + * See base class. + */ + void HandleListBoxSelectionL(); + + /** + * From CGSPluginInterface + * See base class. + */ + void GetCaptionL( TDes& aCaption ) const; + + /** + * From CGSPluginInterface + * See base class. + */ + TInt PluginProviderCategory() const; + + /** + * From CGSPluginInterface + * See base class. + */ + CGulIcon* CreateIconL( const TUid aIconType ); + + /** + * From MEikMenuObserver + * See base class. + */ + void DynInitMenuPaneL( TInt aResourceId, CEikMenuPane *aMenuPane ); + + /** + * From MCoeViewDeactivationObserver + * Used to be able to free memory when plugin get's closed. + * See base class. + */ + void HandleViewDeactivation ( + const TVwsViewId& aViewIdToBeDeactivated, + const TVwsViewId& aNewlyActivatedViewId ); + + /** + * From MEikListBoxObserver + * See base class. + */ + void HandleListBoxEventL(CEikListBox* aListBox, TListBoxEvent aEventType); + + public: // New + + /** + * Gives a handle to PS Model. Ownership is not transferred. + * + * @return handle to PS Model + */ + CPSUIGSPluginModel* PSModel(); + + /** + * Takes care of settings deletion. + */ + void DeleteSettingsL(); + + private: // New + + /** + * Returns count and index of current item in listbox. + * + * @param aIndex returns the index. If no items, KErrNotFound. + * @return TInt containing the count. + */ + TInt SettingCountAndIndex( TInt& aIndex ); + + /** + * Shows the delete certain setting set confirmation note. + * + * @param aCount is the amount of all settings + * @param aIndex is the to be deleted setting set + * @return TBool about proceed with deletion. + */ + TBool AcceptDeletionL( TInt aCount, TInt aIndex ); + + /** + * Constructs the setting view + */ + void ConstructSettingViewL(); + + /** + * Removes the setting view + */ + void RemoveSettingView(); + + /** + * Create new default settings and launch setting view + */ + void CreateNewDefaultSettingsL(); + + /** + * Create new a copy of existing settings and launch setting view + */ + void CreateCopyOfExistingSettingsL(); + + /** + * Toggles visibility of MSK depending on the amount of setting sets + */ + void UpdateMSK(); + + private: // Constructors + + /** + * C++ default constructor. + */ + CPSUIGSPlugin(); + + /** + * Symbian OS default constructor. + */ + void ConstructL(); + + private: // Data + + // Presence UI model + CPSUIGSPluginModel* iPSModel; + // Presence Setting view + CAknView* iSettingView; + // Indicates when PSUIGSPlugin's views are closed + TBool iClosing; + // Previous view + TVwsViewId iPSUIGSPrevViewId; + +#ifdef _DEBUG + friend class UT_CPSUIGSPlugin; + friend class UT_CPSUIGSPluginContainer; +#endif + }; + +#endif // PSUIGSPLUGIN_H +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuigsplugin.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuigsplugin.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2006 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: Presence Settings UI command definitions. +* +*/ + + + + +#ifndef PSUIGSPLUGIN_HRH +#define PSUIGSPLUGIN_HRH + +/** +* Commands used from menus +*/ +enum TPSUIMenuCommands + { + EPSUICmdEdit = 100, + EPSUICmdNewSettings, + EPSUICmdNewSettingsDefault, + EPSUICmdNewSettingsExisting, + EPSUICmdDelete, + EPSUICmdChange + }; + +/** +* Ids for different setting fields +*/ +enum TPSUISettingItemId + { + EPSUIServerNameId, + EPSUISIPProfileId, + EPSUIXDMSettingsId, + EPSUIObjectSizeId, + EPSUIServerAddrId, + EPSUIPublishingIntervalId, + EPSUIMaxSubscriptionsId, + EPSUIMaxContactsInListId, + EPSUIDomainSyntaxId + }; + +#endif //PSUIGSPLUGIN_HRH + diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuigsplugincontainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuigsplugincontainer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2006 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: Header for Presence Settings UI GS plugin container. +* +*/ + + + + +#ifndef PSUIGSPLUGINCONTAINER_H +#define PSUIGSPLUGINCONTAINER_H + +// INCLUDES +#include +#include + +// FORWARD DECLARATIONS +class CPSUIGSPlugin; + +// CLASS DECLARATION + +/** +* CPSUIGSPluginContainer container class +* @since Series60_3.2 +*/ +class CPSUIGSPluginContainer : public CGSBaseContainer, + public MEikMenuObserver + { + public: // Constructors and destructor + + /** + * Default constructor. + */ + CPSUIGSPluginContainer( CPSUIGSPlugin* aView ); + + /** + * Destructor. + */ + ~CPSUIGSPluginContainer(); + + private: // Functions from base classes + + /** + * From CGSBaseContainer + * See base class. + */ + void ConstructListBoxL( TInt aResLbxId ); + + /** + * From CGSBaseContainer + * See base class. + */ + TKeyResponse OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ); + + /** + * From CCoeControl + * See base class. + */ + void GetHelpContext( TCoeHelpContext& aContext ) const; + + /** + * From MEikMenuObserver + */ + void SetEmphasis( CCoeControl* /*aMenuControl*/, TBool /*aEmphasis*/ ){}; + + + /** + * From MEikMenuObserver + */ + void ProcessCommandL( TInt /*aCommandId*/ ){}; + + private: // New + + /** + * Sets empty texts to listbox + * + * @param none + */ + void SetEmptyTextsToListboxL(); + + private: // Constructor + + /** + * Symbian OS constructor. + * + * @param aRect Listbox's rect. + */ + void ConstructL( const TRect& aRect ); + + private: // Data + + // Handle to view + CPSUIGSPlugin* iView; // not owned + + /** + * Menubar. + * Own. + */ + CEikMenuBar* iEikMenuBar; + +#ifdef _DEBUG + friend class UT_CPSUIGSPluginContainer; +#endif + }; + +#endif //PSUIGSPLUGINCONTAINER_H +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuigspluginids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuigspluginids.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2006 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: Header file for Presence Settings GS plugin id consts +* +*/ + + + + +#ifndef __PSUIGSPLUGINIDS_HRH_ +#define __PSUIGSPLUGINIDS_HRH_ + +/** +* UID of the Presence Settings GS plugin dll +*/ +#define PSUIGSPluginDllUid 0x10281EF0 + +/** +* UID of the Presence Settings GS plugin implementation +*/ +#define PSUIGSPluginImplUid 0x10281EF1 + +#endif // PSUIGSPLUGINIDS_HRH_ + diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuigspluginmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuigspluginmodel.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,390 @@ +/* +* Copyright (c) 2006-2010 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: Presence settings UI model header. +* +*/ + + + + +#ifndef PSUIGSPLUGINMODEL_H +#define PSUIGSPLUGINMODEL_H + +// INCLUDES +#include +#include +#include +#include +#include "psuigsplugin.hrh" + +// FORWARD DECLARATIONS + +// CLASS DECLARATION +class RPresenceSettingsArray; +class CSIPManagedProfileRegistry; +class CSIPManagedProfile; + +// Constants +_LIT( KPSUIGSPluginPanicCategory, "PSUIGSPlugin" ); + +/** +* Presence settings UI model +* +* @lib PSUIGSPlugin.lib +* @since Series60_3.2 +*/ +class CPSUIGSPluginModel : + public CBase, + public MDesCArray, + public MSIPProfileRegistryObserver + { + + public: // Constructors and destructor + + /** + * Symbian OS two-phased constructor + */ + static CPSUIGSPluginModel* NewL(); + + /** + * Destructor. + */ + ~CPSUIGSPluginModel(); + + public: // New + + // + // + // Presence settings related + + /** + * Retrieves current presence settings from system + */ + void RetrieveSettingsL(); + + /** + * Stores current presence settings to system + */ + void SaveSettingsL(); + + /** + * Checks are the compulsory fields filled. + * + * @return boolean about filled fields + */ + TBool AllCompulsoryFieldsFilled(); + + /** + * Prepares iSettingSet for editing + * + * @param aIndex of presence settings to be edited + */ + void EditSettingsL( TInt aIndex ); + + /** + * Refreshes the presence settings related arrays + */ + void RefreshPSArraysL(); + + /** + * Prepares the iSettingSet and iSettingId + * with default values + */ + void CreateDefaultSettingsL(); + + /** + * Prepares the iSettingSet and iSettingId + * with values from indexed presence setting + * + * @param aIndex is the presence settings to be duplicated + */ + void DuplicateExistingSettingsL( TInt aIndex ); + + /** + * Creates new name for to be created settings. If aOriginal + * provided, then will use that as a base. If not, then will + * create the name based on default naming. Adds numbering to + * end of name if needed. + * Note : aOriginal will be stored to cleanupstack if provided + * + * @param aOriginal is optional base name + * + */ + HBufC* CreateSettingNameLC( HBufC* aOriginal = NULL ); + + /** + * Deletes indexed settings through presence settings API. + * + * @param aToBeDeleted to be deleted settings + * @param aIsIndex tells is aToBeDeleted index or id + */ + void DeleteSettingsL( TInt aToBeDeleted, TBool aIsIndex ); + + /** + * Returns name of the indexed settings. + * + * @param aIndex of the wanted name + * @return HBufC* containing the name + */ + HBufC* SettingNameLC( TInt aIndex ); + + /** + * Checks if there already is settings with the same name. + */ + TBool IsItDuplicatePSName(); + + /** + * Returns iPSNameArray, which contains names of the + * different setting sets. Ownership of array stays in + * CPSUIGSPluginModel. + * + * @return CDesCArray* containing the names of the settings + */ + CDesCArray* SettingNames(); + + /** + * Returns a reference to iSettingSet. + * + * @return TPresSettingsSet& containing one set of the settings + */ + TPresSettingsSet& SettingsSet(); + + /** + * Checks the validity of SIP- and XDM-fields, + * if not valid empties the fields. + */ + void ClearInvalidSIPAndXDMSettingsL(); + + /** + * Returns a reference to iSettingSetId. + * + * @return TInt& containing setting id + */ + TInt& SettingsId(); + + /** + * Returns a reference to iPSIdArray. + * + * @return RArray& containing iPSIdArray + */ + RArray& SettingsIDArray(); + + // + // + // SIP related + + /** + * Fetches names of defined SIP-profiles + * Refreshes also SIP related arrays. + * + * @return descriptor array of names + */ + CDesCArray* SipProfilesLC(); + + /** + * Fetches the ID of indexed SIP profile + * + * @param aIndex is the index in the array + * @return ID of the SIP profile + */ + TInt SipProfileId( TInt aIndex ); + + /** + * Fetches the index of ID'ed SIP profile + * + * @param aId is ID of the SIP profile + * @return index in the array + */ + TInt SipProfileIndex( TInt aId ); + + /** + * Fetches the name of ID'ed SIP profile + * Refreshes also SIP related arrays. + * + * @param aId is ID of the SIP profile + * @return descriptor containing the name + */ + HBufC* SipProfileNameL( TInt aId ); + + /** + * Checks if SIP profile used by presence settings is in use + * + * @param aIndex is the index in the array + * @return ETrue if profile is registered + */ + TBool IsSipProfileRegisteredL( TInt aIndex ); + + // + // + // XDM related + + /** + * Fetches names of defined XDM settings. + * Refreshes also XDM related arrays. + * + * @return descriptor array of names + */ + CDesCArray* XdmCollectionNamesL(); + + /** + * Fetches the name of ID'ed XDM setting + * + * @param aId is ID of the SIP profile + * @return descriptor containing the name + */ + HBufC* XdmCollectionNameL( TInt aId ); + + /** + * Fetches the index of ID'ed XDM setting + * + * @param aId is ID of the SIP profile + * @return index in the array + */ + TInt XdmSettingIndex( TInt aId ); + + /** + * Fetches the ID of indexed XDM setting + * + * @param aIndex is the index in the array + * @return ID of the SIP profile + */ + TInt XdmSettingId( TInt aIndex ); + + private: // New + + /** + * Destroys given array. Used with TCleanupItem. + * + * @param pointerarray to be deleted + */ + static void ResetAndDestroy( TAny* aPointerArray ); + + /** + * Refreshes the SIP profile array. Needs to be + * called before calling most of the SIP-related methods. + */ + void ReadSipArrayFromEngineL(); + + /** + * Checks if there is ordinal numbering at the end of + * descriptor and rips it off if there is. + * + * @return HBufC* containing the name ready for the numbering + */ + HBufC* GetPrefixL( HBufC* aName ); + + /** + * Re-arranges presence settings (name and id arrays) + * to alphabetical order. + */ + void ReArrangePresenceSettingsL(); + + /** + * Cleans links to specific presence settings for + * service provider settings. + * + * @param aPresenceId presence settings id. + */ + void CleanServiceProviderSettingsDataL( TInt aPresenceId ); + + private: // Functions from base classes + + /** + * from MSIPProfileRegistryObserver + * Refreshes in most cases SIP related arrays. + * + * See base class. + */ + void ProfileRegistryEventOccurred( + TUint32 aSIPProfileId, + TEvent aEvent ); + + /** + * from MSIPProfileRegistryObserver + * Refreshes SIP related arrays. + * + * See base class. + */ + void ProfileRegistryErrorOccurred( + TUint32 aSIPProfileId, + TInt aError); + + /** + * from MDesCArray + * See base class. + */ + TInt MdcaCount() const; + + /** + * from MDesCArray + * See base class. + */ + TPtrC16 MdcaPoint( TInt aIndex ) const; + + private: // Constructors + + /** + * C++ default constructor. + */ + CPSUIGSPluginModel(); + + /** + * Symbian OS default constructor. + */ + void ConstructL(); + + private: // Data + + // Currently edited presence settings + TPresSettingsSet iSettingSet; + // Setting identifier + TInt iSettingId; + // SIP profile registry + CSIPManagedProfileRegistry* iSIPEngine; + // SIP profile array + CArrayPtrFlat* iSIPProfiles; + // XDM ID array + RArray iXdmIdArray; + // XDM name array + CDesCArray* iXdmNameArray; + // Presence settings id array + RArray iPSIdArray; + // Presence settings name array + CDesCArray* iPSNameArray; + // Texts for the MDesCArray + HBufC* iVisibleSettingName; + + }; + +/** +* Small utility class to store presence settings +* name and id. +* Used in CPSUIGSPluginModel::ReArrangePresenceSettingsL(). +* +* @lib PSUIGSPlugin.lib +* @since Series60_3.2 +*/ +class CPSUINameIDPair : + public CBase + { + public : + inline ~CPSUINameIDPair() { delete iName; }; + + public : + TInt iID; + HBufC* iName; + }; + +#endif // PSUIGSPLUGINMODEL_H +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuigspluginsettingview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuigspluginsettingview.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2006 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: Presence Settings UI's setting view. +* +*/ + + + + +#ifndef PSUIGSPLUGINSETTINGVIEW_H +#define PSUIGSPLUGINSETTINGVIEW_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CPSUIGSPluginContainer; +class CPSUIGSPluginSettingViewContainer; +class CPSUIGSPlugin; + +const TUid KPreSettingViewId = {313}; + +// CLASS DECLARATION + +/** +* Header of CPSUIGSPluginSettingView. +* +* @lib PSUIGSPlugin.lib +* @since Series60_3.2 +*/ +class CPSUIGSPluginSettingView : + public CAknView + { + + public: // Constructors and destructor + + /** + * Symbian OS two-phased constructor + */ + static CPSUIGSPluginSettingView* NewL( CPSUIGSPlugin* aMainView ); + + /** + * Destructor. + */ + ~CPSUIGSPluginSettingView(); + + private: // Functions from base classes + + /** + * From CAknView + * See base class. + */ + TUid Id() const; + + /** + * From CAknView + * See base class. + */ + void DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ); + + /** + * From CAknView + * See base class. + */ + void DoDeactivate(); + + /** + * From CAknView + * See base class. + */ + void HandleCommandL( TInt aCommand ); + + /** + * From CAknView + * See base class. + */ + void HandleViewRectChange(); + + public : // New + + /** + * Gives a handle to plugin main view. Ownership is not transferred. + * + * @return handle to plugin main view + */ + CPSUIGSPlugin* MainView(); + + /** + * Uses model to check if name is a duplicate and if it + * is shows a note. + * + * @return TBool about if duplicates were found + */ + TBool HandleDuplicatePSNamesL(); + + private: // New + + /** + * Creates the setting view container + * + * @param none + */ + void CreateContainerL(); + + /** + * Handles back-key presses. Checks if all compulsory + * fields are filled and if there is duplicates. Based on + * this saves and switches view back to main view. + */ + void HandleBackKeyL(); + + /** + * Handles saving funtionality when Exit is chosen from Menu. + * Checks if all compulsory fields are filled and in case of + * duplicate changes name, after this saves settings. + */ + void HandleMenuExitL(); + + private: // Constructors + + /** + * C++ default constructor. + */ + CPSUIGSPluginSettingView( CPSUIGSPlugin* aMainView ); + + /** + * Symbian OS default constructor. + */ + void ConstructL(); + + private: // Data + + // Previous view ID + TVwsViewId iPrevViewId; + // Pointer to application UI. + CAknViewAppUi* iAppUi; + // Presence setting view container + CPSUIGSPluginSettingViewContainer* iPSUIContainer; + // Handle to main view + CPSUIGSPlugin* iMainView; // not owned + }; + +#endif // PSUIGSPLUGINSETTINGVIEW_H +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuigspluginsettingviewcontainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuigspluginsettingviewcontainer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2006 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: Header for Presence Settings UI setting view container. +* +*/ + + + + +#ifndef PSUIGSPLUGINSETTINGVIEWCONTAINER_H +#define PSUIGSPLUGINSETTINGVIEWCONTAINER_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS +class CAknColumnListBox; +class CPSUIGSPluginSettingView; + +// CLASS DECLARATION + +/** +* CPSUIGSPluginSettingViewContainer container class +* @since Series60_3.2 +*/ +class CPSUIGSPluginSettingViewContainer : + public CAknSettingItemList + { + public: // Constructors and destructor + + /** + * Default constructor. + */ + CPSUIGSPluginSettingViewContainer( CPSUIGSPluginSettingView* aView ); + + /** + * Destructor. + */ + ~CPSUIGSPluginSettingViewContainer(); + + private: // Functions from base classes + + /** + * From CAknSettingItemList + * See base class. + */ + CAknSettingItem* CreateSettingItemL( TInt aSettingId ); + + /** + * From CCoeControl + * See base class. + */ + void GetHelpContext( TCoeHelpContext& aContext ) const; + + /** + * From CCoeControl + * See base class. + */ + void HandleResourceChange(TInt aType); + + /** + * From CCoeControl + * See base class. + */ + void SizeChanged(); + + private: // New + + /** + * Update titlepane with setting name + * + * @param none + */ + void UpdateTitleL(); + + public: // Functions from base classes + + /** + * From CAknSettingItemList + * See base class. + */ + void EditItemL( TInt aIndex, TBool aCalledFromMenu ); + + public: // New + + /** + * Edit setting which is currently under focus. + * + * @param none + */ + void EditCurrentItemL(); + + public: // Constructor + + /** + * Symbian OS constructor. + * + * @param aRect Listbox's rect. + */ + void ConstructL( const TRect& aRect ); + + private: // Data + + // Pointer to view + CPSUIGSPluginSettingView* iView; + }; + +#endif //PSUIGSPLUGINSETTINGVIEWCONTAINER_H +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuiintegersettingitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuiintegersettingitem.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2006 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: Setting item for integer values +* +*/ + + + + +#ifndef PSUIINTEGERSETTINGITEM_H +#define PSUIINTEGERSETTINGITEM_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +// CLASS DECLARATION + +/** +* CPSUIIntegerSettingItem setting class. Needed to be able to +* keep default values invisible. +* @since Series60_3.2 +*/ +class CPSUIIntegerSettingItem : public CAknIntegerEdwinSettingItem + { + public : // Constructors and destructor + + /* + * C++ default constructor. + */ + CPSUIIntegerSettingItem( TInt aIdentifier, TInt& aValue ); + + /** + * Destructor + */ + ~CPSUIIntegerSettingItem(); + + private: // Functions from base classes + + /** + * From CAknSettingItem + * See base class. + */ + virtual const TDesC& SettingTextL(); + + /** + * From CAknSettingItem + * See base class. + */ + virtual void CompleteConstructionL(); + + private: // Data + + // since no access to base classes descriptors, + // here are similar ones + HBufC* iPSUIInternalText; + TPtr iPSUIInternalTextPtr; + }; + +#endif //PSUIINTEGERSETTINGITEM_H +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/inc/psuisipxdmsettingitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/inc/psuisipxdmsettingitem.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,110 @@ +/* +* Copyright (c) 2006 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: Setting item for SIP / XDM settings +* +*/ + + + + +#ifndef PSUISIPXDMSETTINGITEM_H +#define PSUISIPXDMSETTINGITEM_H + +// INCLUDES +#include + +// FORWARD DECLARATIONS + +// CLASS DECLARATION +class CPSUIGSPluginModel; + +/** +* CPSUISipXdmSettingItem setting class +* @since Series60_3.2 +*/ +class CPSUISipXdmSettingItem : public CAknSettingItem + { + + public: // Constructors and destructor + + /* + * C++ default constructor. + */ + CPSUISipXdmSettingItem( TInt aIdentifier, TInt& aId, CPSUIGSPluginModel* iPSModel ); + + /** + * Destructor + */ + ~CPSUISipXdmSettingItem(); + + private: // New + + /** + * Like in CAknSettingItem, but SIP specific. + */ + void EditSipItemL(); + + /** + * Like in CAknSettingItem, but XDM specific. + */ + void EditXdmItemL(); + + /** + * Launches the actual radio button setting dialog with data given. + * + * @param aIndex is currently selected setting + * @param aArray contains the settings to choose from + */ + void LaunchSettingDlgL( TInt& aIndex, CDesCArray* aArray ); + + private: // Functions from base classes + + /** + * From CAknSettingItem + * See base class. + */ + virtual void StoreL(); + + /** + * From CAknSettingItem + * See base class. + */ + virtual void LoadL(); + + /** + * From CAknSettingItem + * See base class. + */ + virtual const TDesC& SettingTextL(); + + /** + * From CAknSettingItem + * See base class. + */ + virtual void EditItemL( TBool aCalledFromMenu ); + + protected: // Data + + // reference to external value + TInt& iExtChosenSettingID; + // internal value + TInt iIntChosenSettingID; + // pointer to PSUI model + CPSUIGSPluginModel* iPSModel;// owned elsewhere + // internal text having the listbox text + HBufC* iPSUIInternalText;// owned +}; + +#endif //PSUISIPXDMSETTINGITEM_H +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/loc/psuigsplugin.loc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/loc/psuigsplugin.loc Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,197 @@ +/* +* Copyright (c) 2006 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: Localisation strings for Presence Settings UI +* +*/ + + + + + +///////////////////////////////////////////////// +// Main view related + +// d:Title shown in title pane of main state. +// l:title_pane_t2/opt9 +// r:3.2 +// +#define qtn_presence_settings_title "Presence settings" + +// d:This is shown in listbox when no settings are defined. Primary text. +// l:main_pane_empty_t1/opt2 +// r:3.2 +// +#define qtn_presence_settings_empty_primary "No presence settings" + +// d:This is shown in listbox when no settings are defined. Secondary text. +// l:main_list_empty_pane/opt2 +// r:3.2 +// +#define qtn_presence_settings_empty_secondary "Please contatct your service provider for Presence settings" + +// d:Command in options menu for editing one set of presence settings +// l:list_single_pane_t1_cp2 +// r:3.2 +// +#define qtn_presence_settings_edit "Edit" + +// d:Submenu in options menu for commands for creating new settings. +// l:list_single_pane_t1_cp2/opt3 +// r:3.2 +// +#define qtn_presence_settings_new "New settings" + +// d:Command in submenu for creating new settings based on default settings. +// l:list_single_popup_submenu_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_new_default "Default settings" + +// d:Command in submenu for creating new settings based on settings chosen by user. +// l:list_single_popup_submenu_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_new_existing "Use existing" + +// d:Command in options menu for deleting one setting set. +// l:list_single_pane_t1_cp2 +// r:3.2 +// +#define qtn_presence_settings_delete "Delete" + +// d:Title of listbox when selecting which set to copy as a base of new settings. +// l:heading_pane_t1 +// r:3.2 +// +#define qtn_presence_propmt_use_exist "Use existing set" + + +///////////////////////////////////////////////// +// Setting view related + +// d:Command in options menu for changing setting values. +// l:list_single_pane_t1_cp2 +// r:3.2 +// +#define qtn_presence_settings_change "Change" + +// d:Title for the service name setting field in setting listbox. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_name "Service Name" + +// d:Title of chosen SIP profile -setting field in setting listbox. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_sip_profile "SIP Profile" + +// d:Title of chosen XDM settings -setting field in setting listbox. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_xdm_settings "XDM Settings" + +// d:Title of object size -setting field in setting listbox. This defines +// d:the maximum size of the MIME object data in bytes when PUBLISH and NOTIFY methods are used. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_object_size "Object size" + +// d:Title of server address -setting field in setting listbox. This +// d:defines the HTTP URL of the content server. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_url "Server address" + +// d:Title of publishing interval -setting field in setting listbox. This defines +// d:the minimum time interval (in seconds) between two consecutive publications. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_time_interval "Publishing interval (sec)" + +// d:Title of maximum subscriptions -setting field in setting listbox. This +// d:defines the maximum number of presence subscriptions. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_number_subscriptions "Maximum subscriptions" + +// d:Title of max contacts in list -setting field in setting listbox. This +// d:defines the maximum number of contacts in the subscription list. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_number_subsc_lists "Max. contacts in list" + +// d:Title for the domain name setting field in setting listbox. +// d:This defines the domain name part of the service URL including the at-sign. +// l:list_setting_pane_t1 +// r:3.2 +// +#define qtn_presence_settings_domain "Domain Name" + +// d:Confirmation query text for deleting the last setting set defined. +// l:popup_note_window +// r:3.2 +// +#define qtn_presence_settings_delete_last "%U is the last presence settings. Are you sure to delete it?" + +// d:Confirmation query text shown when trying to go back from edit view +// d:to main view (saves settings) without all the compulsory setting fields filled. +// l:popup_note_window +// r:3.2 +// +#define qtn_presence_settings_not_filled "Presence settings are incomplete. Delete created settings?" + +// d:Confirmation query text shown when trying to go back from edit view +// d:to main view (saves settings) and there are already a setting set named with same name. +// l:popup_note_window +// r:3.2 +// +#define qtn_presence_settings_name_exists "Name %U already in use" + + +///////////////////////////////////////////////// +// Both main and setting view related + +// d:Default name for the presence settings. +// d:Used in couple of different layouts and the smallest space available is in list_set_graphic_pane_t1. +// l:list_set_graphic_pane_t1 +// r:3.2 +// +#define qtn_presence_name_default "Default name" + +// d:Version with numbering if the default name for settings is already used. +// d:Used in couple of different layouts and the smallest space available is in list_set_graphic_pane_t1. +// l:list_set_graphic_pane_t1 +// r:3.2 +// +#define qtn_presence_name_default_number "Default name(%N)" + + +///////////////////////////////////////////////// +// Other + +// d:Title of presence settings in general settings/connection tab. +// l:list_single_large_graphic_pane_t1 +// r:3.2 +// +#define qtn_set_folder_presence "Presence" + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/rom/psuigsplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/rom/psuigsplugin.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,35 @@ +/* +* Copyright (c) 2006 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: ROM creation file for presence settings ui +* +*/ + + + + +#ifndef __PSUIGSPLUGIN_IBY__ +#define __PSUIGSPLUGIN_IBY__ + +#include + +#ifdef RD_GS_RENOVATION_PHASE2 +#ifdef __SIP_SIMPLE_PRESENCE_PROTOCOL + +ECOM_PLUGIN(psuigsplugin.dll,10281ef0.rsc) +data=DATAZ_/BITMAP_DIR/psuigsplugin.mif BITMAP_DIR/psuigsplugin.mif + +#endif RD_GS_RENOVATION_PHASE2 +#endif __SIP_SIMPLE_PRESENCE_PROTOCOL + +#endif //__PSUIGSPLUGIN_IBY__ diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/rom/psuigspluginresources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/rom/psuigspluginresources.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,34 @@ +/* +* Copyright (c) 2006 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: ROM creation file for presence settings ui resources +* +*/ + + + + +#ifndef __PSUIGSPLUGINRESOURCES_IBY__ +#define __PSUIGSPLUGINRESOURCES_IBY__ + +#include + +#ifdef RD_GS_RENOVATION_PHASE2 +#ifdef __SIP_SIMPLE_PRESENCE_PROTOCOL + +data=DATAZ_/RESOURCE_FILES_DIR/psuigspluginrsc.rsc RESOURCE_FILES_DIR/psuigspluginrsc.rsc + +#endif RD_GS_RENOVATION_PHASE2 +#endif __SIP_SIMPLE_PRESENCE_PROTOCOL + +#endif //__PSUIGSPLUGINRESOURCES_IBY__ diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuigsplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuigsplugin.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,561 @@ +/* +* Copyright (c) 2006-2010 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: GSFW implementation for Presence Settings UI GS plugin. +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "psuigsplugin.h" +#include "psuigsplugin.hrh" +#include "psuigsplugincontainer.h" +#include "psuigspluginids.hrh" +#include "psuigspluginmodel.h" +#include "psuigspluginsettingview.h" + +// CONSTANTS +_LIT( KPSUIGSPluginResourceFileName, "z:\\resource\\psuigspluginrsc.rsc" ); + +#ifdef __SCALABLE_ICONS +// bitmap +_LIT( KPSUIGSPluginIconFileName, "\\resource\\apps\\psuigsplugin.mif"); +#else //__SCALABLE_ICONS +// svg file +_LIT( KPSUIGSPluginIconFileName, "\\resource\\apps\\psuigsplugin.mbm"); +#endif //__SCALABLE_ICONS + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CPSUIGSPlugin() +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CPSUIGSPlugin::CPSUIGSPlugin() + : iClosing ( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::~CPSUIGSPlugin() +// Destructor +// --------------------------------------------------------------------------- +// +CPSUIGSPlugin::~CPSUIGSPlugin() + { + delete iPSModel; + FeatureManager::UnInitializeLib(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::ConstructL() + { + // preparing resources for use + TFileName fileName( KPSUIGSPluginResourceFileName ); + BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName ); + iResourceLoader.OpenL( fileName ); + // base construct (base needs the resources to be loaded 1st) + BaseConstructL( R_PSUI_MAIN_VIEW ); + FeatureManager::InitializeLibL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::NewL() +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CPSUIGSPlugin* CPSUIGSPlugin::NewL( TAny* /*aAppUi*/ ) + { + CPSUIGSPlugin* self = new( ELeave ) CPSUIGSPlugin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::Id() +// See header for details. +// --------------------------------------------------------------------------- +// +TUid CPSUIGSPlugin::Id() const + { + return TUid::Uid( PSUIGSPluginImplUid ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::NewContainerL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::NewContainerL() + { + iContainer = new ( ELeave ) CPSUIGSPluginContainer( this ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DoActivateL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DoActivateL( const TVwsViewId& aPrevViewId, + TUid aCustomMessageId, + const TDesC8& aCustomMessage ) + { + if ( KPreSettingViewId != aPrevViewId.iViewUid ) + { + iPSUIGSPrevViewId = aPrevViewId; + } + + // model & observer constructed only when needed + if ( !iPSModel ) + { + iPSModel = CPSUIGSPluginModel::NewL(); + iAppUi->AddViewDeactivationObserverL( this ); + } + + const TInt id = iPSModel->SettingsId(); + if ( id ) + {// readjust the focus + SetCurrentItem( iPSModel->SettingsIDArray().Find( id )); + } + + iClosing = EFalse; + CGSBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage ); + UpdateMSK(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DoDeactivate() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DoDeactivate() + { + CGSBaseView::DoDeactivate(); + if ( iClosing ) + {// PSUI plugin is going to be closed so it is safe to free some memory + delete iPSModel; + iPSModel = NULL; + delete iSettingView; + iSettingView = NULL; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleViewDeactivation() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleViewDeactivation( + const TVwsViewId& aViewIdToBeDeactivated, + const TVwsViewId& aNewlyActivatedViewId) + { + if ( TUid::Uid( PSUIGSPluginImplUid ) == aViewIdToBeDeactivated.iViewUid && + iPSUIGSPrevViewId.iViewUid == aNewlyActivatedViewId.iViewUid ) + { + iClosing = ETrue; + iAppUi->RemoveViewDeactivationObserver( this ); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleCommandL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EAknSoftkeyBack: + { + RemoveSettingView(); + iAppUi->ActivateLocalViewL( iPSUIGSPrevViewId.iViewUid ); + break; + } + case EPSUICmdEdit: + { + HandleListBoxSelectionL(); + break; + } + case EPSUICmdDelete: + { + DeleteSettingsL(); + break; + } + case EPSUICmdNewSettingsDefault: + { + CreateNewDefaultSettingsL(); + break; + } + case EPSUICmdNewSettingsExisting: + { + CreateCopyOfExistingSettingsL(); + break; + } + case EAknCmdHelp: + { + if( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + HlpLauncher::LaunchHelpApplicationL( + iEikonEnv->WsSession(), iAppUi->AppHelpContextL() ); + } + break; + } + default: + { + iAppUi->HandleCommandL( aCommand ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::SettingCountAndIndex() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPlugin::SettingCountAndIndex( TInt& aIndex ) + { + CEikTextListBox* listbox = Container()->iListBox;// not owned + TInt count = listbox->Model()->NumberOfItems(); + aIndex = count ? listbox->CurrentItemIndex() : KErrNotFound; + + return count; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleListBoxSelectionL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleListBoxSelectionL() + { + TInt index = KErrNotFound; + if ( SettingCountAndIndex( index )) + { + iPSModel->EditSettingsL( index ); + + ConstructSettingViewL(); + iAppUi->ActivateLocalViewL( KPreSettingViewId ); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DeleteSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DeleteSettingsL() + { + TInt index = KErrNotFound; + TInt count = SettingCountAndIndex( index ); + if ( count ) + { + if ( AcceptDeletionL( count, index )) + { + iPSModel->DeleteSettingsL( index, ETrue ); + CEikTextListBox* listbox = Container()->iListBox;// not owned + AknListBoxUtils::HandleItemRemovalAndPositionHighlightL( + listbox, index, ETrue ); + listbox->DrawNow(); + UpdateMSK(); + } + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::AcceptDeletionL() +// See header for details. +// --------------------------------------------------------------------------- +// +TBool CPSUIGSPlugin::AcceptDeletionL( TInt aCount, TInt aIndex ) + { + HBufC* currentName = iPSModel->SettingNameLC( aIndex ); + HBufC* string = NULL; + if ( aCount == 1 ) + { + string = StringLoader::LoadLC( R_QTN_PRESENCE_SETTINGS_DELETE_LAST, *currentName ); + } + else + { + string = StringLoader::LoadLC( R_QTN_QUERY_COMMON_CONF_DELETE, *currentName ); + } + + CAknQueryDialog* query = CAknQueryDialog::NewL( CAknQueryDialog::EConfirmationTone ); + TInt ok = query->ExecuteLD( R_PSUI_CONF_QUERY, *string ); + + CleanupStack::PopAndDestroy( 2, currentName );//currentName, string + + return ( ok ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::GetCaptionL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::GetCaptionL( TDes& aCaption ) const + { + StringLoader::Load( aCaption, R_QTN_SET_FOLDER_PRESENCE ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::PluginProviderCategory() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPlugin::PluginProviderCategory() const + { + return KGSPluginProviderInternal; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CreateIconL() +// See header for details. +// --------------------------------------------------------------------------- +// +CGulIcon* CPSUIGSPlugin::CreateIconL( const TUid aIconType ) + { + CGulIcon* icon = NULL; + if( aIconType == KGSIconTypeLbxItem ) + { + icon = AknsUtils::CreateGulIconL( + AknsUtils::SkinInstance(), + KAknsIIDQgnPropSetConnPresence, + KPSUIGSPluginIconFileName, + EMbmPsuigspluginQgn_prop_set_conn_presence, + EMbmPsuigspluginQgn_prop_set_conn_presence_mask ); + } + else + { + icon = CGSPluginInterface::CreateIconL( aIconType ); + } + + return icon; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::DynInitMenuPaneL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane *aMenuPane ) + { + // remove some of the items if no settings available + const TInt count = Container()->iListBox->Model()->NumberOfItems(); + if ( aResourceId == R_PSUI_MAINVIEW_MENUPANE && + 0 == count ) + { + aMenuPane->DeleteMenuItem( EPSUICmdEdit ); + aMenuPane->DeleteMenuItem( EPSUICmdDelete ); + } + if ( aResourceId == R_PSUI_NEWSETTINGS_MENU && + 0 == count ) + { + aMenuPane->DeleteMenuItem( EPSUICmdNewSettingsExisting ); + } + + // help-item handling + if ( aResourceId == R_PSUI_MAINVIEW_MENUPANE && + !FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + aMenuPane->DeleteMenuItem( EAknCmdHelp ); + } + + TInt index( KErrNotFound ); + SettingCountAndIndex( index ); + + if ( KErrNotFound < index ) + { + // Hide delete option if sip profile used with presence settings + // is registered. + if ( iPSModel->IsSipProfileRegisteredL( index ) ) + { + TInt pos( KErrNotFound ); + if ( aMenuPane->MenuItemExists( EPSUICmdDelete, pos ) ) + { + aMenuPane->SetItemSpecific( EPSUICmdDelete, EFalse ); + aMenuPane->SetItemDimmed( EPSUICmdDelete, ETrue ); + } + } + else + { + TInt pos( KErrNotFound ); + if ( aMenuPane->MenuItemExists( EPSUICmdDelete, pos ) ) + { + aMenuPane->SetItemSpecific( EPSUICmdDelete, ETrue ); + aMenuPane->SetItemDimmed( EPSUICmdDelete, EFalse ); + } + } + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::PSModel() +// See header for details. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginModel* CPSUIGSPlugin::PSModel() + { + __ASSERT_DEBUG( iPSModel,User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound )); + return iPSModel; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::ConstructSettingViewL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::ConstructSettingViewL() + { + if ( !iSettingView ) + {// no view yet, construct it + CAknView* view = CPSUIGSPluginSettingView::NewL( this ); + CleanupStack::PushL( view ); + iAppUi->AddViewL( view ); + CleanupStack::Pop( view ); + iSettingView = view; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::RemoveSettingView() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::RemoveSettingView() + { + // Remove view from iAppUi -> View is deleted by iAppUi automatically. + if ( iSettingView ) + { + iAppUi->RemoveView( KPreSettingViewId ); + iSettingView = NULL; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CreateNewDefaultSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::CreateNewDefaultSettingsL() + { + iPSModel->CreateDefaultSettingsL(); + ConstructSettingViewL(); + iAppUi->ActivateLocalViewL( KPreSettingViewId ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::CreateCopyOfExistingSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::CreateCopyOfExistingSettingsL() + { + CAknSinglePopupMenuStyleListBox* list = + new ( ELeave ) CAknSinglePopupMenuStyleListBox; + CleanupStack::PushL( list ); + + CAknPopupList* popupList = + CAknPopupList::NewL( list, R_AVKON_SOFTKEYS_OK_CANCEL ); + CleanupStack::PushL( popupList ); + + HBufC* title = StringLoader::LoadLC( R_QTN_PRESENCE_PROPMT_USE_EXIST ); + popupList->SetTitleL( *title ); + CleanupStack::PopAndDestroy( title ); + + list->ConstructL( popupList, CEikListBox::ELeftDownInViewRect ); + list->CreateScrollBarFrameL( ETrue ); + list->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, + CEikScrollBarFrame::EAuto ); + + CTextListBoxModel* model = list->Model(); + model->SetItemTextArray( iPSModel->SettingNames() );// setting names not owned + model->SetOwnershipType( ELbmDoesNotOwnItemArray ); + list->HandleItemAdditionL(); + + CleanupStack::Pop( popupList ); + TInt keyPress = popupList->ExecuteLD(); + + if ( keyPress ) + { + iPSModel->DuplicateExistingSettingsL( list->CurrentItemIndex() ); + ConstructSettingViewL(); + iAppUi->ActivateLocalViewL( KPreSettingViewId ); + } + + CleanupStack::PopAndDestroy( list ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::UpdateMSK() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::UpdateMSK() + { + if ( !Cba() ) + { + return; + } + + TBool showEdit = ( 0 < Container()->iListBox->Model()->NumberOfItems()); + CEikCba* cba = static_cast< CEikCba* >( Cba()->ButtonGroup() ); + cba->MakeCommandVisible( EPSUICmdEdit, showEdit ); + cba->DrawNow(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPlugin::HandleListBoxEventL() +// --------------------------------------------------------------------------- +// +void CPSUIGSPlugin::HandleListBoxEventL( + CEikListBox* /*aListBox*/, TListBoxEvent aListBoxEvent) + { + // if the Select Key has been pressed + if ((aListBoxEvent == MEikListBoxObserver::EEventEnterKeyPressed) || + (aListBoxEvent == MEikListBoxObserver::EEventItemSingleClicked)) + { + HandleListBoxSelectionL(); + } + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuigsplugincontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuigsplugincontainer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,142 @@ +/* +* Copyright (c) 2006 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: Presence Settings UI GS plugin container implementation +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include "psuigsplugincontainer.h" +#include "psuigspluginmodel.h" +#include "psuigsplugin.h" +#include "psuigspluginids.hrh" +#include + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUIGSPluginContainer::CPSUIGSPluginContainer() +// Default constructor. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginContainer::CPSUIGSPluginContainer( CPSUIGSPlugin* aView ) + : iView ( aView ) + { + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginContainer::ConstructL(const TRect& aRect) +// Symbian OS phase 2 constructor +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginContainer::ConstructL( const TRect& aRect ) + { + iListBox = new ( ELeave ) CAknSingleStyleListBox();// base needs the iListBox to be prepared 1st + BaseConstructL( aRect, R_PSUI_MAINVIEW_TITLE, 0 );// last parameter 0, since dynamic listbox + + iEikMenuBar = new ( ELeave ) CEikMenuBar(); + iEikMenuBar->ConstructL( this, NULL, R_PSUI_MAINVIEW_MENUBAR ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginContainer::~CPSUIGSPluginContainer() +// Destructor +// --------------------------------------------------------------------------- +// +CPSUIGSPluginContainer::~CPSUIGSPluginContainer() + { + delete iEikMenuBar; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginContainer::ConstructListBoxL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginContainer::ConstructListBoxL( TInt /*aResLbxId*/ ) + { + // listbox creation and initialization + iListBox->SetContainerWindowL( *this ); + iListBox->ConstructL( this, EAknListBoxLoopScrolling ); + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + SetEmptyTextsToListboxL(); + + CPSUIGSPluginModel* psuiModel = iView->PSModel();// not owned + CTextListBoxModel* model = iListBox->Model(); + model->SetItemTextArray( psuiModel ); + model->SetOwnershipType( ELbmDoesNotOwnItemArray ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginContainer::SetEmptyTextsToListboxL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginContainer::SetEmptyTextsToListboxL() + { + // empty texts + _LIT ( KPSUIEmptyStringHeader, "%S\n%S" ); + HBufC* emptyText = iEikonEnv->AllocReadResourceLC( + R_QTN_PRESENCE_SETTINGS_EMPTY_PRIMARY ); + HBufC* emptyText2 = iEikonEnv->AllocReadResourceLC( + R_QTN_PRESENCE_SETTINGS_EMPTY_SECONDARY ); + HBufC* emptyFinal = HBufC::NewLC( + emptyText->Length() + emptyText2->Length() + 2 );// 2 is length of "\n" + emptyFinal->Des().Format( KPSUIEmptyStringHeader, emptyText, emptyText2 ); + iListBox->View()->SetListEmptyTextL( *emptyFinal ); + CleanupStack::PopAndDestroy( 3, emptyText );// emptyText, emptyText2, emptyFinal + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginContainer::OfferKeyEventL() +// See header for details. +// --------------------------------------------------------------------------- +// +TKeyResponse CPSUIGSPluginContainer::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if ( iView && aType == EEventKey + && aKeyEvent.iCode == EKeyBackspace && + iEikMenuBar->ItemSpecificCommandsEnabled() ) + { + iView->DeleteSettingsL(); + return EKeyWasConsumed; + } + else + { + return iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + } + +// ----------------------------------------------------------------------------- +// CPSUIGSPluginContainer::GetHelpContext() +// See header for details. +// ----------------------------------------------------------------------------- +// +void CPSUIGSPluginContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = TUid::Uid( PSUIGSPluginDllUid ); + aContext.iContext = KPRE_HLP_LIST_VIEW; + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuigspluginimplementationtable.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuigspluginimplementationtable.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2006 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: +* ECOM proxy table for this plugin +* +*/ + + + + +// System includes +#include +#include +#include "psuigspluginids.hrh" +#include "psuigsplugin.h" + +// Constants +const TImplementationProxy PSUIGSPluginImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( PSUIGSPluginImplUid, CPSUIGSPlugin::NewL ) + }; + +// --------------------------------------------------------------------------- +// ImplementationGroupProxy +// Gate/factory function +// +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + aTableCount = sizeof( PSUIGSPluginImplementationTable ) + / sizeof( TImplementationProxy ); + return PSUIGSPluginImplementationTable; + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuigspluginmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuigspluginmodel.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,877 @@ +/* +* Copyright (c) 2006-2010 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: Presence settings UI model implementation. +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "psuigspluginmodel.h" + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::CPSUIGSPluginModel() +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginModel::CPSUIGSPluginModel() + { + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::~CPSUIGSPluginModel() +// Destructor +// --------------------------------------------------------------------------- +// +CPSUIGSPluginModel::~CPSUIGSPluginModel() + { + delete iSIPEngine; + if ( iSIPProfiles ) + { + iSIPProfiles->ResetAndDestroy(); + delete iSIPProfiles; + } + + iXdmIdArray.Close(); + delete iXdmNameArray; + + iPSIdArray.Close(); + delete iPSNameArray; + delete iVisibleSettingName; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::ConstructL() + { + RetrieveSettingsL(); + ReadSipArrayFromEngineL(); + iVisibleSettingName = HBufC::NewL( + KPresSetNameMaxLength + 2 );// max chars + KColumnListSeparator + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::NewL() +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginModel* CPSUIGSPluginModel::NewL() + { + CPSUIGSPluginModel* self = new ( ELeave ) CPSUIGSPluginModel(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); // self + return self; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::RetrieveSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::RetrieveSettingsL() + { + RefreshPSArraysL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SaveSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::SaveSettingsL() + { + if ( iSettingId == 0 ) + {// new settings + iSettingId = PresSettingsApi::CreateSetL( iSettingSet ); + } + else + {// old & edited settings + PresSettingsApi::UpdateSetL( iSettingSet, iSettingId ); + } + RefreshPSArraysL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::CreateDefaultSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::CreateDefaultSettingsL() + { + iSettingId = 0; // new settings + + iSettingSet.iSetName.Zero(); + HBufC* name = CreateSettingNameLC(); + iSettingSet.iSetName.Append( *name ); + CleanupStack::PopAndDestroy( name );// name + + iSettingSet.iSipProfile = KErrNotFound; + iSettingSet.iXDMSetting = KErrNotFound; + iSettingSet.iObjectSize = KErrNotFound; + iSettingSet.iContSrvrAdd.Zero(); + iSettingSet.iPublicationInt = KErrNotFound; + iSettingSet.iMaxSubscriptions = KErrNotFound; + iSettingSet.iMaxContactsInList = KErrNotFound; + iSettingSet.iDomainSyntax.Zero(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::DuplicateExistingSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::DuplicateExistingSettingsL( TInt aIndex ) + { + __ASSERT_DEBUG( aIndex < iPSIdArray.Count() ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow )); + + iSettingId = 0; // new settings + TPresSettingsSet originalSettings; + PresSettingsApi::SettingsSetL( iPSIdArray[ aIndex ], originalSettings ); + + iSettingSet.iSetName.Zero(); + HBufC* name = CreateSettingNameLC( originalSettings.iSetName.AllocL() ); + iSettingSet.iSetName.Append( *name ); + CleanupStack::PopAndDestroy( name );// name + + iSettingSet.iSipProfile = originalSettings.iSipProfile; + iSettingSet.iXDMSetting = originalSettings.iXDMSetting; + iSettingSet.iObjectSize = originalSettings.iObjectSize; + iSettingSet.iContSrvrAdd = originalSettings.iContSrvrAdd; + iSettingSet.iPublicationInt = originalSettings.iPublicationInt; + iSettingSet.iMaxSubscriptions = originalSettings.iMaxSubscriptions; + iSettingSet.iMaxContactsInList = originalSettings.iMaxContactsInList; + iSettingSet.iDomainSyntax = originalSettings.iDomainSyntax; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::AllCompulsoryFieldsFilled() +// See header for details. +// --------------------------------------------------------------------------- +// +TBool CPSUIGSPluginModel::AllCompulsoryFieldsFilled() + { + TBool returnValue = ETrue; + for ( TInt i = EPSUIServerNameId ; i <= EPSUIDomainSyntaxId && returnValue ; i++ ) + { + switch( i ) + { + case EPSUIServerNameId: + returnValue = ( iSettingSet.iSetName.Length() != 0 ); + break; + case EPSUISIPProfileId: + returnValue = ( iSettingSet.iSipProfile != KErrNotFound ); + break; + case EPSUIObjectSizeId: + returnValue = ( iSettingSet.iObjectSize != KErrNotFound ); + break; + case EPSUIDomainSyntaxId: + returnValue = ( iSettingSet.iDomainSyntax.Length() != 0 ); + break; + default: + // do nothing with non-compulsory ones + break; + } + } + return returnValue; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::IsItDuplicatePSName() +// See header for details. +// --------------------------------------------------------------------------- +// +TBool CPSUIGSPluginModel::IsItDuplicatePSName() + { + TBool found = KErrNone; + TInt pos = 0; + found = ( iPSNameArray->Find( iSettingSet.iSetName, pos ) == KErrNone ); + if ( found ) + {// dupe found, let's check it's not the same setting + __ASSERT_DEBUG( pos < iPSIdArray.Count() ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow )); + found = !( iSettingId == iPSIdArray[ pos ]); + } + return found; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::EditSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::EditSettingsL( TInt aIndex ) + { + __ASSERT_DEBUG( aIndex < iPSIdArray.Count() ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow )); + TInt settingId = iPSIdArray[ aIndex ]; + PresSettingsApi::SettingsSetL( settingId, iSettingSet ); + iSettingId = settingId; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::DeleteSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::DeleteSettingsL( TInt aToBeDeleted, TBool aIsIndex ) + { + if ( aIsIndex ) + {// is index + __ASSERT_DEBUG( aToBeDeleted < iPSIdArray.Count() , + User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow )); + PresSettingsApi::RemoveSetL( iPSIdArray[ aToBeDeleted ]); + CleanServiceProviderSettingsDataL( iPSIdArray[ aToBeDeleted ] ); + } + else + {// is id + PresSettingsApi::RemoveSetL( aToBeDeleted ); + CleanServiceProviderSettingsDataL( aToBeDeleted ); + } + RefreshPSArraysL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::RefreshPSArraysL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::RefreshPSArraysL() + { + delete iPSNameArray; + iPSNameArray = NULL; + iPSIdArray.Reset(); + + iPSNameArray = PresSettingsApi::GetAllSetsNamesLC( iPSIdArray ); + CleanupStack::Pop( iPSNameArray );// iPSNameArray + ReArrangePresenceSettingsL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::ReArrangePresenceSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::ReArrangePresenceSettingsL() + { + const TInt settingsCount = iPSNameArray->Count(); + __ASSERT_DEBUG( + settingsCount == iPSIdArray.Count(), + User::Panic( KPSUIGSPluginPanicCategory, KErrArgument )); + + // make a tables of the original pairs + RPointerArray pairArray; + TCleanupItem clItem( ResetAndDestroy, &pairArray ); + CleanupStack::PushL( clItem ); + CPSUINameIDPair* pair = NULL; + for( TInt i = 0;i < settingsCount;i++ ) + { + pair = new ( ELeave ) CPSUINameIDPair; + CleanupStack::PushL( pair ); + pair->iID = iPSIdArray[ i ]; + pair->iName = iPSNameArray->MdcaPoint( i ).AllocL(); + pairArray.AppendL( pair ); + CleanupStack::Pop( pair );// pair is in array's responsibility now + } + + // sort the original + iPSNameArray->Sort( ECmpCollated ); + + // re-arrange the iPSIdArray based on order of iPSNameArray + iPSIdArray.Reset(); + for( TInt i = 0;i < settingsCount;i++ ) + { + for( TInt ii = 0;ii < pairArray.Count();ii++ ) + { + if ( !iPSNameArray->MdcaPoint( i ).Compare( + *pairArray[ii]->iName )) + { + iPSIdArray.AppendL( pairArray[ii]->iID ); + delete pairArray[ii]; + pairArray.Remove(ii); + break;// no need to go through if already found + } + } + } + CleanupStack::PopAndDestroy( &pairArray ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::CleanServiceProviderSettingsDataL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::CleanServiceProviderSettingsDataL( TInt aPresenceId ) + { + CSPSettings* spSettings = CSPSettings::NewLC(); + + RArray serviceIds; + CleanupClosePushL( serviceIds ); + spSettings->FindServiceIdsL( serviceIds ); + + for ( TInt i( 0 ) ; i < serviceIds.Count() ; i++ ) + { + CSPEntry* spEntry = CSPEntry::NewLC(); + CSPProperty* property1 = CSPProperty::NewLC(); + + TInt err = spSettings->FindPropertyL( + serviceIds[ i ], + ESubPropertyPresenceSettingsId, + *property1 ); + + if ( KErrNone == err ) + { + User::LeaveIfError( + spSettings->FindEntryL( serviceIds[ i ], *spEntry ) ); + + TInt presenceId( 0 ); + User::LeaveIfError( property1->GetValue( presenceId ) ); + + if ( presenceId == aPresenceId ) + { + // Delete all presence related properties from services which + // has this presence id (ESubPropertyPresenceSettingsId). + RPropertyNameArray propertyNameArray; + CleanupClosePushL( propertyNameArray ); + RPropertyNameArray propertyNameArrayToBeDeleted; + CleanupClosePushL( propertyNameArrayToBeDeleted ); + + // presence properties to be removed if found + propertyNameArray.Append( EPropertyPCSPluginId ); + propertyNameArray.Append( EPropertyPresenceSubServicePluginId ); + propertyNameArray.Append( ESubPropertyPresenceSettingsId ); + propertyNameArray.Append( ESubPropertyPresencePreferredSNAPId ); + propertyNameArray.Append( ESubPropertyPresencePreferredIAPId ); + propertyNameArray.Append( ESubPropertyPresencePresentityIDFieldType ); + propertyNameArray.Append( ESubPropertyPresenceLaunchMethod ); + propertyNameArray.Append( ESubPropertyPresenceLaunchUid ); + propertyNameArray.Append( ESubPropertyPresenceAddrScheme ); + propertyNameArray.Append( ESubPropertyPresenceEnabled ); + propertyNameArray.Append( ESubPropertyPresenceRequestPreference ); + + for ( TInt j( 0 ) ; j < propertyNameArray.Count() ; j++ ) + { + CSPProperty* property2 = CSPProperty::NewLC(); + + TInt err = spSettings->FindPropertyL( + serviceIds[ i ], + propertyNameArray[ j ], + *property2 ); + + // if property found add to be deleted array + if ( !err ) + { + propertyNameArrayToBeDeleted.Append( + propertyNameArray[ j ] ); + } + + CleanupStack::PopAndDestroy( property2 ); + } + + spSettings->DeleteServicePropertiesL( + serviceIds[ i ], propertyNameArrayToBeDeleted ); + + CleanupStack::PopAndDestroy( &propertyNameArrayToBeDeleted ); + CleanupStack::PopAndDestroy( &propertyNameArray ); + } + } + + CleanupStack::PopAndDestroy( property1 ); + CleanupStack::PopAndDestroy( spEntry ); + } + + CleanupStack::PopAndDestroy( &serviceIds ); + CleanupStack::PopAndDestroy( spSettings ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::MdcaCount() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPluginModel::MdcaCount() const + { + return iPSNameArray->MdcaCount(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::MdcaPoint() +// See header for details. +// --------------------------------------------------------------------------- +// +TPtrC16 CPSUIGSPluginModel::MdcaPoint( TInt aIndex ) const + { + TPtr tempText = iVisibleSettingName->Des(); + tempText.Zero(); + tempText.Append( KColumnListSeparator ); + tempText.Append( iPSNameArray->MdcaPoint( aIndex )); + + return tempText; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::CreateSettingNameLC() +// See header for details. +// --------------------------------------------------------------------------- +// +HBufC* CPSUIGSPluginModel::CreateSettingNameLC( HBufC* aOriginalName ) + { + _LIT( KPSUIGSPluginNumbering, "(%N)" ); + const TInt KPSUIFormattingExtraLength = 6; + + // prepare + HBufC* settingName = aOriginalName ? + aOriginalName : + StringLoader::LoadL( R_QTN_PRESENCE_NAME_DEFAULT ); + + if ( settingName->Length() + KPSUIFormattingExtraLength > KPresSetNameMaxLength ) + {//if there is no room for duplicate-numbering, let user take care of that when saving settings + CleanupStack::PushL( settingName ); + return settingName; + } + + settingName = settingName->ReAlloc( + settingName->Length() + KPSUIFormattingExtraLength );// enough for formatting + CleanupStack::PushL( settingName ); + HBufC* tempSetName = NULL; + TInt pos = 0;// used as dummy + TInt found = 0; + TInt index = 1; + TPtr ptr = settingName->Des(); + + // do the actual checking of name + found = iPSNameArray->Find( *settingName, pos ); + while ( found == 0 ) + { + if ( !tempSetName ) + { + if ( aOriginalName ) + {// aOriginalName given + tempSetName = GetPrefixL( settingName ); + tempSetName = tempSetName->ReAlloc( + tempSetName->Length() + KPSUIFormattingExtraLength );// enough for formatting + CleanupStack::PushL( tempSetName ); + tempSetName->Des().Append( KPSUIGSPluginNumbering ); + } + else + {// aOriginalName not given + tempSetName = StringLoader::LoadLC( R_QTN_PRESENCE_NAME_DEFAULT_NUMBER ); + } + } + StringLoader::Format( ptr, *tempSetName, -1, index ); + found = iPSNameArray->Find( *settingName, pos ); + index++; + } + + // cleanup + if ( tempSetName ) + { + CleanupStack::PopAndDestroy( tempSetName ); //tempSetName + } + + return settingName; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::GetPrefixL() +// See header for details. +// --------------------------------------------------------------------------- +// +HBufC* CPSUIGSPluginModel::GetPrefixL( HBufC* aName ) + { + TPtrC prefix = aName->Des(); + TInt lastBrace = aName->LocateReverse('('); + if ( lastBrace != KErrNotFound ) + { + // aName looks like "". + // See if is an integer number and + // ends to a brace. + TPtrC num = aName->Right( aName->Length() - lastBrace - 1 ); + TInt val; + TLex lex( num ); + if ( lex.Val( val ) == KErrNone && num.Locate(')') == num.Length() - 1 ) + { + // Yes, the trailer is an integer. + prefix.Set( aName->Left( lastBrace ) ); + } + } + return prefix.AllocL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::CurrentSettingName() +// See header for details. +// --------------------------------------------------------------------------- +// +HBufC* CPSUIGSPluginModel::SettingNameLC( TInt aIndex ) + { + return iPSNameArray->MdcaPoint( aIndex ).AllocLC(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SettingNames() +// See header for details. +// --------------------------------------------------------------------------- +// +CDesCArray* CPSUIGSPluginModel::SettingNames() + { + return iPSNameArray;// ownership stays in CPSUIGSPluginModel + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SettingsSet() +// See header for details. +// --------------------------------------------------------------------------- +// +TPresSettingsSet& CPSUIGSPluginModel::SettingsSet() + { + return iSettingSet; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::ClearInvalidSIPAndXDMSettingsL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::ClearInvalidSIPAndXDMSettingsL() + { + // SIP + ReadSipArrayFromEngineL(); + if ( iSettingSet.iSipProfile != KErrNotFound && + KErrNotFound == SipProfileIndex( iSettingSet.iSipProfile )) + { + iSettingSet.iSipProfile = KErrNotFound; + } + // XDM + XdmCollectionNamesL(); + if ( iSettingSet.iXDMSetting != KErrNotFound && + KErrNotFound == XdmSettingIndex( iSettingSet.iXDMSetting )) + { + iSettingSet.iXDMSetting = KErrNotFound; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SettingsId() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt& CPSUIGSPluginModel::SettingsId() + { + return iSettingId; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SettingsIDArray() +// See header for details. +// --------------------------------------------------------------------------- +// +RArray& CPSUIGSPluginModel::SettingsIDArray() + { + return iPSIdArray; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SipProfilesLC() +// See header for details. +// --------------------------------------------------------------------------- +// +CDesCArray* CPSUIGSPluginModel::SipProfilesLC() + { + ReadSipArrayFromEngineL(); + CDesCArray* array = new ( ELeave ) CDesCArrayFlat( 2 ); + CleanupStack::PushL( array ); + const TInt arrayCount = iSIPProfiles->Count(); + for ( TInt i = 0; i < arrayCount; i++ ) + { + const TDesC8* profileName; + iSIPProfiles->At( i )->GetParameter( KSIPProviderName, profileName ); + HBufC* profileName16 = + EscapeUtils::ConvertToUnicodeFromUtf8L( *profileName ); + CleanupStack::PushL( profileName16 ); + array->AppendL( profileName16->Des() ); + CleanupStack::PopAndDestroy( profileName16 );// profileName16 + } + return array; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SipProfileId() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPluginModel::SipProfileId( TInt aIndex ) + { + __ASSERT_DEBUG( iSIPProfiles, User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound )); + + TUint32 id = 0; + if ( aIndex < iSIPProfiles->Count()) + { + iSIPProfiles->At( aIndex )->GetParameter( KSIPProfileId, id ); + } + + __ASSERT_DEBUG( id < KMaxTInt ,User::Panic( KPSUIGSPluginPanicCategory, KErrOverflow )); + return id ? TInt( id ) : KErrNotFound; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SipProfileIndex() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPluginModel::SipProfileIndex( TInt aId ) + { + __ASSERT_DEBUG( iSIPProfiles, User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound )); + const TInt arrayCount = iSIPProfiles->Count(); + TUint32 idValue = aId; + for ( TInt i = 0; i < arrayCount; i++ ) + { + TUint32 tempValue; + iSIPProfiles->At( i )->GetParameter( KSIPProfileId, tempValue ); + if ( tempValue == idValue ) + { + return i; + } + } + return KErrNotFound; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::SipProfileNameL() +// See header for details. +// --------------------------------------------------------------------------- +// +HBufC* CPSUIGSPluginModel::SipProfileNameL( TInt aId ) + { + const TInt arrayCount = iSIPProfiles->Count(); + TUint32 idValue = aId; + for ( TInt i = 0; i < arrayCount; i++ ) + { + TUint32 tempValue; + iSIPProfiles->At( i )->GetParameter( KSIPProfileId, tempValue ); + if ( tempValue == idValue ) + { + const TDesC8* profileName; + iSIPProfiles->At( i )->GetParameter( KSIPProviderName, profileName ); + return EscapeUtils::ConvertToUnicodeFromUtf8L( *profileName );// name found + } + } + return HBufC::NewL( 0 );// name not found + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::IsSipProfileRegisteredL() +// See header for details. +// --------------------------------------------------------------------------- +// +TBool CPSUIGSPluginModel::IsSipProfileRegisteredL( TInt aIndex ) + { + TBool registered( EFalse ); + TInt sipProfileId = SipProfileId( aIndex ); + const TInt arrayCount = iSIPProfiles->Count(); + + for ( TInt i = 0; i < arrayCount; i++ ) + { + TUint32 tempValue; + iSIPProfiles->At( i )->GetParameter( KSIPProfileId, tempValue ); + + if ( tempValue == sipProfileId ) + { + iSIPProfiles->At( i )->GetParameter( + KSIPProfileRegistered, registered ); + } + } + + return registered; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::ReadSipArrayFromEngineL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::ReadSipArrayFromEngineL() + { + RArray array; + CleanupClosePushL( array ); + + if ( !iSIPEngine ) + { + iSIPEngine = CSIPManagedProfileRegistry::NewL( *this ); + } + + // Get the supported profile types + iSIPEngine->SupportedProfileTypesL( array ); + + // check iSIPProfiles, if exists delete + if ( iSIPProfiles ) + { + iSIPProfiles->ResetAndDestroy(); + delete iSIPProfiles; + } + + // Create the profile pointer array + iSIPProfiles = + new ( ELeave ) CArrayPtrFlat( 2 ); + + RPointerArray profilePointerArray; + TCleanupItem clItem( ResetAndDestroy, &profilePointerArray ); + CleanupStack::PushL( clItem ); + + // Get all profiles based on profile types + const TInt arrayCount = array.Count(); + for ( TInt i = 0; i < arrayCount; i++ ) + { + iSIPEngine->ProfilesL( array[i], profilePointerArray ); + while ( profilePointerArray.Count() > 0 ) + { + CSIPManagedProfile* profile = + static_cast( profilePointerArray[ 0 ]); + iSIPProfiles->AppendL( profile ); + profilePointerArray.Remove( 0 ); + } + profilePointerArray.Reset(); + } + + CleanupStack::PopAndDestroy( 2, &array ); // array + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::ResetAndDestroy() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::ResetAndDestroy( + TAny* aPointerArray ) + { + RPointerArray* array = + static_cast*>( aPointerArray ); + array->ResetAndDestroy(); + array->Close(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::ProfileRegistryEventOccurred() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::ProfileRegistryEventOccurred( + TUint32 /*aSIPProfileId*/, TEvent aEvent ) + { + switch( aEvent ) + { + case EProfileCreated: + case EProfileUpdated: + case EProfileDestroyed: + // update sip profile array + TRAP_IGNORE( ReadSipArrayFromEngineL() ); + break; + default: + // do nothing. + break; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::ProfileRegistryErrorOccurred() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginModel::ProfileRegistryErrorOccurred( + TUint32 /*aSIPProfileId*/, + TInt /*aError*/ ) + { + // update sip profile array + TRAP_IGNORE( ReadSipArrayFromEngineL() ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::XdmCollectionNamesL() +// See header for details. +// --------------------------------------------------------------------------- +// +CDesCArray* CPSUIGSPluginModel::XdmCollectionNamesL() + { + delete iXdmNameArray; + iXdmNameArray = NULL; + iXdmIdArray.Reset(); + + iXdmNameArray = TXdmSettingsApi::CollectionNamesLC( iXdmIdArray ); + CleanupStack::Pop( iXdmNameArray );// iXdmNameArray + return iXdmNameArray;// pointer is given, but ownership stays here + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::XdmCollectionNameL() +// See header for details. +// --------------------------------------------------------------------------- +// +HBufC* CPSUIGSPluginModel::XdmCollectionNameL( TInt aId ) + { + HBufC* buf = NULL; + TRAPD( err, buf = TXdmSettingsApi::PropertyL( aId, EXdmPropName )); + return ( err == KErrNone ) ? buf : HBufC::NewL( 0 ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::XdmSettingIndex() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPluginModel::XdmSettingIndex( TInt aId ) + { + const TInt arrayCount = iXdmIdArray.Count(); + for ( TInt i = 0; i < arrayCount; i++ ) + { + if ( aId == iXdmIdArray[ i ] ) + { + return i; + } + } + return KErrNotFound; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginModel::XdmSettingId() +// See header for details. +// --------------------------------------------------------------------------- +// +TInt CPSUIGSPluginModel::XdmSettingId( TInt aIndex ) + { + TInt id = KErrNotFound; + if ( aIndex+1 <= iXdmIdArray.Count()) + { + id = iXdmIdArray[ aIndex ]; + } + return id; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuigspluginsettingview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuigspluginsettingview.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,319 @@ +/* +* Copyright (c) 2006 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: Presence Settings UI setting view implementation. +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include "psuigsplugin.h" +#include "psuigspluginsettingview.h" +#include "psuigspluginmodel.h" +#include "psuigspluginsettingviewcontainer.h" + +// CONSTANTS + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::CPSUIGSPluginSettingView() +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginSettingView::CPSUIGSPluginSettingView( CPSUIGSPlugin* aMainView ) + : iMainView ( aMainView ) + { + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::~CPSUIGSPluginSettingView() +// Destructor +// --------------------------------------------------------------------------- +// +CPSUIGSPluginSettingView::~CPSUIGSPluginSettingView() + { + // iAppUi, iMainView deleted elsewhere + if ( iPSUIContainer && iAppUi ) + { + iAppUi->RemoveFromViewStack( *this, iPSUIContainer ); + delete iPSUIContainer; + iPSUIContainer = NULL; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::ConstructL() + { + // base construct + BaseConstructL( R_PSUI_SETTING_VIEW ); + iAppUi = AppUi(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::NewL() +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginSettingView* CPSUIGSPluginSettingView::NewL( CPSUIGSPlugin* aMainView ) + { + CPSUIGSPluginSettingView* self = new( ELeave ) CPSUIGSPluginSettingView( aMainView ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::Id() +// See header for details. +// --------------------------------------------------------------------------- +// +TUid CPSUIGSPluginSettingView::Id() const + { + return KPreSettingViewId; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::HandleViewRectChange() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::HandleViewRectChange() + { + if ( iPSUIContainer && iPSUIContainer->ListBox() ) + { + iPSUIContainer->SetRect( ClientRect() ); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::DoActivateL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::DoActivateL( const TVwsViewId& aPrevViewId, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/ ) + { + iPrevViewId = aPrevViewId; + + CreateContainerL(); + iAppUi->AddToViewStackL( *this, iPSUIContainer ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::DoDeactivate() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::DoDeactivate() + { + if ( iPSUIContainer ) + { + iAppUi->RemoveFromViewStack( *this, iPSUIContainer ); + delete iPSUIContainer; + iPSUIContainer = NULL; + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::HandleCommandL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::HandleCommandL( TInt aCommand ) + { + switch ( aCommand ) + { + case EAknSoftkeyBack: + { + HandleBackKeyL(); + break; + } + case EPSUICmdChange: + { + iPSUIContainer->EditCurrentItemL(); + break; + } + case EAknCmdHelp: + { + if( FeatureManager::FeatureSupported( KFeatureIdHelp ) ) + { + HlpLauncher::LaunchHelpApplicationL( + iEikonEnv->WsSession(), iAppUi->AppHelpContextL() ); + } + break; + } + default: + { + if ( EEikCmdExit == aCommand ) + { + HandleMenuExitL(); + } + + iAppUi->HandleCommandL( aCommand ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::CreateContainerL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::CreateContainerL() + { + // delete container if present + if( iPSUIContainer ) + { + iAppUi->RemoveFromViewStack( *this, iPSUIContainer ); + delete iPSUIContainer; + iPSUIContainer = NULL; + } + + // check the data + iMainView->PSModel()->ClearInvalidSIPAndXDMSettingsL(); + + // create container + iPSUIContainer = new ( ELeave ) CPSUIGSPluginSettingViewContainer( this ); + iPSUIContainer->SetMopParent( this ); + iPSUIContainer->ConstructL( ClientRect() ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::HandleBackKeyL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::HandleBackKeyL() + { + CPSUIGSPluginModel* psModel = iMainView->PSModel();// not owned + + TBool okToGoBack = ETrue; + TBool okToSave = ETrue; + psModel->ClearInvalidSIPAndXDMSettingsL(); + const TInt id = psModel->SettingsId(); + + // compulsory-field handling + if ( !psModel->AllCompulsoryFieldsFilled()) + {// empty compulsory fields found + okToSave = EFalse; + HBufC* string = StringLoader::LoadLC( + R_QTN_PRESENCE_SETTINGS_NOT_FILLED ); + CAknQueryDialog* query = CAknQueryDialog::NewL( + CAknQueryDialog::EConfirmationTone ); + if ( !query->ExecuteLD( R_PSUI_CONF_QUERY, *string )) + { + okToGoBack = EFalse; + } + CleanupStack::PopAndDestroy( string );// string + } + + // same name checking + if ( okToSave && HandleDuplicatePSNamesL() ) + {// same name found + okToGoBack = EFalse; + okToSave = EFalse; + iPSUIContainer->EditItemL( EPSUIServerNameId, ETrue ); + } + + if ( okToSave ) + {// save settings + psModel->SaveSettingsL(); + } + else if ( !okToSave && okToGoBack && id ) + {// old settings, delete and go back + psModel->DeleteSettingsL( id, EFalse ); + } + if ( okToGoBack ) + {// go back, no save or delete + iAppUi->ActivateLocalViewL( iPrevViewId.iViewUid ); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::HandleMenuExitL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingView::HandleMenuExitL() + { + CPSUIGSPluginModel* psModel = iMainView->PSModel();// not owned + if ( !psModel ) + {// no model, can't do anything + // (leaving would stop exiting, so just return) + return; + } + + if ( psModel->AllCompulsoryFieldsFilled() ) + {// needed fields filled, proceed saving + if ( psModel->IsItDuplicatePSName() ) + {// a dupe name -> change name + HBufC* newName = psModel->CreateSettingNameLC( + psModel->SettingsSet().iSetName.AllocL() ); + psModel->SettingsSet().iSetName.Copy( newName->Des() ); + CleanupStack::PopAndDestroy( newName ); + } + // save settings + psModel->SaveSettingsL(); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::HandleDuplicatePSNamesL() +// See header for details. +// --------------------------------------------------------------------------- +// +TBool CPSUIGSPluginSettingView::HandleDuplicatePSNamesL() + { + TBool found = iMainView->PSModel()->IsItDuplicatePSName(); + if ( found ) + { + HBufC* fullText = StringLoader::LoadLC( + R_QTN_PRESENCE_SETTINGS_NAME_EXISTS, + iMainView->PSModel()->SettingsSet().iSetName ); + CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue ); //wait-flag on + note->ExecuteLD( *fullText ); + CleanupStack::PopAndDestroy( fullText ); + } + return found; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingView::MainView() +// See header for details. +// --------------------------------------------------------------------------- +// +CPSUIGSPlugin* CPSUIGSPluginSettingView::MainView() + { + return iMainView; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuigspluginsettingviewcontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuigspluginsettingviewcontainer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,221 @@ +/* +* Copyright (c) 2006 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: Presence Settings UI view container implementation +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include "psuigspluginsettingviewcontainer.h" +#include "psuigspluginsettingview.h" +#include "psuigspluginmodel.h" +#include "psuisipxdmsettingitem.h" +#include "psuiintegersettingitem.h" +#include "psuigsplugin.h" +#include "psuigspluginids.hrh" +#include +#include + + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::CPSUIGSPluginSettingViewContainer() +// Default constructor. +// --------------------------------------------------------------------------- +// +CPSUIGSPluginSettingViewContainer::CPSUIGSPluginSettingViewContainer( + CPSUIGSPluginSettingView* aView ) + : iView ( aView ) + { + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::ConstructL(const TRect& aRect) +// Symbian OS phase 2 constructor +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingViewContainer::ConstructL( const TRect& aRect ) + { + UpdateTitleL(); + CreateWindowL(); + ConstructFromResourceL( R_PSUI_SETTING_ITEMS ); + SetRect( aRect ); + ActivateL(); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::~CPSUIGSPluginSettingViewContainer() +// Destructor +// --------------------------------------------------------------------------- +// +CPSUIGSPluginSettingViewContainer::~CPSUIGSPluginSettingViewContainer() + { + // iView is deleted elsewhere + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::CreateSettingItemL() +// See header for details. +// --------------------------------------------------------------------------- +// +CAknSettingItem* CPSUIGSPluginSettingViewContainer::CreateSettingItemL( + TInt aSettingId ) + { + CAknSettingItem* settingItem = NULL; + TPresSettingsSet& settingSet = iView->MainView()->PSModel()->SettingsSet(); + + switch ( aSettingId ) + { + case EPSUIServerNameId: + settingItem = new (ELeave) CAknTextSettingItem( + aSettingId, settingSet.iSetName ); + break; + case EPSUISIPProfileId: + settingItem = new (ELeave) CPSUISipXdmSettingItem( + aSettingId, settingSet.iSipProfile, iView->MainView()->PSModel() ); + break; + case EPSUIXDMSettingsId: + settingItem = new (ELeave) CPSUISipXdmSettingItem( + aSettingId, settingSet.iXDMSetting, iView->MainView()->PSModel() ); + break; + case EPSUIObjectSizeId: + settingItem = new (ELeave) CPSUIIntegerSettingItem( + aSettingId, settingSet.iObjectSize ); + break; +/* server address disabled + case EPSUIServerAddrId: + settingItem = new (ELeave) CAknTextSettingItem( + aSettingId, settingSet.iContSrvrAdd ); + break;*/ + case EPSUIPublishingIntervalId: + settingItem = new (ELeave) CPSUIIntegerSettingItem( + aSettingId, settingSet.iPublicationInt ); + break; + case EPSUIMaxSubscriptionsId: + settingItem = new (ELeave) CPSUIIntegerSettingItem( + aSettingId, settingSet.iMaxSubscriptions ); + settingItem->SetSettingPageFlags( + CAknIntegerSettingPage::EEmptyValueAllowed);// Empty input allowed + break; + case EPSUIMaxContactsInListId: + settingItem = new (ELeave) CPSUIIntegerSettingItem( + aSettingId, settingSet.iMaxContactsInList ); + settingItem->SetSettingPageFlags( + CAknIntegerSettingPage::EEmptyValueAllowed);// Empty input allowed + break; + case EPSUIDomainSyntaxId: + settingItem = new (ELeave) CAknTextSettingItem( + aSettingId, settingSet.iDomainSyntax ); + break; + default: + __ASSERT_DEBUG( 0, User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound )); + break; + } + + return settingItem; + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::EditItemL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingViewContainer::EditItemL( + TInt aIndex, TBool aCalledFromMenu ) + { + CAknSettingItemList::EditItemL( aIndex, aCalledFromMenu ); + + // update setting to setting-object + (*SettingItemArray())[aIndex]->StoreL(); + (*SettingItemArray())[aIndex]->UpdateListBoxTextL(); + ListBox()->DrawNow(); + + if ( EPSUIServerNameId == aIndex ) + { + UpdateTitleL(); + } + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::EditCurrentItemL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingViewContainer::EditCurrentItemL() + { + EditItemL( ListBox()->CurrentItemIndex(), ETrue ); + } + +// --------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::UpdateTitleL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingViewContainer::UpdateTitleL() + { + // title construction + static_cast( + iAvkonAppUi->StatusPane()->ControlL( TUid::Uid( + EEikStatusPaneUidTitle )))->SetTextL( + iView->MainView()->PSModel()->SettingsSet().iSetName ); + } + +// ----------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::GetHelpContext() +// See header for details. +// ----------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingViewContainer::GetHelpContext( TCoeHelpContext& aContext ) const + { + aContext.iMajor = TUid::Uid( PSUIGSPluginDllUid ); + aContext.iContext = KPRE_HLP_EDIT_SET; + } + +// ----------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::HandleResourceChange() +// See header for details. +// ----------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingViewContainer::HandleResourceChange(TInt aType) + { + CAknSettingItemList::HandleResourceChange( aType ); + if ( aType == KAknsMessageSkinChange || + aType == KEikDynamicLayoutVariantSwitch ) + { + TRect mainPaneRect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect); + SetRect( mainPaneRect ); + } + } + +// ----------------------------------------------------------------------------- +// CPSUIGSPluginSettingViewContainer::SizeChanged() +// See header for details. +// ----------------------------------------------------------------------------- +// +void CPSUIGSPluginSettingViewContainer::SizeChanged() + { + ListBox()->SetRect( Rect() ); + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuiintegersettingitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuiintegersettingitem.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2006 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: Setting item for integer settings +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "psuigspluginmodel.h" +#include "psuiintegersettingitem.h" + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUIIntegerSettingItem::CPSUIIntegerSettingItem() +// See header for details. +// --------------------------------------------------------------------------- +// +CPSUIIntegerSettingItem::CPSUIIntegerSettingItem( TInt aIdentifier, TInt& aValue ) + : CAknIntegerEdwinSettingItem ( aIdentifier, aValue ), + iPSUIInternalTextPtr( 0,0 ) + { + } + +// --------------------------------------------------------------------------- +// CPSUIIntegerSettingItem::~CPSUIIntegerSettingItem() +// See header for details. +// --------------------------------------------------------------------------- +// +CPSUIIntegerSettingItem::~CPSUIIntegerSettingItem() + { + delete iPSUIInternalText; + } + +// --------------------------------------------------------------------------- +// CPSUIIntegerSettingItem::CompleteConstructionL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUIIntegerSettingItem::CompleteConstructionL() + { + const TInt KPSUIMaxIntegerDigits = 2 * EAknMaxIntegerDigits;// a bit longer for storing also empty texts + iPSUIInternalText = HBufC::NewMaxL( KPSUIMaxIntegerDigits ); + } + +// --------------------------------------------------------------------------- +// CPSUIIntegerSettingItem::SettingTextL() +// See header for details. +// --------------------------------------------------------------------------- +// +const TDesC& CPSUIIntegerSettingItem::SettingTextL() + { + _LIT( KAknIntegerFormat, "%d" ); + iPSUIInternalTextPtr.Set( iPSUIInternalText->Des() ); + TInt& intValueRef = InternalValueRef(); + if ( intValueRef == KErrNotFound ) + { + iPSUIInternalTextPtr.Zero(); + iPSUIInternalTextPtr.Append( EmptyItemText() ); + iPSUIInternalTextPtr.Append( KColumnListSeparator ); + } + else + { + iPSUIInternalTextPtr.Format( KAknIntegerFormat, intValueRef ); + AknTextUtils::DisplayTextLanguageSpecificNumberConversion( + iPSUIInternalTextPtr ); + } + + return iPSUIInternalTextPtr; + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef presencesettingsui/src/psuisipxdmsettingitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencesettingsui/src/psuisipxdmsettingitem.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,193 @@ +/* +* Copyright (c) 2006 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: Setting item for SIP / XDM settings +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include "psuigspluginmodel.h" +#include "psuisipxdmsettingitem.h" + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::CPSUISipXdmSettingItem() +// Default constructor. +// --------------------------------------------------------------------------- +// +CPSUISipXdmSettingItem::CPSUISipXdmSettingItem( + TInt aIdentifier, TInt& aId, CPSUIGSPluginModel* aPSModel ): + CAknSettingItem( aIdentifier ), + iExtChosenSettingID ( aId ), + iPSModel ( aPSModel ) + { + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::~CPSUISipXdmSettingItem() +// Destructor +// --------------------------------------------------------------------------- +// +CPSUISipXdmSettingItem::~CPSUISipXdmSettingItem() + { + // iPSModel deleted elsewhere + delete iPSUIInternalText; + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::LoadL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUISipXdmSettingItem::LoadL() + { + delete iPSUIInternalText; + iPSUIInternalText = 0; + + TInt id = Identifier(); + if ( id == EPSUISIPProfileId ) + {// SIP + iPSUIInternalText = iPSModel->SipProfileNameL( iExtChosenSettingID ); + } + else if ( id == EPSUIXDMSettingsId ) + {// XDM + iPSUIInternalText = iPSModel->XdmCollectionNameL( iExtChosenSettingID ); + } + else + { + __ASSERT_DEBUG( 0,User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound )); + } + + iIntChosenSettingID = iExtChosenSettingID; + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::StoreL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUISipXdmSettingItem::StoreL() + { + iExtChosenSettingID = iIntChosenSettingID; + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::SettingTextL() +// See header for details. +// --------------------------------------------------------------------------- +// +const TDesC& CPSUISipXdmSettingItem::SettingTextL() + { + if ( iPSUIInternalText->Length() > 0 ) + return *iPSUIInternalText; + else + return EmptyItemText(); + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::EditItemL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUISipXdmSettingItem::EditItemL( TBool /*aCalledFromMenu*/ ) + { + TInt id = Identifier(); + if ( id == EPSUISIPProfileId ) + {// SIP + EditSipItemL(); + } + else if ( id == EPSUIXDMSettingsId ) + {// XDM + EditXdmItemL(); + } + else + { + __ASSERT_DEBUG( 0,User::Panic( KPSUIGSPluginPanicCategory, KErrNotFound )); + } + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::EditSipItemL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUISipXdmSettingItem::EditSipItemL() + { + CDesCArray* array = iPSModel->SipProfilesLC(); + TInt index = iPSModel->SipProfileIndex( iIntChosenSettingID ); + LaunchSettingDlgL( index, array ); + CleanupStack::PopAndDestroy( array ); // array + + if ( index != KErrNotFound ) + {// update only if index available + iIntChosenSettingID = iPSModel->SipProfileId( index ); + + delete iPSUIInternalText; + iPSUIInternalText = 0; + iPSUIInternalText = iPSModel->SipProfileNameL( iIntChosenSettingID ); + + UpdateListBoxTextL(); + } + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::EditXdmItemL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUISipXdmSettingItem::EditXdmItemL() + { + CDesCArray* array = iPSModel->XdmCollectionNamesL();// array not owned + TInt index = iPSModel->XdmSettingIndex( iIntChosenSettingID ); + LaunchSettingDlgL( index, array ); + + if ( index != KErrNotFound ) + {// update only if index available + iIntChosenSettingID = iPSModel->XdmSettingId( index ); + + delete iPSUIInternalText; + iPSUIInternalText = 0; + iPSUIInternalText = iPSModel->XdmCollectionNameL( iIntChosenSettingID ); + + UpdateListBoxTextL(); + } + } + +// --------------------------------------------------------------------------- +// CPSUISipXdmSettingItem::LaunchSettingDlgL() +// See header for details. +// --------------------------------------------------------------------------- +// +void CPSUISipXdmSettingItem::LaunchSettingDlgL( TInt& aIndex, CDesCArray* aArray ) + { + CAknRadioButtonSettingPage* dlg = new (ELeave ) CAknRadioButtonSettingPage( + R_RADIOBUTTON_SETTING_PAGE, + aIndex, + aArray ); + CleanupStack::PushL( dlg ); + dlg->SetSettingTextL( SettingName() ); + SetSettingPage( dlg ); + SettingPage()->SetSettingPageObserver( this ); + CleanupStack::Pop( dlg ); // dlg + SettingPage()->ExecuteLD( CAknSettingPage::EUpdateWhenAccepted ); + SetSettingPage( 0 ); // dlg deleted + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef pressrv_plat/registration_api/inc/simplefactory.h --- a/pressrv_plat/registration_api/inc/simplefactory.h Tue Aug 31 15:35:50 2010 +0300 +++ b/pressrv_plat/registration_api/inc/simplefactory.h Wed Sep 01 12:23:14 2010 +0100 @@ -162,6 +162,15 @@ IMPORT_C static MSimpleContent* NewContentL( const TDesC8& aContentID, const TDesC8& aContentType ); + /** + * Create new simple engine Connection entity. + * @since S60 3.2 + * @param aObserver client callback observer + * @param aServiceId serviceId of current service + * @return MSimpleConnection, ownership is transferred. + */ + IMPORT_C static MSimpleConnection* NewConnectionL( + MSimpleConnectionObserver& aObserver, TInt32 aServiceId ); }; #endif diff -r 2669f8761a99 -r fbd2e7cec7ef pressrv_plat/simple_documents_api/inc/msimplecontent.h --- a/pressrv_plat/simple_documents_api/inc/msimplecontent.h Tue Aug 31 15:35:50 2010 +0300 +++ b/pressrv_plat/simple_documents_api/inc/msimplecontent.h Wed Sep 01 12:23:14 2010 +0100 @@ -22,7 +22,7 @@ #define M_simplecontent_H #include -// #include +// #include // FORWARD DECLARATION diff -r 2669f8761a99 -r fbd2e7cec7ef pressrv_plat/xdm_api/inc/XdmDocument.h --- a/pressrv_plat/xdm_api/inc/XdmDocument.h Tue Aug 31 15:35:50 2010 +0300 +++ b/pressrv_plat/xdm_api/inc/XdmDocument.h Wed Sep 01 12:23:14 2010 +0100 @@ -40,7 +40,9 @@ EXdmIetfCommonPolicy, EXdmOmaCommonPolicy, EXdmIetfPresenceRules, - EXdmOmaPresenceRules + EXdmOmaPresenceRules, + EXdmPresContent, + EXdmPresContentNSN }; //Helper class for searching documents; 16-bit diff -r 2669f8761a99 -r fbd2e7cec7ef pressrv_plat/xdm_api/inc/XdmProtocolUidList.h --- a/pressrv_plat/xdm_api/inc/XdmProtocolUidList.h Tue Aug 31 15:35:50 2010 +0300 +++ b/pressrv_plat/xdm_api/inc/XdmProtocolUidList.h Wed Sep 01 12:23:14 2010 +0100 @@ -43,6 +43,8 @@ const TInt KXdmOmaCommonPolicyUsageUid = 0x10275082; const TInt KXdmIetfPresRulesUsageUid = 0x10275083; const TInt KXdmOmaPresRulesUsageUid = 0x102750AB; +const TInt KXdmUsageUid = 0x20028701; +const TInt KXdmNSNUsageUid = 0x20028702; #endif //__XDMPROTOCOLUIDLIST__ diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/group/10275464.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/group/10275464.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2006 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: ECOM registery info for SIP/Presence Protocol Plugin +* +*/ + + +#include +#include + +#include "presenceplugin_resource.hrh" + + + +// --------------------------------------------------------------------------- +// ECOM registery info for Presence Framework ECOM hook +// --------------------------------------------------------------------------- +// +RESOURCE REGISTRY_INFO theInfo + { + resource_format_version = RESOURCE_FORMAT_VERSION_2; + dll_uid = PRESENCEPLUGIN_DLL_UID_PRESENCE_PROTOCOL; + + interfaces = + { + INTERFACE_INFO + { + // implemented interface + interface_uid = XIMP_ECOM_IF_UID_PROTOCOL_PLUGIN_BASE_INTERFACE; + + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = PRESENCEPLUGIN_1_IMPLEMENTATION_UID; + version_no = PRESENCEPLUGIN_1_VERSION_NO; + display_name = PRESENCEPLUGIN_1_DISPLAY_NAME; + default_data = PRESENCEPLUGIN_1_DEFAULT_DATA; + opaque_data = PRESENCEPLUGIN_1_OPAQUE_DATA; + } + }; + } + }; + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,36 @@ +/* +* Copyright (c) 2006 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: Build information file for SIP/Simple Protocol Plugin +* +*/ + + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +#ifdef GC_AREA_PARTIAL_INCLUDE_CHANGE_ON +#else +#endif + +../rom/simpledatamodeladapter.iby CORE_MW_LAYER_IBY_EXPORT_PATH(simpledatamodeladapter.iby) + +PRJ_MMPFILES +presenceplugin.mmp +#include "../simpleimplugin/group/bld.inf" + +PRJ_TESTMMPFILES +//../internal/tsrc/group/T_SIMPLEDataModelAdapter.mmp diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/group/presenceplugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/group/presenceplugin.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,99 @@ +/* +* Copyright (c) 2006-2010 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: Project definition file for SIP/Simple Protocol Plugin +* +*/ + + +// To get the APP_LAYER_SYSTEMINCLUDE-definition +#include +#include "presenceplugin_resource.hrh" + +TARGET presenceplugin.dll +TARGETTYPE plugin + +UID PRESENCEPLUGIN_DLL_UID_ECOM_PLUGIN PRESENCEPLUGIN_DLL_UID_PRESENCE_PROTOCOL +VENDORID VID_DEFAULT +CAPABILITY CAP_ECOM_PLUGIN + +// RESOURCE +START RESOURCE 10275464.rss +TARGET presenceplugin +TARGETPATH resource/plugins +END + +SOURCEPATH ../src +SOURCE presenceplugin.cpp +SOURCE presencepluginconnection.cpp +SOURCE presencepluginsession.cpp +SOURCE presencepluginwinfo.cpp +SOURCE presencepluginwatcher.cpp +SOURCE presencepluginauthorization.cpp +SOURCE presencepluginpublisher.cpp +SOURCE presencepluginentitywatcher.cpp +SOURCE presenceplugindata.cpp +SOURCE presencepluginxdmutils.cpp +SOURCE presencepluginxdmpresrules.cpp +SOURCE presenceplugingroup.cpp +SOURCE presencepluginwatcherinfo.cpp +SOURCE presencepluginvirtualgroup.cpp +SOURCE presenceconnectioninfo.cpp +SOURCE presencepluginutility.cpp +SOURCE presenceplugincontacts.cpp +SOURCE presenceplugincontactstatehandler.cpp +SOURCE presenceplugincontactstate.cpp +SOURCE presenceplugincontactstateopen.cpp +SOURCE presenceplugincontactstateresolve.cpp +SOURCE presenceplugincontactstatesearch.cpp +SOURCE presenceplugincontactstateend.cpp +SOURCE presensepluginlocalstore.cpp + +USERINCLUDE . +USERINCLUDE ../inc +USERINCLUDE ../simpleimplugin/inc + +// Default system include paths for middleware layer modules. +APP_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY euser.lib // Base +LIBRARY ecom.lib +LIBRARY simpleengine.lib +LIBRARY estor.lib +LIBRARY bafl.lib +LIBRARY charconv.lib + +LIBRARY xdmengine.lib +LIBRARY xdmsettingsapi.lib +LIBRARY presencesettingsapi.lib + +LIBRARY efsrv.lib +LIBRARY edbms.lib +LIBRARY avkon.lib + +//presence cache +LIBRARY presencecacheclient2.lib +LIBRARY presencecacheutils.lib + +// access to service table +LIBRARY serviceprovidersettings.lib + +// access to uiservicetabsettings +LIBRARY vimpstsettings.lib + +// access to Virtual Phonebook contact database +LIBRARY vpbkeng.lib +LIBRARY inetprotutil.lib + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/group/presenceplugin_resource.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/group/presenceplugin_resource.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2006 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: resource definitions +* +*/ + +#ifndef PRESENCEPLUGIN_RESOURCE_HRH +#define PRESENCEPLUGIN_RESOURCE_HRH + +/** + * System wide UID 2:s for ECom plugin dlls. + */ +#define PRESENCEPLUGIN_DLL_UID_ECOM_PLUGIN 0x10009D8D + +/** + * Officially reserved UID 3 for the Presence Framework + * PRESENCE protocol dll. + */ +#define PRESENCEPLUGIN_DLL_UID_PRESENCE_PROTOCOL 0x10275464 + + +/** + * Resource file compatible defintions for ximp test protocols. + * + * This must be kept in-sync with definitions in + * "ximptestprotocols.h" + */ + +#define PRESENCEPLUGIN_1_IMPLEMENTATION_UID 0x10282EF2 +#define PRESENCEPLUGIN_1_VERSION_NO 1 +#define PRESENCEPLUGIN_1_DISPLAY_NAME "IETF SIMPLE PRESENCE protocol" +#define PRESENCEPLUGIN_1_DEFAULT_DATA "PRESENCE" + +// Protocol capabilities: "valuevalue..." +// +//

Provider +// Feature id +// Supported schema +// +// Example: +// "

Nokiafeat/pres/foofeat/pres/barsip" +// +#define PRESENCEPLUGIN_1_OPAQUE_DATA "

Nokiafeat/pres/pubfeat/pres/fetchfeat/pres/subssip" + + +#endif // SIMPLEPLUGIN_RESOURCE_HRH + diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/mpresencepluginconnectionobs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/mpresencepluginconnectionobs.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,247 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef MPRESENCEPLUGINCONNECTIONOBS_H +#define MPRESENCEPLUGINCONNECTIONOBS_H + +#include +#include +#include + +class TXIMPRequestId; +class MXIMPObjectFactory; +class CPresencePluginWinfo; +class MSimpleWinfo; +class MXIMPProtocolConnectionHost; +class CPresencePluginXdmUtils; +class CPresencePluginWatcher; +class MPresenceObjectFactory; +class MProtocolPresenceDataHost; +class MProtocolPresenceAuthorization; +class CPresencePluginVirtualGroup; +class CPresencePluginAuthorization; +class CPresencePluginGroups; + +/** + * MPresencePluginConnectionObs + * + * presence engine connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( MPresencePluginConnectionObs ) + { + +public: + + enum TReqType + { + /** undefined */ + ENoReq = 0, + /** Connection initializing */ + EOpenSess, + /** Connection close */ + ECloseSess, + /** Publish own data */ + EPublish, + /** Subscribe Own data */ + ESubscribeOwn, + /** Subscribe other user */ + ESubscribeOther + }; + + /** + * CPresencePluginWatcher accessor + * @return CPresencePluginWatcher + */ + virtual CPresencePluginWatcher* WatcherHandlerL() = 0; + + /** + * Complete the request + * + * @param aType request type + * @param aStatus status + */ + virtual void CompleteReq(TReqType aType, TInt aStatus ) = 0; + + /** + * Complete the request + * + * @param aReqId ximp request id + * @param aStatus status + */ + virtual void CompleteReq(TXIMPRequestId aReqId, TInt aStatus ) = 0; + + /** + * XIMP Object Factory accessor + * @return ximp Object Factory + */ + virtual MXIMPObjectFactory& ObjectFactory()=0; + + /** + * XIMP Object Factory accessor + * @return PrFw Object Factory + */ + virtual MPresenceObjectFactory& PresenceObjectFactoryOwn()=0; + + /** + * XIMP presence authorization accessor + * @return PrFw Protocol Presence Authorization + */ + virtual MProtocolPresenceAuthorization& PresenceAuthorization() = 0; + + /** + * XIMP presence authorization accessor as own internal type + * @return Presence Authorization + */ + virtual CPresencePluginAuthorization& InternalPresenceAuthorization() = 0; + + /** + * Gets reference to + * MProtocolPresenceDataHost interface. + * + * Presence protocol connection implementation uses returned + * data host interface to manage the Presence connection's + * presence auhtorization data. + * + * @return MProtocolPresenceAuthorizationDataHost interface. + * Interface ownership is not returned caller. + * Returned interface is guaranteed to remain valid (usable) + * as long as this source interface. + */ + virtual MProtocolPresenceDataHost& ProtocolPresenceHost() = 0; + + /** + * CPresencePluginWinfo accessor + * @return CPresencePluginWinfo, ownership is not transferred. + */ + virtual CPresencePluginWinfo* WinfoHandlerL()=0; + + /** + * CPresencePluginWinfoObserver is terminated + * @param aReason reason code + */ + virtual void WinfoTerminatedL( TInt aReason )=0; + + /** + * Watcher info subscription notification is received + * @aWinfo notification content + */ + virtual void WinfoNotification( MSimpleWinfo& aWinfo ) = 0; + + /** + * Current registered SIP entity + */ + virtual TPtrC8 CurrentSipPresentity8() = 0; + + /** + * Access connection host + * @return MximpProtocolConnectionHost + */ + virtual MXIMPProtocolConnectionHost* Host() = 0; + + /** + * Current domain syntax accessor + */ + virtual TPtrC16 CurrentDomain() = 0; + + /** + * Access CPresencePluginXdmUtils + * @return CPresencePluginXdmUtils entity + */ + virtual CPresencePluginXdmUtils* XdmUtilsL() = 0; + + /** + * Get ETag + * @return TDesC8, etag value + */ + virtual const TDesC8& GetETag() const = 0; + + /** + * Set ETag + * @return none + */ + virtual void SetETag( const TDesC8& aETag ) = 0; + + /** + * Get client session time tupleId + * @return TInt, tuple value + */ + virtual TInt GetTupleId() const = 0; + + /** + * Set session time tupleId + * @return none + */ + virtual void SetTupleId( const TInt aTupleId ) =0; + + /** + * Get Stop publish state + * @return TBool, stop publish state + */ + virtual TBool GetStopPublishState() = 0; + + /** + * Is Stop publish called + * @return TBool, stop publish called state + */ + virtual TBool IsStopPublishCalled() = 0; + + /** + * Get Stop publish state + * @return TBool, stop publish state + */ + virtual void SetStopPublishState( TBool aState ) = 0; + + /** + * Get Stop publish state + * @return TBool, session status + */ + virtual TBool GetSessionStatus( ) = 0; + + /** + * Return instace of subcribed contact + * @return TBool, session status + */ + virtual CPresencePluginVirtualGroup* SubscribedContacts( ) = 0; + + /** + * Get grand request list subscribe state + */ + virtual TBool GrandListState() = 0; + + /** + * Terminate connection + */ + virtual void TerminateConnectionL( ) = 0; + + /** + * Return Groups API implemention + */ + virtual CPresencePluginGroups& GroupsL( ) = 0; + + /** + * Return service id + */ + virtual TInt& ServiceId( ) = 0; + }; + +#endif + +// End of File \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/mpresrulesasynchandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/mpresrulesasynchandler.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef __MPRESRULESASYNCHANDLER_H__ +#define __MPRESRULESASYNCHANDLER_H__ + +class CXdmDocument; +// Class declaration + +NONSHARABLE_CLASS( MPresRulesAsyncHandler ) + { + public: + + /** + * This method handles the async. + * call to function CPresenceXDM::UpdateToServerL + * and CPresenceXDM::UpdateAllFromServerL. + * Clients should implement this method to get a callback. + * + * @param aErrorCode, XDMengine error codes + */ + virtual void HandlePresUpdateDocumentL( + TInt aErrorCode ) = 0; + + }; + +#endif //__MPRESRULESASYNCHANDLER_H__ \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceconnectioninfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceconnectioninfo.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,190 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCECONNECTIONARRAY_H +#define CPRESENCECONNECTIONARRAY_H + +#include +#include "presencelogger.h" +#include "presenceplugincommon.h" +#include "presencepluginconnection.h" + +class MXIMPProtocolConnection; + +/** + * CPresencePlugin + * + * Implementation of CXIMPProtocolPluginBase + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ + + +NONSHARABLE_CLASS( CPresenceConnectionInfo ) : public CBase + { + public: + + /** + * Two-phased constructor. + * + * @param none + */ + static CPresenceConnectionInfo* NewL( + MXIMPProtocolConnection* aConnection ); + + /** + * SetConnectionStatus() + * + * @since S60 3.2 + * @param TConnectionStatus + * @return none + */ + void SetConnectionStatus( + CPresencePluginConnection::TConnectionStatus aStatus ); + + /** + * SetConnectionETag() + * + * @since S60 3.2 + * @param TDesC8 aETag + * @return none + */ + void SetConnectionETag( const TDesC8& aETag ); + + /** + * GetConnectionStatus() + * + * @since S60 3.2 + * @param none + * @return TConnectionStatus connection status + */ + CPresencePluginConnection::TConnectionStatus GetConnectionStatus(); + + /** + * GetConnectionEtag() + * + * @since S60 3.2 + * @param none + * @return TDesC8 ETag + */ + TDesC8* GetConnectionEtag(); + + /** + * GetConnection() + * + * @since S60 3.2 + * @param none + * @return MXIMPProtocolConnection connection instance + */ + MXIMPProtocolConnection* GetConnection(); + + /** + * IncreaseClientCount() + * + * @since S60 3.2 + * @param none + * @return none + */ + void IncreaseClientCount(); + + /** + * DecreaseClientCount() + * + * @since S60 3.2 + * @param none + * @return none + */ + void DecreaseClientCount(); + + /** + * GenerateClientId() + * + * @since S60 3.2 + * @param none + * @return TInt uniqueclient id + */ + TInt GenerateClientId(); + + /** + * GenerateClientId() + * + * @since S60 3.2 + * @param none + * @return TInt uniqueclient id + */ + TInt GetClientId(); + + /** + * GenerateClientId() + * + * @since S60 3.2 + * @param none + * @return TInt client count + */ + TInt ClientCount(); + + /** + * Standard C++ destructor + */ + ~CPresenceConnectionInfo(); + + private: + + /** + * Standard C++ constructor + */ + CPresenceConnectionInfo( MXIMPProtocolConnection* aConnection ); + + public: // data + + /** + * Connection ETag + * Own. + */ + HBufC8* iETag; + + /** + * Connection + * Own. + */ + MXIMPProtocolConnection* iConnection; + + /** + * Connection status + * Own. + */ + CPresencePluginConnection::TConnectionStatus iConnectStatus; + + /** + * Connection status + * Own. + */ + TInt iClientCount; + + /** + * Client id + * Own. + */ + TUint iClientId; + + SIMPLE_UNIT_TEST( T_CPresenceConnectionInfo ) + + }; + +#endif // CPRESENCEPLUGIN_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencecontactscontextbase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencecontactscontextbase.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 20010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef M_MPRESENCECONTACTSCONTEXTBASE_H +#define M_MPRESENCECONTACTSCONTEXTBASE_H + + +class MVPbkContactLinkArray; +class MVPbkContactLink; + + +/** + * Base class to state context + * + * @lib presenceplugin.dll + * @since S60 v5.0 + */ +class MPresenceContactsContextBase + { + +public: + + /** + * Open virtual phonebook contact stores + * + * @since S60 v5.0 + */ + virtual void OpenL() = 0; + + /** + * Start virtual phonebook contacts search + * + * @since S60 v5.0 + */ + virtual void SearchL() = 0; + + /** + * Return virtual phonebook contact links + * + * @since S60 v5.0 + * @return virtual phonebook contact links + */ + virtual const MVPbkContactLinkArray& ContactLinkArrayL() = 0; + + /** + * Resolve virtual phonebook contact from contact link + * + * @since S60 v5.0 + * @param aContactLink contact link to resolve + */ + virtual void RetrieveContactL( + const MVPbkContactLink& aContactLink ) = 0; + + }; + + +#endif // M_MPRESENCECONTACTSCONTEXTBASE_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencelogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencelogger.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef DATAMODELADAPTERLOGGER_H +#define DATAMODELADAPTERLOGGER_H + +#define DP_TP_PRINT(s) L##s +#define DP_STRA_PRINT(s) DP_TP_PRINT(s) +#define DP_STR_PRINT(t) DP_STRA_PRINT("[PrwAdapter]") L##t +#define DP_LIT_PRINT(s) TPtrC((const TText *) DP_STR_PRINT(s)) +#ifdef _DEBUG + #include + #define _DEBUG_SIMPLE_DATAMODEL_ADAPTER +#endif + +#ifdef _DEBUG_SIMPLE_DATAMODEL_ADAPTER + #define DP_SDA(a) {RDebug::Print(DP_LIT_PRINT(a));} + #define DP_SDA2(a, b) {RDebug::Print(DP_LIT_PRINT(a),b);} + #define DP_SDA3(a, b, c) RDebug::Print(DP_LIT_PRINT(a), b, c); +#else + #define DP_SDA(a); + #define DP_SDA2(a, b); + #define DP_SDA3(a, b, c); +#endif + +#ifdef SIMPLE_EUNIT +#define SIMPLE_UNIT_TEST(ClassName) friend class ClassName; +#else +#define SIMPLE_UNIT_TEST(ClassName) +#endif // SIMPLE_EUNIT + +#endif //DATAMODELADAPTERLOGGER_H + diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugin.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,140 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGIN_H +#define CPRESENCEPLUGIN_H + +#include +#include + +#include "presencelogger.h" + +class CPresencePluginConnection; +class MXIMPProtocolConnection; +class MXIMPServiceInfo; +class CPresenceConnectionInfo; + +/** + * CPresencePlugin + * + * Implementation of CXIMPProtocolPluginBase + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePlugin ) : public CXIMPProtocolPluginBase + { + public: + + /** + * Two-phased constructor. + * + * @param none + */ + static CPresencePlugin* NewL(); + + /** + * Two-phased constructor. + * + * @param none + */ + static CPresencePlugin* NewLC(); + + /** + * Standard C++ destructor + */ + ~CPresencePlugin(); + + private: + + /** + * Standard C++ constructor + */ + CPresencePlugin(); + + /** + * Delete connection from arrays + * @param TInt aIndex, array index + * @return none + */ + void DeleteConnection( TInt aIndex ); + + public: // from base class MXIMPProtocolPlugin + + /** + * Defined in a base class + */ + void PrimeHost( MXIMPProtocolPluginHost& aHost ); + + /** + * Defined in a base class + */ + MXIMPProtocolConnection& AcquireConnectionL( + const MXIMPServiceInfo& aService, + const MXIMPContextClientInfo& aContextClient ); + + /** + * Defined in a base class + */ + void ReleaseConnection( MXIMPProtocolConnection& aConnection ); + + public: // from base class MXIMPBase + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + private: // Data + + /** + * Prime host + * Own. + */ + MXIMPProtocolPluginHost* iHost; + + /** + * connection array + * Own. + */ + RPointerArray< CPresencePluginConnection > iConnections; + + /** + * connection data array + * Own. + */ + RPointerArray< CPresenceConnectionInfo > iConnectionArray; + + SIMPLE_UNIT_TEST( T_CPresencePlugin ) + + }; +#endif // CPRESENCEPLUGIN_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginauthorization.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginauthorization.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,660 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINAUTHORIZATION_H +#define CPRESENCEPLUGINAUTHORIZATION_H + +#include +#include +#include +#include "mpresencepluginconnectionobs.h" +#include "presenceplugincontactsobs.h" +#include "presencelogger.h" + +class TXIMPRequestId; +class MXIMPIdentity; +class MPresenceInfoFilter; +class MProtocolPresenceAuthorizationDataHost; +class MSimpleWinfo; +class CPresencePluginData; +class CPresencePluginContacts; + +/** + * CPresencePluginAuthorization + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginAuthorization ) : + public CActive, + public MProtocolPresenceAuthorization, + public MPresencePluginContactsObs + { + public: // Constructor and destructor + + /** + * Current operation + */ + enum TPluginAuthOperation + { + ENoOperation, + EGrantPresenceForPresentity, + EGrantPresenceForPresentityGroupMembers, + EWithdrawFromPresentity, + EWithdrawFromGroupMembers, + EGrantForEveryone, + EWithdrawFromEveryone, + ESubscribeBlockList, + EUnsubscribeBlockList, + EBlockPresentity, + EUnblockPresentity + }; + + /** + * Block state + */ + enum TPluginAuthState + { + EStateIdle, + EStateBlocked, + EStateDoBlock, + EStateIsContactBlockedBuddyRequest, + EStateDoUnBlock, + EStatePresenceGranted, + EStateRemovePresentityFromGranted, + EStateAcceptBuddyRequest, + EStateSubscribe + }; + + /** + * Constructor. + * @param aObs callback for complete requests + */ + static CPresencePluginAuthorization* NewL( + MPresencePluginConnectionObs& aObs, + CPresencePluginData* aPresenceData ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginAuthorization(); + + /** + * SetDataHost + * + * @since S60 3.2 + * @param aDataHost, XIMP Plugin Authorization Data Host + */ + void SetDataHost( MProtocolPresenceAuthorizationDataHost& aDataHost ); + + /** + * WinfoTerminatedL + * + * @since S60 3.2 + * SIMPLE Winfo watcher sunscription is terminated + * @param aReason reason code + */ + void WinfoTerminatedL( TInt aReason ); + + /** + * WINFO received from SIMPLE + * @since S60 3.2 + * @param aWinfo WINFO + */ + void WinfoNotificationL( MSimpleWinfo& aWinfo ); + + /** + * Return List subscribe state + * + * @since S60 3.2 + * @param none + * @return TBool subscribe state + */ + TBool ReturnListSubsState(); + + /** + * Returns plugin data handler. + * + * @since S60 5.0 + * @param none + * @return CPresencePluginData data handler reference + */ + CPresencePluginData& PluginData(); + + /** + * Internal grant operation for group operation. + * + * @since S60 5.0 + * @param aPresentityId, identity to be subscribed + * @param aClientStatus, client status to be completed + * @return none + */ + void DoPerformGrantPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ); + + /** + * Internal withdraw grant operation for group operation. + * + * @since S60 5.0 + * @param aPresentityId, identity to be ungranted + * @param aClientStatus, client status to be completed + * @return none + */ + void DoPerformWithdrawPresGrantFromPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ); + + /** + * Internal block operation for group operation. + * + * @since S60 5.0 + * @param aPresentityId, identity to be blocked + * @param aClientStatus, client status to be completed + * @return none + */ + void DoPerformBlockPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ); + + /** + * Internal unblock operation for group operation. + * + * @since S60 5.0 + * @param aPresentityId, identity to be unblocked + * @param aClientStatus, client status to be completed + * @return none + */ + void DoPerformCancelPresenceBlockFromPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ); + + /** + * Resolve is blocked contact a blocked friend request + * + * @since S60 5.0 + * @param aPresenceId, identity to be resolved + * @param aObserver, Returns results + * @param aStatus, client status + */ + void IsBlockedContactFriendRequestL( + const TDesC& aPresenceId, + MPresencePluginContactsObs& aObserver, + TRequestStatus& aStatus ); + + private: + + /** + * Standard C++ constructor + * @param aObs callback for complete requests + */ + CPresencePluginAuthorization( + MPresencePluginConnectionObs& aObs, + CPresencePluginData* aPresenceData ); + + void ConstructL(); + + public: // from base class MXIMPBase + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + + public: // from base class MXIMPProtocolPresenceAuthorization + + /** + * Defined in a base class + */ + void DoSubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ); + + // Granting presence information access to single presentities + + /** + * Defined in a base class + */ + void DoGrantPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresenceGrantPifForPresentityL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoWithdrawPresenceGrantFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + // Granting presence information access to presentity group members + + /** + * Defined in a base class + */ + void DoGrantPresenceForPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresenceGrantPifForPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoWithdrawPresenceGrantFromPresentityGroupMembersL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + // Granting presence information access to everyone + + /** + * Defined in a base class + */ + void DoGrantPresenceForEveryoneL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresenceGrantPifForEveryoneL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoWithdrawPresenceGrantFromEveryoneL( + TXIMPRequestId aReqId ); + + // Subscribe presence block list + + /** + * Defined in a base class + */ + void DoSubscribePresenceBlockListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresenceBlockListL( + TXIMPRequestId aReqId ); + + // Blocking presence information access from single presentities + + /** + * Defined in a base class + */ + void DoBlockPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoCancelPresenceBlockFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + public: // MPresencePluginContactsObs + + /** + * Request Complete + * + * @param aResult Result data returned, ownership changed to client. + * In operation EOperationIsPresenceStoredToContacts + * return type is TBool*. + * @param aOperation Operation type + * @param aError Completion error code + */ + void RequestComplete( TAny* aResult, + TPresenceContactsOperation aOperation, TInt aError ); + + protected: // from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + private: + + /** + * Save presentity id + * + * @since S60 3.2 + * @param aPresentityId presentity id + * @param aFormatUri, attempt to format URI (set + * ETrue is aPresentityId is uri identity) + * @return none + */ + void SetPresIdentityL( + const MXIMPIdentity& aPresentityId, + TBool aFormatUri ); + + /** + * Complete client request + * + * @since S60 3.2 + * @param aStatus + * @return none + */ + void CompleteXIMPReq( TInt aStatus ); + + /** + * Start XDM operation + * + * @since S60 3.2 + * @param aId, XIMP identity + * @param aReqId, request id + * @param aOperation, plugin operation + * @return none + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ); + + /** + * Start XDM operation + * + * @since S60 5.0 + * @param aId, XIMP identity + * @param aOperation, plugin operation + * @param aClientStatus, client status to complete + * @return none + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + TPluginAuthOperation aOperation, + TRequestStatus& aClientStatus ); + + /** + * Call actual xdm operation from xdm utils + * + * @since S60 3.2 + * @param none + * @return none + */ + void CallActualXdmOperationL(); + + /** + * Subscribe block list + * + * @since S60 3.2 + * @param none + * @return none + */ + void SubscribeBlockListL( ); + + /** + * Unsubscribe block list + * + * @since S60 3.2 + * @param none + * @return none + */ + void UnSubscribeBlockListL(); + + /** + * Handle full winfo notification + * + * @since S60 3.2 + * @param MSimpleWinfo winfo notification + * @return none + */ + void HandleFullWinfoNotificationL( MSimpleWinfo& aWinfo ); + + /** + * Handle partial winfo notification + * + * @since S60 3.2 + * @param MSimpleWinfo winfo notification + * @return none + */ + void HandlePartialWinfoNotificationL( MSimpleWinfo& aWinfo ); + + /** + * Handle received grant request + * + * @since S60 3.2 + * @param TDesC userid + * @return none + */ + void CallHandlePresenceGrantRequestReceivedL( const TDesC& aUserId ); + + /** + * Handle obsolated grantrequest + * + * @since S60 3.2 + * @param TDesC userid + * @return none + */ + void CallHandlePresenceGrantRequestObsoletedL( const TDesC& aUserId ); + + /** + * Grant presence for presentity + * + * @since S60 3.2 + * @param none + * @return none + */ + void GrantPresenceForPresentityL(); + + /** + * Withdraw from presentity + * + * @since S60 3.2 + * @param none + * @return none + */ + void WithdrawFromPresentityL(); + + /** + * Set presentity blocked to XIMP + * + * @since S60 5.1 + * @param none + * @return none + */ + void SetPresentityBlockedToXIMPL(); + + /** + * Block presentity + * + * @since S60 3.2 + * @param none + * @return none + */ + void BlockPresentityL(); + + /** + * Unblock presentity + * + * @since S60 3.2 + * @param none + * @return none + */ + void UnblockPresentityL(); + + /** + * Unsubscribe presentity presence + * + * @since S60 3.2 + * @param none + * @return none + */ + void UnsubscribePresentityPresenceL(); + + private: // Data + + /** + * XIMP Plugin connection observer + * Own. + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * XIMP Plugin Authorization Data Host + * Not own. + */ + MProtocolPresenceAuthorizationDataHost* iDataHost; + + /** + * XDM Settings id + * Own. + */ + TInt iSettingsId; + + /** + * PrFW request id + * Own. + */ + TXIMPRequestId iXIMPId; + + /** + * PrFW request id for own requests + * Own. + */ + TXIMPRequestId iXIMPIdOwn; + + /** + * Simple Engine request id + * Own. + */ + TInt iSimpleId; + + /** + * Subscribed items. + * Own. + */ + TBool iSubscribed; + + /** + * Current operation + * Own. + */ + TPluginAuthOperation iOperation; + + /** + * Current presentity in progress + * Own. + */ + HBufC16* iPresIdentity; + + /** + * Whether Presence XDM is up-to-date + * Own. + */ + TBool iXdmOk; + + /** + * XDM Utils + * Not own. + */ + CPresencePluginXdmUtils* iXdmUtils; + + /** + * Authorization complete + * Own. + */ + TBool iComplete; + + /** + * Presence Data + * Not Own + */ + CPresencePluginData* iPresenceData; + + /** + * client statutus. + * Not own. + */ + TRequestStatus* iClientStatus; + + /** + * Block state. + * Own. + */ + TPluginAuthState iAuthState; + + /* + * Virtual phone book contact database operations + * Own. + */ + CPresencePluginContacts* iContacts; + + /* + * Data Returned by CPresencePluginContacts + */ + TBool iContactIsStored; + + SIMPLE_UNIT_TEST( T_CPresencePluginAuthorization ) + SIMPLE_UNIT_TEST( T_CPresencePluginXdmUtils ) + + }; + +#endif // CPresencePluginAuthorization_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincommon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincommon.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,177 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#ifndef PRESENCEPLUGINCOMMON_H +#define PRESENCEPLUGINCOMMON_H + +#include + +/** + * common definitions for Presence Plugin + */ + +//Define max tuple and person id integer +const TInt KMaxNumber = 99999999; + +//Buf size defines + +const TInt KBufSize100 = 100; +const TInt KBufSize200 = 200; +const TInt KBufSize255 = 255; +const TInt KBufSize20 = 20; +const TInt KBufSize10 = 10; + +// Presence Plugin specifications + +_LIT( KPluginName, "CPresencePlugin"); + +/** Nothing subscribed */ +const TUint KPresencePluginSubsNone = 0x00000000; +/** Grant list subscribed */ +const TUint KPresencePluginSubsGrant = 0x00000001; +/** Block list subscribed */ +const TUint KPresencePluginSubsBlock = 0x00000002; +/** Winfo list subscribed */ +const TUint KPresencePluginSubsWinfo = 0x00000004; + +//XDM Resourcelist +/** buddy list id */ +_LIT( KPresenceBuddyList, "buddylist"); +/** blocked list id */ +_LIT( KPresenceBlockedList, "blockedcontacts"); +/** for virtual online buddy group */ +_LIT( KPresenceOnlineBuddy ,"online_buddies"); +/** Subscribed buddys */ +_LIT( KPresenceSubcribedBuddys, "subs_buddys"); + +//XDM Presencerules list +/** Presence XDM block rule id */ +_LIT( KPresenceXdmBlockRule, "pres_blacklist"); +/** Presence XDM whitelist*/ +_LIT( KPresenceXdmWhiteList, "pres_whitelist"); +/** Presence XDM grant rule id */ +_LIT( KPresenceXdmGrantRule, "pres_whitelist"); +/** S60 Shared XDM list for granted entities */ +_LIT( KPresenceS60GrantedList, "s60_granted_list"); + +//For localmode check +_LIT(KLocalhost, "http://localhost"); + +// when contact goes offline this is content of aBasicElement->ContentUnicodeL() +_LIT( KClose ,"close"); + +//For own presence status NOTIFY +_LIT(KIndent, "t"); // for tupleId +_LIT(KPersonId, "p"); // for person + +// Temporary hard coded values for presence cache 2 support. Common definitions needed! +_LIT( KDefaultAvailableStatus, "available" ); + + +namespace NPresencePlugin + { + namespace NPresence + { + _LIT( KPresenceDisplayName, "display-name"); + _LIT( KPresenceIndex, "index"); + _LIT( KPresenceResourceLists, "resource-lists"); + _LIT( KPresenceResourceList, "resource-list.xml"); + _LIT( KPresenceConditions, "conditions"); + _LIT( KPresenceIdentity, "identity"); + _LIT( KPresenceRuleset, "ruleset" ); + _LIT( KPresenceRule, "rule"); + _LIT( KPresenceAction, "actions"); + _LIT( KPresenceAllow, "allow"); + _LIT8( KPresenceAllow8, "allow"); + _LIT( KPresenceBlock, "block"); + _LIT8( KPresenceBlock8, "block"); + _LIT( KPresenceSub, "sub-handling"); + _LIT( KPresencePresRules, "presrules"); + _LIT( KPresenceList, "list"); + _LIT( KPresenceName, "name"); + _LIT( KPresenceEntry, "entry"); + _LIT( KPresenceOne , "one"); + _LIT( KPresencePerson, "person"); + _LIT8( KPresencePerson8, "person"); + _LIT8( KPresenceWatcher8, "watcher"); + _LIT8( KPresenceWatherInfo8, "watcherinfo"); + _LIT8( KPresenceWatcherList8, "watcher-list"); + _LIT8( KPresenceStatus8, "status"); + _LIT8( KPresenceActive8, "active"); + _LIT8( KPresenceEvent8, "event"); + _LIT8( KPresencePending8, "pending"); + _LIT8( KPresenceBasic8, "basic"); + _LIT( KPresenceBasic, "basic"); + _LIT8( KPresenceStatusicon8, "status-icon"); + _LIT8( KPresenceNote8, "note"); + _LIT8( KPresenceSubscribe8, "subscribe"); + _LIT( KPresenceUri, "uri"); + _LIT8( KPresenceUri8, "uri"); + _LIT8( KPresenceState8, "state"); + _LIT8( KPresenceInstance8, "instance"); + _LIT8( KPresenceTerminated8, "terminated"); + _LIT8( KPresenceResource8, "resource"); + _LIT8( KPresenceList8, "list"); + _LIT8( KPresenceTuple8, "tuple"); + _LIT( KPresenceTuple, "tuple"); + _LIT( KPresenceId, "id"); + _LIT8( KPresenceId8, "id"); + _LIT( KPresenceActivities, "activities"); + _LIT8( KPresenceActivities8, "activities"); + _LIT8( KPresenceFull8, "full"); + _LIT( KPresencePartial, "partial"); + _LIT8( KPresencePartial8, "partial"); + } + namespace NPresenceStates + { + _LIT( KPresenceOpen, "open"); + _LIT( KPresenceClosed, "closed"); + _LIT( KPresenceClose, "close"); + _LIT( KPresenceOffline, "offline"); + _LIT8( KPresenceOffline8, "offline"); + _LIT( KPresenceAvailable, "available"); + _LIT8( KPresenceAvailable8, "available"); + _LIT( KPresenceUnknow, "unknown"); + _LIT8( KPresenceUnknow8, "unknown"); + _LIT( KPresenceBusy, "busy"); + _LIT8( KPresenceBusy8, "busy"); + _LIT( KPresenceOnThePhone, "on-the-phone"); + _LIT8( KPresenceOnThePhone8, "on-the-phone"); + _LIT( KPresenceAway, "away"); + _LIT8( KPresenceAway8, "away"); + _LIT( KPresenceDoNotDisturb, "do-not-disturb"); + _LIT8( KPresenceDoNotDisturb8, "do-not-disturb"); + _LIT( KPresencePending, "pending" ); + } + namespace NPresenceTransformations + { + _LIT( KPresenceTRUE, "TRUE"); + _LIT( KPresenceFALSE, "FALSE"); + _LIT( KPresenceTrasformations, "transformations"); + _LIT( KPresenceProvideServices, "provide-services"); + _LIT( KPresenceAllServices, "all-services"); + _LIT( KPresenceProvidePersons, "provide-persons"); + _LIT( KPresenceAllPersons, "all-persons"); + _LIT( KPresenceProvidedevices, "provide-devices"); + _LIT( KPresenceAlldevices, "all-devices"); + _LIT( KPresenceProvideAllAttributes, "provide-all-attributes"); + _LIT( KPresenceProvideActivities, "provide-activities"); + _LIT( KPresenceProvideNote, "provide-note"); + } + } + +#endif // PRESENCEPLUGINCOMMON_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginconnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginconnection.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,642 @@ +/* +* Copyright (c) 2006-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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef PRESENCEPLUGINCONNECTION_H +#define PRESENCEPLUGINCONNECTION_H + +#include +#include +#include +//Connection obs +#include "mpresencepluginconnectionobs.h" +#include "simpleimfeatures.h" +#include "presencelogger.h" + +//FORWARD +class MXIMPServiceInfo; +class MXIMPObjectFactory; +class MXIMPProtocolConnectionHost; +class MProtocolPresenceWatching; +class MProtocolPresencePublishing; +class MProtocolPresentityGroups; +class MProtocolPresenceAuthorization; +class MProtocolPresenceFeatures; +class MProtocolPresenceDataHost; +class CPresencePluginSession; +class CPresencePluginWinfo; +class CPresencePluginWatcher; +class CPresencePluginAuthorization; +class CPresencePluginPublisher; +class CPresencePluginXdmUtils; +class CPresencePluginGroups; +class CPresencePluginVirtualGroup; +class CPresencePluginData; +class CPresenceConnectionInfo; +class MProtocolImFeatures; + + +/** + * CPrecensePluginSession + * + * presence Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS(CPresencePluginConnection) : public CActive, + public MXIMPProtocolConnection, + public MProtocolPresenceFeatures, + public MPresencePluginConnectionObs + { + public: + + enum TConnectionStatus + { + /** undefined */ + ENotActive = 0, + /** Connection initializing */ + EActive, + /** Connection close */ + ETerminated + }; + + /** + * Two-phased constructor. + * + * @param aServiceInfo, XIMP service info + * @param aClientCtxInfo, XIMP contex client info + */ + static CPresencePluginConnection* NewL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aClientCtxInfo ); + + /** + * Two-phased constructor loaded. + * + * @param aServiceInfo, XIMP service info + * @param aClientCtxInfo, XIMP contex client info + */ + static CPresencePluginConnection* NewL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aClientCtxInfo, + const TDesC8& aETag ); + + /** + * Standard C++ destructor + */ + ~CPresencePluginConnection(); + + /** + * Grand list subscribe state + * + * @since S60 3.2 + * @param none + * @return TBool grand list subscribe state + */ + TBool GrandListState( ); + + /** + * Set connection info array + * + * @since S60 3.2 + * @param connection info + * @return none + */ + void SetConnectionArray( CPresenceConnectionInfo* aArray ); + + /** + * Get connection info array + * + * @since S60 3.2 + * @param none + * @return return info + */ + CPresenceConnectionInfo* GetConnectionArray( ); + + + /** + * Gets protocol interface. In error cases returns NULL + * + * @since S60 5.0 + * @param none + * @return protocol interface + */ + TAny* GetProtocolInterface( TInt aInterfaceId ); + + private: + + /** + * Standard C++ constructor + */ + CPresencePluginConnection( ); + + /** + * Performs the 2nd phase of construction. + * + * @param aService, XIMP service info + * @param aClientCtxInfo, XIMP contex client info + */ + void ConstructL( + const MXIMPServiceInfo& aService, + const MXIMPContextClientInfo& aClientCtxInfo ); + + /** + * Performs the 2nd phase of construction. Overload + * + * @param aService, XIMP service info + * @param aClientCtxInfo, XIMP contex client info + */ + void ConstructL( + const MXIMPServiceInfo& aService, + const MXIMPContextClientInfo& aClientCtxInfo, + const TDesC8& aETag ); + + private: //Own private functions + + /** + * DeRegister + * + * @since S60 3.2 + * @param none + * @return none + */ + void DeRegister( ); + + /** + * CreateImFeaturesPlugin + * + * @since S60 5.0 + * @param none + * @return none + */ + void CreateImFeaturesPluginL(); + + /** + * DeleteImFeaturesPlugin + * + * @since S60 5.0 + * @param none + * @return none + */ + void DeleteImFeaturesPlugin(); + + protected: // from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + public: // from base class MPrFwBase + + TInt32 GetPresenceSetId() const; + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + public:// from base class MPresencePluginConnectionObs + + /** + * Return subscribed buddy virtual group + * + * @since S60 3.2 + * @param none + * @return CPresencePluginVirtualGroup, virtual group + */ + CPresencePluginVirtualGroup* SubscribedContacts(); + + /** + * Get Stop Publish state + * + * @since S60 3.2 + * @param none + * @return TBOOL, Stop Publish state + */ + TBool GetStopPublishState(); + + /** + * Is stop publish called + * + * @since S60 3.2 + * @param none + * @return TBOOL, Stop Publish + */ + TBool IsStopPublishCalled(); + + /** + * Set Stop Publish state + * + * @since S60 3.2 + * @param aState, stop publish state TRUE/FALSE + * @return none + */ + void SetStopPublishState( TBool aState ); + + /** + * Get Tuple id + * + * @since S60 3.2 + * @param none + * @return TInt, tupleid + */ + TInt GetTupleId() const; + + /** + * Set Tuple id + * + * @since S60 3.2 + * @param aTupleId, generated tupleid + * @return none + */ + void SetTupleId( const TInt aTupleId ); + + /** + * Get ETag + * + * @since S60 3.2 + * @param none + * @return TDesC8, Etag value + */ + const TDesC8& GetETag() const; + + /** + * Set ETag + * + * @since S60 3.2 + * @param aEtag, Etag value + * @return none + */ + void SetETag( const TDesC8& aETag ); + + /** + * Defined in a base class + */ + void CompleteReq( TReqType aType, TInt aStatus ); + + /** + * Defined in a base class + */ + void CompleteReq( TXIMPRequestId aReqId, TInt aStatus ); + + /** + * Defined in a base class + */ + MXIMPObjectFactory& ObjectFactory(); + + /** + * Defined in a base class + */ + MPresenceObjectFactory& PresenceObjectFactoryOwn(); + + /** + * Defined in a base class + */ + CPresencePluginWinfo* WinfoHandlerL(); + + /** + * Defined in a base class + */ + CPresencePluginWatcher* WatcherHandlerL(); + + /** + * Defined in a base class + */ + void WinfoTerminatedL( TInt aReason ); + + /** + * Defined in a base class + */ + void WinfoNotification( MSimpleWinfo& aWinfo ); + + /** + * Defined in a base class + */ + TPtrC8 CurrentSipPresentity8(); + + /** + * Defined in a base class + */ + CPresencePluginXdmUtils* XdmUtilsL(); + + /** + * Defined in a base class + */ + TBool GetSessionStatus( ); + + /** + * Termiante connection + */ + void TerminateConnectionL( ); + + /** + * Returns groups api implementation. Leaves if + * pointer not available. + */ + CPresencePluginGroups& GroupsL(); + + /** + * Returns service id + */ + TInt& ServiceId(); + + public: // from MXIMPProtocolConnection + + /** + * Defined in a base class + */ + MProtocolPresenceDataHost& ProtocolPresenceHost(); + + /** + * Defined in a base class + */ + MProtocolPresenceFeatures& ProtocolPresenceFeatures(); + + /** + * PrimeHost + * + * @since S60 3.2 + * @param [in] aHost + * Reference to host interface, what this MXIMPProtocolConnection + * instance must use to communicate back to Presence Framework + * direction. + */ + void PrimeHost( MXIMPProtocolConnectionHost& aHost ); + + /** + * OpenSessionL + * + * @since S60 3.2 + * @param [in] aReqId + * Request ID identifying the request. Presence protocol + * connection implementation must cache here given ID and + * use it when completing the request later through the + * MXIMPProtocolConnectionHost::HandleRequestCompleted(). + */ + void OpenSessionL( const MXIMPContextClientInfo& aClientCtxInfo, + TXIMPRequestId aReqId ); + + /** + * OpenSessionL + * + * @since S60 3.2 + * @param [in] aReqId + * Request ID identifying the request. Presence protocol + * connection implementation must cache here given ID and + * use it when completing the request later through the + * MXIMPProtocolConnectionHost::HandleRequestCompleted(). + */ + void OpenSessionL( const TInt& aSettingsId, + TXIMPRequestId aReqId ); + + /** + * CloseSession + * + * @since S60 3.2 + * @param [in] aReqId + * Request ID identifying the request. Presence protocol + * connection implementation must cache here given ID and + * use it when completing the request later through the + * MXIMPProtocolConnectionHost::HandleRequestCompleted(). + */ + void CloseSession( const MXIMPContextClientInfo& aContextClient, + TXIMPRequestId aReqId ); + + /** + * GetSupportedFeaturesL + * + * @since S60 3.2 + * @param [out] aFeatures + * Return parameter where to append supported + * presence protocol connection features. + * Feature IDs are defined in NXIMPFeature namespace. + */ + void GetSupportedFeaturesL( CDesC8Array& aFeatures ) const; + + /** + * PresenceWatching + * + * @since S60 3.2 + * @return Requested interface. + * interface ownership is not returned caller. + */ + MProtocolPresenceWatching& PresenceWatching(); + + /** + * PresencePublishing + * + * @since S60 3.2 + * @return Requested interface. + * interface ownership is not returned caller. + */ + MProtocolPresencePublishing& PresencePublishing(); + + /** + * PresentityGroups + * + * @since S60 3.2 + * @return Requested interface. + * interface ownership is not returned caller. + */ + MProtocolPresentityGroups& PresentityGroups(); + + /** + * PresenceAuthorization + * + * @since S60 3.2 + * @return Requested interface. + * interface ownership is not returned caller. + */ + MProtocolPresenceAuthorization& PresenceAuthorization(); + + /** + * PresenceAuthorization + * + * @since S60 3.2 + * @return Requested interface as own type + * interface ownership is not returned caller. + */ + CPresencePluginAuthorization& InternalPresenceAuthorization(); + + /** + * Defined in a base class + */ + MXIMPProtocolConnectionHost* Host(); + + /** + * Defined in a base class + */ + TPtrC16 CurrentDomain(); + + /** + * Defined in a base class + */ + MXIMPServiceInfo& ServiceInfo(); + + private: //data + + /** + * Presence Engine session + * Own. + */ + CPresencePluginSession* iSession; + + /** + * CPresencePluginWinfo + * Own. + */ + CPresencePluginWinfo* iPluginWinfo; + + /** + * CPresencePluginWatcher + * Own. + */ + CPresencePluginWatcher* iWatcher; + + /** + * current request id + * Own + */ + TXIMPRequestId iXIMPId; + + /** + * Host for connection. + * Not own. + */ + MXIMPProtocolConnectionHost* iConnectionHost; + + /** + * MXIMPProtocolPresenceauthorization implementation. + * Own. + */ + CPresencePluginAuthorization* iAuth; + + /** + * CSimplePluginPublisher + * Own. + */ + CPresencePluginPublisher* iPublisher; + + /** + * CSimplePluginGroups + * Own. + */ + CPresencePluginGroups* iGroups; + + /** + * CPresencePluginImFeatures + * Own. + */ + CSimpleImFeatures* iImFeatures; + + /** + * Current user SIP identity + * Own. + */ + HBufC16* iSipPresentity; + + /** + * XDM utils + * Own. + */ + CPresencePluginXdmUtils* iXdmUtils; + + /** + * TupleId + * Own. + */ + TInt iOwnTupleId; + + /** + * Document Etag + * Own. + */ + HBufC8* iETag; + + /** + * Virtual groups + * Own + */ + CPresencePluginVirtualGroup* iSubscribedBuddys; + + /** + * Plugin Data + * Own. + */ + CPresencePluginData* iPresenceData; + + /** + * Stop publish state + * Own + */ + TBool iStopPublishState; + + /** + * Grant list subscribe state + * Own + */ + TBool iGrantListSubs; + + /** + * Is stop publish called + * Own + */ + TBool iStopPublishCall; + + /** + * Terminated state called + * Own. + */ + TBool iTerminatedCall; + + /** + * Connection Array instance + * Own. + */ + CPresenceConnectionInfo* iConnectionArray; + + SIMPLE_UNIT_TEST( T_CPresencePluginConnection ) + SIMPLE_UNIT_TEST( T_SIMPLEDataModelAdapter ) + }; + +#endif // PRESENCEPLUGINCONNECTION_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontacts.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontacts.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,344 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_CPRESENCEPLUGINCONTACTS_H +#define C_CPRESENCEPLUGINCONTACTS_H + + +#include +#include +#include +#include +#include "presencecontactscontextbase.h" +#include "presencelogger.h" + +class CVPbkContactManager; +class MVPbkContactOperationBase; +class MVPbkContactLinkArray; +class MVPbkStoreContact; +class CVPbkFieldTypeRefsList; +class CPresencePluginContactStateHandler; +class MPresencePluginContactsObs; + + +/** + * CPrecensePluginContacts Operation states + */ +enum TPresenceContactsOperation + { + EOperationIsPresenceStoredToContacts + }; + + +/** + * Access to virtual phonebook contacts database + * + * @lib presenceplugin.dll + * @since S60 v5.0 + */ +NONSHARABLE_CLASS( CPresencePluginContacts ) : + public CActive, + public MVPbkContactStoreListObserver, + public MVPbkContactFindObserver, + public MVPbkSingleContactOperationObserver, + public MPresenceContactsContextBase + { + +public: + + /** + * Two-phased constructor. + * @param aServiceId Service ID. + * @param aServiceName Service name + * @param aObserver Callback results + */ + static CPresencePluginContacts* NewL( + TInt aServiceId, + const TDesC& aServiceName, + MPresencePluginContactsObs& aObserver ); + + /** + * Two-phased constructor. + * @param aServiceId Service ID. + * @param aServiceName Service name + * @param aObserver Callback results + */ + static CPresencePluginContacts* NewLC( + TInt aServiceId, + const TDesC& aServiceName, + MPresencePluginContactsObs& aObserver ); + + /** + * Destructor. + */ + virtual ~CPresencePluginContacts(); + + /** + * Query to virtual bhonebook contacts database + * to ensure is the presence service stored to database + * + * Calls MPresencePluginContactsObs::RequestComplete() when comlete + * + * @since S60 v5.0 + * @param aPresenceId Presence ID. + * @param aStatus Client status + */ + void IsPresenceIdStoredL( const TDesC16& aPresenceId, + TRequestStatus& aStatus ); + +protected: + +// from base class CActive + + void RunL(); + + void DoCancel(); + + TInt RunError( TInt aError ); + +// from base class MVPbkContactStoreListObserver + + /** + * Called when the opening process is complete. + * + * Before this all stores have sent StoreReady or StoreUnavailable + * event. The client can not trust that all stores are available + * for use when this is called. + */ + void OpenComplete(); + +// from base class MVPbkContactStoreObserver ( from MVPbkContactStoreListObserver ) + + /** + * Called when a contact store is ready to use. + * + * @param aContactStore The store that is ready. + */ + void StoreReady( MVPbkContactStore& aContactStore ); + + /** + * Called when a contact store becomes unavailable. + * + * Client may inspect the reason of the unavailability and decide + * whether or not it will keep the store opened (ie. listen to + * the store events). + * + * @param aContactStore The store that became unavailable. + * @param aReason The reason why the store is unavailable. + * This is one of the system wide error codes. + */ + void StoreUnavailable( MVPbkContactStore& aContactStore, + TInt aReason ); + + /** + * Called when changes occur in the contact store. + * + * @see TVPbkContactStoreEvent + * @param aContactStore A store whose event it is. + * @param aStoreEvent The event that has occurred. + */ + void HandleStoreEventL( + MVPbkContactStore& aContactStore, + TVPbkContactStoreEvent aStoreEvent ); + +// from base class MVPbkContactFindObserver + + /** + * Called when find is complete. Caller takes ownership of the results + * In case of an error during find, the aResults may contain only + * partial results of the find + * + * @param aResults Array of contact links that matched the find + * Callee must take ownership of this object in + * the start of the function, ie. in case the + * function leaves the results must be destroyed. + * The find operation can be destroyed at the end + * of this callback. + */ + void FindCompleteL( MVPbkContactLinkArray* aResults ); + + /** + * Called in case the find fails for some reason. The find operation + * can be destroyed at the end of this callback. + * + * @param aError One of the system wide error codes. + * KErrNotReady if store is not ready (not open or unavailable) + */ + void FindFailed( TInt aError ); + +// from base class MVPbkSingleContactOperationObserver + + /** + * Called when the operation is completed. + * + * A client has the operation as a member and it can delete the operation + * instance in this function call. If the implementation of the store + * calls the function from the operation instance it must not handle + * any member data after calling it. + * + * @param aOperation The completed operation. + * @param aContact The contact returned by the operation. + * A client must take the ownership immediately. + * + * NOTE: + * If you use CleanupStack for MVPbkStoreContact + * Use MVPbkStoreContact::PushL or + * CleanupDeletePushL from e32base.h. + * (Do Not Use CleanupStack::PushL(TAny*) because + * then the virtual destructor of the M-class + * won't be called when the object is deleted). + */ + void VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& aOperation, + MVPbkStoreContact* aContact ); + + /** + * Called if the operation fails. + * + * A client has the operation as a member and it can delete the operation + * instance in this function call. If the implementation of the store + * calls the function from the operation instance it must not handle + * any member data after calling it. + * + * @param aOperation The failed operation. + * @param aError An error code of the failure. + */ + void VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& aOperation, + TInt aError ); + +// from base class MPresenceContactsContextBase + + /** + * Open virtual phonebook contact stores + * + * @since S60 v5.0 + */ + void OpenL(); + + /** + * Start virtual phonebook contacts search + * + * @since S60 v5.0 + */ + void SearchL(); + + /** + * Return virtual phonebook contact links + * + * @since S60 v5.0 + * @return virtual phonebook contact links + */ + const MVPbkContactLinkArray& ContactLinkArrayL(); + + /** + * Resolve virtual phonebook contact from contact link + * + * @since S60 v5.0 + * @param aContactLink contact link to resolve + */ + void RetrieveContactL( + const MVPbkContactLink& aContactLink ); + +private: + + CPresencePluginContacts( TInt aServiceId, MPresencePluginContactsObs& aObserver ); + + void ConstructL( const TDesC& aServiceName ); + + HBufC* ContactStoreNameL(); + +private: //data + + /** + * Service id. + */ + TInt iServiceId; + + /** + * Service name. + * Own. + */ + HBufC* iServiceName; + + /** + * Text used in search + * Own. + */ + HBufC* iSearchText; + + /** + * Observer. + * Not own. + */ + MPresencePluginContactsObs* iObserver; + + /** + * Presence Plugin Contacts Operation + */ + TPresenceContactsOperation iOperation; + + /** + * Virtual Phonebook field types + * Own. + */ + CVPbkFieldTypeRefsList* iFieldTypeRefList; + + /** + * Virtual Phonebook contact manager + * Own. + */ + CVPbkContactManager* iContactManager; + + /** + * VPbk operation + * Own. + */ + MVPbkContactOperationBase* iContactOperation; + + /** + * VPbk contact links + * Own. + */ + MVPbkContactLinkArray* iContactLinkArray; + + /** + * VPbk Store contact array + * Own. + */ + RPointerArray iStoreContactArray; + + /** + * state handler + * Own. + */ + CPresencePluginContactStateHandler* iStateHandler; + + /** + * Client status + * Not own. + */ + TRequestStatus* iClientStatus; + + + SIMPLE_UNIT_TEST( UT_CPresencePluginContacts ) + + }; + + +#endif // C_CPRESENCEPLUGINCONTACTS_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontactsobs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontactsobs.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef M_MPRESENCEPLUGINCONTACTSOBS_H +#define M_MPRESENCEPLUGINCONTACTSOBS_H + + +#include +#include "presenceplugincontacts.h" + + +/** + * Callback from virtual phonebook contacts handler + * + * @lib presenceplugin.dll + * @since S60 v5.0 + */ +class MPresencePluginContactsObs + { + +public: + + /** + * Informs the observer that the operation is completed + * + * @param aResult Result data returned,ownership is + * transferred to the client. + * In operation EOperationIsPresenceStoredToContacts + * return type is TBool*. + * @param aOperation Operation type + * @param aError Completion error code + */ + virtual void RequestComplete( TAny* aResult, + TPresenceContactsOperation aOperation, TInt aError ) = 0; + + }; + + +#endif // M_PRESENCEPLUGINCONTACTSOBS_H + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontactstate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontactstate.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,65 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#ifndef C_CPRESENCEPLUGINCONTACTSTATE_H +#define C_CPRESENCEPLUGINCONTACTSTATE_H + +#include + +class CPresencePluginContactStateHandler; +class MPresenceContactsContextBase; + +/** + * Base class for presenceplugin contacts states + * + * @lib presenceplugin.dll + * @since S60 V5.0 + */ +class CPresencepluginContactState : public CBase + { + +public: + + CPresencepluginContactState( MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ); + + virtual ~CPresencepluginContactState(); + + virtual void HandleL() = 0; + + virtual void Complete(); + + virtual void Error( TInt aError ); + +protected: // data + + /** + * Context + * Not own. + */ + MPresenceContactsContextBase* iContext; + + /** + * State handler + * Not own. + */ + CPresencePluginContactStateHandler* iStateHandler; + + }; + + +#endif // C_CPRESENCEPLUGINCONTACTSTATE_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontactstateend.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontactstateend.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_CPRESENCEPLUGINCONTACTSTATEEND_H +#define C_CPRESENCEPLUGINCONTACTSTATEEND_H + + +#include "presenceplugincontactstate.h" + +/** + * CPresencePluginContactStateEnd + */ +class CPresencePluginContactStateEnd : + public CPresencepluginContactState + { + +public: + + /** + * Constructor + */ + CPresencePluginContactStateEnd( MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ); + + virtual ~CPresencePluginContactStateEnd(); + + void HandleL(); + + }; + + +#endif // C_CPRESENCEPLUGINCONTACTSTATEEND_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontactstatehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontactstatehandler.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_CPRESENCEPLUGINCONTACTSTATEHANDLER_H +#define C_CPRESENCEPLUGINCONTACTSTATEHANDLER_H + + +#include + +class CPresencepluginContactState; + +/** + * States handler + * + * @lib presenceplugin.dll + * @since S60 v5.0 + */ +class CPresencePluginContactStateHandler : public CBase + { + +public: + + static CPresencePluginContactStateHandler* NewL(); + + /** + * Destructor. + */ + virtual ~CPresencePluginContactStateHandler(); + + /** + * Add states to queue + * + * @since S60 v5.0 + * @param aState State to add, ownership is transferred. + */ + void AddStateL( CPresencepluginContactState* aState ); + + /** + * Start State machine. + * States must be added before + * + * @since S60 v5.0 + * @param aStatus Client status + */ + void Start( TRequestStatus* aStatus ); + + /** + * States are progressed to end + * or error occured + * + * @since S60 v5.0 + * @param aError Possible error + */ + void Complete( TInt aError ); + + /** + * State getter + * + * @since S60 v5.0 + * @return State + */ + CPresencepluginContactState* State(); + + /** + * Order statehandler to move next state + * + * @since S60 v5.0 + */ + void ProgressToNextState(); + +private: + + CPresencePluginContactStateHandler(); + + void HandleNextState(); + +private: // data + + /** + * Current state index + * own. + */ + TInt iCurrentStateIndex; + + /** + * States to process + * own. + */ + RPointerArray< CPresencepluginContactState > iStateArray; + + /** + * Client status + * Not own. + */ + TRequestStatus* iClientStatus; + + }; + + +#endif // C_CPRESENCEPLUGINCONTACTSTATEHANDLER_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontactstateopen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontactstateopen.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_CPRESENCEPLUGINCONTACTSTATEOPEN_H +#define C_CPRESENCEPLUGINCONTACTSTATEOPEN_H + + +#include "presenceplugincontactstate.h" + +/** + * CPresencePluginContactStateOpen + * + */ +class CPresencePluginContactStateOpen : + public CPresencepluginContactState + { + +public: + + /** + * Constructor + */ + CPresencePluginContactStateOpen( MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ); + + + virtual ~CPresencePluginContactStateOpen(); + + void HandleL(); + + }; + + +#endif // C_CPRESENCEPLUGINCONTACTSTATEOPEN_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontactstateresolve.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontactstateresolve.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_CPRESENCEPLUGINCONTACTSTATERESOLVE_H +#define C_CPRESENCEPLUGINCONTACTSTATERESOLVE_H + + +#include "presenceplugincontactstate.h" + +/** + * CPresencePluginContactStateResolve + * + */ +class CPresencePluginContactStateResolve : + public CPresencepluginContactState + { + +public: + + /** + * Constructor + */ + CPresencePluginContactStateResolve( MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ); + + virtual ~CPresencePluginContactStateResolve(); + + void HandleL(); + + void Complete(); + +private: // Data + + TInt iContactLinkIndex; + + TInt iContactLinkCount; + + }; + + +#endif // C_CPRESENCEPLUGINCONTACTSTATERESOLVE_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugincontactstatesearch.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugincontactstatesearch.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,48 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_CPRESENCEPLUGINCONTACTSTATESEARCH_H +#define C_CPRESENCEPLUGINCONTACTSTATESEARCH_H + + +#include "presenceplugincontactstate.h" + +/** + * CPresencePluginContactStateSearch + * + */ +class CPresencePluginContactStateSearch : + public CPresencepluginContactState + { + +public: + + /** + * Constructor + */ + CPresencePluginContactStateSearch( MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ); + + virtual ~CPresencePluginContactStateSearch(); + + void HandleL(); + + }; + + +#endif // C_CPRESENCEPLUGINCONTACTSTATESEARCH_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugindata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugindata.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,470 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_PRESENCEPLUGINDATA_H +#define C_PRESENCEPLUGINDATA_H + +#include +#include +#include +#include + +#include "mpresencepluginconnectionobs.h" +#include "presencelogger.h" + +class MXIMPObjectFactory; +class MPresenceObjectFactory; +class MSimpleDocument; +class MPresenceInfo; +class MSimplePresenceList; +class MPresenceInfoFieldCollection; +class MXIMPObjectCollection; +class MPersonPresenceInfo; +class MPresenceInfoField; +class MSimpleElement; +class MPresenceCacheWriter2; +class MPresenceCacheReader2; + +/** + * CPresencePluginData + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginData ): public CBase + { + public: + + /** + * Two-phased constructor. + * + * @param none + * @param none + */ + static CPresencePluginData* NewL( + MPresencePluginConnectionObs& aObs, + TInt aServiceId ); + + /** + * Two-phased constructor. + * + * @param none + * @param none + */ + static CPresencePluginData* NewLC( + MPresencePluginConnectionObs& aObs, + TInt aServiceId ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginData(); + + /** + * Convert to engine notification to MXIMPPresenceInfo + * + * @since S60 5.0 + * @param aPresenceFactory object factory + * @param aPrInfo ximp info structure [out] + * @param aUnicodeNoteContent note field content [out] + */ + void NotifyToBlockedToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent = KNullDesC ); + + /** + * Convert to engine notification to MXIMPPresenceInfo + * + * @since S60 3.2 + * @param aFactory ximp Factory + * @param aPrInfo ximp info structure [out] + * @param aUnicodeNoteContent note field content [out] + */ + void NotifyToPendingToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent = KNullDesC ); + + /** + * Convert to engine notification to MXIMPPresenceInfo + * + * @since S60 3.2 + * @param aFactory ximp Factory + * @param aPrInfo ximp info structure [out] + * @param aUnicodeNoteContent note field content [out] + */ + void NotifyTerminatedToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent = KNullDesC ); + + /** + * Convert to engine notification to MXIMPPresenceInfo + * + * @since S60 3.2 + * @param aFactory ximp Factory + * @param aPrInfo ximp info structure [out] + * @param aUnicodeNoteContent note field content [out] + * @param aAvailability availability value for cache entry [out] + */ + void NotifyToActiveToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent = KNullDesC, + NPresenceInfo::TAvailabilityValues aAvailability = + NPresenceInfo::EAvailable ); + + /** + * Convert to engine notification to MximpPresenceInfo + * + * @since S60 3.2 + * @param aFactory ximp Factory + * @param aDocument notification + * @param aPrInfo ximp info structure [out] + */ + void NotifyToPrInfoL( + MXIMPObjectFactory& aFactory, + MPresenceObjectFactory& aPresenceFactory, + MSimpleDocument& aDocument, + MPresenceInfo& aPrInfo ); + + /** + * Extracts cache data entries from presence info object. + * + * @since S60 5.0 + * @param aPrInfo ximp info structure + * @param aAvailability will store cache availability + * @param aExtendedAvailability will store extended availability + * @param aStatusMessage will store custom status message + */ + void CacheEntriesFromPrInfo( + MPresenceInfo& aPrInfo, + MPresenceBuddyInfo2::TAvailabilityValues& aAvailability, + TPtr& aExtendedAvailability, + TPtr& aStatusMessage ); + + /** + * Convert to engine list notification to MximpPresenceInfo elements + * + * @since S60 3.2 + * @param aFactory ximp Factory + * @param aList notification + * @param aEntities array of ximp info structure [out] + * @param aTerminated array of ximp info structure for + * terminated entities [out] + */ + void NotifyListToPrInfoL( + MXIMPObjectFactory& aFactory, + MPresenceObjectFactory& aPresenceFactory, + MSimplePresenceList& aList, + RPointerArray& aEntities, + RPointerArray& aActives, + RPointerArray& aTerminated ); + + /** + * AddPrPersToSimpleDocumentL + * + * @since S60 3.2 + * Add subscribed or blocked person to document + * @param aInfo, presence info + * @param aDocument, xml document + * @param aSipId, sip identity + * @param aTupleId, client tupleId + */ + void AddPrPersToSimpleDocumentL( + const MPersonPresenceInfo* aInfo, + MSimpleDocument& aDocument, + const TDesC8& aSipId, + TInt aTupleId ); + + /** + * Creates document. + * + * @since S60 3.2 + * @param aDocument XDM document + * @param aSipId SIP profile id + * @param aStatusField, status enum field + * @param aMessageField, message field + */ + void DoCreateDocumentL( + MSimpleDocument& aDocument, + const TDesC8& aSipId, + const MPresenceInfoField* aStatusField, + const MPresenceInfoField* aMessageField ); + + /** + * DoCheckBasicStatusValueL + * + * @since S60 3.2 + * @param aField + * @return TPtrC basic status value + */ + TPtrC DoCheckBasicStatusValueL( + const MPresenceInfoField& aField ); + + /** + * DoCheckActivitiesValueL + * + * @since S60 3.2 + * @param aField + * @return TPtrC activities value + */ + TPtrC8 DoCheckActivitiesValueL( + const MPresenceInfoField& aField ); + + /** + * DoCheckNoteValueL + * + * @since S60 3.2 + * @param aField + * @return TPtrC activities value + */ + TPtrC DoCheckNoteValueL( + const MPresenceInfoField& aField ); + + /** + * CreatePresenceUri8LC + * + * @since S60 3.2 + * @param aPresentityUri + * @return presence URI + */ + HBufC8* CreatePresenceUri8LC( + const TDesC8& aPresentityUri ); + + /** + * GenerateTupleId() + * Generate Tuple id for status document + * + * @since S60 3.2 + * @param none + * @return TInt, tupleid + */ + TInt GenerateTupleId(); + + + /** + * Removes prefix from uri. + * + * @since S60 3.2 + * @param aPresentityUri, presentity url + * @return HBufC16, URL without prefix + */ + HBufC16* RemovePrefixLC( + const TDesC& aPresentityUri ); + + /** + * Returns service id. + * + * @since S60 5.0 + * @return TInt, service id related to this data instance + */ + TInt ServiceId(); + + /** + * Resolve service name + * + * @since S60 5.0 + * @param aServiceId Service Id. + * @return resolved service name, ownership returned to caller + */ + HBufC* ServiceNameLC( TInt aServiceId ) const; + + /** + * Writes status to presence cache + * + * @since S60 5.0 + * @param aPresentityId, identity of status + * @param aAvailability, availability value to set + * @param aAvailabilityText, text for extended states + * @param aStatusMessage, status message from remote party + * @return None + */ + void WriteStatusToCacheL( + const TDesC& aPresentityId, + MPresenceBuddyInfo2::TAvailabilityValues aAvailability, + const TDesC& aAvailabilityText, + const TDesC& aStatusMessage ); + + /** + * Removes cache entries for this service. + * + * @since S60 5.0 + * @return None + */ + void RemoveCacheL(); + + /** + * Removes cache entries for certain person. + * + * @since S60 5.0 + * @param aIdentity, identity of presence entry + * @return None + */ + void DeletePresenceL( const TDesC& aIdentity ); + + /** + * Stores own presence values to permanent storage. + * + * @since S60 5.0 + * @param aServiceId, service id + * @param aAvailability, availability enumeration + * @param aStatusMessage, custom status message + * @return None + */ + void StorePresenceOwnPresenceL( + const TUint aServiceId, + NPresenceInfo::TAvailabilityValues aAvailability, + const TDesC& aStatusMessage ); + + /** + * Reads document id from permanent storage. + * + * @since S60 5.0 + * @param aServiceId, service id + * @param aDocumentId, document id + * @return None + */ + void ReadDocumentIdL( + const TInt aServiceId, + TDes8& aDocumentId ); + + /** + * Deletes permanent data from storage + * + * @since S60 5.0 + * @param aServiceId, service id + * @return None + */ + void DeletePresenceVariablesL( const TInt aServiceId ); + + private: + + /** + * Standard C++ constructor + */ + CPresencePluginData( + MPresencePluginConnectionObs& aObs, + TInt aServiceId ); + + /** + * Standard C++ constructor + */ + void ConstructL(); + + /** + * UserNoteToXIMPL + * + * @since S60 3.2 + * This method not yet used + * @param aPresenceFactory ximp Factory + * @param aElement Simple elemnt + * @param aCollection Field Collection + */ + void UserNoteToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection ); + + /** + * SingleUserStatusToXIMPL + * + * @since S60 3.2 + * @param aPresenceFactory ximp Factory + * @param aElement Simple element + * @param aActivitiesElement Simple element + * @param aNoteElement Simple element for note elems (can be null) + * @param aCollection Field Collection + */ + void SingleUserStatusToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aBasicElement, + MSimpleElement* aActivitiesElement, + MSimpleElement* aNoteElement, + MPresenceInfoFieldCollection& aCollection ); + + /** + * Returns element or NULL if no is found in the given + * element list. element which matches best current locale is + * returned. + * + * @since S60 5.1 + * @param aElements Element array. + * @return Best matching or NULL. + */ + MSimpleElement* ResolveNoteElementL( + const RPointerArray& aElements ) const; + + /** + * Checks if element has language attribute compatible with the + * current locale. + * + * @since S60 5.1 + * @param aElement Simple element containing language attribute. + * @return ETrue if compatible language attribute is found, + * EFalse otherwise. + */ + TBool IsElementLanguageValidForCurrentLocaleL( + MSimpleElement& aElement ) const; + + /** + * Resolve cache used identifier + * + * @since S60 5.0 + * @param aIdentity presence id without prefix + * @return resolved cache identifier, ownership returned to caller + */ + HBufC* ResolveCacheXspIdentifierL( const TDesC& aIdentity ) const; + + + private: // data + + /** + * Generated tuple/person id + * Own. + */ + TInt iNumBuf; + + /** + * ximp Plugin connection observer + * Not Own. + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * Stores service id. + */ + TInt iServiceId; + + /** + * Writes service status to presence cache. + * Own. + */ + MPresenceCacheWriter2* iPresenceCacheWriter; + + /** + * Reads service status from presence cache. + * Own. + */ + MPresenceCacheReader2* iPresenceCacheReader; + + SIMPLE_UNIT_TEST( T_CPresencePluginData ) + }; + +#endif //C_PRESENCEPLUGINDATA_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugindef.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugindef.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#ifndef PRESENCEPLUGINDEF_H +#define PRESENCEPLUGINDEF_H + +#include + + +/** + * C++ compatible definitions for XIMP PRESENCE protocol. + * + * This must be kept in-sync with definitions in + * "simpleplugin_resource.hrh" + */ + +//XIMP primary test protocol +const TInt K_PRESENCEPLUGIN_1_VERSION_NO = 1; +_LIT( K_PRESENCEPLUGIN_1_DISPLAY_NAME, "XIMP PRESENCE protocol" ); +_LIT( K_PRESENCEPLUGIN_1_DEFAULT_DATA, "PRESENCE" ); +_LIT( K_PRESENCEPLUGIN_1_OPAQUE_DATA , "

Nokiafeat/pres/pubfeat/pres/fetchfeat/pres/subssip" ); + + +#endif // PRESENCEPLUGINDEF_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginentitywatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginentitywatcher.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,301 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINENTITYWATCHER_H +#define CPRESENCEPLUGINENTITYWATCHER_H + +#include +#include +#include +#include +#include "presenceplugincommon.h" +#include "mpresencepluginconnectionobs.h" +#include "presencelogger.h" + +class TXIMPRequestId; +class MSimpleDocument; +class MSimpleWatcher; +class CPresencePluginWatcher; +class MSimpleConnection; +class CPresencePluginData; + +/** + * CPresencePluginEntityWatcher + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginEntityWatcher ): public CBase, + public MSimpleWatcherObserver + { + private: + + /** + * Current operation + */ + enum TPluginEntityWatcherOperation + { + EPluginIdle, + EPluginStop, + EPluginStart, + EPluginModify, + EPluginStartNotifyClient + }; + + public: + + /** + * Constructor. + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + * @param aHost XIMP connection host + */ + static CPresencePluginEntityWatcher* NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginWatcher& aWatcher, + CPresencePluginData* aPresenceData ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginEntityWatcher(); + + /** + * Access Request id + * + * @since S60 3.2 + * @return XIMP request id + */ + TXIMPRequestId XIMPRequestId(); + + /** + * Access Presentity id + * + * @since S60 3.2 + * @return Presentity id + */ + TPtrC8 PresentityId(); + + /** + * Start subscribe + * + * @since S60 3.2 + * @param aPresentityId presentity id + */ + void StartSubscribeL( const TDesC8& aPresentityId ); + + /** + * Start subscribe + * + * @since S60 5.0 + * @param aPresentityId presentity id + * @param aClientRequst client status to complete + */ + void StartSubscribeL( + const TDesC8& aPresentityId, + TRequestStatus& aClientRequst ); + + /** + * Stop Subscrib + * + * @since S60 3.2 + * @param none + * @return none + */ + void StopSubscribeL(); + + /** + * Stop subscribe + * + * @since S60 5.0 + * @param aClientRequst client status to complete + */ + void StopSubscribeL( + TRequestStatus& aClientRequst ); + + /** + * Set active status to XIMP + * + * @since S60 3.2 + * @param none + * @return none + */ + void SetActiveToXIMPL( const TDesC& aIdentity ); + + /** + * Set terminated status to XIMP + * + * @since S60 3.2 + * @param aIdentity identity + * @return none + */ + void SetTerminatedToXIMPL( const TDesC& aIdentity ); + + private: + + /** + * Standard C++ constructor + * + * @param aObs, connection observer + * @param aConn, SIMPLE connection + * @param aWatcher, plugin watcher + */ + CPresencePluginEntityWatcher( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginWatcher& aWatcher ); + + /** + * Performs the 2nd phase of construction. + * + * @since S60 3.2 + * @param none + * @param none + */ + void ConstructL( CPresencePluginData* aPresenceData ); + + public: // from base class MSimpleWatcherObserver + + /** + * Defined in a base class + */ + void WatcherReqCompleteL( TInt aOpId, TInt aStatus ); + + /** + * Defined in a base class + */ + void WatcherNotificationL( MSimpleDocument& aDocument ); + + /** + * Defined in a base class + */ + void WatcherListNotificationL( MSimplePresenceList& aList ); + + /** + * Defined in a base class + */ + void WatcherTerminatedL( + TInt aOpId, TInt aReason ); + + private: + + /** + * Set active status to XIMP + * + * @since S60 3.2 + * @param none + * @return none + */ + void SetActiveToXIMPL( MSimpleDocument& aDocument ); + + /** + * Set terminated status to XIMP + * + * @since S60 3.2 + * @param none + * @return none + */ + void SetTerminatedToXIMPL( ); + + /** + * Set pending status to XIMP + * + * @since S60 3.2 + * @param none + * @return none + */ + void SetPendingToXIMPL( ); + + /** + * Completes client request + * + * @since S60 5.0 + * @param aStatus, complete code + * @return none + */ + void CompleteClientReq( TInt aStatus ); + + private: // Data + + /** + * XIMP Plugin connection observer + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * SIMPLE engine connection + * Not Own. + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine watcher + * Own. + */ + MSimpleWatcher* iWatcher; + + /** + * PrFW request id + * Own. + */ + TXIMPRequestId iXIMPId; + + /** + * Subscribed entity Id. + * Own. + */ + HBufC8* iEntityId; + + /** + * Simple Engine request id + * Own. + */ + TInt iSimpleId; + + /** + * host class + * Own. + */ + CPresencePluginWatcher& iPluginWatcher; + + /** + * current pending operation + * Own. + */ + TPluginEntityWatcherOperation iOperation; + + /** + * instance to Presence data + * Own. + */ + CPresencePluginData* iPresenceData; + + /** + * Client status. + * Not own. + */ + TRequestStatus* iClientStatus; + + SIMPLE_UNIT_TEST( T_CPresencePluginEntityWatcher ) + SIMPLE_UNIT_TEST( T_CPresencePluginWatcher ) + }; + +#endif // CPRESENCEPLUGINENTITYWATCHER_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presenceplugingroup.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presenceplugingroup.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,428 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINGROUP_H +#define CPRESENCEPLUGINGROUP_H + +#include +#include +#include + +#include "presenceplugincommon.h" +#include "mpresencepluginconnectionobs.h" +#include "presencelogger.h" + +class TXIMPRequestId; +class MXIMPIdentity; +class MXIMPProtocolPresentityGroupsDataHost; +class MXIMPObjectCollection; +class CPresencePluginVirtualGroup; +class CPresencePluginData; + +/** + * CPresencePluginGroups + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginGroups ) : public CActive, + public MProtocolPresentityGroups + { + public: + + /** + * Current operation + */ + enum TPluginGroupsOperation + { + ENoOperation, + ECreatePresentityGroup, + EDeletePresentityGroup, + EAddPresentityGroupMember, + EGrantPresentityGroupMember, + ERemovePresentityGroupMember, + EWithdrawGrantFromMember, + EGetListOfLists, + EGetListContent, + EBlockPresentityGroupMember, + EUnblockPresentityGroupMember, + EUnblockInAddPresentityGroupMember + }; + + /** + * Current actibe object state + */ + enum TPluginGroupsState + { + EPluginIdle, + EPluginInitXdm, + EPluginFetchRls, + EPluginAddGroupMember, + EPluginRemoveGroupMember, + EPluginCommitRls, + EPluginCommitXdm + }; + + /** + * Constructor. + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CPresencePluginGroups* NewL( + MPresencePluginConnectionObs& aObs, + CPresencePluginVirtualGroup* aSubscribedBuddies, + CPresencePluginData* aPresenceData ); + + /** + * Constructor. + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CPresencePluginGroups* NewLC( + MPresencePluginConnectionObs& aObs, + CPresencePluginVirtualGroup* aSubscribedBuddies, + CPresencePluginData* aPresenceData ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginGroups(); + + private: + + /** + * Standard C++ constructor + */ + CPresencePluginGroups( + MPresencePluginConnectionObs& aObs, + CPresencePluginVirtualGroup* aSubscribedBuddies, + CPresencePluginData* aPresenceData ); + + public: // from base class MXIMPBase + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + + public: // from base class MXIMPProtocolPresentityGroups + + /** + * Defined in a base class + */ + void DoSubscribePresentityGroupListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityGroupListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoCreatePresentityGroupL( + const MXIMPIdentity& aGroupId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoDeletePresentityGroupL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityGroupDisplayNameL( + const MXIMPIdentity& aGroupId, + const TDesC16& aDisplayName, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribePresentityGroupContentL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityGroupContentL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoAddPresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + const TDesC16& aMemberDisplayName, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoRemovePresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityGroupMemberDisplayNameL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + const TDesC16& aMemberDisplayName, + TXIMPRequestId aReqId ); + + protected: // from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + private: + + /** + * Save presentity id + * + * @since S60 3.2 + * @param aPresentityId presentity id + * @param aFormatUri, attempt to format uri + * @return none + */ + void SetPresIdentityL( + const MXIMPIdentity& aPresentityId, + TBool aFormatUri ); + + /** + * Calls MXIMPProtocolConnectionHost callback + * + * @since S60 3.2 + * @param aStatus error status + * @return none + */ + void CompleteXIMPReq( TInt aStatus ); + + /** + * Start XDM operation + * + * @since S60 3.2 + * @param aReqId, request id + * @param aOperation, groups operation + * @return none + */ + void StartXdmOperationL( + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ); + + /** + * Start XDM operation + * + * @since S60 3.2 + * @param aReqId, request id + * @param aOperation, groups operation + * @return none + */ + void StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ); + + /** + * Start XDM operation + * + * @since S60 3.2 + * @param none + * @return none + */ + void StartXdmOperationL(); + + /** + * Call actual XDM operation + * + * @since S60 3.2 + * @param aCompleteStatus, success or not + * @return none + */ + void CallActualXdmOperationL( TInt aCompleteStatus ); + + /** + * Get List of lists + * + * @since S60 3.2 + * @param none + * @return none + */ + void GetListOfListsL(); + + /** + * Get List content + * + * @since S60 3.2 + * @param none + * @return none + */ + void GetListContentL(); + + /** + * Do Get BuddyList form XDM list + * + * @since S60 3.2 + * @param none + * @return none + */ + void DoGetBuddyListL(); + + /** + * Do Get subscribed BuddyList form virtual list + * + * @since S60 3.2 + * @param none + * @return none + */ + void DoGetSubscribedBuddyListL(); + + /** + * Removes cache entries for certain person. + * + * @since S60 5.0 + * @param none + * @return none + */ + void DeletePersonCacheL(); + + private: // Data + + /** + * XIMP Plugin connection observer + * Own. + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * XDM Settings id + * Own. + */ + TInt iSettingsId; + + /** + * PrFW request id + * Own. + */ + TXIMPRequestId iXIMPId; + + /** + * PrFW request id for own requests + * Own. + */ + TXIMPRequestId iXIMPIdOwn; + + /** + * Simple Engine request id + * Own. + */ + TInt iSimpleId; + + /** + * Current operation + * Own. + */ + TPluginGroupsOperation iOperation; + + /** + * Current presentity in progress + * Own. + */ + HBufC16* iPresIdentity; + + /** + * XDM Utils + * Not own. + */ + CPresencePluginXdmUtils* iXdmUtils; + + /** + * Display name + * Own + */ + HBufC* iDisplayName; + + /** + * Active object state + * Own. + */ + TPluginGroupsState iState; + + /** + * Group request complete + * Own. + */ + TBool iCompleted; + + /** + * Virtual groups + * Not Own + */ + CPresencePluginVirtualGroup* iSubscribedBuddies; + + /** + * Plugin data. + * Not Own + */ + CPresencePluginData* iPresenceData; + + SIMPLE_UNIT_TEST( T_CPresencePluginGroups ) + }; + +#endif // CPRESENCEPLUGINGROUP_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginlanguagecodes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginlanguagecodes.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,184 @@ +/* +* Copyright (c) 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: +* +*/ + +#ifndef T_PRESENCEPLUGINLANGUAGECODES_H +#define T_PRESENCEPLUGINLANGUAGECODES_H + +#include + +/** ISO 639-1 language code length. */ +const TInt KIsoLanguageCodeLength = 2; + +/** + * Maps Symbian and ISO 639 language codes. + * + * @since S60 v5.1 + */ +class TLanguageCodeMapping + { + +public: + + /** + * Returns Symbian language code. + * + * @since S60 5.1 + * @return Symbian language code. + */ + TInt SymbianLanguageCode() const + { return iSymbianLanguageCode; } + + /** + * Returns ISO language code. + * + * @since S60 5.1 + * @return ISO language code. + */ + TPtrC8 IsoLanguageCode() const + { return TPtrC8( iIsoLanguageCode ); } + +public: // data + + /** + * Symbian language code as specified in e32lang.h. + */ + TInt iSymbianLanguageCode; + + /** + * ISO 639 language code. + */ + TText8 iIsoLanguageCode[__Align8( KIsoLanguageCodeLength + sizeof( "" ) )]; + }; + +/** Mapping table for Symbian and ISO 639 language codes. */ +static const TLanguageCodeMapping KLanguageCodeMappings[] = + { + { ELangEnglish, "en" }, + { ELangFrench, "fr" }, + { ELangGerman, "de" }, + { ELangSpanish, "es" }, + { ELangItalian, "it" }, + { ELangSwedish, "sv" }, + { ELangDanish, "da" }, + { ELangNorwegian, "no" }, + { ELangFinnish, "fi" }, + { ELangAmerican, "en" }, + { ELangSwissFrench, "fr" }, + { ELangSwissGerman, "de" }, + { ELangPortuguese, "pt" }, + { ELangTurkish, "tr" }, + { ELangIcelandic, "is" }, + { ELangRussian, "ru" }, + { ELangHungarian, "hu" }, + { ELangDutch, "nl" }, + { ELangBelgianFlemish, "nl" }, + { ELangAustralian, "en" }, + { ELangBelgianFrench, "fr" }, + { ELangAustrian, "de" }, + { ELangNewZealand, "en" }, + { ELangInternationalFrench, "fr" }, + { ELangCzech, "cs" }, + { ELangSlovak, "sk" }, + { ELangPolish, "pl" }, + { ELangSlovenian, "sl" }, + { ELangTaiwanChinese, "zh" }, + { ELangHongKongChinese, "zh" }, + { ELangPrcChinese, "zh" }, + { ELangJapanese, "ja" }, + { ELangThai, "th" }, + { ELangArabic, "ar" }, + { ELangAfrikaans, "af" }, + { ELangAlbanian, "sq" }, + { ELangAmharic, "am" }, + { ELangArabic, "ar" }, + { ELangArmenian, "hy" }, + { ELangTagalog, "tl" }, + { ELangBelarussian, "be" }, + { ELangBengali, "bn" }, + { ELangBulgarian, "bg" }, + { ELangBurmese, "my" }, + { ELangCatalan, "ca" }, + { ELangCroatian, "hr" }, + { ELangCanadianEnglish, "en" }, + { ELangInternationalEnglish,"en" }, + { ELangSouthAfricanEnglish, "en" }, + { ELangEstonian, "et" }, + { ELangFarsi, "fa" }, + { ELangCanadianFrench, "fr" }, + { ELangScotsGaelic, "gd" }, + { ELangGeorgian, "ka" }, + { ELangGreek, "el" }, + { ELangCyprusGreek, "el" }, + { ELangGujarati, "gu" }, + { ELangHebrew, "he" }, + { ELangHindi, "hi" }, + { ELangIndonesian, "id" }, + { ELangIrish, "ga" }, + { ELangSwissItalian, "it" }, + { ELangKannada, "kn" }, + { ELangKazakh, "kk" }, + { ELangKhmer, "km" }, + { ELangKorean, "ko" }, + { ELangLao, "lo" }, + { ELangLatvian, "lv" }, + { ELangLithuanian, "lt" }, + { ELangMacedonian, "mk" }, + { ELangMalay, "ms" }, + { ELangMalayalam, "ml" }, + { ELangMarathi, "mr" }, + { ELangMoldavian, "mo" }, + { ELangMongolian, "mn" }, + { ELangNorwegianNynorsk, "no" }, + { ELangBrazilianPortuguese, "pt" }, + { ELangPunjabi, "pa" }, + { ELangRomanian, "ro" }, + { ELangSerbian, "sr" }, + { ELangSinhalese, "si" }, + { ELangSomali, "so" }, + { ELangInternationalSpanish,"es" }, + { ELangLatinAmericanSpanish,"es" }, + { ELangSwahili, "sw" }, + { ELangFinlandSwedish, "sv" }, + { ELangTamil, "ta" }, + { ELangTelugu, "te" }, + { ELangTibetan, "bo" }, + { ELangTigrinya, "ti" }, + { ELangCyprusTurkish, "tr" }, + { ELangTurkmen, "tk" }, + { ELangUkrainian, "uk" }, + { ELangUrdu, "ur" }, + { ELangVietnamese, "vi" }, + { ELangWelsh, "cy" }, + { ELangZulu, "zu" }, + { ELangManufacturerEnglish, "en" }, + { ELangSouthSotho, "st" }, + { ELangBasque, "eu" }, + { ELangGalician, "gl" }, + { ELangEnglish_Apac, "en" }, + { ELangEnglish_Taiwan, "en" }, + { ELangEnglish_HongKong, "en" }, + { ELangEnglish_Prc, "en" }, + { ELangEnglish_Japan, "en" }, + { ELangEnglish_Thailand, "en" }, + { ELangMalay_Apac, "ms" } + }; + +/** Number of language code mappings. */ +static const TInt KLanguageCodeMappingsCount = + sizeof ( KLanguageCodeMappings ) / sizeof ( TLanguageCodeMapping ); + +#endif // T_PRESENCEPLUGINLANGUAGECODES_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginlocalstore.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginlocalstore.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef C_CPRESENCEPLUGINLOCALSTORE_H +#define C_CPRESENCEPLUGINLOCALSTORE_H + + +#include +#include +#include + + +/** + * Service contacts local store reader + * + * @lib presenceplugin.dll + * @since S60 v5.0 + */ +class CPresencePluginLocalstore : public CBase + { + +public: + + /** + * Two-phased constructor. + * @param aServiceName Service name + */ + static CPresencePluginLocalstore* NewL( const TDesC& aServiceName ); + + /** + * Two-phased constructor. + * @param aServiceName Service name + */ + static CPresencePluginLocalstore* NewLC( const TDesC& aServiceName ); + + /** + * Destructor. + */ + virtual ~CPresencePluginLocalstore(); + + /** + * Seeks given id at contact column + * + * @since S60 v5.0 + * @param aIdentifier Id. to search + * @return ETrue if found + */ + TBool SeekRowAtContactColL( TInt32& aIdentifier ); + +private: + + CPresencePluginLocalstore(); + + void ConstructL( const TDesC& aServiceName ); + + TBool DbExists(); + + void OpenDbL(); + +private: // data + + /** + * File stream + */ + RFs iFs; + + /** + * Store database + */ + RDbStoreDatabase iDb; + + /** + * Table + */ + RDbTable iTable; + + /** + * Column definitions + * Own. + */ + CDbColSet* iColset; + + /** + * DB Store + * Own. + */ + CPermanentFileStore* iFileStore; + + /** + * Local database name + * Own. + */ + HBufC* iLocalDBName; + + }; + + +#endif // C_CPRESENCEPLUGINLOCALSTORE_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginpublisher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginpublisher.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,512 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINPUBLISHER_H +#define CPRESENCEPLUGINPUBLISHER_H + +#include + +#include +#include +#include +#include +#include +#include + +#include "presencepluginentitywatcher.h" +#include "presenceplugincommon.h" +#include "mpresencepluginconnectionobs.h" +#include "msimpleetagobserver.h" +#include "presencelogger.h" + +class TXIMPRequestId; +class MXIMPProtocolConnectionHost; +class MPersonPresenceInfo; +class MServicePresenceInfo; +class MDevicePresenceInfo; +class MSimplePublisher; +class MSimpleDocument; +class MSimpleElement; +class MSimpleWatcher; +class CPresencePluginXdmUtils; +class CPresencePluginData; +class CPresencePluginWatcherInfo; + +/** + * CPresencePluginPublisher + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginPublisher ): public CActive, + public MSimplePublishObserver, + public MSimpleWatcherObserver, + public MProtocolPresencePublishing, + public MSimpleETagObserver + { + public: + + /** + * Current operation + */ + enum TPluginPublishOperation + { + ENoOperation, + EPublishOwn, + ESubscribeOwn, + EUnsubscribeOwn, + ESubscribeWinfo, + EUnsubscribeWinfo, + EPublishReq + }; + + /** + * NewL + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CPresencePluginPublisher* NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginData* aPresenceData ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginPublisher(); + + /** + * WinfoTerminatedL + * + * SIMPLE Winfo watcher sunscription is terminated + * @param aReason reason code + */ + void WinfoTerminatedL( TInt aReason ); + + /** + * WINFO received from SIMPLE + * @param aWinfo WINFO + */ + void WinfoNotificationL( MSimpleWinfo& aWinfo ); + + private: + + /** + * Standard C++ constructor + * @param aObs, connection observer + * @param aConn, SIMPLE connection + */ + CPresencePluginPublisher( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + /** + * Performs the 2nd phase of construction. + */ + void ConstructL( CPresencePluginData* aPresenceData ); + + public: //Own public methods + + /** + * StopPublishL() + * + * @since S60 3.2 + * @param none + * @return none + */ + void StopPublishL( TRequestStatus& aStatus ); + + /** + * Published() + * + * @since S60 3.2 + * @param none + * @return none + */ + TBool Published(); + + public: // from MSimpleETagObserver + + /** + * Defined in a base class + */ + void NewETagL( const TDesC8& aVal ); + + public: // from base class MSimplePublishObserver + + /** + * Defined in a base class + */ + void PublishReqCompleteL( TInt aOpid, TInt aStatus); + + /** + * Defined in a base class + */ + void PublishTerminatedL( TInt aOpid ); + + public: // from base class MSimpleWatcherObserver + + /** + * Defined in a base class + */ + void WatcherReqCompleteL( TInt aOpId, TInt aStatus ); + + /** + * Defined in a base class + */ + void WatcherNotificationL( MSimpleDocument& aDocument ); + + /** + * Defined in a base class + */ + void WatcherListNotificationL( MSimplePresenceList& aList ); + + /** + * Defined in a base class + */ + void WatcherTerminatedL( + TInt aOpId, TInt aReason ); + + public: // from base class MximpBase + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + public: // from base class MximpProtocolPresencePublishing + + /** + * Defined in a base class + */ + void DoPublishOwnPresenceL( + const MPresenceInfo& aOwnPresence, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribeOwnPresenceL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdateOwnPresenceSubscriptionPifL( + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribeOwnPresenceL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribePresenceWatcherListL( + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresenceWatcherListL( + TXIMPRequestId aReqId ); + + protected: // from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + private: + + /** + * Calls MximpProtocolConnectionHost callback + * + * @since S60 3.2 + * @param aStatus error status + */ + void CompleteXIMPReq( TInt aStatus ); + + /** + * Complete client request + * + * @since S60 3.2 + * @param aStatus error status + */ + void CompleteClientReq( TInt aStatus ); + + /** + * Initialize a document + */ + void InitializeSimpleDocumentL( ); + + /** + * Add person information to the document. + * + * @since S60 3.2 + * @param aPersInfo personal information + */ + void AddSimpleDocumentPersL( + const MPersonPresenceInfo* aInfo ); + + /** + * Make a publish request + * + * @since S60 3.2 + * @param none + * @return none + */ + void MakePublishReqL(); + + /** + * Start XDM initialization + * + * @since S60 3.2 + * @param aReqId, XIMP request id + */ + void StartXdmOperationL( TXIMPRequestId aReqId ); + + /** + * Delete watcher information + * + * @since S60 3.2 + * @param none + * @return none + */ + void DeleteWatchers(); + + /** + * Add Watcher if not exist + * + * @since S60 3.2 + * @param aId, watcher identity + * @param aSipId, watcher sip URL + * @return none + */ + void AddWatcherIfNotExistsL( + const TDesC8& aId, + const TDesC& aSipId ); + + /** + * Remove Watcher if not exist + * + * @since S60 3.2 + * @param aId, watcher identity + * @param aSipId, watcher sip URL + * @return none + */ + void RemoveWatcherIfExists( + const TDesC8& aId, + const TDesC& aSipId ); + + /** + * Make current watcher list + * + * @since S60 3.2 + * @param none + * @return CDesCArrayFlat, watcher array + */ + CDesCArrayFlat* MakeCurrentWatcherListLC(); + + /** + * Collect watcher from winfo + * + * @since S60 3.2 + * @param aElems element array + * @return none + */ + void CollectWatchersL( + RPointerArray& aElems ); + + /** + * CreatePublisherL() + * + * @since S60 3.2 + * @param none + * @return none + */ + void CreatePublisherL(); + + /** + * Stores own presence status to presence cache + * + * @since S60 5.0 + * @return none + */ + void StoreOwnStatusToCacheL(); + + /** + * Resolves presence cache values according to provided + * unicode string content. + * + * @since S60 5.0 + * @param aUnicodeContent, string containing info data + * @param aActivities, activities string + * @param aCacheAvailability, will store enumerated status + * @param aCacheAvailability, will store extended status string + * @param aXimpApiAvailability, will store ximp api availabiltiy + * @return TBool, was handled or not + */ + TBool ResolveOwnCacheValues( + const TDesC& aUnicodeContent, + const TDesC& aActivities, + MPresenceBuddyInfo2::TAvailabilityValues& aCacheAvailability, + TPtr& aExtendedCacheAvailability, + NPresenceInfo::TAvailabilityValues& aXimpApiAvailability ); + + private: // Data + + /** + * ximp Plugin connection observer + * Own. + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * ximp Host. + * Not Own. + */ + MXIMPProtocolConnectionHost* iHost; + + /** + * SIMPLE engine connection + * Not Own. + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine publisher + * Own. + */ + MSimplePublisher* iPublisher; + + /** + * SIMPLE engine watcher + * Own. + */ + MSimpleWatcher* iWatcher; + + /** + * ximp request id + * Own. + */ + TXIMPRequestId iXIMPId; + + /** + * Simple Engine request id + * Own. + */ + TInt iSimpleId; + + /** + * Subscribed winfo + * Own. + */ + TBool iSubscribed; + + /** + * Subscribed own data + * Own. + */ + TBool iSubscribedOwn; + + /** + * Published own data + * Own. + */ + TBool iPublished; + + /** + * RePublish status + * Own. + */ + TBool iRePublish; + + /** + * Current operation + * Own. + */ + TPluginPublishOperation iOperation; + + /** + * Simple publish document + * Own. + */ + MSimpleDocument* iDocument; + + /** + * XDM Utils + * Not own. + */ + CPresencePluginXdmUtils* iXdmUtils; + + /** + * WINFO watchers + * Own. + */ + TDblQue iWatcherList; + + /** + * Presence Data + * Not Own + */ + CPresencePluginData* iPresenceData; + + /** + * client statutus. + * Not own. + */ + TRequestStatus* iClientStatus; + + SIMPLE_UNIT_TEST( T_CPresencePluginPublisher ) + + + }; + +#endif // CPRESENCEPLUGINPUBLISHER_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginsession.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,306 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINSESSION_H +#define CPRESENCEPLUGINSESSION_H + + +#include +#include +#include "mpresencepluginconnectionobs.h" +#include "presencelogger.h" + +//FORWARD +class MXIMPServiceInfo; +class MPresencePluginConnectionObs; + +/** + * CPrecensePluginSession + * + * presence Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginSession ): public CActive, + public MSimpleConnectionObserver + { + public: + + /** + * Current operation + */ + enum TPluginSessionOperation + { + ENoOperation, + EInitializeXdm, + }; + + /** + * Two-phased constructor. + * + * @param aService, XIMP Service info + * @param aObs, Connection observer + */ + static CPresencePluginSession* NewL( + const MXIMPServiceInfo& aService, + MPresencePluginConnectionObs& aObs ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginSession(); + + public: //New function + + TInt32 GetPresenceSetId( ) const; + + /** + * MSimpleConnection accessor + * + * @since S60 3.2 + * @return MSImpleConnection instance + */ + MSimpleConnection* SimpleConnection(); + + /** + * OpenSessionL + * + * @since S60 3.2 + * Opens the SIP connection (registers when needed) + * @param none + * @return none + */ + void OpenSessionL(); + + /** + * XDMSettings accessor + * + * @since S60 3.2 + * @param none + * @return XDM Settings ID + */ + TInt XdmSettingsId(); + + /** + * Current registered SIP entity + * + * @since S60 3.2 + * @param none + * @return TPrtC8, current sip presentity + */ + TPtrC8 CurrentSipPresentity(); + + /** + * Domain syntax for current settings + * + * @since S60 3.2 + * @param none + * @return TPrtC16, current domain + */ + TPtrC16 CurrentDomain(); + + /** + * Close Connection + * + * @since S60 3.2 + * @param none + * @return none + */ + void CloseConnection(); + + /** + * Connection status + * + * @since S60 3.2 + * @param none + * @return TBool, connection TRUE/FALSE + */ + TBool ConnectionStatus(); + + /** + * Connection status + * + * @since S60 3.2 + * @param none + * @return TBool, connection TRUE/FALSE + */ + TBool IsXdmLocalmode(); + + /** + * Check XDM settings valid + * + * @since S60 5.0 + * @param aServiceId, service if owning this session + * @return none + */ + void CheckXDMSettingsL( TUint aServiceId ); + + /** + * Accessor to valid XdmUtils + * + * @since S60 3.2 + * @param none + * @return XdmUtils instance + */ + CPresencePluginXdmUtils* XdmUtilsL(); + + /** + * Returns service id owning this session. + * + * @since S60 5.0 + * @param none + * @return TInt, service id + */ + TInt& ServiceId(); + + private: + + /** + * Standard C++ constructor + * @param aObs, connection observer. + */ + CPresencePluginSession( + MPresencePluginConnectionObs& aObs ); + + /** + * Performs the 2nd phase of construction. + * + * @param aService, XIMP service info + */ + void ConstructL( const MXIMPServiceInfo& aService ); + + public:// from base class MSimpleConnectionObserver + + /** + * Defined in a base class + */ + void ConnectionStatusL( + MSimpleConnection::TSimpleState aState ); + + /** + * Defined in a base class + */ + void RequestCompleteL( TInt aOpId, TInt aStatus ); + + protected: // from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + private: // Data + + /** + * XIMP Plugin connection observer + * Own. + */ + MPresencePluginConnectionObs& iObs; + + /** + * Simple Engine connection. + * Own. + */ + MSimpleConnection* iConnection; + + /** + * Current Simple Engine operation id + * Own. + */ + TInt iOpId; + + /** + * Request type + * Own. + */ + MPresencePluginConnectionObs::TReqType iType; + + /** + * presence settings Id + * Own. + */ + TInt iPresSettingId; + + /** + * XDM Settings id + * Own. + */ + TInt iXdmSetting; + + /** + * Domain syntax for current settings + * Own, + */ + HBufC16* iDomain; + + /** + * Current User ID, User's SIP identity + * Own. + */ + HBufC8* iUserId8; + + /** + * Whether conncted to network + * Own. + */ + TBool iSipConnected; + + /** + * Whether conncted to network + * Own. + */ + TBool iXdmConnected; + + /** + * Xdm local mode + * Own. + */ + TBool iXdmLocalMode; + + /** + * XDM utils + * Own. + */ + CPresencePluginXdmUtils* iXdmUtils; + + /** + * Session operation. + */ + TPluginSessionOperation iOperation; + + /** + * Service id owning this session. + */ + TInt iServiceId; + + SIMPLE_UNIT_TEST( T_CPresencePluginSession ) + SIMPLE_UNIT_TEST( T_CPresencePluginConnection ) + }; + +#endif // CPRESENCEPLUGINSESSION_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginutility.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginutility.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef T_PRESENCEPLUGINUTILITY_H +#define T_PRESENCEPLUGINUTILITY_H + +/** +* Static utility functions for presence adapter. +* +* @lib presenceplugin.dll +* @since S60 v5.0 +*/ +NONSHARABLE_CLASS( TPresencePluginUtility ) + { + + public: + + /** + * Implementation for cleanup item. + * Resets and destroys array of the MXIMPIdentity + * entries and closes array. + * @param anArray RPointerArray pointer. + */ + static void ResetAndDestroyIdentities( TAny* anArray ); + + }; + +#endif // T_PRESENCEPLUGINUTILITY_H + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginvirtualgroup.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginvirtualgroup.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,160 @@ +/* +* Copyright (c) 2006-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: IETF SIMPLE Protocol, creating virtualgroup +* +*/ + + +#ifndef CPRESENCEPLUGINVIRTUALGROUP_H +#define CPRESENCEPLUGINVIRTUALGROUP_H + +#include +#include +#include +#include + +#include "mpresencepluginconnectionobs.h" +#include "presencelogger.h" + +class MXIMPObjectCollection; +class CPresencePluginData; + +/** + * CPresencePluginVirtualGroup + * + * virtual groups + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginVirtualGroup ): public CBase + { + public: + + /** + * Constructor. + * @param aId watcher id + * @param aSipId watcher SIP identity + */ + static CPresencePluginVirtualGroup* NewL( + MPresencePluginConnectionObs& aObs, + const TDesC16& aListName, + CPresencePluginData* aPresenceData ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginVirtualGroup(); + + private: + + /** + * Standard C++ constructor + * @param aObs, Presence plugin connection + * @param aPresenceData, access to presence data + */ + CPresencePluginVirtualGroup( MPresencePluginConnectionObs& aObs, + CPresencePluginData* aPresenceData ); + + /** + * Performs the 2nd phase of construction. + */ + void ConstructL( const TDesC16& aListName ); + + /** + * IdentityExists() + * + * @since S60 3.2 + * @param aIdentityUri, identity url + * @return TInt, return KErrNotFound if indentity not exists + */ + TInt IdentityExists( const TDesC& aIdentityUri ); + + public: + + /** + * GetVirtualIdentityArray() + * + * @since S60 3.2 + * @param aColl, XIMP object collection + * @return none + */ + CDesCArray* GetVirtualIdentityArray( ); + + /** + * GetOnlineEntitiesL() + * + * @since S60 3.2 + * @param aColl, XIMP object collection + * @return none + */ + void GetVirtualEntitiesL( MXIMPObjectCollection& aColl ); + + /** + * AddOnlineEntity() + * + * @since S60 3.2 + * @param aIdentityUri, identity url + * @return none + */ + void AddEntityL( const TDesC& aIdentityUri ); + + /** + * RemoveOnlineEntity() + * + * @since S60 3.2 + * @param aIdentityUri, identity url + * @return none + */ + void RemoveEntityL( const TDesC& aIdentityUri ); + + /** + * HandlePresentityGroupMemberAddedL() + * + * @since S60 5.1 + * @param aIdentityUri, identity url + * @return none + */ + void HandlePresentityGroupMemberAddedL( const TDesC& aIdentityUri ); + + private: // data + + /** + * XIMP Plugin connection observer + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * Access to presence data. + * Not Own. + */ + CPresencePluginData* iPresenceData; + + /** + * Identities/Uri of online Buddies. + */ + CDesCArray* iVirtualMember; + + /** + * list ident + * own + */ + HBufC16* iListName; + + SIMPLE_UNIT_TEST( T_CPresencePluginVirtualGroup ) + SIMPLE_UNIT_TEST( T_CPresencePluginXdmUtils ) + + }; + +#endif // CPRESENCEPLUGINVIRTUALGROUP_H \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginwatcher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginwatcher.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,408 @@ +/* +* Copyright (c) 2006-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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINWATCHER_H +#define CPRESENCEPLUGINWATCHER_H + +#include +#include +#include +#include + +#include "mpresencepluginconnectionobs.h" +#include "presencelogger.h" + +class TXIMPRequestId; +class MXIMPIdentity; +class MXIMPProtocolConnectionHost; +class MSimpleConnection; +class CPresencePluginEntityWatcher; +class CPresencePluginData; + +/** + * CPresencePluginWatcher + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginWatcher ): public CActive, + public MProtocolPresenceWatching + { + public: + + /** + * Current operation + */ + enum TPluginWatcherOperation + { + EPluginUndef, + EPluginSubscribeGroup, + EPluginUnsubscribeGroup, + EPluginSubscribeSingle, + EPluginSubscribeByAdding, + EPluginUnSubscribeByRemoving + }; + + /** + * Current actibe object state + */ + enum TPluginXdmState + { + EPluginIdle, + EPluginInitXdm, + EPluginFetchRls, + EPluginAddGroupMember, + EPluginRemoveGroupMember + }; + + /** + * Constructor. + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CPresencePluginWatcher* NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginData* aPresenceData ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginWatcher(); + + /** + * SIP Watcher is complets it's task. + * @param aStatus error status + * @return none + */ + void CompleteWatcher( TInt aStatus ); + + /** + * Delete a single entity watcher + * @param aPresentityid presentity id + * @return none + */ + void DeleteWatcher( + const TDesC8& aPresentityid ); + + /** + * SubscribeL() + * + * @since S60 5.1 + * @param aIdentity presentity id to subscribe + * @return none + */ + void SubscribeL( const TDesC& aIdentity ); + + /** + * SubscribeAllL() + * + * @since S60 3.2 + * @param none + * @return none + */ + void SubscribeAllL(); + + /** + * UnSubscribeAllL() + * + * @since S60 3.2 + * @param none + * @return none + */ + void UnSubscribeAllL(); + + /** + * Subscribes presentity presence. + * + * @since S60 5.0 + * @param aPresentityId, presentity id + * @param aStatus, client status to complete + * @return none + */ + void DoPerformSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aStatus ); + + /** + * Unsubscribes presentity presence. + * + * @since S60 5.0 + * @param aPresentityId, presentity id + * @param aStatus, client status to complete + * @return none + */ + void DoPerformUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aStatus ); + + /** + * Accept watcher to watcher list + * + * @since S60 5.1 + * @param aWatcher, watcher + * @return none + */ + void AcceptL( const CPresencePluginEntityWatcher* aWatcher ); + + private: + + /** + * Standard C++ constructor + * @param aObs, Presence plugin connection + * @param aConn, SIMPLE connection + */ + CPresencePluginWatcher( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginData* aPresenceData ); + + public: // from base class MXIMPBase + + /** + * Defined in a base class + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ); + + /** + * Defined in a base class + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOps ) const; + + /** + * Defined in a base class + */ + TInt32 GetInterfaceId() const; + + public: // from base class MXIMPProtocolPresenceWatching + + /** + * Defined in a base class + */ + void DoSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityPresenceSubscriptionPifL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoSubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUpdatePresentityGroupMembersPresenceSubscriptionPifL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& aPif, + TXIMPRequestId aReqId ); + + /** + * Defined in a base class + */ + void DoUnsubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ); + + public: + + /** + * Save presentity id + * + * @since S60 3.2 + * @param aPresentityId presentity id + * @param aFormatUri, attempt to format uri + * @return none + */ + void SetPresIdentityL( + const MXIMPIdentity& aPresentityId, + TBool aFormatUri ); + + /** + * Calls MXIMPProtocolConnectionHost callback + * + * @since S60 3.2 + * @param aStatus error status + * @return none + */ + void CompleteXIMPReq( TInt aStatus ); + + /** + * Set XIMP request id + * + * @since S60 3.2 + * @param aId, request id + * @return none + */ + void SetXIMPId( TXIMPRequestId aId ); + + /** + * Check if ID matches with existing watcher + * + * @since S60 5.1 + * @param aPresentityId presentity ID + * @return ETrue if matching watcher found + */ + TBool MatchWatcherId( const TDesC8& aPresentityId ) const; + + protected: // from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + private: + + /** + * Match existing watcher + * + * @since S60 3.2 + * @param aPresentityId presentity id + * @return watcher or NULL when not found + */ + CPresencePluginEntityWatcher* MatchWatcherL( + const TDesC8& aPresentityId, TBool aCreate ); + + /** + * StartXdmOperationL + * + * @since S60 3.2 + * @param none + * @return none + */ + void StartXdmOperationL(); + + private: // Data + + /** + * XIMP Plugin connection observer + * Own. + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * XIMP Host. + * Not Own. + */ + MXIMPProtocolConnectionHost* iHost; + + /** + * SIMPLE engine connection + * Not Own. + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine watchers + * Own. + */ + RPointerArray iWatchers; + + /** + * Watcher candidates + * Own. + */ + RPointerArray iWatcherCandidates; + + /** + * Current PrFW request id + * Own. + */ + TXIMPRequestId iXIMPId; + + /** + * Simple Engine request id + * Own. + */ + TInt iSimpleId; + + /** + * XDM Utils + * Not own. + */ + CPresencePluginXdmUtils* iXdmUtils; + + /** + * Current presentity in progress + * Own. + */ + HBufC16* iPresIdentity; + + /** + * Presence data + * Own + */ + CPresencePluginData* iPresenceData; + + /** + * XDM state + */ + TPluginXdmState iXdmState; + + /** + * Whether the request is completed + * Own. + */ + TBool iCompleted; + + /** + * Current operation + * Own. + */ + TPluginWatcherOperation iOperation; + + SIMPLE_UNIT_TEST( T_CPresencePluginWatcher ) + SIMPLE_UNIT_TEST( T_CPresencePluginXdmUtils ) + }; + +#endif // CPRESENCEPLUGINWATCHER_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginwatcherinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginwatcherinfo.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,124 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINWATCHERINFO_H +#define CPRESENCEPLUGINWATCHERINFO_H + +#include +#include + +#include "presencelogger.h" + +/** + * CPresencePluginWatcherInfo + * + * watcher info. + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginWatcherInfo ): public CBase + { + public: + + /** + * Constructor. + * @param aId watcher id + * @param aSipId watcher SIP identity + */ + static CPresencePluginWatcherInfo* NewL( + const TDesC8& aId, + const TDesC& aSipId ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginWatcherInfo(); + + /** + * Destructor + * + * @since S60 3.2 + * @param none + * @return none + */ + void Destroy(); + + /** + * Match to given info + * + * @since S60 3.2 + * @param aId watcher id + * @param aSipId watcher SIP identity + * @return ETrue if current entity matches to the parameters + */ + TBool Match( const TDesC8& aId, + const TDesC& aSipId ); + /** + * SipId + * + * @since S60 3.2 + * @param none + * @return TPtrC, sip Uri + */ + TPtrC SipId(); + + static TInt LinkOffset(); + + private: + + CPresencePluginWatcherInfo( ); + + /** + * Constructor + * + * @since S60 3.2 + * @param aId watcher id + * @param aSipId watcher SIP identity + */ + void ConstructL( + const TDesC8& aId, + const TDesC& aSipId ); + + public: // data + + /** + * Linked list + * own + */ + TDblQueLink iLink; + + private: // data + + /** + * ident id + * own + */ + HBufC8* iId; + + /** + * sip id + * own + */ + HBufC* iSipId; + + SIMPLE_UNIT_TEST( T_SIMPLEDataModelAdapter ) + + }; + +#endif // CPRESENCEPLUGINWATCHERINFO_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginwinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginwinfo.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,179 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINWINFO_H +#define CPRESENCEPLUGINWINFO_H + +#include +#include +#include + +#include "mpresencepluginconnectionobs.h" +#include "presencelogger.h" + +class MSimpleWinfo; +class TximpRequestId; +class MSimpleWinfoWatcher; +class MSimpleConnection; +class MximpProtocolConnectionHost; +class MPresencePluginConnectionObs; + +/** + * CPresencePluginWinfo + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginWinfo ): public CBase, + public MSimpleWinfoObserver + { + public: + + /** + * Constructor. + * @param aObs callback for complete requests + * @param aConn Simple Engine connection + */ + static CPresencePluginWinfo* NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginWinfo(); + + /** + * SetHost + * Set ximp Host + * + * @since S60 3.2 + * @param aHost ximp Host + */ + void SetHost( MXIMPProtocolConnectionHost* aHost ); + + /** + * SubscribeWinfoListL + * + * @since S60 3.2 + * @param aReqId ximp req id + */ + void SubscribeWinfoListL( TXIMPRequestId aReqId ); + + /** + * UnsubscribeWinfoListL + * + * @since S60 3.2 + * @param aReqId ximp req id + */ + void UnsubscribeWinfoListL( TXIMPRequestId aReqId ); + + private: + + /** + * Standard C++ constructor + * + * @param aObs, plugin connection observer + * @param aConn, SIMPLE connection + */ + CPresencePluginWinfo( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn ); + + /** + * Performs the 2nd phase of construction. + */ + void ConstructL( ); + + public: // from base class MSimpleWinfoObserver + + // Subscribe presence grant request list + + /** + * Defined in a base class + */ + void WinfoReqCompleteL( TInt aOpid, TInt aStatus ); + + /** + * Defined in a base class + */ + void WinfoTerminatedL( + TInt aOpid, TInt aReason ); + + /** + * Defined in a base class + */ + void WinfoNotificationL( MSimpleWinfo& aWinfo ); + + private: // Data + + /** + * ximp Plugin connection observer + * Own. + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * ximp Host. + * Not Own. + */ + MXIMPProtocolConnectionHost* iHost; + + /** + * SIMPLE engine connection + */ + MSimpleConnection& iConnection; + + /** + * SIMPLE engine winfo watcher. + * Own. + */ + MSimpleWinfoWatcher* iWinfoWatcher; + + /** + * ximp request id + * Own. + */ + TXIMPRequestId iXIMPId; + + /** + * Simple Engine request id + * Own. + */ + TInt iSimpleId; + + /** + * Subscribed + * Own. + */ + TBool iSubscribed; + + /** + * Winfo subscribe completed + * Own. + */ + TBool iWinfoCompleted; + + SIMPLE_UNIT_TEST( T_CPresencePluginAuthorization ) + SIMPLE_UNIT_TEST( T_CPresencePluginWinfo ) + SIMPLE_UNIT_TEST( CSimpleDataModelAdapterTestObserver ) + }; + +#endif // CPRESENCEPLUGINWINFO_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginxdmpresrules.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginxdmpresrules.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,413 @@ +/* +* Copyright (c) 2006-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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINXDMPRESRULES_H +#define CPRESENCEPLUGINXDMPRESRULES_H + +#include +#include + +#include "presenceplugincommon.h" +#include "presencelogger.h" + +class CXdmEngine; +class CXdmDocument; +class CXdmDocumentNode; +class TRequestStatus; +class MPresRulesAsyncHandler; + +/** + * CPresencePluginXdmPresRules + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginXdmPresRules ): public CActive + { + public: // Constructor and destructor + + /** + * XDM presrules state + */ + enum TPluginPresRulesXdmState + { + EStateIdle, + EGetXdmRules, + EUpdateXdmRules, + ECreateXdmPresrules + }; + + /** + * Operation state for rules update + */ + enum TPluginPresRulesUpdateState + { + EStateNoOperation, + EStateAddToWhiteList, + EStateAddToBlockList, + EStateRemoveFromWhiteList, + EStateRemoveFromBlackList, + EStateInitializeRules + }; + + /** + * Current operation + */ + enum TPluginPresRulesXdmOperation + { + ENoOperation, + ECancelDocument, + EXdmInit, + EXdmDeleteAll, + EXdmCancel, + EXdmGetRulesFromServer, + EXdmInitialPresDoc, + EXdmUpdateRules, + EXdmUpdateRulesFromServer + }; + + /** + * Two-phased constructor. + * + * @param aXmdId xdm settings id + * @param aLocalMode, local or server mode TRUE/FALSE + */ + static CPresencePluginXdmPresRules* NewL( const TInt aXmdId, TBool ); + + /** + * Two-phased constructor. + * + * @param aXmdId xdm settings id + * @param aLocalMode, local or server mode TRUE/FALSE + */ + static CPresencePluginXdmPresRules* NewLC( + const TInt aSettingId, + TBool aLocalMode ); + + /** + * Standard C++ destructor + */ + virtual ~CPresencePluginXdmPresRules( ); + + public: // Own functions + + /** + * Updates XDM rules into server + * + * @since S60 3.2 + * @param aHandler, MPresRulesAssyncHandler + * @return TInt, Error code + */ + TInt UpdateXdmRulesL( MPresRulesAsyncHandler* const aHandler ); + + /** + * Add white list tag to presrules document + * + * @since S60 3.2 + * @param aRoot, xml document root + * @return none + */ + void AddWhiteListL( CXdmDocumentNode* aRoot ); + + /** + * Add black list tag to presrules document + * + * @since S60 3.2 + * @param aRoot, xml document root + * @return none + */ + void AddBlackListL( CXdmDocumentNode* aRoot ); + + /** + * Get presence rules from server + * + * @since S60 3.2 + * @param aHandler, PresRules assync handler + * @return TInt, error code + */ + TInt GetXdmRulesL( MPresRulesAsyncHandler* const aHandler ); + + /** + * Making initial presence rules document + * + * @since S60 3.2 + * @param aHandler, PresRules assync handler + * @return none + */ + void MakeInitialRulesDocumentL( + MPresRulesAsyncHandler* const aHandler ); + + /** + * Remove entiry from blocked rules + * + * @since S60 3.2 + * @param aUri, entity url + * @aHandler, PresRules assync handler + * @return none + */ + void RemoveEntityBlockedRulesL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ); + + /** + * Remove entity from presrules white list + * + * @since S60 3.2 + * @param aUri, entity url + * @aHandler, PresRules assync handler + * @return none + */ + void RemoveEntityFromWhiteListL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ); + + /** + * Add entity to presrules white list + * + * @since S60 3.2 + * @param aUri, entity url + * @aHandler, PresRules assync handler + * @return none + */ + void AddEntityToWhiteListL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ); + + /** + * Add entity to blocked rules + * + * @since S60 3.2 + * @param aUri, entity url + * @aHandler, PresRules assync handler + * @return none + */ + void AddEntityToBlockedRulesL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ); + + /** + * Remove one from rule list + * + * @since S60 3.2 + * @param aRule, presence rule name + * @param aUri, entity url + * @return none + */ + void RemoveOneFromRuleL( + const TDesC& aRule, + const TDesC& aUri ); + + /** + * Add one to rule list + * + * @since S60 3.2 + * @param aRule, presence rule name + * @param aUri, entity url + * @return none + */ + void DoOneAddUserL( + const TDesC& aList, + const TDesC& aUri ); + + /** + * Update presence document from server + * + * @since S60 3.2 + * @param none + * @return TInt, error code + */ + TInt UpdateFromServerL( MPresRulesAsyncHandler* const aHandler ); + + private: + + /** + * Standard C++ constructor + * @param aXmdId, XDM settings id + */ + CPresencePluginXdmPresRules( const TInt aXmdId ); + + /** + * Performs the 2nd phase of construction. + * + * @param aXmdId, xdm settings id + * @param aLocalMode, clinet localmode state + */ + void ConstructL( const TInt aXmdId, TBool aLocalMode ); + + private: // own functions + + /** + * GetRulesL + * + * @since S60 3.2 + * @param aRuleArray, rule array + * @return TBool, rules found + */ + CXdmDocumentNode* GetRulesL( const TDesC& aRule, + RPointerArray& aRuleArray ); + + /** + * Remove rule group from pres-rules document + * + * @since S60 3.2 + * @param aRule, presence rule name + * @return none + */ + void RemoveRuleGroupL( const TDesC& aRule ); + + /** + * Search list under parent + * + * @since S60 3.2 + * @param aParent. document node + * @param aName, name of search + * @return none + */ + CXdmDocumentNode* SearchListUnderParentL( + CXdmDocumentNode* aParent, + const TDesC& aName ); + + /** + * Create root if need + * + * @since S60 3.2 + * @param none + * @return none + */ + void CreateRootIfNeededL(); + + static void ResetAndDestroy1( TAny* aPointerArray ); + static void ResetAndDestroy2( TAny* aPointerArray ); + + /** + * Find rule from presrules xml + * + * @since S60 3.2 + * @param aRule, rule name + * @return TBool + */ + TBool FindRuleL( const TDesC& aRule, TBool aCreateRule ); + + /** + * Check if one already exist + * + * @since S60 3.2 + * @param aList, listname + * @param aUri, entity url + * @return TBool + */ + TBool CheckIfOneExistL( + const TDesC& aRule, + const TDesC& aUri ); + + /** + * Compare uri to attribute without prefix. Returns ETrue if match. + * + * @since S60 5.0 + * @param aUri, entity url + * @parram aAttribute url attribute + * @return TBool + */ + TBool CompareUriWithoutPrefixL( + const TDesC& aUri, const TDesC& aAttribute ); + + protected: // from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + private: // Data + + /** + * XDM Engine + * Own. + */ + CXdmEngine* iXdmEngine; + + /** + * XDM Settings id + * Own. + */ + TInt iSettingsId; + + /** + * Presence rules document + * Own + */ + CXdmDocument* iPresRulesDoc; + + /** + * Current state + * Own. + */ + TPluginPresRulesXdmState iXdmState; + + /** + * TPluginPresRulesUpdateState + * Own. + */ + TPluginPresRulesUpdateState iRulesUpdateState; + + /** + * client statutus. + * Not own. + */ + TRequestStatus* iClientStatus; + + /** + * Whether Presence XDM is up-to-date + * Own. + */ + TBool iPresXdmOk; + + /** + * Entity uri + * own + */ + HBufC* iEntityUri; + + /** + * Async request + * Own. + */ + TPluginPresRulesXdmOperation iAsyncReq; + + /** + * Async handler + * Own. + */ + MPresRulesAsyncHandler* iAsyncHandler; + + SIMPLE_UNIT_TEST( T_CPresencePluginXdmPresRules ) + }; + +#endif // CPRESENCEPLUGINXDMPRESRULES_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/inc/presencepluginxdmutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/inc/presencepluginxdmutils.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,655 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#ifndef CPRESENCEPLUGINXDMUTILS_H +#define CPRESENCEPLUGINXDMUTILS_H + +#include +#include +#include +#include "presenceplugincommon.h" +#include "mpresrulesasynchandler.h" +#include "presencelogger.h" +#include "presenceplugincontactsobs.h" + +class CPresencePluginXdmPresRules; +class TXIMPRequestId; +class MXIMPIdentity; +class MXIMPObjectCollection; +class CXdmEngine; +class CXdmDocument; +class CXdmDocumentNode; +class TRequestStatus; +class MPresencePluginConnectionObs; + +/** + * CPresencePluginXdmUtils + * + * Simple Engine Connection + * + * @lib presenceplugin.dll + * @since S60 v3.2 + */ +NONSHARABLE_CLASS( CPresencePluginXdmUtils ) : public CActive, + public MPresRulesAsyncHandler, + public MPresencePluginContactsObs + { + public: // Constructor and destructor + + /** + * Active object asynch states + */ + enum TPluginXdmState + { + EStateIdle, + /** Get XDM lists 1*/ + EGetXdmLists, + /** Create XDM lists */ + ECreateXdmLists, + /** Get XDM lists only, no rules later */ + EGetXdmListsOnly, + /** Create XDM lists only, no rules later */ + ECreateXdmListsOnly, + /** Get RLS service */ + EGetRlsServices, + /** Create RLS service */ + ECreateRlsServices, + /** Update RLS service */ + EUpdateRlsServices, + /** Get rules from server for GrantPresenceForPresentity */ + EGetXdmRules, + /** Update rules to server for GrantPresenceForPresentity */ + EUpdateXdmRules, + /** Update XDM List */ + EUpdateXdmList, + /** Cancel XDM document operation */ + ECancelDocument, + /** Get Block list */ + EGetXdmBlockList, + /** Create presence rules */ + ECreateXdmRules, + /** Subscripe block list */ + ESubsBlockList, + EGetResourceListFromServer, + EUpdateBlockedContactPresenceCache + }; + + /** + * Current operation + */ + enum TPluginXdmOperation + { + ENoOperation, + EXdmInit, + EXdmDeleteAll, + EXdmCancel, + EXdmAddUserToGroup, + EXdmAddGroupToGroup, + EXdmRemoveUserFromGroup, + EXdmRemoveGroupFromGroup, + EXdmGrantForAll, + EXdmWithdrawFromAll, + EXdmGetBlockedList, + EXdmCreateGroup, + EXdmDeleteGroup, + EXdmRlsFetch, + EXdmRlsAdd, + EXdmRlsRemove, + EXdmCommitXdm, + EXdmCommitRls, + EXdmGetBuddyList, + EXdmAddUserToRules, + EXdmRemoveUserFromRules + }; + + /** + * Operation state for rules update + */ + enum TPluginPresRulesState + { + EStateNoOperation, + EStateAddToWhiteList, + EStateAddToBlockList, + EStateRemoveFromWhiteList, + EStateRemoveFromBlackList, + EStateInitializeRules + }; + + /** + * NewL + * @param aObs callback for complete requests + * @param aXdmId XDm settings id + */ + static CPresencePluginXdmUtils* NewL( + MPresencePluginConnectionObs& aObs, + TInt aXmdId, + TBool aLocalMode ); + + virtual ~CPresencePluginXdmUtils(); + + /** + * Initialize XDMS and Presence XDM structures in network + * + * @since S60 3.2 + * @param aStatus Request status of the caller + */ + void InitializeXdmL( TRequestStatus& aStatus ); + + /** + * Initialize XDMS in network + * + * @since S60 3.2 + * @param aStatus Request status of the caller + */ + void InitializeXdmsOnlyL( TRequestStatus& aStatus ); + + /** + * Initialize Presence rules document only + * + * @since S60 3.2 + * @param aStatus Request status of the caller + */ + void InitializePresRulesL( ); + + /** + * Add entity to granted list + * + * @since S60 3.2 + * @param aUri, entity URL + * @param aStatus, request status + * @return none + */ + void AddEntityToGrantedL( + const TDesC& aUri, + TRequestStatus& aStatus ); + + /** + * Remove entity from granted list + * + * @since S60 3.2 + * @param aUri, entity URL + * @param aStatus, request status + * @return none + */ + void RemoveEntityFromGrantedL( + const TDesC& aUri, + TRequestStatus& aStatus ); + + /** + * Remove entity from blocked list + * + * @since S60 3.2 + * @param aName, entity URL + * @param aStatus, request status + * @return none + */ + void RemoveEntityFromBlockedL( + const TDesC& aName, + TRequestStatus& aStatus ); + + /** + * Add entity to blocked list + * + * @since S60 3.2 + * @param aUri, entity URL + * @param aStatus, request status + * @return none + */ + void AddEntityToBlockedL( + const TDesC& aUri, + TRequestStatus& aStatus ); + + /** + * Get (subscribe) Block List + * + * @since S60 3.2 + * @param aMembers, member list array + * @return none + */ + void SubscribeBlockListL( RPointerArray& aMembers ); + + /** + * Get (subscribe) Buddy List + * + * @since S60 3.2 + * @param aMembers, member list array + * @return none + */ + void SubscribeBuddyListL( RPointerArray& aMembers ); + + /** + * GetUserListsL + * + * @since S60 3.2 + * @param aList, List name + * @param aColl, XIMP object collection + */ + void GetEntitiesInListL( + const TDesC& aList, MXIMPObjectCollection& aColl ); + + /** + * Add identity to virtual list + * + * @since S60 3.2 + * @param aList, List name + */ + void AddIdentityToVirtualListL( + const TDesC& aList ); + + /** + * CheckXdmDoc + * + * @since S60 3.2 + * @param none + * @return TBool, state of xdm documents + */ + TBool CheckXdmDoc(); + + public: //From assync + + /** + * Defined in a base class + */ + void HandlePresUpdateDocumentL( TInt aErrorCode ); + + /** + * Defined in a base class + */ + void HandlePresUpdateCancelL( TInt aErrorCode ); + + private: + + /** + * Standard C++ constructor + * + * @param aObs, plugin connection observer + * @param aXmdId, XDM settings id + */ + CPresencePluginXdmUtils( + MPresencePluginConnectionObs& aObs, + TInt aXmdId, + TBool aLocalmode ); + + /** + * Performs the 2nd phase of construction. + */ + void ConstructL( ); + + protected:// from base class CActive + + /** + * Defined in a base class + */ + void RunL(); + + /** + * Defined in a base class + */ + TInt RunError( TInt aError ); + + /** + * Defined in a base class + */ + void DoCancel(); + + protected: // from MPresencePluginContactsObs + + /** + * Defined in a base class + */ + void RequestComplete( TAny* aResult, + TPresenceContactsOperation aOperation, TInt aError ); + + private: + + /** + * DoUpdateXdmLists + * + * @since S60 3.2 + * @param aMyStatus, RunL status + * @return aOrigState, xdm state + */ + void DoUpdateXdmListsL( TInt aMyStatus, + TPluginXdmState aOrigState ); + + /** + * DoGetXdmLists + * + * @since S60 3.2 + * @param aMyStatus, RunL status + * @return aOrigState, xdm state + */ + void DoGetXdmListsL( TInt aMyStatus, + TPluginXdmState aOrigState ); + + /** + * DoCreateXdmLists + * + * @since S60 3.2 + * @param aMyStatus, RunL status + * @return aOrigState, xdm state + */ + void DoCreateXdmListsL( TInt aMyStatus, + TPluginXdmState aOrigState, + TBool aOnlyResourceList ); + + /** + * Search list under parent + * + * @since S60 3.2 + * @param none + * @return none + */ + CXdmDocumentNode* SearchListUnderParentL( + CXdmDocumentNode* aParent, + const TDesC& aName ); + + /** + * Complete client request + * + * @since S60 3.2 + * @param aStatus, client status + * @return none + */ + void CompleteClientReq( TInt aStatus ); + + /** + * Get XDM lists + * + * @since S60 3.2 + * @param aCreateRules, create new rule document + * @param aLocalMode, use localmode + * @return none + */ + void GetXdmListsL( TBool aCreateRules, TBool aLocalMode ); + + /** + * Create XDM list document model + * + * @since S60 3.2 + * @param aCreateRules, create new rule document + * @return none + */ + void CreateXdmListsL( TBool aCreateRules ); + + /** + * Update document to server + * + * @since S60 3.2 + * @param none + * @return none + */ + void UpdateXdmToServerL(); + + /** + * Updates XDMS reource lists into server + * + * @since S60 3.2 + * @param none + * @return none + */ + void UpdateXdmsL(); + + /** + * Updates XDM rules + * + * @since S60 3.2 + * @param none + * @return none + */ + void UpdateXdmRulesL(); + + /** + * Get XDM rules + * + * @since S60 3.2 + * @param none + * @return none + */ + void GetXdmRulesL(); + + /** + * Handle presence document + * + * @since S60 3.2 + * @param aList, list name + * @param aUser, entity name + * @return none + */ + void DoHandlePresUpdateDocumentL( TInt aErrorCode ); + + /** + * Add User to resource list + * + * @since S60 3.2 + * @param aList, list name + * @param aName, url + */ + void DoAddUserToListL( + const TDesC& aList, + const TDesC& aName ); + + /** + * Remove user from list + * + * @since S60 3.2 + * @param aList, list name + * @param aUser, entity name + * @return none + */ + void DoRemoveUserFromListL( + const TDesC& aList, + const TDesC& aName ); + + /** + * Get member list + * + * @since S60 3.2 + * @param aList, list name + * @param aMembers, member array + * @return none + */ + void DoGetListMembersL( + const TDesC& aList, + RPointerArray& aMembers ); + + /** + * Get buddy list + * + * @since S60 3.2 + * @param aList, list name + * @return XDM document + */ + CXdmDocumentNode* DoGetBuddyListL( const TDesC& aParent); + + /** + * Get buddy list + * + * @since S60 3.2 + * @param aList, list name + * @parma aBuddyList, xdm document node + * @return XDM document + */ + CXdmDocumentNode* DoGetUserListL( + const TDesC& aList, + CXdmDocumentNode* aBuddyList ); + + /** + * Check XDM errors + * + * @since S60 3.2 + * @param aMyStatus, XDM error code + * @return errorcode + */ + TInt CheckIfErrorL( TInt aMyStatus ); + + /** + * Check if entity already exist + * + * @since S60 3.2 + * @param aList, listname + * @param aUri, entity url + * @return TBool + */ + TBool CheckIfEnityExistL( const TDesC& aList, const TDesC& aUri ); + + /** + * Update document from server + * + * @since S60 3.2 + * @param none + * @return none + */ + void UpdateFromServerL(); + + /** + * Compare uri to attribute without prefix. Returns ETrue if match. + * + * @since S60 5.0 + * @param aUri, entity url + * @parram aAttribute url attribute + * @return TBool + */ + TBool CompareUriWithoutPrefixL( + const TDesC& aUri, const TDesC& aAttribute ); + + /** + * Update blocked contact status to Presence Cache + * + * @since S60 5.0 + * @param aMyStatus, error status + */ + void DoUpdateBlockedContactPresenceCacheL( + TInt aMyStatus ); + + private: // Data + + /** + * ximp Plugin connection observer + * Own. + */ + MPresencePluginConnectionObs& iConnObs; + + /** + * XDM Settings id + * Own. + */ + TInt iSettingsId; + + /** + * ximp request id + * Own. + */ + TXIMPRequestId iximpId; + + /** + * ximp request id for own requests + * Own. + */ + TXIMPRequestId iximpIdOwn; + + /** + * Simple Engine request id + * Own. + */ + TInt iSimpleId; + + /** + * XDM Engine + * Own. + */ + CXdmEngine* iXdmEngine; + + /** + * XDM document for resource-lists + * Own. + */ + CXdmDocument* iXdmDoc; + + /** + * Current state + * Own. + */ + TPluginXdmState iXdmState; + + /** + * Current operation + * Own. + */ + TPluginXdmOperation iOperation; + + /** + * Whether Presence XDM is up-to-date + * Own. + */ + TBool iPresXdmOk; + + /** + * Whether XDM is up-to-date + * Own. + */ + TBool iXdmOk; + + /** + * client statutus. + * Not own. + */ + TRequestStatus* iClientStatus; + + /** + * XDM presence rules handling + * own. + */ + CPresencePluginXdmPresRules* iXdmPresRules; + + /** + * Entity uri + * Own. + */ + HBufC* iEntityUri; + + /** + * TPluginPresRulesUpdateState + * Own. + */ + TPluginPresRulesState iRulesUpdateState; + + /** + * XDM localmode + * Own. + */ + TBool iLocalMode; + + /** + * Request results. + * Is contact blocked request + */ + TBool iPresenceContactsAsyncReqResult; + + /* + * Initial blocked contact list + */ + RPointerArray iBlockedContacts; + + SIMPLE_UNIT_TEST( T_CPresencePluginGroups ) + SIMPLE_UNIT_TEST( T_CPresencePluginWatcher ) + SIMPLE_UNIT_TEST( T_CPresencePluginAuthorization ) + SIMPLE_UNIT_TEST( T_CPresencePluginXdmUtils ) + }; + +#endif // CPRESENCEPLUGINXDMUTILS_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/install/sis/create_sis.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/install/sis/create_sis.bat Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,17 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: +rem + +createsis create -key H:\RD_RootCA\rd-key.pem -cert H:\RD_RootCA\rd.cer simpledatamodeladapter.pkg \ No newline at end of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/install/sis/simpledatamodeladapter.SIS Binary file simpledatamodeladapter/install/sis/simpledatamodeladapter.SIS has changed diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/install/sis/simpledatamodeladapter.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/install/sis/simpledatamodeladapter.pkg Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,61 @@ +; +; Copyright (c) 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: +; +&EN + +;Header +#{"Presence adapter"},(0x10207FE0),1,22,1, TYPE=SA + + +;Series 60 v3.0 +[0x101f7961], 0, 0, 0, {"Series60ProductID"} + +;Localised Vendor name +%{"Nokia"} + +; Non-localised vendor name +:"Nokia Corporation" + +;Files to install + + +;ECOM PLUGINS: + +; SIMPLE DATAMODEL ADAPTER: +"\epoc32\release\armv5\udeb\presenceplugin.dll" -"!:\sys\bin\presenceplugin.dll" +"\epoc32\data\Z\Resource\Plugins\presenceplugin.RSC" -"C:\Resource\Plugins\presenceplugin.RSC" + +;test app +;"\epoc32\release\armv5\urel\HelloWorld.exe" -"!:\sys\bin\HelloWorld.exe" +;"\epoc32\data\Z\Resource\Apps\HelloWorld.RSC" -"C:\Resource\HelloWorld.RSC" + +;UI stuff +;"\epoc32\release\armv5\udeb\sipvoipcontactsextension.dll" -"C:\sys\bin\sipvoipcontactsextension.dll" +;"\epoc32\data\Z\Resource\sipvoipcontactsextensionres.Rsc" -"C:\Resource\sipvoipcontactsextensionres.Rsc" +;"\epoc32\data\Z\Resource\Plugins\sipvoipcontactsextension.RSC" -"C:\Resource\Plugins\sipvoipcontactsextension.RSC" +;"\epoc32\data\Z\Resource\apps\sipvoipcontactsextensiondefaulticons.mif" -"C:\Resource\Apps\sipvoipcontactsextensiondefaulticons.mif" +;"\epoc32\data\Z\Resource\apps\svcedefaulticons.mif" -"C:\Resource\Apps\svcedefaulticons.mif" + +;Extension manager stuff +;"\epoc32\release\armv5\udeb\ExtensionManager.dll" -"!:\sys\bin\ExtensionManager.dll" +;"\epoc32\data\Z\Resource\ExtensionManagerRes.rsc" -"C:\Resource\Plugins\ExtensionManagerRes.rsc" + +; sipconnectionprovider +;"\epoc32\release\armv5\udeb\sipconnectionprovider.dll"-"!:\sys\bin\sipconnectionprovider.dll" +;"\epoc32\data\Z\resource\plugins\sipconnectionprovider.rsc"-"!:\resource\plugins\sipconnectionprovider.rsc" + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/rom/simpledatamodeladapter.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/rom/simpledatamodeladapter.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006 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: ROM definition file. +* +*/ + + +#ifndef SIMPLEDATAMODELADAPTER_IBY +#define SIMPLEDATAMODELADAPTER_IBY + +#ifdef RD_VOIP_REL_2_2 + +ECOM_PLUGIN(presenceplugin.dll, 10275464.RSC) + +#endif // RD_VOIP_REL_2_2 + +#endif // SIMPLEDATAMODELADAPTER_IBY diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/data/20022d58.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/data/20022d58.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 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: Resource definitions for project Simple IM Plugin +* +*/ + +#include +#include +#include "simpleimpluginuids.hrh" + +// --------------------------------------------------------------------------- +// REGISTRY_INFO +// ecom plugin resource info +// --------------------------------------------------------------------------- +// +RESOURCE REGISTRY_INFO theInfo + { + resource_format_version = RESOURCE_FORMAT_VERSION_2; + + dll_uid = KDllUidSimpleImPlugin; + + // Declare array of interface info + interfaces = + { + INTERFACE_INFO + { + // UID of interface that is implemented + interface_uid = IM_IF_ID_PROTOCOL_IM_FEATURES; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = KImplUidSimpleImPlugin; + version_no = 1; + display_name = "simple im plugin"; + default_data = 2219; + opaque_data = ""; + rom_only = 0; + } + }; + } + }; + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,30 @@ +/* +* Copyright (c) 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: Build information file for project simpleimplugin. +* +*/ + +#include + +PRJ_PLATFORMS +DEFAULT + +PRJ_EXPORTS +../rom/simpleimplugin.iby CORE_MW_LAYER_IBY_EXPORT_PATH(simpleimplugin.iby) + +PRJ_MMPFILES +simpleimplugin.mmp + +PRJ_TESTMMPFILES + diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/group/simpleimplugin.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/group/simpleimplugin.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 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: Project definition file for project simpleimplugin. +* +*/ + +#include +#include + +TARGET simpleimplugin.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x20022D58 + +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE simpleimconversation.cpp +SOURCE simpleimfeatures.cpp +SOURCE simpleimpluginimplementationproxy.cpp + +SOURCEPATH ../data +START RESOURCE 20022d58.rss +TARGET simpleimplugin.rsc +END // RESOURCE + +USERINCLUDE ../inc +USERINCLUDE ../../inc + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom + +LIBRARY cch.lib +LIBRARY euser.lib +LIBRARY ecom.lib +LIBRARY esock.lib +LIBRARY insock.lib +LIBRARY charconv.lib +LIBRARY simpleengine.lib +LIBRARY serviceprovidersettings.lib +LIBRARY imcacheclient.lib diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/inc/simpleimconversation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/inc/simpleimconversation.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,290 @@ +/* +* Copyright (c) 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: Provides IM sending and receiving services. +* +*/ + + +#ifndef C_CSIMPLEIMCONVERSATION_H +#define C_CSIMPLEIMCONVERSATION_H + +#include +#include +#include +#include +#include +#include +#include + +class CIMCacheFactory; +class MIMCacheUpdater; +class MPresencePluginConnectionObs; +class MSimpleConnection; +class MProtocolImDataHost; +class MXIMPIdentity; + +/** + * This class is used for sending and receiving instant messages. + * A client sends the message and waits for notification of send process + * success. Client is notified with + * MPresencePluginConnectionObs::CompleteReq(). + * + * There can be only one message in the sending que at the time. + * Otherwise DoSendMessageL() method leaves with KErrInUse. + * + * Messages received from the other end are handled in this class and + * delivered to the client. Client gets messages through + * MProtocolImConversationDataHost::HandleNewTextMessageL(). + * + * @lib simpleimplugin.dll + * @since S60 v5.1 + */ +NONSHARABLE_CLASS( CSimpleImConversation ) : public CBase, + public MProtocolImConversation, + public MSimpleInstantMsgObserver + { + +public: + + /** + * Two-phased constructor. + * + * @param aObs Callback for complete requests. + * @param aConn Simple engine connection. + */ + static CSimpleImConversation* NewL( + MPresencePluginConnectionObs& aObs, MSimpleConnection& aConn, + TUint aServiceId ); + + /** + * Destructor. + */ + virtual ~CSimpleImConversation(); + +public: + + /** + * Sets current IM data host. + * + * @since S60 v5.1 + * @param aHost IM data host. + */ + void SetHost( MProtocolImDataHost& aHost ); + +public: //from MXIMPBase + + /** + * From MXIMPBase. + * @see MXIMPBase. + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ); + + /** + * From MXIMPBase. + * @see MXIMPBase. + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const; + + /** + * From MXIMPBase. + * @see MXIMPBase. + */ + TInt32 GetInterfaceId() const; + +public: // From MProtocolImConversation + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + void DoSendMessageL( + const MImConversationInfo& aImMessage, + TXIMPRequestId aReqId ); + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + void DoForwardMessageL( + const MImConversationInfo& aImMessage, + TXIMPRequestId aReqId); + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + void DoSendMessageToGroupL( + const MImConversationInfo& aImMessage, + const TDesC* aGroupId,TXIMPRequestId aReqId ); + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + TXIMPRequestId DoBlockUsersL( + const MDesCArray* aUserIds, + TXIMPRequestId aReqId); + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + TXIMPRequestId DoUnBlockUsersL( + const MDesCArray* aUserIds, + TXIMPRequestId aReqId ); + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + void DoGetBlockedListRequestL( + const MXIMPIdentity& aImMessageId, + TXIMPRequestId aReqId ); + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + void DoGetMessageListL( + const MXIMPIdentity& aImMessageId, + const TDesC* aGroupId, + const TInt aMessageCount, + TBool aDeliveryReportWanted, + TXIMPRequestId aReqId); + + /** + * From MProtocolImConversation. + * @see MProtocolImConversation. + */ + void DoRejectMessageL( + const MXIMPIdentity& aImMessageId, + const TDesC& aMessageID, + TXIMPRequestId aReqId ); + +public: // From MSimpleInstantMsgObserver + + /** + * From MSimpleInstantMsgObserver. + * @see MSimpleInstantMsgObserver. + */ + void SendInstantMsgReqComplete( TInt aOpid, TInt aStatus ); + + /** + * From MSimpleInstantMsgObserver. + * @see MSimpleInstantMsgObserver. + */ + void HandleReceiveTextMessage( TPtrC8 aFrom, TPtrC8 aContent ); + +private: // constructor and the Symbian second-phase constructor + + CSimpleImConversation( MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + TUint aServiceId ); + + void ConstructL( ); + +private: + + /** + * Calls MXIMPProtocolConnectionHost callback. + * + * @since S60 v5.1 + * @param aStatus Error status. + */ + void CompleteXimpReq( TInt aStatus ); + + /** + * Leaveable version of HandleReceiveTextMessage. + * + * @see MSimpleInstantMsgObserver + */ + void DoHandleReceiveTextMessageL( TPtrC8 aFrom, TPtrC8 aContent ); + + /** + * Resolves username to be used. + * + * @since S60 v5.1 + * @param aServiceId Service identifier. + * @param aUserName On return contains resolved user name. + */ + void ResolveUsernameL( TUint aServiceId, RBuf& aUserName ) const; + + /** + * Creates IM cache updater if not yet created. + * + * @since S60 v5.1 + */ + void CreateImCacheUpdaterIfNeededL(); + +private: // Data + + /** + * XIMP Plugin connection observer. + * Not own. + */ + MPresencePluginConnectionObs* iConnectionObs; + + /** + * SIMPLE engine connection. + * Not Own. + */ + MSimpleConnection* iConnection; + + /** + * Instant message handler instance. + * Own. + */ + MSimpleInstantMessage* iImHandler; + + /** + * Request identifier. + */ + TXIMPRequestId iXimpId; + + /** + * Current request status; completed or not. + */ + TBool iCompleted; + + /** + * Protocol IM data host. + * Not own. + */ + MProtocolImDataHost* iHost; + + /** + * IM cache factory. + * Own. + */ + CIMCacheFactory* iImCacheFactory; + + /** + * IM cache updater. + * Owned by factory. + */ + MIMCacheUpdater* iImCacheUpdater; + + /** + * ServiceId of current + * service + */ + TUint iServiceId; + + }; + +#endif // C_CSIMPLEIMCONVERSATION_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/inc/simpleimfeatures.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/inc/simpleimfeatures.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,173 @@ +/* +* Copyright (c) 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: +* +*/ + + +#ifndef C_CSIMPLEIMFEATURES_H +#define C_CSIMPLEIMFEATURES_H + +#include +#include + +class CSimpleImConversation; +class MPresencePluginConnectionObs; +class MSimpleConnection; + +/** + * Main class of XIMP FW plugin providing SIP IM feature. + * + * @lib simpleimplugin.dll + * @since S60 v5.1 + */ +NONSHARABLE_CLASS( CSimpleImFeatures ) : public CProtocolImFeatures +{ +public: + + /** + * This class encapsulates SIP IM plugin initialization parameters. + * + * @lib simpleimplugin.dll + * @since S60 v5.1 + */ + class TSimpleImPluginInitParams + { + public: + + /** + * Constructor. + * @param aObs Presence plugin connection observer. + * @param aConn Simple engine connection. + */ + TSimpleImPluginInitParams( MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, TUint aServiceId ) : iObserver( aObs ), + iConnection( aConn ), iServiceId( aServiceId ) {}; + + public: + + /** + * Presence plugin connnection observer. + * Not own. + */ + MPresencePluginConnectionObs& iObserver; + + /** + * Simple engine connection. + * Not own. + */ + MSimpleConnection& iConnection; + + /** + * Service identifier. + */ + TUint iServiceId; + }; + + /** + * Constructor. + * @param aInitParams Plugin initialization parameters. + */ + static CSimpleImFeatures* NewL( TAny* aInitParams ); + + /** + * Standard C++ destructor. + */ + virtual ~CSimpleImFeatures(); + +private: + + CSimpleImFeatures(); + + void ConstructL( TAny* aInitParams ); + +public: // From MXIMPBase + + /** + * From MXIMPBase. + * @see MXIMPBase. + */ + TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ); + + /** + * From MXIMPBase. + * @see MXIMPBase. + */ + const TAny* GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const; + + /** + * From MXIMPBase. + * @see MXIMPBase. + */ + TInt32 GetInterfaceId() const; + +public : // From CProtocolImFeatures + + /** + * From CProtocolImFeatures. + * @see CProtocolImFeatures. + */ + MProtocolImGroup& ImGroup(); + + /** + * From CProtocolImFeatures. + * @see CProtocolImFeatures. + */ + MProtocolImConversation& ImConversation(); + + /** + * From CProtocolImFeatures. + * @see CProtocolImFeatures. + */ + MProtocolImInvitation& ImInvitation(); + + /** + * From CProtocolImFeatures. + * @see CProtocolImFeatures. + */ + MProtocolImSearch& ImSearch(); + + /** + * From CProtocolImFeatures. + * @see CProtocolImFeatures. + */ + void SetHost( MProtocolImDataHost& aHost ); + + /** + * From CProtocolImFeatures. + * @see CProtocolImFeatures. + */ + TInt SupportedSubInterfaces() const; + +private : // data members + + /** + * IM conversation. + * Own. + */ + CSimpleImConversation* iImConversation; + + /** + * Protocol IM data host. + * Not own. + */ + MProtocolImDataHost* iHost; + + }; + +#endif // C_CSIMPLEIMFEATURES_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/inc/simpleimlogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/inc/simpleimlogger.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,40 @@ +/* +* Copyright (c) 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: +* +*/ + + +#ifndef SIMPLEIMLOGGER_H +#define SIMPLEIMLOGGER_H + +#ifdef _DEBUG + #include + #define _DEBUG_SIMPLE_IM_PLUGIN +#endif + +#ifdef _DEBUG_SIMPLE_IM_PLUGIN + #define DP_IMP( a ) \ + { _LIT( KFormatString, a ); RDebug::Print( KFormatString ); } + #define DP_IMP2( a, b ) \ + { _LIT( KFormatString, a ); RDebug::Print( KFormatString, b ); } + #define DP_IMP3( a, b, c ) \ + { _LIT( KFormatString, a ); RDebug::Print( KFormatString, b, c ); } +#else + #define DP_IMP( a ); + #define DP_IMP2( a, b ); + #define DP_IMP3( a, b, c ); +#endif + +#endif // SIMPLEIMLOGGER_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/inc/simpleimplugindefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/inc/simpleimplugindefs.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,26 @@ +/* +* Copyright (c) 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: Common definitions for SIP IM plugin. +* +*/ + + +#ifndef SIMPLEIMPLUGINDEFS_H +#define SIMPLEIMPLUGINDEFS_H + +#include + +_LIT( KSimpleImPluginName, "SimpleImPlugin" ); + +#endif // SIMPLEIMPLUGINDEFS_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/inc/simpleimpluginuids.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/inc/simpleimpluginuids.hrh Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 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: Resource headers for project simpleimplugin. +* +*/ + +#ifndef SIMPLEIMPLUGINUIDS_HRH +#define SIMPLEIMPLUGINUIDS_HRH + +/** + * Plugin DLL UID + */ +#define KDllUidSimpleImPlugin 0x20022D58 + +/** + * Interface Implementation UIDs + */ +#define KImplUidSimpleImPlugin 0x20022D59 + +#endif // SIMPLEIMPLUGINUIDS_HRH diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/rom/simpleimplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/rom/simpleimplugin.iby Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,27 @@ +/* +* Copyright (c) 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: ROM definition file. +* +*/ + +#ifndef SIMPLEIMPLUGIN_IBY +#define SIMPLEIMPLUGIN_IBY + +#ifdef RD_VOIP_REL_2_2 + +ECOM_PLUGIN(simpleimplugin.dll, 20022D58.RSC) + +#endif // RD_VOIP_REL_2_2 + +#endif // SIMPLEIMPLUGIN_IBY diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/src/simpleimconversation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/src/simpleimconversation.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,487 @@ +/* +* Copyright (c) 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: +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "simpleimconversation.h" +#include "presenceplugincommon.h" +#include "mpresencepluginconnectionobs.h" +#include "simpleimplugindefs.h" +#include "simpleimlogger.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::CPresencePluginGroups +// --------------------------------------------------------------------------- +// +CSimpleImConversation::CSimpleImConversation( + MPresencePluginConnectionObs& aObs, MSimpleConnection& aConn, + TUint aServiceId ): + iConnectionObs( &aObs ), + iConnection( &aConn ), + iServiceId( aServiceId ) + { + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::NewL +// --------------------------------------------------------------------------- +// +CSimpleImConversation* CSimpleImConversation::NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, TUint aServiceId) + { + CSimpleImConversation* self = + new( ELeave ) CSimpleImConversation ( aObs, aConn, aServiceId ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::ConstructL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::ConstructL() + { + DP_IMP("CSimpleImConversation::ConstructL") + + iImHandler = TSimpleFactory::NewInstantMessageL( + *iConnection, *this ); + + iImCacheFactory = CIMCacheFactory::InstanceL(); + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::~CSimpleImConversation +// --------------------------------------------------------------------------- +// +CSimpleImConversation::~CSimpleImConversation() + { + DP_IMP("CSimpleImConversation::~CSimpleImConversation") + + if ( iImHandler ) + { + DP_IMP("Close the msg handler") + iImHandler->Close(); + } + + // Release the imcache, all the conversation will lost here + if ( iImCacheFactory ) + { + DP_IMP("Release IM Cache") + CIMCacheFactory::Release(); + iImCacheFactory = NULL; + } + + iImCacheUpdater = NULL; + iHost = NULL; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::SetHost +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::SetHost( MProtocolImDataHost& aHost ) + { + DP_IMP("CSimpleImConversation::SetHost") + + iHost = &aHost; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CSimpleImConversation::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + DP_IMP("CSimpleImConversation::GetInterface") + + if ( MProtocolImConversation::KInterfaceId == aInterfaceId ) + { + return this; + } + + if ( MXIMPBase::EPanicIfUnknown == aOptions ) + { + User::Panic( KSimpleImPluginName, KErrExtensionNotSupported ); + } + + return NULL; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::GetInterface() const +// --------------------------------------------------------------------------- +// +const TAny* CSimpleImConversation::GetInterface( + TInt32 aInterfaceId, TIfGetOps aOptions ) const + { + DP_IMP("CSimpleImConversation::GetInterface") + + if ( MProtocolImConversation::KInterfaceId == aInterfaceId ) + { + // caller wants this interface + return const_cast( this ); + } + + if ( MXIMPBase::EPanicIfUnknown == aOptions ) + { + User::Panic( KSimpleImPluginName, KErrExtensionNotSupported ); + } + + return NULL; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::GetInterfaceId() const +// --------------------------------------------------------------------------- +// +TInt32 CSimpleImConversation::GetInterfaceId() const + { + DP_IMP("CSimpleImConversation::GetInterfaceId") + + return MProtocolImConversation::KInterfaceId; + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoSendMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoSendMessageL( + const MImConversationInfo& aImMessage, + TXIMPRequestId aReqId ) + { + DP_IMP( "CSimpleImConversation::DoSendMessageL" ) + + iCompleted = EFalse; + + TPtrC16 msgText16 = aImMessage.TextMessage(); + DP_IMP2( "CSimpleImConversation::DoSendMessageL, CONTENT: %S", + &msgText16 ) + HBufC8* contentData = CnvUtfConverter::ConvertFromUnicodeToUtf8L( + msgText16 ); + CleanupStack::PushL( contentData ); + + const MDesCArray& recipients = aImMessage.RecipientL(); + for ( TInt i = 0; i < recipients.MdcaCount(); i++ ) + { + TPtrC16 recipientsPtr16 = recipients.MdcaPoint( i ); + HBufC8* recipientsData = CnvUtfConverter::ConvertFromUnicodeToUtf8L( + recipientsPtr16 ); + CleanupStack::PushL( recipientsData ); + DP_IMP2( "CSimpleImConversation::DoSendMessageL, RECIPIENT: %S", + &recipientsPtr16 ) + + TInt result = iImHandler->SendInstantMessage( *contentData, + *recipientsData ); + CleanupStack::PopAndDestroy( recipientsData ); + + if ( KErrInUse == result ) + { + User::Leave( KErrInUse ); + } + } + + CleanupStack::PopAndDestroy( contentData ); + iXimpId = aReqId; + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoForwardMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoForwardMessageL( + const MImConversationInfo& /*aImMessage*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoForwardMessageL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoSendMessageToGroupL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoSendMessageToGroupL( + const MImConversationInfo& /*aImMessage*/, + const TDesC* /*aGroupId*/, TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoSendMessageToGroupL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoBlockUsersL() +// --------------------------------------------------------------------------- +// +TXIMPRequestId CSimpleImConversation::DoBlockUsersL( + const MDesCArray* /*aUserIds*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoBlockUsersL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + return TXIMPRequestId(); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoUnBlockUsersL() +// --------------------------------------------------------------------------- +// +TXIMPRequestId CSimpleImConversation::DoUnBlockUsersL( + const MDesCArray* /*aUserIds*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoUnBlockUsersL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + return TXIMPRequestId(); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoGetBlockedListRequestL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoGetBlockedListRequestL( + const MXIMPIdentity& /*aImMessageId*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoGetBlockedListRequestL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoGetMessageListL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoGetMessageListL( + const MXIMPIdentity& /*aImMessageId*/, + const TDesC* /*aGroupId*/, + const TInt /*aMessageCount*/, + TBool /*aDeliveryReportWanted*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoGetMessageListL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoRejectMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoRejectMessageL( + const MXIMPIdentity& /*aImMessageId*/, + const TDesC& /*aMessageID*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoRejectMessageL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MSimpleInstantMsgObserver. +// CSimpleImConversation::SendInstantMsgReqComplete() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::SendInstantMsgReqComplete( + TInt /*aOpid*/, TInt aStatus) + { + DP_IMP("CSimpleImConversation::SendInstantMsgReqComplete") + + CompleteXimpReq( aStatus ); + } + + +// --------------------------------------------------------------------------- +// From MSimpleInstantMsgObserver. +// CSimpleImConversation::HandleReceiveTextMessage() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::HandleReceiveTextMessage( + TPtrC8 aFrom, TPtrC8 aContent ) + { + DP_IMP( "CSimpleImConversation::HandleReceiveTextMessage" ) + + TRAPD( err, DoHandleReceiveTextMessageL( aFrom, aContent ) ) + + if ( KErrNone != err ) + { + // Do nothing + DP_IMP2( "CSimpleImConversation::HandleReceiveTextMessage, ERROR: %i", + err ) + } + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::CompleteXimpReq() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::CompleteXimpReq( TInt aStatus ) + { + DP_IMP( "CSimpleImConversation::CompleteXimpReq" ) + + if ( iCompleted ) + { + DP_IMP("CSimpleImConversation::CompleteXimpReq return") + return; + } + + iCompleted = ETrue; + iConnectionObs->CompleteReq( iXimpId, aStatus ); + iXimpId = TXIMPRequestId(); + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::DoHandleReceiveTextMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoHandleReceiveTextMessageL( TPtrC8 aFrom, + TPtrC8 aContent ) + { + DP_IMP( "CSimpleImConversation::DoHandleReceiveTextMessageL" ) + + CreateImCacheUpdaterIfNeededL(); + + if ( iHost ) + { + MXIMPObjectFactory& objFact = iConnectionObs->Host()->ObjectFactory(); + MImObjectFactory& imObjFact = iHost->ImObjectFactory(); + + MXIMPIdentity* identity = objFact.NewIdentityLC(); // CS:1 + MImConversationInfo* convinfo = imObjFact. + NewImConversationInfoLC(); // CS:2 + + HBufC16* sendername = CnvUtfConverter::ConvertToUnicodeFromUtf8L( + aFrom ); + CleanupStack::PushL( sendername ); // CS:3 + identity->SetIdentityL( *sendername ); + CleanupStack::PopAndDestroy( sendername ); // CS:2 + convinfo->SetMessageIdL( identity ); + + HBufC16* messagecontent = CnvUtfConverter::ConvertToUnicodeFromUtf8L( + aContent ); + CleanupStack::PushL( messagecontent ); // CS:3 + convinfo->SetTextMessageL( *messagecontent ); + CleanupStack::PopAndDestroy( messagecontent ); // CS:2 + + iHost->ConversationDataHost().HandleNewTextMessageL( convinfo ); + TRAP_IGNORE( iImCacheUpdater->AppendReceiveMessageL( + identity->Identity(), convinfo->TextMessage() ) ); + + CleanupStack::Pop(); // CS:1 + CleanupStack::Pop(); // CS:0 + } + else + { + DP_IMP( " --> PROTOCOL IM DATA HOST IS NULL!" ) + } + } + +// --------------------------------------------------------------------------- +// CSimpleImConversation::ResolveUsernameL +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::ResolveUsernameL( + TUint aServiceId, RBuf& aUserName ) const + { + DP_IMP( "CSimpleImConversation::ResolveUsernameL" ) + + CCch* cchApi = CCch::NewLC(); + CCchService* service = cchApi->GetService( aServiceId ); + + User::LeaveIfError( service->GetConnectionParameter( + ECCHUnknown, ECchUsername, aUserName ) ); + + DP_IMP2( "CSimpleImConversation::ResolveUsernameL, USERNAME: %S", + &aUserName ) + + CleanupStack::PopAndDestroy( cchApi ); + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::CreateImCacheUpdaterIfNeededL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::CreateImCacheUpdaterIfNeededL() + { + if ( !iImCacheUpdater ) + { + DP_IMP( "CSimpleImConversation::CreateImCacheUpdaterIfNeededL," ) + DP_IMP( "CREATING UPDATER" ) + + RBuf username; + CleanupClosePushL( username ); + const TInt KMaxUserNameLength = 255; + username.CreateL( KMaxUserNameLength ); + ResolveUsernameL( iServiceId, username ); + + iImCacheUpdater = + iImCacheFactory->CreateUpdaterL( iServiceId, username, EFalse ); + CleanupStack::PopAndDestroy( &username ); + } + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/src/simpleimfeatures.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/src/simpleimfeatures.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 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: +* +*/ + + +#include "simpleimfeatures.h" +#include "simpleimconversation.h" +#include "mpresencepluginconnectionobs.h" +#include "simpleimplugindefs.h" +#include "simpleimlogger.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimpleImFeatures::CSimpleImFeatures() +// --------------------------------------------------------------------------- +// +CSimpleImFeatures::CSimpleImFeatures() : CProtocolImFeatures() + { + } + + +// --------------------------------------------------------------------------- +// CSimpleImFeatures::NewL() +// --------------------------------------------------------------------------- +// +CSimpleImFeatures* CSimpleImFeatures::NewL( TAny* aInitParams ) + { + DP_IMP( "CSimpleImFeatures::NewL()" ) + + CSimpleImFeatures* self = new( ELeave ) CSimpleImFeatures(); + CleanupStack::PushL( self ); + self->ConstructL( aInitParams ); + CleanupStack::Pop( self ); + + return self; + } + + +// --------------------------------------------------------------------------- +// CSimpleImFeatures::ConstructL +// --------------------------------------------------------------------------- +// +void CSimpleImFeatures::ConstructL( TAny* aInitParams ) + { + DP_IMP( "CSimpleImFeatures::ConstructL()" ) + __ASSERT_ALWAYS( aInitParams, User::Leave( KErrArgument ) ); + + TSimpleImPluginInitParams* initParams = + static_cast( aInitParams ); + + iImConversation = CSimpleImConversation::NewL( initParams->iObserver, + initParams->iConnection, initParams->iServiceId ); + } + + +// --------------------------------------------------------------------------- +// CSimpleImFeatures::~CSimpleImFeatures +// --------------------------------------------------------------------------- +// +CSimpleImFeatures::~CSimpleImFeatures() + { + DP_IMP( "CSimpleImFeatures::~CSimpleImFeatures()" ) + + delete iImConversation; + } + + +// --------------------------------------------------------------------------- +// From MXIMPBase. +// CSimpleImFeatures::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CSimpleImFeatures::GetInterface( TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + DP_IMP( "CSimpleImFeatures::GetInterface()" ) + + if ( CProtocolImFeatures::KInterfaceId == aInterfaceId ) + { + DP_IMP( "CSimpleImFeatures::GetInterface() - Found" ) + CProtocolImFeatures* self = this; + return self; + } + + if ( MXIMPBase::EPanicIfUnknown == aOptions ) + { + User::Panic( KSimpleImPluginName, KErrExtensionNotSupported ); + } + + return NULL; + } + + +// --------------------------------------------------------------------------- +// From MXIMPBase. +// CSimpleImFeatures::GetInterface() const +// --------------------------------------------------------------------------- +// +const TAny* CSimpleImFeatures::GetInterface( TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + DP_IMP( "CSimpleImFeatures::GetInterface() const" ) + + if ( CProtocolImFeatures::KInterfaceId == aInterfaceId ) + { + DP_IMP( "CSimpleImFeatures::GetInterface() const - Found" ) + const CProtocolImFeatures* self = this; + return self; + } + + if ( MXIMPBase::EPanicIfUnknown == aOptions ) + { + User::Panic( KSimpleImPluginName, KErrExtensionNotSupported ); + } + + return NULL; + } + + +// --------------------------------------------------------------------------- +// From MXIMPBase. +// CSimpleImFeatures::GetInterfaceId() const +// --------------------------------------------------------------------------- +// +TInt32 CSimpleImFeatures::GetInterfaceId() const + { + return CProtocolImFeatures::KInterfaceId; + } + + +// --------------------------------------------------------------------------- +// From CProtocolImFeatures. +// CSimpleImFeatures::ImGroup() +// --------------------------------------------------------------------------- +// +MProtocolImGroup& CSimpleImFeatures::ImGroup() + { + DP_IMP( "CSimpleImFeatures::ImGroup(), NOT SUPPORTED" ) + + MProtocolImGroup* dummyGroup = NULL; + return *dummyGroup; + } + + +// --------------------------------------------------------------------------- +// From CProtocolImFeatures. +// CSimpleImFeatures::ImConversation() +// --------------------------------------------------------------------------- +// +MProtocolImConversation& CSimpleImFeatures::ImConversation() + { + DP_IMP( "CSimpleImFeatures::ImConversation()" ) + + return *iImConversation; + } + + +// --------------------------------------------------------------------------- +// From CProtocolImFeatures. +// CSimpleImFeatures::ImInvitation() +// --------------------------------------------------------------------------- +// +MProtocolImInvitation& CSimpleImFeatures::ImInvitation() + { + DP_IMP( "CSimpleImFeatures::ImInvitation(), NOT SUPPORTED" ) + + MProtocolImInvitation* dummyInvitation = NULL; + return *dummyInvitation; + } + + +// --------------------------------------------------------------------------- +// From CProtocolImFeatures. +// CSimpleImFeatures::ImSearch() +// --------------------------------------------------------------------------- +// +MProtocolImSearch& CSimpleImFeatures::ImSearch() + { + DP_IMP( "CSimpleImFeatures::ImSearch(), NOT SUPPORTED" ) + + MProtocolImSearch* dummySearch = NULL; + return *dummySearch; + } + + +// --------------------------------------------------------------------------- +// From CProtocolImFeatures. +// CSimpleImFeatures::SetHost() +// --------------------------------------------------------------------------- +// +void CSimpleImFeatures::SetHost( MProtocolImDataHost& aHost ) + { + DP_IMP( "CSimpleImFeatures::SetHost()" ) + + iHost = &aHost ; + iImConversation->SetHost( *iHost ); + } + +// --------------------------------------------------------------------------- +// From CProtocolImFeatures. +// CSimpleImFeatures::SupportedSubInterfaces() +// --------------------------------------------------------------------------- +// +TInt CSimpleImFeatures::SupportedSubInterfaces() const + { + return EProtocolImConversation; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/src/simpleimpluginimplementationproxy.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/src/simpleimpluginimplementationproxy.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 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: ECom implementation proxy. +* +*/ + + +#include +#include + +#include "simpleimfeatures.h" + +// LOCAL CONSTANTS AND MACROS +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( 0x20022D59, CSimpleImFeatures::NewL ) + }; + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// ImplementationGroupProxy +// Function to return the implementation proxy table +// ----------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + aTableCount = + sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + + return ImplementationTable; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceconnectioninfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceconnectioninfo.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#include +#include + +#include "presencepluginconnection.h" +#include "presenceconnectioninfo.h" +#include "presenceplugincommon.h" +#include "presencelogger.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::CPresenceConnectionInfo() +// --------------------------------------------------------------------------- +// +CPresenceConnectionInfo::CPresenceConnectionInfo( + MXIMPProtocolConnection* aConnection ): + iConnection( aConnection ), + iConnectStatus( CPresencePluginConnection::ENotActive ) + { + iClientCount = 0; + iClientId = GenerateClientId(); + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::NewL() +// --------------------------------------------------------------------------- +// +CPresenceConnectionInfo* CPresenceConnectionInfo::NewL( + MXIMPProtocolConnection* aConnection ) + { + DP_SDA("CPresenceConnectionInfo::NewL"); + CPresenceConnectionInfo* self = + new( ELeave ) CPresenceConnectionInfo( aConnection ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::~CPresenceConnectionInfo() +// --------------------------------------------------------------------------- +// +CPresenceConnectionInfo::~CPresenceConnectionInfo() + { + DP_SDA("CPresenceConnectionInfo::~CPresenceConnectionInfo"); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + + delete iETag; + iETag = NULL; + + DP_SDA("CPresenceConnectionInfo::~CPresenceConnectionInfo done"); + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::SetConnectionStatus() +// --------------------------------------------------------------------------- +// +void CPresenceConnectionInfo::SetConnectionStatus( + CPresencePluginConnection::TConnectionStatus aStatus ) + { + DP_SDA2("CPresenceConnectionInfo::SetConnectionStatus %d", aStatus); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + iConnectStatus = aStatus; + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::SetConnectionETag() +// --------------------------------------------------------------------------- +// +void CPresenceConnectionInfo::SetConnectionETag( const TDesC8& aETag ) + { + DP_SDA("CPresenceConnectionInfo::SetConnectionETag"); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + delete iETag; + iETag = NULL; + TRAP_IGNORE( ( iETag = aETag.AllocL() ) ); + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::GetConnectionStatus() +// --------------------------------------------------------------------------- +// +CPresencePluginConnection::TConnectionStatus + CPresenceConnectionInfo::GetConnectionStatus() + { + DP_SDA("CPresenceConnectionInfo::GetConnectionStatus"); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + DP_SDA2("CPresenceConnectionInfo:: connection status %d", iConnectStatus); + return iConnectStatus; + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::GetConnectionEtag() +// --------------------------------------------------------------------------- +// +TDesC8* CPresenceConnectionInfo::GetConnectionEtag() + { + DP_SDA("CPresenceConnectionInfo::GetConnectionEtag"); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + return iETag; + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::GetConnection() +// --------------------------------------------------------------------------- +// +MXIMPProtocolConnection* CPresenceConnectionInfo::GetConnection() + { + DP_SDA("CPresenceConnectionInfo::GetConnection"); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + return iConnection; + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::IncreaseClientCount() +// --------------------------------------------------------------------------- +// +void CPresenceConnectionInfo::IncreaseClientCount() + { + iClientCount++; + DP_SDA2("CPresenceConnectionInfo::IncreaseClientCount %d", iClientCount ); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::DecreaseClientCount() +// --------------------------------------------------------------------------- +// +void CPresenceConnectionInfo::DecreaseClientCount() + { + iClientCount--; + DP_SDA2("CPresenceConnectionArray::DecreaseClientCount %d", iClientCount ); + DP_SDA2("CPresenceConnectionArray:: clientID %d", iClientId); + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::ClientCount() +// --------------------------------------------------------------------------- +// +TInt CPresenceConnectionInfo::ClientCount() + { + DP_SDA2("CPresenceConnectionInfo::ClientCount %d", iClientCount ); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + return iClientCount; + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::GetClientId() +// --------------------------------------------------------------------------- +// +TInt CPresenceConnectionInfo::GetClientId() + { + DP_SDA2("CPresenceConnectionInfo::ClientCount %d", iClientCount ); + DP_SDA2("CPresenceConnectionInfo:: clientID %d", iClientId); + return iClientId; + } + +// --------------------------------------------------------------------------- +// CPresenceConnectionInfo::GenerateClientId() +// --------------------------------------------------------------------------- +// +TInt CPresenceConnectionInfo::GenerateClientId() + { + // Generate unique session client id + DP_SDA("CPresenceConnectionInfo::GenerateClientIdstart"); + const TInt KMaxRand = 9999; + TInt64 seed; + TTime time; + time.HomeTime(); + seed = time.Int64(); + TInt random = Math::Rand( seed ) % KMaxRand; + DP_SDA("CPresenceConnectionInfo::GenerateClientId 1"); + return random; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugin.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,378 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presenceplugin.h" +#include "presenceplugindef.h" +#include "presencepluginconnection.h" +#include "presenceplugincommon.h" +#include "presenceplugin_resource.hrh" +#include "presenceconnectioninfo.h" + +#include +#include +#include +#include + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Key value pair table to identify correct constructor +// function for the requested interface. +// --------------------------------------------------------------------------- +// +const TImplementationProxy ImplementationTable[] = + { + //Warning in Lint 611 + IMPLEMENTATION_PROXY_ENTRY( PRESENCEPLUGIN_1_IMPLEMENTATION_UID, + CPresencePlugin::NewL ) + }; + +// --------------------------------------------------------------------------- +// Exported function to return the implementation proxy table +// --------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / + sizeof( TImplementationProxy ); + return ImplementationTable; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::CPresencePlugin() +// --------------------------------------------------------------------------- +// +CPresencePlugin::CPresencePlugin() + { + //empty + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::NewLC() +// --------------------------------------------------------------------------- +// +CPresencePlugin* CPresencePlugin::NewLC() + { + CPresencePlugin* self = new( ELeave ) CPresencePlugin(); + CleanupStack::PushL( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::NewL() +// --------------------------------------------------------------------------- +// +CPresencePlugin* CPresencePlugin::NewL() + { + CPresencePlugin* self = CPresencePlugin::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::~CPresencePlugin() +// --------------------------------------------------------------------------- +// +CPresencePlugin::~CPresencePlugin() + { + DP_SDA("CPresencePlugin::~CPresencePlugin"); + iConnections.ResetAndDestroy(); + iConnectionArray.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::~CPresencePlugin() +// --------------------------------------------------------------------------- +// +void CPresencePlugin::PrimeHost( MXIMPProtocolPluginHost& aHost ) + { + DP_SDA("CPresencePlugin::PrimeHost"); + iHost = &aHost; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::AcquireConnectionL() +// --------------------------------------------------------------------------- +// +MXIMPProtocolConnection& CPresencePlugin::AcquireConnectionL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aContextClient ) + { + DP_SDA("CPresencePlugin::AcquireConnectionL"); + MXIMPProtocolConnection* tmp = NULL; + CPresenceConnectionInfo* connectionArray = NULL; + TBool connected = EFalse; + + //Check if presence is allready connected to id + //!!!! IN this adapter that IapID is service id ID!!!! + + DP_SDA2("CPresencePlugin::AcquireConnectionL - service id: %d", + aServiceInfo.IapId() ); + + TInt presenceId = KErrNotFound; + CSPSettings* spSettings = CSPSettings::NewL(); + CleanupStack::PushL( spSettings ); + + CSPProperty* property = CSPProperty::NewLC(); + spSettings->FindPropertyL( aServiceInfo.IapId(), + ESubPropertyPresenceSettingsId, + *property ); + if ( property ) + { + property->GetValue( presenceId ); + } + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spSettings ); + + DP_SDA2(" -> presence settings id: %d",presenceId ); + __ASSERT_ALWAYS( presenceId > 0, User::Leave( KErrArgument ) ); + + TInt connectionsCount = iConnections.Count(); + DP_SDA2("AcquireConnectionL : connectionsCount =%d ", connectionsCount ); + + for( TInt i( connectionsCount - 1 ); i >= 0; i-- ) + { + DP_SDA2("AcquireConnectionL connection count %d", connectionsCount); + if( iConnections[i]->GetPresenceSetId() == presenceId ) + { + DP_SDA2("AcquireConnectionL RETURN OLD CONNECTION : i = %d " , i ); + //Check connection status + tmp = iConnections[i]; + connectionArray = iConnections[i]->GetConnectionArray(); + + //Check connection status from connectionArray + CPresencePluginConnection::TConnectionStatus status = + connectionArray->GetConnectionStatus(); + + if( CPresencePluginConnection::ENotActive == status ) + { + DP_SDA("AcquireConnectionL ENotActive "); + DP_SDA("AcquireConnectionL Del old inactive connection"); + //Call session CLOSE here!!!!! + //Ensure there is no any client to bind this connect + //Release this failed connection + DeleteConnection(i); + } + else if ( CPresencePluginConnection::ETerminated == status ) + { + DP_SDA("AcquireConnectionL ETerminated CREATE NEW CONNECTION "); + //Roamning try use lates ETag + //Delete old terminaded connection and create new with old ETag + CPresencePluginConnection* connection = + CPresencePluginConnection::NewL( + aServiceInfo, aContextClient, + *iConnectionArray[i]->GetConnectionEtag() ); + CleanupStack::PushL( connection ); + + DeleteConnection( i ); + + //Add this new connection to connectionArray + CPresenceConnectionInfo* connectionInfo = + CPresenceConnectionInfo::NewL( connection ); + CleanupStack::PushL( connectionInfo ); + iConnectionArray.AppendL( connectionInfo ); + CleanupStack::Pop(); + connection->SetConnectionArray( connectionInfo ); + iConnections.AppendL( connection ); + CleanupStack::Pop( connection ); + tmp = connection; + connected = ETrue; + + iConnectionArray[i]->IncreaseClientCount(); + } + else if ( CPresencePluginConnection::EActive == status ) + { + DP_SDA("AcquireConnectionL EActive"); + // NOTE: Incase there is no reply from XIMP before client is + // shutdown , then closeconnection wouldnt be called, reopening + // client will increase clientCount which is wrong. ClientCount + // should be checked for validity before increasing? + // If already connected + iConnectionArray[i]->IncreaseClientCount(); + connected = ETrue; + tmp = iConnections[i]; + DP_SDA("AcquireConnectionL RETURN OLD CONNECTION done"); + } + break; + } + } + if( !connected ) + { + DP_SDA("CPresencePlugin::AcquireConnectionL CREATE NEW CONNECTION"); + // If not already connected + CPresencePluginConnection* connection = CPresencePluginConnection::NewL( + aServiceInfo, aContextClient ); + CleanupStack::PushL( connection ); + + //Add this new connection to connectionArray + CPresenceConnectionInfo* connectionInfo = + CPresenceConnectionInfo::NewL( connection ); + CleanupStack::PushL( connectionInfo ); + iConnectionArray.AppendL( connectionInfo ); + CleanupStack::Pop(); + connection->SetConnectionArray( connectionInfo ); + //Add on binded client + connectionInfo->IncreaseClientCount(); + + iConnections.AppendL( connection ); + CleanupStack::Pop( connection ); + tmp = connection; + DP_SDA("AcquireConnectionL CREATE NEW CONNECTION DONE"); + } + DP_SDA("CPresencePlugin::AcquireConnectionL ret"); + return *tmp; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::ReleaseConnection() +// --------------------------------------------------------------------------- +// +void CPresencePlugin::ReleaseConnection( MXIMPProtocolConnection& aConnection ) + { + DP_SDA("CPresencePlugin::ReleaseConnection"); + TInt connectionsCount = iConnections.Count(); + + DP_SDA2("ReleaseConnection : connectionsCount =%d ", connectionsCount ); + + for ( TInt i=0; i < connectionsCount; i++ ) + { + DP_SDA("CPresencePlugin::ReleaseConnection for start"); + if ( iConnectionArray[i]->GetConnection() == &aConnection ) + { + //Check how many client is using this connection + TInt clientCount = iConnectionArray[i]->ClientCount(); + + DP_SDA2("ReleaseConnection : clientCount = %d ", clientCount ); + DP_SDA2("CPresencePlugin::ReleaseConnection : i = %d", i ); + + if ( connectionsCount == 1 && clientCount <= 0 ) + { + DP_SDA("CPresencePlugin::ReleaseConnection Lets start to check"); + DP_SDA2("CPresencePlugin::ReleaseConnection connect status %d,", iConnections[i]->GetSessionStatus()); + //Check this connection status + if( !(CPresencePluginConnection::ENotActive == + iConnectionArray[i]->GetConnectionStatus() )) + { + DP_SDA("CPresencePlugin::ReleaseConnection not have clients"); + DeleteConnection(i); + break; + } + DP_SDA("connectionsCount == 1 && i == 0 && clientCount == 0 "); + DP_SDA("ReleaseConnection : Don't delete this connection "); + break; //don't delete first connection + } + DP_SDA("CPresencePlugin::ReleaseConnection for end"); + } + } + DP_SDA("CPresencePlugin::ReleaseConnection end"); + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CPresencePlugin::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + return this; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CPresencePlugin::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + DP_SDA("CPresencePlugin::GetInterface"); + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + return const_cast(this); + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePlugin::GetInterfaceId() const + { + return MXIMPProtocolPlugin::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CPresencePlugin::DeleteConnection() +// --------------------------------------------------------------------------- +// +void CPresencePlugin::DeleteConnection( TInt aIndex ) + { + //First delete connectionArray where connection is same at connection + DP_SDA("CPresencePlugin::DeleteConnection"); + + TInt connectionArrayCount = iConnectionArray.Count(); + + for ( TInt i=0; i < connectionArrayCount; i++ ) + { + DP_SDA2("CPresencePlugin::DeleteConnection FINDING, con status %d", iConnectionArray[i]->GetConnectionStatus() ); + if( (iConnections[aIndex] == iConnectionArray[i]->GetConnection()) && + !(CPresencePluginConnection::EActive == + iConnectionArray[i]->GetConnectionStatus() ) ) + { + DP_SDA("CPresencePlugin::DeleteConnection connection Match"); + delete iConnectionArray[i]; + iConnectionArray.Remove( i ); + iConnectionArray.Compress(); + break; + } + } + delete iConnections[aIndex]; + iConnections.Remove( aIndex ); + iConnections.Compress(); + DP_SDA("CPresencePlugin::DeleteConnection end"); + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginauthorization.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginauthorization.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1350 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "presencepluginauthorization.h" +#include "presencepluginwinfo.h" +#include "presenceplugincommon.h" +#include "presencepluginxdmutils.h" +#include "presencepluginwatcher.h" +#include "presenceplugindata.h" +#include "presencepluginutility.h" +#include "presenceplugingroup.h" +#include "presencepluginvirtualgroup.h" +#include "presenceplugincontacts.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::CPresencePluginAuthorization() +// --------------------------------------------------------------------------- +// +CPresencePluginAuthorization::CPresencePluginAuthorization( + MPresencePluginConnectionObs& aObs, + CPresencePluginData* aPresenceData ) + : CActive( CActive::EPriorityStandard ), + iConnObs(aObs), iSubscribed( EFalse ), + iOperation( ENoOperation ), iXdmOk( EFalse ), + iComplete( EFalse ), iPresenceData( aPresenceData ), + iContactIsStored( ETrue ) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginAuthorization* CPresencePluginAuthorization::NewL( + MPresencePluginConnectionObs& aObs, + CPresencePluginData* aPresenceData ) + { + DP_SDA("CPresencePluginAuthorization::NewL "); + CPresencePluginAuthorization* self = + new( ELeave ) CPresencePluginAuthorization( aObs, aPresenceData ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::ConstructL() + { + HBufC* serviceName = + iPresenceData->ServiceNameLC( iPresenceData->ServiceId() ); + iContacts = CPresencePluginContacts::NewL( + iPresenceData->ServiceId(), *serviceName, *this ); + CleanupStack::PopAndDestroy( serviceName ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::~CPresencePluginAuthorization() +// --------------------------------------------------------------------------- +// +CPresencePluginAuthorization::~CPresencePluginAuthorization() + { + delete iPresIdentity; + delete iContacts; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::SetDataHost() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::SetDataHost( + MProtocolPresenceAuthorizationDataHost& aDataHost ) + { + DP_SDA("CPresencePluginAuthorization::SetDataHost "); + iDataHost = &aDataHost; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::WinfoTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::WinfoTerminatedL( TInt aReason ) + { + DP_SDA("CPresencePluginAuthorization::WinfoTerminatedL "); + + if ( iSubscribed ) + { + MXIMPDataSubscriptionState* myState = + iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC(); + myStatus->SetResultCode( aReason ? aReason : KErrCompletion ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + // parameters' OWNERSHIP is taken + iDataHost->SetPresenceGrantRequestDataSubscriptionStateL( + myState, + myStatus ); + + CleanupStack::Pop( /*myStatus*/ ); + CleanupStack::Pop( /*myState*/ ); + } + + DP_SDA("CPresencePluginAuthorization::WinfoTerminatedL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoSubscribePresenceGrantRequestListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoSubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ) + { + DP_SDA("DoSubscribePresenceGrantRequestListL "); + iConnObs.WinfoHandlerL()->SubscribeWinfoListL( aReqId ); + iSubscribed = ETrue; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoUnsubscribePresenceGrantRequestListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoUnsubscribePresenceGrantRequestListL( + TXIMPRequestId aReqId ) + { + DP_SDA("DoUnsubscribePresenceGrantRequestListL "); + iConnObs.WinfoHandlerL()->UnsubscribeWinfoListL( aReqId ); + iSubscribed = EFalse; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoGrantPresenceForPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoGrantPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& /*aPif*/, // notice: pif support + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginAuthorization::DoGrantPresenceForPresentityL "); + + // Workaround for clients that can only grant when accepting buddy request. + // SIMPLE also requires grant + subscribe so do both here even though + // it is agains ximp api definitions. + + _LIT( KDefaultBuddyList, "buddylist" ); + + iAuthState = EStateAcceptBuddyRequest; + MXIMPIdentity* buddyList = iConnObs.ObjectFactory().NewIdentityLC(); + buddyList->SetIdentityL( KDefaultBuddyList() ); + + iConnObs.GroupsL().DoAddPresentityGroupMemberL( *buddyList, aPresentityId, + KNullDesC(), aReqId ); + CleanupStack::PopAndDestroy( 1 ); // buddyList + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoPerformGrantPresenceForPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoPerformGrantPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ) + { + DP_SDA("CPresencePluginAuthorization::DoPerformGrantPresenceForPresentityL"); + StartXdmOperationL( aPresentityId, + EGrantPresenceForPresentity, aClientStatus ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL( + const MXIMPIdentity& /*aPresentityId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + // Notice: later + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginAuth::DoWithdrawPresenceGrantFromPresentityL "); + StartXdmOperationL( aPresentityId, aReqId, EWithdrawFromPresentity ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoPerformWithdrawPresGrantFromPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoPerformWithdrawPresGrantFromPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ) + { + DP_SDA("CPresencePluginAuthorization"); + DP_SDA(" -> DoPerformWithdrawPresGrantFromPresentityL"); + StartXdmOperationL( aPresentityId, + EWithdrawFromPresentity, aClientStatus ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL( + const MXIMPIdentity& /*aGroupId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_SDA("CPresencePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL -not supported"); + + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization:: +// DoUpdatePresenceGrantPifForPresentityGroupMembersL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization:: + DoUpdatePresenceGrantPifForPresentityGroupMembersL( + const MXIMPIdentity& /*aGroupId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_SDA("CPresencePluginAuthorization::DoUpdatePresenceGrantPifForPresentityGroupMembersL -not supported"); + + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization:: +// DoWithdrawPresenceGrantFromPresentityGroupMembersL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization:: + DoWithdrawPresenceGrantFromPresentityGroupMembersL( + const MXIMPIdentity& /*aGroupId*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_SDA("CPresencePluginAuthorization::DoWithdrawPresenceGrantFromPresentityGroupMembersL -not supported"); + + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoGrantPresenceForEveryoneL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoGrantPresenceForEveryoneL( + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_SDA("CPresencePluginAuthorization::DoGrantPresenceForEveryoneL -not supported"); + + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL( + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_SDA("CPresencePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL -not supported"); + + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL( + TXIMPRequestId /*aReqId*/ ) + { + DP_SDA("CPresencePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL -not supported"); + + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoSubscribePresenceBlockListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoSubscribePresenceBlockListL( + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginAuthorization::DoSubscribePresenceBlockListL "); + MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC(); + StartXdmOperationL( *nobody, aReqId, ESubscribeBlockList ); + // Cannot PopAndDestroy by name + CleanupStack::PopAndDestroy( ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoUnsubscribePresenceBlockListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoUnsubscribePresenceBlockListL( + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginAuthorization::DoUnsubscribePresenceBlockListL "); + MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC(); + StartXdmOperationL( *nobody, aReqId, EUnsubscribeBlockList ); + // Cannot PopAndDestroy by name + CleanupStack::PopAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoBlockPresenceForPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoBlockPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginAuthorization::DoBlockPresenceForPresentityL "); + StartXdmOperationL( aPresentityId, aReqId, EBlockPresentity ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoPerformBlockPresenceForPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoPerformBlockPresenceForPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ) + { + DP_SDA( + "CPresencePluginAuthorization::DoPerformBlockPresenceForPresentityL"); + StartXdmOperationL( aPresentityId, EBlockPresentity, aClientStatus ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoCancelPresenceBlockFromPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoCancelPresenceBlockFromPresentityL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { + DP_SDA(" DoCancelPresenceBlockFromPresentityL "); + StartXdmOperationL( aPresentityId, aReqId, EUnblockPresentity ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoPerformCancelPresenceBlockFromPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoPerformCancelPresenceBlockFromPresentityL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aClientStatus ) + { + DP_SDA(" DoPerformCancelPresenceBlockFromPresentityL (list)"); + StartXdmOperationL( aPresentityId, EUnblockPresentity, aClientStatus ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::DoCancel( ) + { + iXdmUtils->Cancel(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::RunL( ) + { + TInt myStatus = iStatus.Int(); + + DP_SDA2( "CPresencePluginAuthorization::RunL mystatus %d ", myStatus ); + DP_SDA2( "CPresencePluginAuthorization::RunL state %d ",iOperation ); + + if ( !iXdmOk && !myStatus ) + { + DP_SDA( "CPresencePluginAuthorization::RunL !iXdmOk && !myStatus" ); + iXdmOk = ETrue; + CallActualXdmOperationL(); + } + else if ( iClientStatus ) + { + DP_SDA( "CPresencePluginAuthorization::RunL - complete client" ); + TRequestStatus* s = iClientStatus; + User::RequestComplete( s, myStatus ); + iClientStatus = NULL; + DP_SDA( "CPresencePluginAuthorization::RunL - complete client ok" ); + } + else if ( !myStatus ) + { + switch ( iAuthState ) + { + case EStateDoBlock: + { + DP_SDA( "CPresencePluginAuthorization::RunL - Block presentity" ); + BlockPresentityL(); + iAuthState = EStateRemovePresentityFromGranted; + } + break; + + case EStateRemovePresentityFromGranted: + { + DP_SDA( "CPresencePluginAuthorization::RunL - Remove presentity from granted" ); + WithdrawFromPresentityL(); + iAuthState = EStateBlocked; + } + break; + + case EStateBlocked: + { + DP_SDA( "CPresencePluginAuthorization::RunL - Blocked" ); + SetPresentityBlockedToXIMPL(); + iAuthState = EStateIdle; + CompleteXIMPReq( myStatus ); + } + break; + + case EStateIsContactBlockedBuddyRequest: + { + DP_SDA( "CPresencePluginAuthorization::RunL - Resolve contact type" ); + // resolve is contact blocked friend request + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity ); + IsBlockedContactFriendRequestL( *withoutPrefix, *this, iStatus ); + CleanupStack::PopAndDestroy( withoutPrefix ); + SetActive(); + iAuthState = EStateDoUnBlock; + } + break; + + case EStateDoUnBlock: + { + if ( iContactIsStored ) + { + DP_SDA( "CPresencePluginAuthorization::RunL - Grant presence for presentity" ); + GrantPresenceForPresentityL(); + iAuthState = EStatePresenceGranted; + } + else + { + DP_SDA( "CPresencePluginAuthorization::RunL - Complete unblock" ); + iAuthState = EStateIdle; + CompleteXIMPReq( myStatus ); + } + } + break; + + case EStatePresenceGranted: + { + DP_SDA( "CPresencePluginAuthorization::RunL -Subscribe presentity presence" ); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + identity->SetIdentityL( iPresIdentity->Des() ); + iConnObs.WatcherHandlerL()->DoPerformSubscribePresentityPresenceL( *identity, iStatus ); + CleanupStack::PopAndDestroy( ); //identity + iAuthState = EStateSubscribe; + SetActive(); + } + break; + + case EStateSubscribe: + { + DP_SDA( "CPresencePluginAuthorization::RunL -UnBlock completed" ); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity ); + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + KInvisibleState(), + KNullDesC() ); + CleanupStack::PopAndDestroy( withoutPrefix ); + iAuthState = EStateIdle; + CompleteXIMPReq( myStatus ); + } + break; + + default: + { + DP_SDA( "CPresencePluginAuthorization::RunL - default case" ); + CompleteXIMPReq( myStatus ); + } + break; + } + } + else if ( KErrNotFound == myStatus && EStateDoBlock == iAuthState ) + { + // When blocking friend request, watcher was not found but request + // has to be blocked anyways. + DP_SDA( "CPresencePluginAuthorization::RunL - Block presentity" ); + BlockPresentityL(); + iAuthState = EStateBlocked; + } + else + { + DP_SDA( "CPresencePluginAuthorization::RunL -error" ); + CompleteXIMPReq( myStatus ); + } + + if ( EStateAcceptBuddyRequest == iAuthState && EGrantPresenceForPresentity == iOperation ) + { + iAuthState = EStateIdle; + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity ); + CallHandlePresenceGrantRequestObsoletedL( *withoutPrefix ); + iConnObs.SubscribedContacts()->HandlePresentityGroupMemberAddedL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + } + + DP_SDA( "CPresencePluginAuthorization::RunL - exit" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::CallActualXdmOperationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::CallActualXdmOperationL() + { + DP_SDA("CPresencePluginAuthorization::CallActualXdmOperationL "); + DP_SDA2("CallActualXdmOperationL operation %d", iOperation ); + iComplete = EFalse; + switch ( iOperation ) + { + case EGrantPresenceForPresentity: + { + DP_SDA("CallActualXdmOperationL EGrantPresenceForPresentity"); + GrantPresenceForPresentityL(); + } + break; + + case EWithdrawFromPresentity: + { + DP_SDA("CallActualXdmOperationL EWithdrawFromPresentity"); + WithdrawFromPresentityL(); + } + break; + + case ESubscribeBlockList: + { + SubscribeBlockListL( ); + } + break; + + case EUnsubscribeBlockList: + { + UnSubscribeBlockListL(); + } + break; + + case EBlockPresentity: + { + DP_SDA( "CallActualXdmOperationL EBlockPresentity" ); + + TRAPD( error, UnsubscribePresentityPresenceL() ); + + if( error ) + { + DP_SDA2( "Unsubscribe presentity FAIL, error = %d" , error ); + + if ( KErrNotFound != error ) + { + User::Leave( error ); + } + BlockPresentityL(); + iAuthState = EStateBlocked; + } + else + { + iAuthState = EStateDoBlock; + } + } + break; + + case EUnblockPresentity: + { + DP_SDA("CallActualXdmOperationL EUnblockPresentity"); + UnblockPresentityL(); + } + break; + + default: + User::Leave( KErrNotSupported ); + break; + } + DP_SDA("CPresencePluginAuthorization::CallActualXdmOperationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::RunError() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginAuthorization::RunError( TInt aError ) + { + // complete the open request + CompleteXIMPReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CPresencePluginAuthorization::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + return this; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::GetInterface() const +// --------------------------------------------------------------------------- +// +const TAny* CPresencePluginAuthorization::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + return const_cast(this); + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginAuthorization::GetInterfaceId() const + { + return MProtocolPresenceAuthorization::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::SetPresIdentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::SetPresIdentityL( + const MXIMPIdentity& aPresentityId, + TBool aFormatUri ) + { + DP_SDA2("CPresencePluginAuthorization::SetPresIdentityL: %S", + &aPresentityId.Identity() ); + + delete iPresIdentity; + iPresIdentity = NULL; + + if ( aFormatUri ) + { + DP_SDA("CPresencePluginAuthorization::SetPresIdentityL, add prefix"); + + HBufC8* identityCopy = HBufC8::NewLC( KBufSize255 ); + TPtr8 identityCopyPtr( identityCopy->Des() ); + identityCopyPtr.Copy( aPresentityId.Identity() ); + + HBufC8* prefixUri = iPresenceData->CreatePresenceUri8LC( + identityCopyPtr ); + + HBufC* prefixUri16 = HBufC::NewLC( KBufSize255 ); + TPtr prefixUri16Ptr( prefixUri16->Des() ); + prefixUri16Ptr.Copy( *prefixUri ); + + iPresIdentity = prefixUri16; + CleanupStack::Pop( prefixUri16 ); + CleanupStack::PopAndDestroy( prefixUri ); + CleanupStack::PopAndDestroy( identityCopy ); + } + else + { + DP_SDA(" SetPresIdentityL, use as it is"); + iPresIdentity = aPresentityId.Identity().AllocL(); + } + DP_SDA( "CPresencePluginAuthorization::SetPresIdentityL -exit" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::WinfoNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::WinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + DP_SDA("CPresencePluginAuthorization::WinfoNotificationL"); + // Ignore notification if not subscribed + using namespace NPresencePlugin::NPresence; + + RPointerArray elems; + CleanupClosePushL( elems ); + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + DP_SDA2("CPresencePluginAuthorization::WinfoNotificationL count %d", + count); + + if ( !count ) + { + // stop parsing empty notification + DP_SDA("CPresencePluginAuthorization::WinfoNotificationL LEAVE"); + User::Leave( KErrArgument ); + } + + const TDesC8* stateVal = aWinfo.AttrValue( KPresenceState8 ); + if ( stateVal && !stateVal->CompareF( KPresenceFull8 )) + { + // Call full list method + DP_SDA("CPresencePluginAuthorization::WinfoNotificationL FULL winfo"); + HandleFullWinfoNotificationL( aWinfo ); + } + else + { + // Indicate changes in WINFO list one by one. + DP_SDA("CPresencePluginAuthorization::WinfoNotificationLPARTIAL winfo"); + HandlePartialWinfoNotificationL( aWinfo ); + } + CleanupStack::PopAndDestroy( &elems ); + DP_SDA("CPresencePluginAuthorization::WinfoNotificationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::StartXdmOperationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginAuthOperation aOperation ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrNotReady ) ); + DP_SDA("CPresencePluginAuthorization::StartXdmOperationL 2"); + SetPresIdentityL( aId, ETrue ); + + iXIMPId = aReqId; + iOperation = aOperation; + if ( !iXdmUtils ) + { + DP_SDA("StartXdmOperationL !iXdmUtils"); + iXdmUtils = iConnObs.XdmUtilsL(); + } + if ( iXdmUtils->CheckXdmDoc() ) + { + DP_SDA("StartXdmOperationL iXdmOk"); + iXdmOk = ETrue; + CallActualXdmOperationL(); + } + else + { + DP_SDA("StartXdmOperationL else"); + iXdmUtils->InitializeXdmL( iStatus ); + SetActive(); + } + DP_SDA("CPresencePluginAuthorization::StartXdmOperationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::StartXdmOperationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::StartXdmOperationL( + const MXIMPIdentity& aId, + TPluginAuthOperation aOperation, + TRequestStatus& aClientStatus ) + { + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrNotReady ) ); + DP_SDA("CPresencePluginAuthorization::StartXdmOperationL 3 (list)"); + + SetPresIdentityL( aId, EFalse ); + + iClientStatus = &aClientStatus; + *iClientStatus = KRequestPending; + + iOperation = aOperation; + + if ( !iXdmUtils ) + { + DP_SDA("StartXdmOperationL !iXdmUtils"); + iXdmUtils = iConnObs.XdmUtilsL(); + } + if ( iXdmUtils->CheckXdmDoc() ) + { + DP_SDA("StartXdmOperationL iXdmOk"); + iXdmOk = ETrue; + CallActualXdmOperationL(); + } + else + { + DP_SDA("StartXdmOperationL else"); + iXdmUtils->InitializeXdmL( iStatus ); + SetActive(); + } + DP_SDA("CPresencePluginAuthorization::StartXdmOperationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::CompleteXIMPReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::CompleteXIMPReq( TInt aStatus ) + { + DP_SDA("CPresencePluginAuthorization::CompleteXIMPReq"); + iOperation = ENoOperation; + iConnObs.CompleteReq( iXIMPId, aStatus ); + iXIMPId = TXIMPRequestId(); + DP_SDA("CPresencePluginAuthorization::CompleteXIMPReq end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::SubscribeBlockListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::SubscribeBlockListL() + { + DP_SDA("CPresencePluginAuthorization::SubscribeBlockList"); + + RPointerArray blocked; + CleanupStack::PushL( TCleanupItem( + TPresencePluginUtility::ResetAndDestroyIdentities, + &blocked ) ); + + iXdmUtils->SubscribeBlockListL( blocked ); + MXIMPObjectCollection* coll = + iConnObs.ObjectFactory().NewObjectCollectionLC(); // << coll + + TInt count = blocked.Count(); + for ( TInt i = 0; i < count; i++ ) + { + MXIMPIdentity* currId = blocked[i]; + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( currId->Identity() ); + currId->SetIdentityL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + MPresenceBlockInfo* bInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceBlockInfoLC(); + bInfo->SetBlockedEntityIdL( currId ); // ownership is taken + blocked.Remove( i ); // remove currId from blocked + blocked.InsertL( NULL, i ); + bInfo->SetBlockedEntityDisplayNameL( currId->Identity() ); + coll->AddObjectL( bInfo );// ownership is taken + CleanupStack::Pop();// >> bInfo + } + + DP_SDA("SubscribeBlockList complete request"); + CompleteXIMPReq( KErrNone ); + + MXIMPDataSubscriptionState* myState = + iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + + MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC(); + + // Notice: consider XIMP error codes + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + iDataHost->SetPresenceBlockDataSubscriptionStateL( + myState, myStatus ); + + iDataHost->HandlePresenceBlockListL( coll ); + //Callback for subscription result + CleanupStack::Pop( 3 ); // >> myState, myStatus, coll + CleanupStack::PopAndDestroy( &blocked ); + DP_SDA("CPresencePluginAuthorization::SubscribeBlockList end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::UnSubscribeBlockListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::UnSubscribeBlockListL() + { + DP_SDA("CPresencePluginAuthorization::UnSubscribeBlockListL"); + + MXIMPObjectCollection* coll = + iConnObs.ObjectFactory().NewObjectCollectionLC(); + + MXIMPDataSubscriptionState* myState = + iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + + MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC(); + + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + iDataHost->SetPresenceBlockDataSubscriptionStateL( + myState, myStatus ); + + iDataHost->HandlePresenceBlockListL( coll ); + + CleanupStack::Pop( 3 ); + + CompleteXIMPReq( KErrNone ); + + DP_SDA("CPresencePluginAuthorization::UnSubscribeBlockListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::ReturnListSubsState() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginAuthorization::ReturnListSubsState() + { + return iSubscribed; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::PluginData() +// --------------------------------------------------------------------------- +// +CPresencePluginData& CPresencePluginAuthorization::PluginData() + { + return *iPresenceData; + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::HandleFullWinfoNotificationL +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::HandleFullWinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + using namespace NPresencePlugin::NPresence; + + RPointerArray elems; + CleanupClosePushL( elems ); + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + MSimpleElement* elem = elems[0]; + TPtrC8 p8 = elem->LocalName(); + err = p8.CompareF( KPresenceWatcherList8 ); //watcher-list + DP_SDA2("HandleFullWinfoNotificationL leave if watcherlist error %d", err); + User::LeaveIfError( err ); + + err = elem->SimpleElementsL( elems ); + DP_SDA2("HandleFullWinfoNotificationL error %d", err); + User::LeaveIfError( err ); + + count = elems.Count(); + DP_SDA("HandleFullWinfoNotificationL watcher list is valid"); + + // Search watchers who are pending (status = pending) + HBufC* nodeContent = NULL; + MXIMPObjectCollection *pendings = + iConnObs.ObjectFactory().NewObjectCollectionLC(); + + TBool pendingFound(EFalse); + + for ( TInt i = 0; i < count; i++ ) + { + elem = elems[i]; + p8.Set( elem->LocalName()); + if (!( p8.CompareF( KPresenceWatcher8 ))) + { + const TDesC8* pp8 = elem->AttrValue( KPresenceStatus8 ); + if ( pp8 && !pp8->CompareF( KPresencePending8 )) + { + DP_SDA("HandleFullWinfoNotificationL least one pending"); + // Build collection of grant requests + // Find the child node containing the SIP entity + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + // create the collection entry here + MPresenceGrantRequestInfo* grInfo = + iConnObs.PresenceObjectFactoryOwn(). + NewPresenceGrantRequestInfoLC(); + MXIMPIdentity* identity = + iConnObs.ObjectFactory().NewIdentityLC(); + + // Remove prefix to keep client side protocol agnostic + HBufC16* withoutPrefix = iPresenceData->RemovePrefixLC( + *nodeContent ); + identity->SetIdentityL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + + grInfo->SetRequestorIdL( identity ); // ownership is taken + + pendings->AddObjectL( grInfo ); // ownership is taken + pendingFound = ETrue; + CleanupStack::Pop( 2 ); //grInfo, identity + CleanupStack::PopAndDestroy( nodeContent ); + } + } + } + + if ( pendingFound ) + { + DP_SDA("HandleFullWinfoNotificationL send pending"); + iXIMPIdOwn = iDataHost->HandlePresenceGrantRequestListL( pendings ); + CleanupStack::Pop(); // >> pendings + } + else + { + DP_SDA("HandleFullWinfoNotificationL pop pending"); + CleanupStack::PopAndDestroy( ); // >> pendings + } + + CleanupStack::PopAndDestroy( &elems ); + DP_SDA("CPresencePluginAuthorization::HandleFullWinfoNotificationL END"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::HandlePartialWinfoNotificationL +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::HandlePartialWinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + DP_SDA("CPresencePluginAuthorization::HandlePartialWinfoNotificationL"); + using namespace NPresencePlugin::NPresence; + + RPointerArray elems; + CleanupClosePushL( elems ); + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + MSimpleElement* elem = elems[0]; + TPtrC8 p8 = elem->LocalName(); + err = p8.CompareF( KPresenceWatcherList8 ); + User::LeaveIfError( err ); + + err = elem->SimpleElementsL( elems ); + User::LeaveIfError( err ); + count = elems.Count(); + + HBufC* nodeContent = NULL; + + for ( TInt i = 0; i < count; i++ ) + { + elem = elems[i]; + p8.Set( elem->LocalName()); + if (!( p8.CompareF( KPresenceWatcher8 ))) + { + const TDesC8* pp8 = elem->AttrValue( KPresenceStatus8 ); + if ( pp8 && !pp8->CompareF( KPresencePending8 )) + { + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + + // Remove prefix to keep client side protocol agnostic + HBufC16* withoutPrefix = iPresenceData->RemovePrefixLC( + *nodeContent ); + CallHandlePresenceGrantRequestReceivedL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( nodeContent ); + } + else if ( pp8 && !pp8->CompareF( KPresenceTerminated8 )) + { + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + + // Remove prefix to keep client side protocol agnostic + HBufC16* withoutPrefix = iPresenceData->RemovePrefixLC( + *nodeContent ); + CallHandlePresenceGrantRequestObsoletedL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( nodeContent ); + } + else if ( pp8 && !pp8->CompareF( KPresenceActive8 )) + { + DP_SDA( "CPresencePluginAuthorization::HandlePartialWinfoNotificationL presence active" ); + + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + TInt pos( 0 ); + if ( iConnObs.SubscribedContacts()-> + GetVirtualIdentityArray()->Find( *nodeContent, pos ) == 0 ) + { + HBufC8* buffer = HBufC8::NewLC( nodeContent->Length() ); + buffer->Des().Copy( *nodeContent ); + if ( !iConnObs.WatcherHandlerL()->MatchWatcherId( *buffer ) ) + { + DP_SDA( "CPresencePluginAuthorization::HandlePartialWinfoNotificationL -subscribe presence" ); + iConnObs.WatcherHandlerL()->SubscribeL( *nodeContent ); + } + CleanupStack::PopAndDestroy( buffer ); + } + CleanupStack::PopAndDestroy( nodeContent ); + } + } + } + CleanupStack::PopAndDestroy( &elems ); + DP_SDA("CPresencePluginAuthorization::HandlePartialWinfoNotificationL END"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::CallHandlePresenceGrantRequestReceivedL +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::CallHandlePresenceGrantRequestReceivedL( + const TDesC& aUserId ) + { + DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestReceivedL"); + // create the collection entry here + MPresenceGrantRequestInfo* grInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceGrantRequestInfoLC(); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + identity->SetIdentityL( aUserId ); + grInfo->SetRequestorIdL( identity ); // ownership is taken + CleanupStack::Pop( ); // -identity + + iDataHost->HandlePresenceGrantRequestReceivedL( grInfo );//ownership taken + CleanupStack::Pop( ); // -grInfo + DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestReceivedL END"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL( + const TDesC& aUserId ) + { + DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestObsoletedL"); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + identity->SetIdentityL( aUserId ); + iDataHost->HandlePresenceGrantRequestObsoletedL( identity );//taken + CleanupStack::Pop( );// >> identity + DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestObsoletedL END"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::GrantPresenceForPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::GrantPresenceForPresentityL() + { + iXdmUtils->AddEntityToGrantedL( + iPresIdentity->Des(), iStatus ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::WithdrawFromPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::WithdrawFromPresentityL() + { + iXdmUtils->RemoveEntityFromGrantedL( + iPresIdentity->Des(),iStatus ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::UnsubscribePresentityPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::UnsubscribePresentityPresenceL() + { + DP_SDA( "CPresencePluginAuthorization::UnsubscribePresentityPresence" ); + + MXIMPIdentity* identity = + iConnObs.ObjectFactory().NewIdentityLC(); + identity->SetIdentityL( iPresIdentity->Des() ); + iConnObs.WatcherHandlerL()-> + DoPerformUnsubscribePresentityPresenceL( *identity, iStatus ); + CleanupStack::PopAndDestroy(); // identity + SetActive(); + + DP_SDA( "CPresencePluginAuthorization::UnsubscribePresentityPresence -Exit" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::BlockPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::BlockPresentityL() + { + DP_SDA( "CPresencePluginAuthorization::BlockPresentityL" ); + // add entity to block list + iXdmUtils->AddEntityToBlockedL( + iPresIdentity->Des(), iStatus ); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::BlockPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::SetPresentityBlockedToXIMPL() + { + DP_SDA( "CPresencePluginAuthorization::SetPresentityBlockedToXIMPL" ); + + MPresenceBlockInfo* bInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceBlockInfoLC(); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity ); + identity->SetIdentityL( *withoutPrefix ); + bInfo->SetBlockedEntityIdL( identity ); // ownership is taken + // Write blocked state into the presence cache + TBuf<20> buf; + buf.Copy( KBlockedExtensionValue ); + iPresenceData->WriteStatusToCacheL( + *withoutPrefix, + MPresenceBuddyInfo2::EUnknownAvailability, + buf, + KNullDesC() ); + CleanupStack::PopAndDestroy( withoutPrefix ); + iDataHost->HandlePresenceBlockedL( bInfo ); + CleanupStack::Pop();// >> identity + CleanupStack::Pop();// >> bInfo + + DP_SDA( "CPresencePluginAuthorization::SetPresentityBlockedToXIMPL -Exit" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::UnblockPresentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::UnblockPresentityL() + { + DP_SDA( "CPresencePluginAuthorization::UnblockPresentityL" ); + + //remove entity from blocked list + iXdmUtils->RemoveEntityFromBlockedL( + iPresIdentity->Des(), iStatus ); + //remove enity from ximp blocked too + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity ); + identity->SetIdentityL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + iDataHost->HandlePresenceBlockCanceledL( identity ); + CleanupStack::Pop();// >> identity + iAuthState = EStateIsContactBlockedBuddyRequest; + SetActive(); + + DP_SDA( "CPresencePluginAuthorization::UnblockPresentityL -Exit" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginAuthorization::IsBlockedContactFriendRequest() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::IsBlockedContactFriendRequestL( + const TDesC& aPresenceId, + MPresencePluginContactsObs& aObserver, + TRequestStatus& aStatus ) + { + DP_SDA( "CPresencePluginAuthorization::IsBlockedContactFriendRequest" ); + + delete iContacts; + iContacts = NULL; + + HBufC* serviceName = + iPresenceData->ServiceNameLC( iPresenceData->ServiceId() ); + + iContacts = CPresencePluginContacts::NewL( + iPresenceData->ServiceId(), *serviceName, aObserver ); + + CleanupStack::PopAndDestroy( serviceName ); + + iContacts->IsPresenceIdStoredL( aPresenceId, aStatus ); + + DP_SDA( "CPresencePluginAuthorization::IsBlockedContactFriendRequest -exit" ); + } + + +// --------------------------------------------------------------------------- +// From base class MPresencePluginContactsObs +// CPresencePluginAuthorization::RequestComplete() +// --------------------------------------------------------------------------- +// +void CPresencePluginAuthorization::RequestComplete( TAny* aResult, + TPresenceContactsOperation aOperation, TInt aError ) + { + DP_SDA( "CPresencePluginAuthorization::RequestComplete" ); + + switch( aOperation ) + { + case EOperationIsPresenceStoredToContacts: + if ( aResult != NULL && KErrNone == aError ) + { + iContactIsStored = *static_cast( aResult ); + } + break; + default: + break; + } + DP_SDA2( "CPresencePluginAuthorization::RequestComplete - iContactIsStored = %d", iContactIsStored ); + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginconnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginconnection.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,981 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include //for etc. KPublish +#include //Part of Registration API from SIMPLE engine +#include //Connection callback methods +#include + +#include "presencepluginconnection.h" +#include "presencepluginsession.h" +#include "mpresencepluginconnectionobs.h" +#include "presencepluginwatcher.h" +#include "presencepluginauthorization.h" +#include "presencepluginwinfo.h" +#include "presencepluginpublisher.h" +#include "presenceplugingroup.h" +#include "presencepluginxdmutils.h" +#include "presencepluginvirtualgroup.h" +#include "presenceconnectioninfo.h" +#include "presenceplugindata.h" + +#include "simpleimpluginuids.hrh" //KImplUidSimpleImPlugin + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::CPresencePluginConnection() +// --------------------------------------------------------------------------- +// +CPresencePluginConnection::CPresencePluginConnection( ): + CActive( CActive::EPriorityHigh ), iSipPresentity(NULL), + iStopPublishState( EFalse ), iGrantListSubs( EFalse ), iStopPublishCall( EFalse ), + iTerminatedCall( EFalse ) + { + DP_SDA("CPresencePluginConnection::CPresencePluginConnection"); + CActiveScheduler::Add(this); + iOwnTupleId = 0; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginConnection* CPresencePluginConnection::NewL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aClientCtxInfo ) + { + DP_SDA("CPresencePluginConnection::NewL"); + CPresencePluginConnection* self = + new( ELeave ) CPresencePluginConnection( ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceInfo, aClientCtxInfo ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::NewL() loaded +// --------------------------------------------------------------------------- +// +CPresencePluginConnection* CPresencePluginConnection::NewL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& aClientCtxInfo, + const TDesC8& aETag ) + { + DP_SDA("CPresencePluginConnection::NewL loaded"); + CPresencePluginConnection* self = + new( ELeave ) CPresencePluginConnection( ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceInfo, aClientCtxInfo, aETag ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::ConstructL() loaded +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::ConstructL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& /*aClientCtxInfo*/, + const TDesC8& aETag ) + { + DP_SDA("CPresencePluginConnection::ConstructL loaded"); + + iETag = aETag.AllocL(); + + iSession = CPresencePluginSession::NewL( aServiceInfo, *this ); + + // create instance from data class + iPresenceData = CPresencePluginData::NewL( *this, + aServiceInfo.IapId() ); + + DP_SDA("ConstructL create subscribed buddy list loaded "); + // create another virtual group for all subscribed buddyes + iSubscribedBuddys = + CPresencePluginVirtualGroup::NewL( *this, + KPresenceBuddyList(), + iPresenceData ); + + iAuth = CPresencePluginAuthorization::NewL( *this, iPresenceData ); + + iPublisher = CPresencePluginPublisher::NewL( + *this, + *iSession->SimpleConnection(), + iPresenceData ); + + iWatcher = CPresencePluginWatcher::NewL( + *this, + *iSession->SimpleConnection(), + iPresenceData ); + + iGroups = CPresencePluginGroups::NewL( + *this, iSubscribedBuddys, iPresenceData ); + + iPluginWinfo = CPresencePluginWinfo::NewL( + *this, *(iSession->SimpleConnection() )); + + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::ConstructL( + const MXIMPServiceInfo& aServiceInfo, + const MXIMPContextClientInfo& /*aClientCtxInfo*/ ) + { + DP_SDA("CPresencePluginConnection::ConstructL"); + + iETag = KNullDesC8().AllocL(); + + iSession = CPresencePluginSession::NewL( aServiceInfo, *this ); + + // create instance from data class + iPresenceData = CPresencePluginData::NewL( *this, + aServiceInfo.IapId() ); + + DP_SDA("ConstructL create subscribed buddy list"); + // create another virtual group for all subscribed buddyes + iSubscribedBuddys = + CPresencePluginVirtualGroup::NewL( + *this, KPresenceBuddyList(), iPresenceData ); + + iAuth = CPresencePluginAuthorization::NewL( *this, iPresenceData ); + + iPublisher = CPresencePluginPublisher::NewL( + *this, + *iSession->SimpleConnection(), + iPresenceData ); + + iWatcher = CPresencePluginWatcher::NewL( + *this, + *iSession->SimpleConnection(), + iPresenceData ); + + iGroups = CPresencePluginGroups::NewL( + *this, iSubscribedBuddys, iPresenceData ); + + iPluginWinfo = CPresencePluginWinfo::NewL( + *this, *(iSession->SimpleConnection() )); + + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::~CPresencePluginConnection() +// --------------------------------------------------------------------------- +// +CPresencePluginConnection::~CPresencePluginConnection() + { + DP_SDA("CPresencePluginConnection::~CPresencePluginConnection"); + + Cancel(); + + delete iSipPresentity; + iSipPresentity = NULL; + + delete iPluginWinfo; + iPluginWinfo = NULL; + + delete iWatcher; + iWatcher = NULL; + + delete iPublisher; + iPublisher = NULL; + + delete iAuth; + iAuth = NULL; + + delete iGroups; + iGroups = NULL; + + delete iSession; + iSession = NULL; + + delete iImFeatures; + + REComSession::FinalClose(); + + delete iSubscribedBuddys; + delete iPresenceData; + + delete iETag; + iETag = NULL; + DP_SDA("CPresencePluginConnection::~CPresencePluginConnection end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::PrimeHost +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::PrimeHost( + MXIMPProtocolConnectionHost& aHost ) + { + DP_SDA("CPresencePluginConnection::PrimeHost"); + iConnectionHost = &aHost; + iAuth->SetDataHost( + iConnectionHost->ProtocolPresenceDataHost().AuthorizationDataHost() ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetOnlineBuddyGroup() +// --------------------------------------------------------------------------- +// +CPresencePluginVirtualGroup* CPresencePluginConnection::SubscribedContacts( ) + { + return iSubscribedBuddys; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetSessionStatus() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginConnection::GetSessionStatus( ) + { + return iSession->ConnectionStatus(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::TupleIdGet() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginConnection::GetTupleId() const + { + DP_SDA("CPresencePluginConnection::TupleIdGet"); + return iOwnTupleId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetEtag() +// --------------------------------------------------------------------------- +// +const TDesC8& CPresencePluginConnection::GetETag() const + { + DP_SDA("CPresencePluginConnection::GetETag"); + + if( !iETag ) + { + DP_SDA2("CPresencePluginConnection::GetETag empty ??? %S", iConnectionArray->GetConnectionEtag() ); + return KNullDesC8(); + } + + return *iETag; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::SetETag() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::SetETag( const TDesC8& aETag ) + { + DP_SDA("CPresencePluginConnection::SetETag"); + delete iETag; + iETag = NULL; + + TRAP_IGNORE( ( iETag = aETag.AllocL() ) ); + //Add etag also in connectionArray + iConnectionArray->SetConnectionETag( *iETag ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::SetConnectionArray() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::SetConnectionArray( + CPresenceConnectionInfo* aArray ) + { + DP_SDA("CPresencePluginConnection::SetConnectionArray"); + iConnectionArray = aArray; + iConnectionArray->SetConnectionStatus( EActive ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetConnectionArray() +// --------------------------------------------------------------------------- +// +CPresenceConnectionInfo* CPresencePluginConnection::GetConnectionArray( ) + { + DP_SDA("CPresencePluginConnection::GetConnectionArray"); + return iConnectionArray; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::TupleIdGet() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginConnection::GetPresenceSetId() const + { + DP_SDA("CPresencePluginConnection::GetPresenceSetId"); + return iSession->GetPresenceSetId(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::TupleIdGet() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::SetTupleId( const TInt aTupleId ) + { + DP_SDA("CPresencePluginConnection::TupleIdSet"); + iOwnTupleId = aTupleId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetStopPublishState() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginConnection::GetStopPublishState() + { + DP_SDA2("::GetStopPublishState = %d", (TInt)iStopPublishState ); + return iStopPublishState; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::SetStopPublishState() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::SetStopPublishState( TBool aState ) + { + DP_SDA2("SetStopPublishState : aState = %d ", (TInt)aState ); + iStopPublishState = aState; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::PresenceWatching +// --------------------------------------------------------------------------- +// +MProtocolPresenceDataHost& CPresencePluginConnection::ProtocolPresenceHost() + { + DP_SDA("CPresencePluginConnection::ProtocolPresenceHost"); + return iConnectionHost->ProtocolPresenceDataHost(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::PresenceWatching +// --------------------------------------------------------------------------- +// +MProtocolPresenceWatching& CPresencePluginConnection::PresenceWatching() + { + DP_SDA("CPresencePluginConnection::PresenceWatching"); + return *iWatcher; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::PresencePublishing +// --------------------------------------------------------------------------- +// + MProtocolPresencePublishing& CPresencePluginConnection::PresencePublishing() + { + return *iPublisher; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::PresentityGroups +// --------------------------------------------------------------------------- +// +MProtocolPresentityGroups& CPresencePluginConnection::PresentityGroups() + { + return *iGroups; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::PresenceAuthorization +// --------------------------------------------------------------------------- +// +MProtocolPresenceAuthorization& + CPresencePluginConnection::PresenceAuthorization() + { + DP_SDA2("CPresencePluginConnection::PresenceAuthorization %x", iAuth); + return *iAuth; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::InternalPresenceAuthorization +// --------------------------------------------------------------------------- +// +CPresencePluginAuthorization& + CPresencePluginConnection::InternalPresenceAuthorization() + { + DP_SDA2("CPresencePluginConnection::InternalPresenceAuthorization %x", iAuth); + return *iAuth; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::OpenSessionL +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::OpenSessionL( + const MXIMPContextClientInfo& /*aClientCtxInfo*/, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginConnection::OpenSessionL"); + iGrantListSubs = ETrue; + iTerminatedCall = EFalse; + iXIMPId = aReqId; + iSession->OpenSessionL(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::OpenSessionL +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::OpenSessionL( const TInt& /*aSettingsId*/, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginConnection::OpenSessionL 2 "); + iXIMPId = aReqId; + iGrantListSubs = ETrue; + iTerminatedCall = EFalse; + iSession->OpenSessionL( ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::CloseSession +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::CloseSession( + const MXIMPContextClientInfo& /*aContextClient*/, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginConnection::CloseSession begin"); + + TBool completeXimpRequestNow( EFalse ); + iConnectionArray->DecreaseClientCount(); + iXIMPId = aReqId; + + // Client count can´t be negative. Increase if goes negative. + // This happens for example in network lost case. + // This method is called then because connection is terminated and + // for all clients which have done unbind. But here we cannot tell + // if this method is called by clients unbind or connection termination + // therefore this workaround needed. + if ( iConnectionArray->ClientCount() < 0 ) + { + completeXimpRequestNow = ETrue; + iConnectionArray->IncreaseClientCount(); + } + + // In case there is no more clients we cannot complete Ximp request + // right away. We have to stop publish first, Ximp request completion is + // handled in RunL after that is done. + if( KErrNone == iConnectionArray->ClientCount() && + (EActive == iConnectionArray->GetConnectionStatus()) ) + { + completeXimpRequestNow = EFalse; // request is completed later in RunL + iGrantListSubs = EFalse; + + //Start stopPublish request + DeRegister(); + } + + if ( !iStopPublishCall ) + { + completeXimpRequestNow = ETrue; + } + + if ( completeXimpRequestNow ) + { + CompleteReq( iXIMPId, KErrNone ); + } + + DP_SDA("CPresencePluginConnection::CloseSession end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetSupportedFeaturesL +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::GetSupportedFeaturesL( + CDesC8Array& aFeatures ) const + { + DP_SDA("CPresencePluginConnection::GetSupportedFeaturesL"); + // first empty the whole array + aFeatures.Reset(); + using namespace NXIMPFeature::Presence; + aFeatures.AppendL( KPublish ); + aFeatures.AppendL( KSubscribe ); + aFeatures.AppendL( KUnsubscribe ); + aFeatures.AppendL( KAddContact ); + aFeatures.AppendL( KDeleteContact ); + aFeatures.AppendL( KFetch ); + aFeatures.AppendL( KBlock ); + aFeatures.AppendL( KUnBlock ); + + if( iImFeatures ) + { + using namespace NXIMPFeature::InstantMessage; + aFeatures.AppendL( KInstantMessage ); + } + } + +//***************************************************************************** +//* FROM MPresencePluginConnectionObs +//***************************************************************************** +// --------------------------------------------------------------------------- +// CPresencePluginConnection::CompleteReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::CompleteReq( TReqType aType, TInt aStatus ) + { + DP_SDA("CPresencePluginConnection::CompleteReq"); + // Return immediately if PrimeHost() is not called. + if ( !iConnectionHost ) + { + DP_SDA("CPresencePluginConnection::CompleteReq !iConnectionHost"); + iXIMPId = TXIMPRequestId(); + return; + } + + switch ( aType ) + { + case EOpenSess: + { + DP_SDA("CPresencePluginConnection::CompleteReq EOpenSess"); + iConnectionHost->HandleRequestCompleted( iXIMPId, aStatus ); + iXIMPId = TXIMPRequestId(); + //Set connection status to connection Array + iConnectionArray->SetConnectionStatus( EActive ); + } + break; + case ECloseSess: + { + DP_SDA("CPresencePluginConnection::CompleteReq ECloseSess"); + iConnectionArray->DecreaseClientCount(); + CompleteReq( iXIMPId, aStatus ); + iConnectionArray->SetConnectionStatus( ENotActive ); + } + break; + default: + DP_SDA("CPresencePluginConnection::CompleteReq DEFAULT"); + break; + }; + DP_SDA("CPresencePluginConnection::CompleteReq end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::CompleteReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::CompleteReq( + TXIMPRequestId aReqId, + TInt aStatus ) + { + DP_SDA2("CPresencePluginConnection::CompleteReq status %d", aStatus); + // Return immediately if PrimeHost() is not called. + if ( !iConnectionHost ) + { + DP_SDA("CPresencePluginConnection::CompleteReq return"); + return; + } + DP_SDA("CPresencePluginConnection::CompleteReq complete"); + iConnectionHost->HandleRequestCompleted( aReqId, aStatus ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::ObjectFactory() +// --------------------------------------------------------------------------- +// +MXIMPObjectFactory& CPresencePluginConnection::ObjectFactory() + { + DP_SDA("CPresencePluginConnection::ObjectFactory"); + return iConnectionHost->ObjectFactory(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::Host +// --------------------------------------------------------------------------- +// +MXIMPProtocolConnectionHost* CPresencePluginConnection::Host() + { + DP_SDA("CPresencePluginConnection::Host"); + return iConnectionHost; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection:CurrentDomain +// --------------------------------------------------------------------------- +// +TPtrC16 CPresencePluginConnection::CurrentDomain() + { + return iSession->CurrentDomain(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::CurrentSipPresentit8() +// --------------------------------------------------------------------------- +// +TPtrC8 CPresencePluginConnection::CurrentSipPresentity8() + { + return iSession->CurrentSipPresentity(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection:XdmUtilsL +// --------------------------------------------------------------------------- +// +CPresencePluginXdmUtils* CPresencePluginConnection::XdmUtilsL() + { + DP_SDA("CPresencePluginConnection::XdmUtilsL"); + return iSession->XdmUtilsL(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::WinfoHandlerL() +// --------------------------------------------------------------------------- +// +CPresencePluginWinfo* CPresencePluginConnection::WinfoHandlerL() + { + DP_SDA("CPresencePluginConnection::WinfoHandlerL"); + if ( !iPluginWinfo ) + { + iPluginWinfo = CPresencePluginWinfo::NewL( + *this, *(iSession->SimpleConnection() )); + } + + iPluginWinfo->SetHost( iConnectionHost ); + return iPluginWinfo; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::WatcherHandlerL() +// --------------------------------------------------------------------------- +// + CPresencePluginWatcher* CPresencePluginConnection::WatcherHandlerL() + { + DP_SDA("CPresencePluginConnection::WatcherHandlerL"); + if ( !iWatcher ) + { + DP_SDA("CPresencePluginConnection::WatcherHandlerL: if ( !iWatcher )"); + iWatcher = CPresencePluginWatcher::NewL( + *this, + *iSession->SimpleConnection(), + iPresenceData ); + } + return iWatcher; + } +// --------------------------------------------------------------------------- +// CPresencePluginConnection::WinfoTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::WinfoTerminatedL( TInt aReason ) + { + DP_SDA("CPresencePluginConnection::WinfoTerminatedL"); + // Pass the information to iAuth and iPublisher, + // so that they can call XIMP Plugin Data Host callbacks. + iAuth->WinfoTerminatedL( aReason ); + iPublisher->WinfoTerminatedL( aReason ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::WinfoNotification() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::WinfoNotification( MSimpleWinfo& aWinfo ) + { + DP_SDA("CPresencePluginConnection::WinfoNotification"); + TRAP_IGNORE( iPublisher->WinfoNotificationL( aWinfo )); + TRAP_IGNORE( iAuth->WinfoNotificationL( aWinfo )); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CPresencePluginConnection::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + DP_SDA("CPresencePluginConnection::GetInterface()"); + if ( aInterfaceId == GetInterfaceId() ) + { + DP_SDA("CPresencePluginConnection::GetInterface()if "); + // caller wants this interface + return this; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + DP_SDA("CPresencePluginConnection::GetInterface() panic"); + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CPresencePluginConnection::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + DP_SDA("CPresencePluginConnection::GetInterface() const "); + if ( aInterfaceId == GetInterfaceId() ) + { + DP_SDA("CPresencePluginConnection::GetInterface()2 "); + // caller wants this interface + return const_cast(this); + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + DP_SDA("CPresencePluginConnection::GetInterface()panic 2"); + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginConnection::GetInterfaceId() const + { + DP_SDA("CPresencePluginConnection::GetInterfaceId() const "); + return MXIMPProtocolConnection::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::ProtocolPresenceFeatures() +// --------------------------------------------------------------------------- +// +MProtocolPresenceFeatures& CPresencePluginConnection:: + ProtocolPresenceFeatures() + { + DP_SDA("CPresencePluginConnection::ProtocolPresenceFeatures() "); + return *this; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::PresenceObjectFactory() +// --------------------------------------------------------------------------- +// +MPresenceObjectFactory& CPresencePluginConnection::PresenceObjectFactoryOwn() + { + DP_SDA("CPresencePluginConnection::PresenceObjectFactoryOwn() "); + return iConnectionHost-> + ProtocolPresenceDataHost().PresenceObjectFactory(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GrandListState() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginConnection::GrandListState( ) + { + DP_SDA2("GrandListState : iGrantListSubs = %d", (TInt)iGrantListSubs ); + return iGrantListSubs; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::IsStopPublishCalled() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginConnection::IsStopPublishCalled( ) + { + DP_SDA("CPresencePluginConnection::IsStopPublishCalled"); + return iStopPublishCall; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::TerminateConnectionL() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::TerminateConnectionL( ) + { + DP_SDA("CPresencePluginConnection::TerminateConnectionL"); + iConnectionHost->HandleConnectionTerminated( NULL ); + iConnectionArray->SetConnectionStatus( ETerminated ); + DP_SDA("CPresencePluginConnection::TerminateConnectionL Done"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::DeRegister() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::DeRegister( ) + { + DP_SDA("CPresencePluginConnection::Deregister"); + + DP_SDA(" -> CloseSession, delete permanent pres data"); + TRAP_IGNORE( iPresenceData->DeletePresenceVariablesL( ServiceId() ) ); + + // Try to stop publish only if we have successfully published + if ( iPublisher->Published() ) + { + DP_SDA("CloseSession call stopPublish"); + TRAP_IGNORE( iPublisher->StopPublishL( iStatus ) ); + iStopPublishCall = ETrue; + SetActive(); + } + + DP_SDA("CPresencePluginConnection::Deregister Done"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::CreateImFeaturesPlugin() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::CreateImFeaturesPluginL( ) + { + if ( !iImFeatures ) + { + DP_SDA("Creating SimpleImPlugin"); + + CSimpleImFeatures::TSimpleImPluginInitParams imPluginInitParams( + *this, + *iSession->SimpleConnection(), + iSession->ServiceId() ); + + iImFeatures = static_cast ( + CProtocolImFeatures::NewL( TUid::Uid(KImplUidSimpleImPlugin), + &imPluginInitParams ) ); + + DP_SDA("Creating SimpleImPlugin done"); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::DeleteImFeaturesPlugin() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::DeleteImFeaturesPlugin( ) + { + if ( iImFeatures ) + { + DP_SDA("Deleting SimpleImPlugin"); + + delete iImFeatures; + iImFeatures = NULL; + REComSession::FinalClose(); + + DP_SDA("Deleting SimpleImPlugin done"); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::DoCancel( ) + { + DP_SDA("CPresencePluginConnection::DoCancel CANCEL"); + iPublisher->Cancel(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginConnection::RunL( ) + { + DP_SDA("CPresencePluginConnection::RunL"); + TInt status = iStatus.Int(); + DP_SDA2("CPresencePluginConnection::RunL status %d", status ); + + if ( iStopPublishCall ) + { + DP_SDA("CPresencePluginConnection::RunL complete"); + + iStopPublishCall = EFalse; + CompleteReq( iXIMPId, status ); + + DP_SDA("CPresencePluginConnection::RunL --> REMOVE CACHE"); + iPresenceData->RemoveCacheL(); + + DP_SDA("CPresencePluginConnection::RunL --> Delete im plugin"); + DeleteImFeaturesPlugin(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginConnection::RunError( TInt /*aError*/ ) + { + DP_SDA("CPresencePluginConnection::RunError"); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GroupsL() +// --------------------------------------------------------------------------- +// +CPresencePluginGroups& CPresencePluginConnection::GroupsL() + { + User::LeaveIfNull( iGroups ); + return *iGroups; + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::ServiceId() +// --------------------------------------------------------------------------- +// +TInt& CPresencePluginConnection::ServiceId() + { + return iSession->ServiceId(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginConnection::GetProtocolInterface() +// --------------------------------------------------------------------------- +// +TAny* CPresencePluginConnection::GetProtocolInterface( TInt aInterfaceId ) + { + DP_SDA("CPresencePluginConnection::GetProtocolInterface"); + + if( aInterfaceId == CProtocolImFeatures::KInterfaceId ) + { + TInt err( KErrNone ); + + if ( !iImFeatures ) + { + DP_SDA(" --> Create im features plugin"); + TRAP( err, CreateImFeaturesPluginL() ); + } + + if ( !err ) + { + DP_SDA(" --> get interface"); + + return iImFeatures->GetInterface( + aInterfaceId, MXIMPBase::EPanicIfUnknown ); + } + else + { + DP_SDA(" --> Creating im features plugin failed"); + return NULL; + } + } + else + { + return NULL; + } + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontacts.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontacts.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,507 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presenceplugincontacts.h" +#include "presencelogger.h" +#include "presenceplugincontactsobs.h" +#include "presenceplugincontactstatehandler.h" +#include "presencepluginlocalstore.h" +// States +#include "presenceplugincontactstate.h" +#include "presenceplugincontactstateopen.h" +#include "presenceplugincontactstateresolve.h" +#include "presenceplugincontactstatesearch.h" +#include "presenceplugincontactstateend.h" + +const TInt KSDMASPSMaxPropertyLength = 512; + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::CPresencePluginContacts() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts::CPresencePluginContacts( TInt aServiceId, + MPresencePluginContactsObs& aObserver ) + : CActive( CActive::EPriorityStandard ), + iServiceId( aServiceId ), + iObserver( &aObserver ) + { + CActiveScheduler::Add(this); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::ConstructL( const TDesC& aServiceName ) + { + DP_SDA( "CPresencePluginContacts::ConstructL()" ); + + iServiceName = aServiceName.AllocL(); + CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewLC(); + HBufC* storeName = ContactStoreNameL(); + + if ( NULL != storeName ) + { + DP_SDA2( "CPresencePluginContacts::ConstructL() %S", storeName ); + CleanupStack::PushL( storeName ); + uriArray->AppendL( TVPbkContactStoreUriPtr( *storeName ) ); + CleanupStack::PopAndDestroy( storeName ); + } + else + { + DP_SDA( "CPresencePluginContacts::ConstructL() Use default contact store uri" ); + uriArray->AppendL( TVPbkContactStoreUriPtr( + VPbkContactStoreUris::DefaultCntDbUri() ) ); + } + iContactManager = CVPbkContactManager::NewL( *uriArray ); + CleanupStack::PopAndDestroy( uriArray ); + + DP_SDA( "CPresencePluginContacts::ConstructL() -exit" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts* CPresencePluginContacts::NewL( TInt aServiceId, + const TDesC& aServiceName, MPresencePluginContactsObs& aObserver ) + { + CPresencePluginContacts* self = + CPresencePluginContacts::NewLC( aServiceId, aServiceName, aObserver ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::NewLC() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts* CPresencePluginContacts::NewLC( TInt aServiceId, + const TDesC& aServiceName, MPresencePluginContactsObs& aObserver ) + { + CPresencePluginContacts* self = + new( ELeave ) CPresencePluginContacts( aServiceId, aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceName ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::~CPresencePluginContacts() +// --------------------------------------------------------------------------- +// +CPresencePluginContacts::~CPresencePluginContacts() + { + DP_SDA("CPresencePluginContacts::~CPresencePluginContacts"); + + delete iServiceName; + delete iSearchText; + delete iContactOperation; + iStoreContactArray.ResetAndDestroy(); + delete iStateHandler; + delete iFieldTypeRefList; + delete iContactLinkArray; + if( iContactManager ) + { + TRAP_IGNORE( iContactManager->ContactStoresL().CloseAll( *this ) ); + } + delete iContactManager; + iClientStatus = NULL; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::PresenceIdStoredL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::IsPresenceIdStoredL( + const TDesC16& aPresenceId, TRequestStatus& aStatus ) + { + DP_SDA( "CPresencePluginContacts::IsPresenceIdStoredL -Enter" ); + + iOperation = EOperationIsPresenceStoredToContacts; + + aStatus = KRequestPending; + iClientStatus = &aStatus; + + iSearchText = HBufC::NewL( + iServiceName->Length() + aPresenceId.Length() + 1 ); + TPtr searchTextPtr = iSearchText->Des(); + searchTextPtr.Copy( *iServiceName ); + searchTextPtr.Append( ':' ); + searchTextPtr.Append( aPresenceId ); + + iFieldTypeRefList = CVPbkFieldTypeRefsList::NewL(); + iFieldTypeRefList->AppendL( + *iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_IMPP ) ); + + iStateHandler = CPresencePluginContactStateHandler::NewL(); + + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateOpen( + *this, *iStateHandler ) ); + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateSearch( + *this, *iStateHandler ) ); + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateResolve( + *this, *iStateHandler ) ); + iStateHandler->AddStateL( new( ELeave ) CPresencePluginContactStateEnd( + *this, *iStateHandler ) ); + + iStateHandler->Start( &iStatus ); + SetActive(); + + DP_SDA( "CPresencePluginContacts::IsPresenceIdStoredL - exit" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContacts::ContactStoreNameL +// --------------------------------------------------------------------------- +// +HBufC* CPresencePluginContacts::ContactStoreNameL() + { + DP_SDA( "CPresencePluginContacts::ContactStoreNameL()" ); + + HBufC* storeName = NULL; + CSPSettings* spSettings = CSPSettings::NewLC(); + CSPProperty* property = CSPProperty::NewLC(); + + TInt err = spSettings->FindPropertyL( iServiceId, + EPropertyContactStoreId, + *property ); + + if ( KErrNone == err ) + { + storeName = HBufC::NewL( KSDMASPSMaxPropertyLength ); + TPtr16 storeNamePtr = storeName->Des(); + err = property->GetValue( storeNamePtr ); + } + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spSettings ); + + return storeName; + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +// CPresencePluginContacts::Open +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::OpenL() + { + DP_SDA( "CPresencePluginContacts::Open()" ); + iContactManager->ContactStoresL().OpenAllL( *this ); + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +// CPresencePluginContacts::Search +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::SearchL() + { + DP_SDA( "CPresencePluginContacts::Search()" ); + iContactOperation = iContactManager->FindL( + *iSearchText, *iFieldTypeRefList, *this ); + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +// CPresencePluginContacts::ContactLinkArray +// --------------------------------------------------------------------------- +// +const MVPbkContactLinkArray& CPresencePluginContacts::ContactLinkArrayL() + { + if ( NULL == iContactLinkArray ) + { + User::Leave( KErrNotReady ); + } + return *iContactLinkArray; + } + + +// --------------------------------------------------------------------------- +// From class MPresenceContactsContextBase. +//CPresencePluginContacts::RetrieveContactL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::RetrieveContactL( + const MVPbkContactLink& aContactLink ) + { + DP_SDA( "CPresencePluginContacts::RetrieveContactL()" ); + iContactOperation = + iContactManager->RetrieveContactL( aContactLink, *this ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreListObserver. +// CPresencePluginContacts::OpenComplete +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::OpenComplete() + { + DP_SDA( "CPresencePluginContacts::OpenComplete()" ); + iStateHandler->State()->Complete(); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreObserver. +// CPresencePluginContacts::StoreReady +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::StoreReady( + MVPbkContactStore& /*aContactStore*/ ) + { + DP_SDA( "CPresencePluginContacts::StoreReady()" ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreObserver. +// CPresencePluginContacts::StoreUnavailable +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::StoreUnavailable( + MVPbkContactStore& /*aContactStore*/, TInt /*aReason*/ ) + { + DP_SDA( "CPresencePluginContacts::StoreUnavailable()" ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactStoreObserver. +// CPresencePluginContacts::HandleStoreEventL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::HandleStoreEventL( + MVPbkContactStore& /*aContactStore*/, + TVPbkContactStoreEvent /*aStoreEvent*/ ) + { + DP_SDA( "CPresencePluginContacts::HandleStoreEventL()" ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactFindObserver. +// CPresencePluginContacts::FindCompleteL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::FindCompleteL( MVPbkContactLinkArray* aResults ) + { + DP_SDA( "CPresencePluginContacts::FindCompleteL()" ); + + delete iContactLinkArray; + iContactLinkArray = NULL; + iContactLinkArray = aResults; + + delete iContactOperation; + iContactOperation = NULL; + + iStateHandler->State()->Complete(); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkContactFindObserver. +// CPresencePluginContacts::FindFailed +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::FindFailed( TInt aError ) + { + DP_SDA( "CPresencePluginContacts::FindFailed()" ); + + delete iContactOperation; + iContactOperation = NULL; + + iStateHandler->State()->Error( aError ); + } + + +// --------------------------------------------------------------------------- +// From class MVPbkSingleContactOperationObserver. +// CPresencePluginContacts::VPbkSingleContactOperationComplete +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& aOperation, + MVPbkStoreContact* aContact ) + { + DP_SDA( "CPresencePluginContacts::VPbkSingleContactOperationComplete()" ); + + if ( iContactOperation == &aOperation ) + { + delete iContactOperation; + iContactOperation = NULL; + } + + TInt error = iStoreContactArray.Append( aContact ); + if ( KErrNone != error ) + { + delete aContact; + aContact = NULL; + iStateHandler->State()->Error( error ); + } + else + { + iStateHandler->State()->Complete(); + } + } + + +// --------------------------------------------------------------------------- +// From class MVPbkSingleContactOperationObserver. +// CPresencePluginContacts::VPbkSingleContactOperationFailed +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& aOperation, + TInt aError ) + { + DP_SDA( "CPresencePluginContacts::VPbkSingleContactOperationFailed()" ); + + if ( iContactOperation == &aOperation ) + { + delete iContactOperation; + iContactOperation = NULL; + } + + iStateHandler->State()->Error( aError); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// CPresencePluginContacts::RunL +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::RunL() + { + DP_SDA2( "CPresencePluginContacts::RunL - status %d", iStatus.Int() ); + + TBool result( EFalse ); + TBool found( EFalse ); + CPresencePluginLocalstore* localStore = NULL; + TInt error = iStatus.Int(); + + switch( iOperation ) + { + case EOperationIsPresenceStoredToContacts: + DP_SDA( "CPresencePluginContacts::RunL -EOperationIsPresenceStoredToContacts" ); + + if ( KErrNone == error ) + { + localStore = CPresencePluginLocalstore::NewLC( *iServiceName ); + + for ( TInt i( 0 ); ( i < iStoreContactArray.Count() ) && !found; i++ ) + { + MVPbkContactLink* link = iStoreContactArray[ i ]->CreateLinkLC(); + CVPbkContactIdConverter* converter = + CVPbkContactIdConverter::NewL( link->ContactStore() ); + CleanupStack::PushL( converter ); + + TInt32 id = converter->LinkToIdentifier( *link ); + if ( localStore->SeekRowAtContactColL( id ) ) + { + found = ETrue; + result = ETrue; + } + CleanupStack::PopAndDestroy( converter ); + CleanupStack::PopAndDestroy(); // link + } + + CleanupStack::PopAndDestroy( localStore ); + } + if ( KErrNotFound == error ) + { + error = KErrNone; + } + iObserver->RequestComplete( &result, iOperation, error ); + break; + default: + break; + } + // Operation completed. + // State handler not needet anymore + delete iStateHandler; + iStateHandler = NULL; + // Close contact stores + iContactManager->ContactStoresL().CloseAll( *this ); + + User::RequestComplete( iClientStatus, error ); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// CPresencePluginContacts::DoCancel +// --------------------------------------------------------------------------- +// +void CPresencePluginContacts::DoCancel() + { + if ( iClientStatus && *iClientStatus == KRequestPending ) + { + User::RequestComplete( iClientStatus, KErrCancel ); + } + iStateHandler->Complete( KErrCancel ); + } + + +// --------------------------------------------------------------------------- +// From class CActive. +// CPresencePluginContacts::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginContacts::RunError( TInt aError ) + { + DP_SDA2( "CPresencePluginContacts::RunError - status %d", aError ); + User::RequestComplete( iClientStatus, aError ); + return KErrNone; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontactstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontactstate.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,63 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include "presenceplugincontactstate.h" +#include "presenceplugincontactstatehandler.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencepluginContactState::CPresencepluginContactState +// --------------------------------------------------------------------------- +// +CPresencepluginContactState::CPresencepluginContactState( + MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ) + : iContext( &aContext ), iStateHandler( &aStateHandler ) + { + } + + +// --------------------------------------------------------------------------- +// CPresencepluginContactState::~CPresencepluginContactState +// --------------------------------------------------------------------------- +// +CPresencepluginContactState::~CPresencepluginContactState() + { + } + + +// --------------------------------------------------------------------------- +// CPresencepluginContactState::Complete +// --------------------------------------------------------------------------- +// +void CPresencepluginContactState::Complete() + { + iStateHandler->ProgressToNextState(); + } + + +// --------------------------------------------------------------------------- +// CPresencepluginContactState::Complete +// --------------------------------------------------------------------------- +// +void CPresencepluginContactState::Error( TInt aError ) + { + iStateHandler->Complete( aError ); + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontactstateend.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontactstateend.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include "presenceplugincontactstateend.h" +#include "presenceplugincontactstatehandler.h" +#include "presencecontactscontextbase.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateEnd::CPresencePluginContactStateEnd +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateEnd::CPresencePluginContactStateEnd( + MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ) + : CPresencepluginContactState( aContext, aStateHandler ) + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateEnd::~CPresencePluginContactStateEnd +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateEnd::~CPresencePluginContactStateEnd() + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateEnd::HandleL +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateEnd::HandleL() + { + iStateHandler->Complete( KErrNone ); + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontactstatehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontactstatehandler.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,129 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include "presenceplugincontactstatehandler.h" +#include "presenceplugincontactstate.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::CPresencePluginContactStateHandler +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateHandler::CPresencePluginContactStateHandler() + : iCurrentStateIndex( 0 ) + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::~CPresencePluginContactStateHandler +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateHandler::~CPresencePluginContactStateHandler() + { + iStateArray.ResetAndDestroy(); + iClientStatus = NULL; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::NewL +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateHandler* CPresencePluginContactStateHandler::NewL() + { + CPresencePluginContactStateHandler* self = + new (ELeave) CPresencePluginContactStateHandler(); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::Start +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateHandler::Start( TRequestStatus* aStatus ) + { + iClientStatus = aStatus; + *iClientStatus = KRequestPending; + iCurrentStateIndex = 0; + HandleNextState(); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::Complete +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateHandler::Complete( TInt aError ) + { + if( iClientStatus && *iClientStatus == KRequestPending ) + { + User::RequestComplete( iClientStatus, aError ); + } + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::ProgressToNextState +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateHandler::ProgressToNextState() + { + iCurrentStateIndex++; + HandleNextState(); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::HandleNextState +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateHandler::HandleNextState() + { + TRAPD( error, State()->HandleL() ); + if ( KErrNone != error ) + { + Complete( error ); + } + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::AddStateL +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateHandler::AddStateL( + CPresencepluginContactState* aState ) + { + CleanupStack::PushL( aState ); + iStateArray.AppendL( aState ); + CleanupStack::Pop( aState ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateHandler::State +// --------------------------------------------------------------------------- +// +CPresencepluginContactState* CPresencePluginContactStateHandler::State() + { + return iStateArray[ iCurrentStateIndex ]; + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontactstateopen.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontactstateopen.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,54 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include "presenceplugincontactstateopen.h" +#include "presencecontactscontextbase.h" +#include "presenceplugincontactstatehandler.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateOpen::CPresencePluginContactStateOpen +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateOpen::CPresencePluginContactStateOpen( + MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ) + : CPresencepluginContactState( aContext, aStateHandler ) + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateOpen::~CPresencePluginContactStateOpen +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateOpen::~CPresencePluginContactStateOpen() + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateOpen::HandleL +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateOpen::HandleL() + { + iContext->OpenL(); + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontactstateresolve.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontactstateresolve.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include "presenceplugincontactstateresolve.h" +#include "presencecontactscontextbase.h" +#include "presenceplugincontactstatehandler.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateResolve::PresencePluginContactStateResolve +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateResolve::CPresencePluginContactStateResolve( + MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ) + : CPresencepluginContactState( aContext, aStateHandler ), + iContactLinkIndex( NULL ), + iContactLinkCount( NULL ) + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateResolve::~CPresencePluginContactStateResolve +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateResolve::~CPresencePluginContactStateResolve() + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateResolve::HandleL +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateResolve::HandleL() + { + iContactLinkCount = iContext->ContactLinkArrayL().Count(); + if ( NULL == iContactLinkCount ) + { + Error( KErrNotFound ); + } + else + { + iContext->RetrieveContactL( + iContext->ContactLinkArrayL().At( iContactLinkIndex ) ); + iContactLinkIndex++; + } + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateResolve::Complete +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateResolve::Complete() + { + if ( iContactLinkIndex < iContactLinkCount ) + { + TRAPD( error, HandleL() ); + if ( KErrNone != error ) + { + Error( error ); + } + } + else + { + iStateHandler->ProgressToNextState(); + } + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugincontactstatesearch.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugincontactstatesearch.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,53 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include "presenceplugincontactstatesearch.h" +#include "presencecontactscontextbase.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateSearch::CPresencePluginContactStateSearch +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateSearch::CPresencePluginContactStateSearch( + MPresenceContactsContextBase& aContext, + CPresencePluginContactStateHandler& aStateHandler ) + : CPresencepluginContactState( aContext, aStateHandler ) + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateSearch::~CPresencePluginContactStateSearch +// --------------------------------------------------------------------------- +// +CPresencePluginContactStateSearch::~CPresencePluginContactStateSearch() + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginContactStateSearch::HandleL +// --------------------------------------------------------------------------- +// +void CPresencePluginContactStateSearch::HandleL() + { + iContext->SearchL(); + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugindata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugindata.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1839 @@ +/* +* Copyright (c) 2007-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presenceplugindata.h" +#include "presenceplugincommon.h" +#include "presencepluginvirtualgroup.h" +#include "presencepluginlanguagecodes.h" + +// --------------------------------------------------------------------------- +// CPresencePluginData::CPresencePluginData +// --------------------------------------------------------------------------- +// +CPresencePluginData::CPresencePluginData( + MPresencePluginConnectionObs& aObs, + TInt aServiceId ): + iConnObs( aObs ), + iServiceId( aServiceId ), + iPresenceCacheWriter( NULL ), + iPresenceCacheReader( NULL ) + { + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::~CPresencePluginData +// --------------------------------------------------------------------------- +// +CPresencePluginData::~CPresencePluginData() + { + DP_SDA("CPresencePluginData::~CPresencePluginData"); + delete iPresenceCacheWriter; + delete iPresenceCacheReader; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NewL +// --------------------------------------------------------------------------- +// +CPresencePluginData* CPresencePluginData::NewL( + MPresencePluginConnectionObs& aObs, TInt aServiceId ) + { + CPresencePluginData* self = CPresencePluginData::NewLC( + aObs, + aServiceId ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginData::ConstructL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::ConstructL() + { + DP_SDA("CPresencePluginData::ConstructL"); + iPresenceCacheWriter = MPresenceCacheWriter2::CreateWriterL(); + iPresenceCacheReader = MPresenceCacheReader2::CreateReaderL(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NewLC +// --------------------------------------------------------------------------- +// +CPresencePluginData* CPresencePluginData::NewLC( + MPresencePluginConnectionObs& aObs, TInt aServiceId ) + { + CPresencePluginData* self = + new( ELeave ) CPresencePluginData( aObs, aServiceId ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NotifyToBlockedToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::NotifyToBlockedToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent ) + { + DP_SDA("CPresencePluginData::NotifyToBlockedToXIMPL"); + MPersonPresenceInfo* persInfo = + aPresenceFactory.NewPersonPresenceInfoLC(); + MPresenceInfoFieldCollection& coll = persInfo->Fields(); + + //Set pending + using namespace NPresenceInfo::NFieldType; + using namespace NPresencePlugin::NPresenceStates; + + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KAvailabilityEnum ); + + // use mapped enums to pass status + MPresenceInfoFieldValueEnum* enumField = + aPresenceFactory.NewEnumInfoFieldLC(); + + // HOX: BLOCKED ENUM NEEDED TO XIMP + enumField->SetValueL( NPresenceInfo::ENotAvailable ); + field->SetFieldValue( enumField ); + + coll.AddOrReplaceFieldL( field ); + CleanupStack::Pop( 2 ); // >> field, enumField + + // Add status msg field + MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC(); + noteField->SetFieldTypeL( KStatusMessage ); + + MPresenceInfoFieldValueText* textField = + aPresenceFactory.NewTextInfoFieldLC(); + textField->SetTextValueL( aUnicodeNoteContent ); + + noteField->SetFieldValue( textField ); + + coll.AddOrReplaceFieldL( noteField ); + CleanupStack::Pop( 2 ); // >> noteField, enumField + + aPrInfo.SetPersonPresenceL( persInfo ); + CleanupStack::Pop(); // >> persInfo + DP_SDA("CPresencePluginData::NotifyToBlockedToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NotifyToPendingToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::NotifyToPendingToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent ) + { + DP_SDA("CPresencePluginData::NotifyToPendingToXIMP"); + MPersonPresenceInfo* persInfo = + aPresenceFactory.NewPersonPresenceInfoLC(); + MPresenceInfoFieldCollection& coll = persInfo->Fields(); + + //Set pending + using namespace NPresenceInfo::NFieldType; + using namespace NPresencePlugin::NPresenceStates; + + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KAvailabilityEnum ); + + // use mapped enums to pass status + MPresenceInfoFieldValueEnum* enumField = + aPresenceFactory.NewEnumInfoFieldLC(); + enumField->SetValueL( NPresenceInfo::ERemotePending ); + field->SetFieldValue( enumField ); + + coll.AddOrReplaceFieldL( field ); + CleanupStack::Pop( 2 ); // >> field, enumField + + // Add status msg field + MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC(); + noteField->SetFieldTypeL( KStatusMessage ); + + MPresenceInfoFieldValueText* textField = + aPresenceFactory.NewTextInfoFieldLC(); + textField->SetTextValueL( aUnicodeNoteContent ); + + noteField->SetFieldValue( textField ); + + coll.AddOrReplaceFieldL( noteField ); + CleanupStack::Pop( 2 ); // >> noteField, enumField + + aPrInfo.SetPersonPresenceL( persInfo ); + CleanupStack::Pop(); // >> persInfo + DP_SDA("CPresencePluginData::NotifyToPendingToXIMP end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NotifyActiveToPrInfoL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::NotifyToActiveToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent, + NPresenceInfo::TAvailabilityValues aAvailability ) + { + DP_SDA("CPresencePluginData::NotifyToActiveToXIMPL"); + MPersonPresenceInfo* persInfo = + aPresenceFactory.NewPersonPresenceInfoLC(); + MPresenceInfoFieldCollection& coll = persInfo->Fields(); + + //Set pending + using namespace NPresenceInfo::NFieldType; + using namespace NPresencePlugin::NPresenceStates; + + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KAvailabilityEnum ); + + // use mapped enums to pass status + MPresenceInfoFieldValueEnum* enumField = + aPresenceFactory.NewEnumInfoFieldLC(); + enumField->SetValueL( aAvailability ); + field->SetFieldValue( enumField ); + + coll.AddOrReplaceFieldL( field ); + CleanupStack::Pop( 2 ); // >> field, enumField + + // Add status msg field + MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC(); + noteField->SetFieldTypeL( KStatusMessage ); + + MPresenceInfoFieldValueText* textField = + aPresenceFactory.NewTextInfoFieldLC(); + textField->SetTextValueL( aUnicodeNoteContent ); + + noteField->SetFieldValue( textField ); + + coll.AddOrReplaceFieldL( noteField ); + CleanupStack::Pop( 2 ); // >> noteField, enumField + + aPrInfo.SetPersonPresenceL( persInfo ); + CleanupStack::Pop(); // >> persInfo + DP_SDA("CPresencePluginData::NotifyToActiveToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NotifyTerminatedToPrInfoL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::NotifyTerminatedToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MPresenceInfo& aPrInfo, + const TDesC& aUnicodeNoteContent ) + { + DP_SDA("CPresencePluginData::NotifyTerminatedToXIMPL"); + MPersonPresenceInfo* persInfo = + aPresenceFactory.NewPersonPresenceInfoLC(); + MPresenceInfoFieldCollection& coll = persInfo->Fields(); + + //Set pending + using namespace NPresenceInfo::NFieldType; + using namespace NPresencePlugin::NPresenceStates; + + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KAvailabilityEnum ); + + // use mapped enums to pass status + MPresenceInfoFieldValueEnum* enumField = + aPresenceFactory.NewEnumInfoFieldLC(); + enumField->SetValueL( NPresenceInfo::EOffline ); + field->SetFieldValue( enumField ); + + coll.AddOrReplaceFieldL( field ); + CleanupStack::Pop( 2 ); // >> field, enumField + + // Add status msg field + MPresenceInfoField* noteField = aPresenceFactory.NewInfoFieldLC(); + noteField->SetFieldTypeL( KStatusMessage ); + + MPresenceInfoFieldValueText* textField = + aPresenceFactory.NewTextInfoFieldLC(); + textField->SetTextValueL( aUnicodeNoteContent ); + + noteField->SetFieldValue( textField ); + + coll.AddOrReplaceFieldL( noteField ); + CleanupStack::Pop( 2 ); // >> noteField, enumField + + aPrInfo.SetPersonPresenceL( persInfo ); + CleanupStack::Pop(); // >> persInfo + DP_SDA("CPresencePluginData::NotifyTerminatedToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NotifyToPrInfoL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::NotifyToPrInfoL( + MXIMPObjectFactory& /*aFactory*/, + MPresenceObjectFactory& aPresenceFactory, + MSimpleDocument& aDocument, + MPresenceInfo& aPrInfo ) + { + DP_SDA("CPresencePluginData::NotifyToPrInfoL"); + MPersonPresenceInfo* persInfo = + aPresenceFactory.NewPersonPresenceInfoLC(); + DP_SDA("CPresencePluginData::NotifyToPrInfoL persInfo"); + + if( !aDocument.EntityURI() ) + { + DP_SDA("CPresencePluginData::NotifyToPrInfoL entity URL not valid"); + User::Leave( KErrCancel ); + } + + MPresenceInfoFieldCollection& coll = persInfo->Fields(); + + DP_SDA("CPresencePluginData::NotifyToPrInfoL collection"); + // Search own person info. Notice: Extend supported attributes later + TBool basicElementFound = EFalse; + TBool activitiesElementFound = EFalse; + TBool noteElemFound = EFalse; + + DP_SDA("CPresencePluginData::NotifyToPrInfoL RPointerArray"); + RPointerArray elems; + DP_SDA("CPresencePluginData::NotifyToPrInfoL Push elems"); + CleanupClosePushL( elems ); + DP_SDA("CPresencePluginData::NotifyToPrInfoL aDocument"); + TInt err = aDocument.SimpleElementsL( elems ); + + DP_SDA2("CPresencePluginData::NotifyToPrInfoL err %d", err); + + RPointerArray basicElems; + CleanupClosePushL( basicElems ); + MSimpleElement* basicSimpleElem(NULL); + + RPointerArray activitiesElems; + CleanupClosePushL( activitiesElems ); + MSimpleElement* activitiesSimpleElem(NULL); + MSimpleElement* noteSimpleElem(NULL); + + if ( !err ) + { + DP_SDA("CPresencePluginData::NotifyToPrInfoL, elements ok"); + TInt count = elems.Count(); + DP_SDA2("CPresencePluginData::NotifyToPrInfoL, element count: %d", count ); + + using namespace NPresencePlugin::NPresence; + + MSimpleElement* elem = NULL; + TPtrC8 p8; + + for ( TInt i = 0; i < count; i++ ) + { + DP_SDA2("CPresencePluginData::NotifyToPrInfoL, handling elem[%d]", i ); + + elem = elems[i]; + p8.Set( elem->LocalName()); + if (!( p8.CompareF( KPresencePerson8 )) || + !( p8.CompareF( KPresenceTuple8 )) ) + { + // person element found + RPointerArray elems2; + CleanupClosePushL( elems2 ); + elem->SimpleElementsL( elems2 ); + TInt count2 = elems2.Count(); + DP_SDA2("CPresencePluginData::NotifyToPrInfoL count2 %d", count2); + for ( TInt j = 0; j < count2; j++ ) + { + DP_SDA("CPresencePluginData::NotifyToPrInfoL 4"); + // + MSimpleElement* elem2 = elems2[j]; + + //FIND BASIC/ACTIVITIES ELEMENT + if ( !elem2->LocalName().CompareF( KPresenceStatus8 ) && + !basicElementFound ) + { + DP_SDA("NotifyToPrInfoL PresenceStatus"); + //Get elem2 childs + elem2->SimpleElementsL( basicElems ); + TInt count3 = basicElems.Count(); //Child count + for ( TInt k = 0; k < count3; k++ ) + { + MSimpleElement* tempElem = basicElems[k]; + if ( !tempElem->LocalName().CompareF( + KPresenceBasic8 )) + { + DP_SDA("NotifyToPrInfoL basic elem true"); + basicSimpleElem = basicElems[k]; + basicElementFound = ETrue; + } + else if( !tempElem->LocalName().CompareF( + KPresenceActivities8 )) + { + DP_SDA("NotifyToPrInfoL activities under basic"); + activitiesSimpleElem = basicElems[k]; + activitiesElementFound = ETrue; + } + } + } + + //FIND ACTIVITIES ELEMENT + if ( basicElementFound && !activitiesElementFound && + !elem2->LocalName().CompareF( KPresenceActivities8 ) ) + { + DP_SDA("NotifyToPrInfoL activities found outside basic"); + elem2->SimpleElementsL( activitiesElems ); + TInt count4 = activitiesElems.Count(); + for ( TInt l = 0; l < count4; l++ ) + { + activitiesSimpleElem = activitiesElems[l]; + activitiesElementFound = ETrue; + DP_SDA("CPresencePluginData::NotifyToPrInfoL 6"); + } + } + } + + if ( basicElementFound && !noteSimpleElem ) + { + noteSimpleElem = ResolveNoteElementL( elems2 ); + } + + DP_SDA("NotifyToPrInfoL ALL DONE"); + CleanupStack::PopAndDestroy( &elems2 ); + + if ( basicElementFound && activitiesElementFound && noteElemFound ) + { + DP_SDA("NotifyToPrInfoL ALL DONE break out"); + //Just handle first status information from document + // In future server should support + //Also client should be can handle timestaps if there are present + break; + } + } + // Check note field + else if ( basicElementFound && !( p8.CompareF( KPresenceNote8 )) && + !noteSimpleElem ) + { + DP_SDA("NotifyToPrInfoL note field found outside tuple"); + noteSimpleElem = elem; + } + } + } + + if ( basicElementFound ) + { + DP_SDA("NotifyToPrInfoL basic proceed to handling"); + SingleUserStatusToXIMPL( + aPresenceFactory, basicSimpleElem, + activitiesSimpleElem, noteSimpleElem, coll ); + } + CleanupStack::PopAndDestroy( &activitiesElems ); + CleanupStack::PopAndDestroy( &basicElems ); + CleanupStack::PopAndDestroy( &elems ); + + aPrInfo.SetPersonPresenceL( persInfo ); + CleanupStack::Pop(); // >> persInfo + + // TODO2: Notice: the following crashes in old PrFW version + /* + aPrInfo.AddDevicePresenceL ( NULL ); + aPrInfo.AddServicePresenceL( NULL ); + */ + DP_SDA("CPresencePluginData::NotifyToPrInfoL end"); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginData::CacheEntriesFromPrInfo +// --------------------------------------------------------------------------- +// +void CPresencePluginData::CacheEntriesFromPrInfo( + MPresenceInfo& aPrInfo, + MPresenceBuddyInfo2::TAvailabilityValues& aAvailability, + TPtr& aExtendedAvailability, + TPtr& aStatusMessage ) + { + DP_SDA("CPresencePluginData::CacheEntriesFromPrInfoL"); + + DP_SDA(" -> CacheEntriesFromPrInfoL, fetch status enum field"); + MPresenceInfoField* statusEnumInfoField = NULL; + MPersonPresenceInfo* presInfo = aPrInfo.PersonPresence(); + if ( presInfo ) + { + DP_SDA(" -> CacheEntriesFromPrInfoL, has person presence, get field"); + presInfo->Fields().LookupFieldByFieldType( + statusEnumInfoField, + NPresenceInfo::NFieldType::KAvailabilityEnum ); + DP_SDA(" -> CacheEntriesFromPrInfoL, fetch status enum field done, check item"); + if ( statusEnumInfoField ) + { + DP_SDA(" -> status enum field found"); + const MPresenceInfoFieldValueEnum* availability = + TXIMPGetInterface< const MPresenceInfoFieldValueEnum >::From( + statusEnumInfoField->FieldValue(), MXIMPBase::EPanicIfUnknown ); + switch( availability->Value() ) + { + case NPresenceInfo::EAvailable: + { + DP_SDA(" -> status enum field => available"); + aAvailability = MPresenceBuddyInfo2::EAvailable; + aExtendedAvailability.Copy( KDefaultAvailableStatus() ); + } + break; + + case NPresenceInfo::EBusy: + { + DP_SDA(" -> status enum field => busy"); + aAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedAvailability.Copy( KDndState() ); + } + break; + + case NPresenceInfo::EOnPhone: + { + DP_SDA(" -> status enum field => on phone"); + aAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedAvailability.Copy( KOnPhoneState() ); + } + break; + + case NPresenceInfo::EAway: + { + DP_SDA(" -> status enum field => away"); + aAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedAvailability.Copy( KAwayState() ); + } + break; + + case NPresenceInfo::EDoNotDisturb: + { + DP_SDA(" -> status enum field => dnd"); + aAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedAvailability.Copy( KDndState() ); + } + break; + + case NPresenceInfo::EOffline: + case NPresenceInfo::ENotAvailable: + default: + { + DP_SDA(" -> status enum field => offline/not available/default"); + aAvailability = MPresenceBuddyInfo2::ENotAvailable; + aExtendedAvailability.Copy( KInvisibleState() ); + } + break; + } + } + else + { + DP_SDA(" -> status enum not found => set unknown"); + aAvailability = MPresenceBuddyInfo2::EUnknownAvailability; + aExtendedAvailability.Copy( KNullDesC() ); + } + DP_SDA(" -> fetch status message field"); + MPresenceInfoField* statusMsgInfoField = NULL; + presInfo->Fields().LookupFieldByFieldType( + statusMsgInfoField, + NPresenceInfo::NFieldType::KStatusMessage ); + DP_SDA(" -> CacheEntriesFromPrInfoL, fetch status message field done, check item"); + if ( statusMsgInfoField ) + { + DP_SDA(" -> status msg field found"); + const MPresenceInfoFieldValueText* statusMsg = + TXIMPGetInterface< const MPresenceInfoFieldValueText >::From( + statusMsgInfoField->FieldValue(), MXIMPBase::EPanicIfUnknown ); + if ( statusMsg && statusMsg->TextValue().Length() ) + { + DP_SDA(" -> status msg field found, copy content"); + aStatusMessage.Copy( statusMsg->TextValue() ); + } + } + else + { + DP_SDA(" -> status msg field not found, set empty"); + aStatusMessage.Copy( KNullDesC() ); + } + } + + DP_SDA("CPresencePluginData::CacheEntriesFromPrInfoL out"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::SingleUserStatusToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::SingleUserStatusToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aBasicElement, + MSimpleElement* aActivitiesElement, + MSimpleElement* aNoteElement, + MPresenceInfoFieldCollection& aCollection ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL"); + + using namespace NPresenceInfo::NFieldType; + using namespace NPresencePlugin::NPresenceStates; + + //Get aBasicElem content + HBufC* nodeContent = aBasicElement->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + + TBuf basicContentBuf; + basicContentBuf.Copy( *nodeContent ); + DP_SDA2("SingleUserStatusToXIMPL basicContent %S", &basicContentBuf); + + TBuf activitiesContentBuf; + + if ( !aActivitiesElement ) + { + activitiesContentBuf.Copy( KPresenceUnknow ); + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL activities NULL"); + } + else + { + activitiesContentBuf.Copy( aActivitiesElement->LocalName() ); + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL else"); + } + + if ( nodeContent ) + { + using namespace NPresenceInfo::NFieldType; + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KAvailabilityEnum ); + + // use mapped enums to pass status + MPresenceInfoFieldValueEnum* enumField = + aPresenceFactory.NewEnumInfoFieldLC(); + + // Busy case + if ( !nodeContent->Des().CompareF( KPresenceOpen ) && + !activitiesContentBuf.CompareF ( KPresenceBusy ) ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/busy"); + enumField->SetValueL( NPresenceInfo::EBusy ); + } + // On-The-Phone case + else if ( !nodeContent->Des().CompareF( KPresenceOpen ) && + !activitiesContentBuf.CompareF ( KPresenceOnThePhone ) ) + { + DP_SDA("CPresencePluginData::SingleUserStatusToXIMPL open/on-the-phone"); + enumField->SetValueL( NPresenceInfo::EOnPhone ); + } + //Away case + else if ( !nodeContent->Des().CompareF( KPresenceOpen ) && + !activitiesContentBuf.CompareF ( KPresenceAway ) ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/away"); + enumField->SetValueL( NPresenceInfo::EAway ); + } + //Dnd case + else if ( !nodeContent->Des().CompareF( KPresenceOpen ) && + !activitiesContentBuf.CompareF ( KPresenceDoNotDisturb ) ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/dnd"); + enumField->SetValueL( NPresenceInfo::EDoNotDisturb ); + } + // Unknown open + else if ( !nodeContent->Des().CompareF( KPresenceOpen ) && + !activitiesContentBuf.CompareF ( KPresenceUnknow ) ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/unknown"); + enumField->SetValueL( NPresenceInfo::EAvailable ); + } + // availale open + else if ( !nodeContent->Des().CompareF( KPresenceOpen ) && + !activitiesContentBuf.CompareF ( KPresenceAvailable ) ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL open/available"); + enumField->SetValueL( NPresenceInfo::EAvailable ); + } + //Unknown closed + else if ( !nodeContent->Des().CompareF( KPresenceClosed ) && + !activitiesContentBuf.CompareF ( KPresenceUnknow ) ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL closed/unknown"); + enumField->SetValueL( NPresenceInfo::EOffline ); + } + //Else set status according to basic status + else + { + if ( !nodeContent->Des().CompareF( KPresenceOpen ) ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL else open"); + enumField->SetValueL( NPresenceInfo::EAvailable ); + } + else + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL else closed"); + enumField->SetValueL( NPresenceInfo::ENotAvailable ); + } + } + + field->SetFieldValue( enumField ); + aCollection.AddOrReplaceFieldL( field ); + + CleanupStack::Pop( 2 ); // >> field, enumField + + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL check for note"); + + // Handle note field if found and buddy is "available". + if ( aNoteElement && + NPresenceInfo::EOffline != enumField->Value() && + NPresenceInfo::ENotAvailable != enumField->Value() ) + { + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL note elems found"); + // consider mapping note text to enum value if value not mapped + UserNoteToXIMPL( aPresenceFactory, aNoteElement, aCollection ); + } + } + CleanupStack::PopAndDestroy( nodeContent ); + DP_SDA(" CPresencePluginData::SingleUserStatusToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::UserNoteToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::UserNoteToXIMPL( + MPresenceObjectFactory& aPresenceFactory, + MSimpleElement* aElement, + MPresenceInfoFieldCollection& aCollection ) + { + DP_SDA(" CPresencePluginData::UserNoteToXIMPL IN"); + HBufC* nodeContent = aElement->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + if ( nodeContent ) + { + DP_SDA(" CPresencePluginData::UserNoteToXIMPL - content found"); + // Save note, convert from unicode + // notice: consider xml::lang-attribute + // note <-> KStatusMessage + // notice: no need to consider namespaces in XML? + using namespace NPresenceInfo::NFieldType; + + DP_SDA(" CPresencePluginData::UserNoteToXIMPL - create fields"); + MPresenceInfoField* field = aPresenceFactory.NewInfoFieldLC(); + field->SetFieldTypeL( KStatusMessage ); + MPresenceInfoFieldValueText* text = + aPresenceFactory.NewTextInfoFieldLC(); + text->SetTextValueL( nodeContent->Des() ); + field->SetFieldValue( text ); + CleanupStack::Pop(); // >> text + aCollection.AddOrReplaceFieldL( field ); + CleanupStack::Pop(); // >> field + DP_SDA(" -> fields added to collection"); + } + CleanupStack::PopAndDestroy( nodeContent ); + DP_SDA(" CPresencePluginData::UserNoteToXIMPL OUT"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::NotifyListToPrInfoL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::NotifyListToPrInfoL( + MXIMPObjectFactory& aFactory, + MPresenceObjectFactory& aPresenceFactory, + MSimplePresenceList& aList, + RPointerArray& aEntities, + RPointerArray& aActives, + RPointerArray& aTerminated ) + { + DP_SDA(" CPresencePluginData::NotifyListToPrInfoL"); + // Split array into individual prInfos + + aEntities.Reset(); + RPointerArray docs; + CleanupClosePushL( docs ); + // get documents, ownership is not transferred. + aList.GetDocuments( docs ); + + TInt count = docs.Count(); + + // active presentities + for ( TInt i = 0; i < count; i++ ) + { + MPresenceInfo* info = + aPresenceFactory.NewPresenceInfoLC();//<< info + aEntities.AppendL( info ); + // aEntities may contain entries even this method leaves + CleanupStack::Pop();// >> info + + NotifyToPrInfoL( aFactory, aPresenceFactory, *docs[i], *info ); + // Add SIp identity to active users list + MXIMPIdentity* active = aFactory.NewIdentityLC();// << active + aActives.AppendL( active ); + CleanupStack::Pop();// >> active + + // Convert SIP entity URI from UTF to Unicode. + const TDesC8* pUri8 = (docs[i])->EntityURI(); + HBufC16* uri16 = NULL; + uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *pUri8 ); + CleanupStack::PushL( uri16 ); // << uri16 + active->SetIdentityL( uri16->Des() ); + CleanupStack::PopAndDestroy( uri16 );// >> uri16 + } + + using namespace NPresencePlugin::NPresence; + + // Search "terminated" presentities + MSimpleMeta* meta = aList.MetaData(); + // ownership in not transferred + if ( meta && !meta->LocalName().CompareF( KPresenceList8 )) + { + // list element found + RPointerArray elems2; + CleanupClosePushL( elems2 ); + meta->SimpleElementsL( elems2); + TInt count2 = elems2.Count(); + + for ( TInt i = 0; i < count2; i++ ) + { + MSimpleElement* elem2 = elems2[i]; + if ( !elem2->LocalName().CompareF( KPresenceResource8 )) + { + // resource element + RPointerArray elems3; + CleanupClosePushL( elems3 ); + meta->SimpleElementsL( elems3 ); + TInt count3 = elems3.Count(); + + for ( TInt j=0; j < count3; j++ ) + { + MSimpleElement* elem3 = elems3[i]; + + if ( !elem3->LocalName().CompareF( KPresenceInstance8 )) + { + // instance element + const TDesC8* stateVal = + elem3->AttrValue( KPresenceState8 ); + if ( stateVal && stateVal-> + CompareF( KPresenceTerminated8 )) + { + // get next entity if this is not state="terminated" + break; + } + // Save resource element URI into list of + // "terminated" users. + const TDesC8* uri8 = elem2->AttrValue( KPresenceUri8 ); + MXIMPIdentity* terminated = + aFactory.NewIdentityLC();// << terminated + aTerminated.AppendL( terminated ); + CleanupStack::Pop(); // >> terminated + + // Convert SIP entity URI from UTF to Unicode. + HBufC16* uri16 = NULL; + uri16 = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( *uri8 ); + CleanupStack::PushL( uri16 ); // << uri16 + terminated->SetIdentityL( uri16->Des() ); + CleanupStack::PopAndDestroy( uri16 ); // >> uri16 + } + } + CleanupStack::PopAndDestroy( &elems3 ); + } // resource element + }// for (i); list element subelement + CleanupStack::PopAndDestroy( &elems2 ); + } + + CleanupStack::PopAndDestroy( &docs ); + DP_SDA(" CPresencePluginData::NotifyListToPrInfoL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::AddPrPersToSimpleDocumentL +// --------------------------------------------------------------------------- +// +void CPresencePluginData::AddPrPersToSimpleDocumentL( + const MPersonPresenceInfo* aInfo, + MSimpleDocument& aDocument, + const TDesC8& aSipId, TInt aTupleId ) + { + DP_SDA("CPresencePluginData::AddPrPersToSimpleDocumentL start"); + iNumBuf = aTupleId; + // notice: later: generate random id. + + using namespace NPresencePlugin::NPresence; + using namespace NPresenceInfo::NFieldType; + + const MPresenceInfoFieldCollection& coll = aInfo->Fields(); + + const MPresenceInfoField* statusEmumField = NULL; + const MPresenceInfoField* messageField = NULL; + + TInt myCount = coll.FieldCount(); + for ( TInt i = 0; i < myCount; i++ ) + { + DP_SDA("CPresencePluginData::AddPrPersToSimpleDocumentL 1"); + + const MPresenceInfoField& field = coll.FieldAt( i ); + const TDesC8& fieldType = field.FieldType(); + TBuf printBuf; + printBuf.Copy( fieldType ); + + if ( !fieldType.Compare( KAvatar ) ) + { + // Do nothing in sawfis, maybe later? + } + else if ( !fieldType.Compare( KAvailabilityEnum ) ) + { + DP_SDA("AddPrPersToSimpleDocumentL Avaibility"); + statusEmumField = &field; + DP_SDA("AddPrPersToSimpleDocumentL Avaibility done"); + } + else if ( !fieldType.Compare( KStatusMessage ) ) + { + DP_SDA("AddPrPersToSimpleDocumentL statusmessage"); + messageField = &field; + } + } + if ( statusEmumField ) + { + DoCreateDocumentL( aDocument, aSipId, + statusEmumField, messageField ); + } + + + DP_SDA("CPresencePluginData::AddPrPersToSimpleDocumentL end"); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginData::CreatePresenceUri8LC +// --------------------------------------------------------------------------- +// +HBufC8* CPresencePluginData::CreatePresenceUri8LC( + const TDesC8& aPresentityUri ) + { + DP_SDA("CPresencePluginData::CreatePresenceUri8LC "); + const TInt KMyLenSipPrefix = 4; + const TInt KMyLenSipsPrefix = 5; + _LIT8( KMySip8, "sip:" ); + _LIT8( KMySips8, "sips:" ); + TInt uriLen = aPresentityUri.Length(); + DP_SDA2( "CPresencePluginData::CreatePresenceUri8LC - param length: %d ", uriLen ); + + //For debugging purposes + //TBuf<256> tmpPresentityUri; + //tmpPresentityUri.Copy( aPresentityUri ); + //DP_SDA2( "CPresencePluginData::CreatePresenceUri8LC - URI: %S ", &tmpPresentityUri ); + + HBufC8* buf = HBufC8::NewLC( uriLen ); + TPtr8 pBuf( buf->Des() ); + + //SIP uri check + if ( !aPresentityUri.Left( KMyLenSipPrefix ).CompareF( KMySip8 ) ) + { + DP_SDA("CPresencePluginData::CreatePresenceUri8LC (sip:) prefix in SIP URI "); + pBuf.Append( aPresentityUri ); + } + else if ( !aPresentityUri.Left( KMyLenSipsPrefix ).CompareF( KMySips8 ) ) + { + DP_SDA( "CPresencePluginData::CreatePresenceUri8LC (sips:) prefix in SIP URI " ); + pBuf.Append( aPresentityUri ); + } + else // No prefix, strange ... + { + DP_SDA( "CPresencePluginData::CreatePresenceUri8LC NO prefix in SIP URI, adding... " ); + // Maybe should check which prefix to use, + // but assume that no secure is used if prefix missing + TInt len = aPresentityUri.Length() + KMyLenSipPrefix; + buf = buf->ReAllocL( len ); + //update pointer after realloc + CleanupStack::Pop( 1 ); + CleanupStack::PushL( buf ); + // Since realloc may have changed the location in memory + // we must also reset ptr + pBuf.Set( buf->Des() ); + pBuf.Append( KMySip8 ); + pBuf.Append( aPresentityUri ); + } + return buf; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::RemovePrefixLC +// --------------------------------------------------------------------------- +// +HBufC16* CPresencePluginData::RemovePrefixLC( + const TDesC& aPresentityUri ) + { + DP_SDA2("CPresencePluginData::RemovePrefixLC, uri: %S", &aPresentityUri ); + + HBufC* withouPrefix = HBufC::NewLC( KBufSize255 ); + TPtr withouPrefixPtr( withouPrefix->Des() ); + + TInt prefixLocation = aPresentityUri.Locate( ':' ); + DP_SDA2("CPresencePluginData::RemovePrefixLC, prefix pos: %d", prefixLocation ); + if ( KErrNotFound != prefixLocation ) + { + DP_SDA("CPresencePluginData::RemovePrefixLC - has prefix"); + withouPrefixPtr.Copy( aPresentityUri.Mid( prefixLocation+1 ) ); + DP_SDA("CPresencePluginData::RemovePrefixLC - copy ok"); + } + else + { + DP_SDA("CPresencePluginData::RemovePrefixLC - has no prefix"); + withouPrefixPtr.Copy( aPresentityUri ); + } + + //DP_SDA2("CPresencePluginData::RemovePrefixLC - returns %S", *withouPrefix ); + return withouPrefix; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::DoCreateDocumentL() +// --------------------------------------------------------------------------- +// +void CPresencePluginData::DoCreateDocumentL( + MSimpleDocument& aDocument, + const TDesC8& aSipId, + const MPresenceInfoField* aStatusField, + const MPresenceInfoField* aMessageField ) + { + DP_SDA("CPresencePluginData::DoCreateDocumentL "); + const TInt KNumBuf = 20; + const TInt KTupleBuf = 10; + + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceStates; + using namespace NPresenceInfo::NFieldType; + + TBuf numBuf; + TBuf tupleBuf; + + tupleBuf.Copy( KIndent ); + numBuf.Num( iNumBuf ); + tupleBuf.Append( numBuf ); + DP_SDA2("CPresencePluginData::DoCreateDocumentL id %d", iNumBuf); + DP_SDA("CPresencePluginData::DoCreateDocumentL 2"); + + //Add tuple id to document + MSimpleElement* tuple = aDocument.AddSimpleElementL( KPresenceTuple8 ); + CleanupClosePushL( *tuple ); + tuple->AddAttrL( KPresenceId8, tupleBuf); + + //Presence status field + MSimpleElement* status = tuple->AddSimpleElementL( KPresenceStatus8 ); + CleanupClosePushL( *status ); + + //basic field + MSimpleElement* basic = status->AddSimpleElementL( KPresenceBasic8 ); + CleanupClosePushL( *basic ); + + basic->SetContentUnicodeL( DoCheckBasicStatusValueL( *aStatusField ) ); + + DP_SDA("CPresencePluginData::DoCreateDocumentL Basic ok, check msg"); + + if ( aMessageField ) + { + DP_SDA("CPresencePluginData::DoCreateDocumentL message field"); + //Creating note + MSimpleElement* note = + aDocument.AddSimpleElementL( KPresenceNote8 ); + CleanupClosePushL( *note ); + + // Get status msg field from info field + const MPresenceInfoFieldValueText* textField = + TXIMPGetInterface< + const MPresenceInfoFieldValueText >::From( + aMessageField->FieldValue(), + MXIMPBase::EPanicIfUnknown ); + note->SetContentUnicodeL( textField->TextValue() ); + CleanupStack::PopAndDestroy( note ); + } + + /* Basic model example + + + open + + closed + + sip:someone@example.com + + sleeping + + */ + + DP_SDA("CPresencePluginData::DoCreateDocumentL Rich presence person"); + //Creatin person presence field + MSimpleElement* pers = + aDocument.AddSimpleElementL( KSimpleNsPDM, KPresencePerson8 ); + CleanupClosePushL( *pers ); + TBuf buf; + TBuf personId; + personId.Copy( KPersonId ); + buf.Num( iNumBuf ); + personId.Append( buf ); + pers->AddAttrL( KPresenceId8, personId ); + DP_SDA("CPresencePluginData::DoCreateDocumentL Rich presence person ok"); + + HBufC8* urlBuf = CreatePresenceUri8LC( aSipId ); + DP_SDA("CPresencePluginData::DoCreateDocumentL Push urlBuf"); + + aDocument.SetEntityURIL( urlBuf->Des() ); + DP_SDA("CPresencePluginData::DoCreateDocumentL 2"); + + DP_SDA("CPresencePluginData::DoCreateDocumentLC Rich presence activities"); + MSimpleElement* activ = pers->AddSimpleElementL( + KSimpleNsRPID, KPresenceActivities8 ); + CleanupClosePushL( *activ ); + + //unknown used if person presence is just open or closed + MSimpleElement* unknown = activ->AddSimpleElementL( + KSimpleNsRPID, DoCheckActivitiesValueL( *aStatusField ) ); + DP_SDA("CPresencePluginData::DoCreateDocumentL, unknown/status element created"); + CleanupClosePushL( *unknown ); + + DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy unknown"); + CleanupStack::PopAndDestroy( unknown ); + DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy activ"); + CleanupStack::PopAndDestroy( activ ); + + DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy urlBuf"); + CleanupStack::PopAndDestroy( urlBuf ); + + DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy pers"); + CleanupStack::PopAndDestroy( pers ); + DP_SDA("CPresencePluginData::DoCreateDocumentL Rich presence activities ok"); + + DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy basic"); + CleanupStack::PopAndDestroy( basic ); + + DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy status"); + CleanupStack::PopAndDestroy( status ); + + DP_SDA("CPresencePluginData::DoCreateDocumentL Destroy tuple"); + CleanupStack::PopAndDestroy( tuple ); + DP_SDA("CPresencePluginData::DoCreateDocumentL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::DoCheckBasicStatusValueL() +// --------------------------------------------------------------------------- +// +TPtrC CPresencePluginData::DoCheckBasicStatusValueL( + const MPresenceInfoField& aField ) + { + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceStates; + using namespace NPresenceInfo::NFieldType; + + TPtrC basicStatus( KPresenceOpen ); //default status open + //First check what is person status value + const MXIMPBase& storage = aField.FieldValue(); + const MPresenceInfoFieldValueEnum* enumObject = + TXIMPGetInterface< const MPresenceInfoFieldValueEnum >:: + From( storage,MXIMPBase::EReturnNullIfUnknown ); + + __ASSERT_ALWAYS( NULL != enumObject, User::Leave( KErrArgument ) ); + + DP_SDA2(" DoCheckBasicStatusValueL - enumValue: %d", enumObject->Value() ); + switch ( enumObject->Value() ) + { + case NPresenceInfo::EAvailable: + { + DP_SDA("DoCheckBasicStatusValueL stopPublish false status open"); + iConnObs.SetStopPublishState( EFalse ); + basicStatus.Set( KPresenceOpen ); + } + break; + + case NPresenceInfo::EOffline: + case NPresenceInfo::EHidden: + case NPresenceInfo::ENotAvailable: + { + //If state is closed we can stop publish + //if client is going to offline + DP_SDA("DoCheckBasicStatusValueL stopPublish true status Closed"); + iConnObs.SetStopPublishState( ETrue ); + basicStatus.Set( KPresenceClosed ); + } + break; + + default: + { + DP_SDA("DoCheckBasicStatusValueL stopPublish false else open"); + iConnObs.SetStopPublishState( EFalse ); + basicStatus.Set( KPresenceOpen ); + } + break; + } + return basicStatus; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::DoCheckActivitiesValueL() +// --------------------------------------------------------------------------- +// +TPtrC8 CPresencePluginData::DoCheckActivitiesValueL( + const MPresenceInfoField& aField ) + { + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceStates; + using namespace NPresenceInfo::NFieldType; + + TPtrC8 activities( KPresenceUnknow8 ); //default activities unknown + + const MXIMPBase& storage = aField.FieldValue(); + const MPresenceInfoFieldValueEnum* enumObject = + TXIMPGetInterface< const MPresenceInfoFieldValueEnum >:: + From( storage,MXIMPBase::EReturnNullIfUnknown ); + + __ASSERT_ALWAYS( NULL != enumObject, User::Leave( KErrArgument ) ); + + DP_SDA2(" DoCheckActivitiesValueL - enumValue: %d", enumObject->Value() ); + switch ( enumObject->Value() ) + { + case NPresenceInfo::EAvailable: + { + DP_SDA("DoCheckActivitiesValueL - available, set publish"); + iConnObs.SetStopPublishState( EFalse ); + DP_SDA("DoCheckActivitiesValueL - available, set value"); + activities.Set( KPresenceUnknow8 ); + DP_SDA("DoCheckActivitiesValueL - available, ok"); + } + break; + + case NPresenceInfo::EOffline: + case NPresenceInfo::ENotAvailable: + { + DP_SDA("DoCheckActivitiesValueL - offline/not available"); + iConnObs.SetStopPublishState( ETrue ); + activities.Set( KPresenceUnknow8 ); + } + break; + + case NPresenceInfo::EBusy: + { + DP_SDA("DoCheckActivitiesValueL - busy"); + iConnObs.SetStopPublishState( EFalse ); + activities.Set( KPresenceBusy8 ); + } + break; + + case NPresenceInfo::EExtAway: + case NPresenceInfo::EAway: + { + DP_SDA("DoCheckActivitiesValueL - away"); + iConnObs.SetStopPublishState( EFalse ); + activities.Set( KPresenceAway8 ); + } + break; + + case NPresenceInfo::EOnPhone: + { + DP_SDA("DoCheckActivitiesValueL - on phone"); + iConnObs.SetStopPublishState( EFalse ); + activities.Set( KPresenceOnThePhone8 ); + } + break; + + + case NPresenceInfo::EDoNotDisturb: + { + DP_SDA("DoCheckActivitiesValueL - dnd"); + iConnObs.SetStopPublishState( EFalse ); + activities.Set( KPresenceDoNotDisturb8 ); + } + break; + + default: + { + DP_SDA("DoCheckActivitiesValueL default => unknown"); + iConnObs.SetStopPublishState( EFalse ); + activities.Set( KPresenceUnknow8 ); + } + break; + } + DP_SDA("DoCheckActivitiesValueL - done and return"); + return activities; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::DoCheckNoteValueL() +// --------------------------------------------------------------------------- +// +TPtrC CPresencePluginData::DoCheckNoteValueL( + const MPresenceInfoField& aField ) + { + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceStates; + using namespace NPresenceInfo::NFieldType; + + TPtrC note( KPresenceUnknow ); //default activities unknown + //First check what is person status value + const MXIMPBase& storage = aField.FieldValue(); + const MPresenceInfoFieldValueText* text = + TXIMPGetInterface< const MPresenceInfoFieldValueText >:: + From( storage,MXIMPBase::EReturnNullIfUnknown ); + + __ASSERT_ALWAYS( NULL != text, User::Leave( KErrArgument ) ); + + TBuf buffer; + buffer.Copy( text->TextValue() ); + + //Check if status is closed + if( !buffer.CompareF( KPresenceClosed ) ) + { + //If state is closed we can stop publish + //if client is going to offline + DP_SDA("DoCheckNoteValueL stopPublish true closed"); + iConnObs.SetStopPublishState( ETrue ); + note.Set( KPresenceOffline ); + } + else if( !buffer.CompareF( KPresenceOpen ) ) + { + DP_SDA("DoCheckNoteValueL stopPublish false open"); + iConnObs.SetStopPublishState( EFalse ); + note.Set( KPresenceAvailable ); + } + else if( !buffer.CompareF( KPresenceBusy ) ) + { + DP_SDA("DoCheckNoteValueL activities BUSY"); + iConnObs.SetStopPublishState( EFalse ); + note.Set( KPresenceBusy ); + } + else if( !buffer.CompareF( KPresenceOnThePhone ) ) + { + DP_SDA("DoCheckNoteValueL activities OnThePhone"); + iConnObs.SetStopPublishState( EFalse ); + note.Set( KPresenceOnThePhone ); + } + else if( !buffer.CompareF( KPresenceAway ) ) + { + DP_SDA("DoCheckNoteValueL activities OnThePhone"); + iConnObs.SetStopPublishState( EFalse ); + note.Set( KPresenceAway ); + } + else + { + DP_SDA("DoCheckNoteValueL stopPublish false"); + iConnObs.SetStopPublishState( EFalse ); + note.Set( KPresenceUnknow ); + } + return note; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginData::GenerateTupleId() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginData::GenerateTupleId() + { + // Generate unique session tuple id + DP_SDA("CPresencePluginData::GenerateTupleId start"); + const TInt KMaxRand = KMaxNumber; + TInt64 seed; + TTime time; + time.HomeTime(); + seed = time.Int64(); + TInt random = Math::Rand( seed ) % KMaxRand; + DP_SDA("CPresencePluginData::GenerateTupleId 1"); + return random; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::ServiceId() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginData::ServiceId() + { + return iServiceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::ServiceNameLC() +// --------------------------------------------------------------------------- +// +HBufC* CPresencePluginData::ServiceNameLC( TInt aServiceId ) const + { + CSPSettings* spSettings = CSPSettings::NewLC(); + CSPEntry* entry = CSPEntry::NewLC(); + HBufC* serviceName = NULL; + + User::LeaveIfError( spSettings->FindEntryL( aServiceId, *entry ) ); + + serviceName = entry->GetServiceName().AllocL(); + + CleanupStack::PopAndDestroy( entry ); + CleanupStack::PopAndDestroy( spSettings ); + CleanupStack::PushL( serviceName ); + return serviceName; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::ResolveCacheXspIdentifierL() +// --------------------------------------------------------------------------- +// +HBufC* CPresencePluginData::ResolveCacheXspIdentifierL( + const TDesC& aIdentity ) const + { + DP_SDA( "CPresencePluginData::ResolveCacheXspIdentifierL" ); + + CSPSettings* spSettings = CSPSettings::NewLC(); + CSPEntry* entry = CSPEntry::NewLC(); + + User::LeaveIfError( spSettings->FindEntryL( iServiceId, *entry ) ); + + TInt cacheUriLength = ( entry->GetServiceName().Length() + + aIdentity.Length() + 1 ); + + HBufC* cacheUri = HBufC::NewL( cacheUriLength ); + TPtr cacheUriPtr( cacheUri->Des() ); + + cacheUriPtr.Append( entry->GetServiceName() ); + cacheUriPtr.Append( ':' ); + cacheUriPtr.Append( aIdentity ); + + CleanupStack::PopAndDestroy( entry ); + CleanupStack::PopAndDestroy( spSettings ); + + DP_SDA2( "CPresencePluginData::ResolveCacheXspIdentifierL returns: %S", cacheUri ); + return cacheUri; + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::WriteBlockItemsToCacheL() +// --------------------------------------------------------------------------- +// +void CPresencePluginData::WriteStatusToCacheL( + const TDesC& aPresentityId, + MPresenceBuddyInfo2::TAvailabilityValues aAvailability, + const TDesC& aAvailabilityText, + const TDesC& aStatusMessage ) + { + DP_SDA( "CPresencePluginData::WriteStatusToCacheL start" ); + DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, aStatus: %d", + aAvailability ); + DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, availabilityText: %S", + &aAvailabilityText ); + DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, statusMessage: %S", + &aStatusMessage ); + + TBool updateCache( ETrue ); + + // Decode encoded username (spaces to %20). + HBufC* decodedUsername = EscapeUtils::EscapeDecodeL( aPresentityId ); + CleanupStack::PushL( decodedUsername ); + + // convert to 8 bit version + HBufC8* tmp = HBufC8::NewLC( decodedUsername->Length() ); + tmp->Des().Copy( *decodedUsername ); + + // convert to unicode + HBufC* userName16 = + EscapeUtils::ConvertToUnicodeFromUtf8L( tmp->Des() ); + + HBufC* cacheUri = ResolveCacheXspIdentifierL( userName16->Des() ); + CleanupStack::PopAndDestroy( tmp ); + CleanupStack::PopAndDestroy( decodedUsername ); + delete userName16; + CleanupStack::PushL( cacheUri ); + + DP_SDA(" -> WriteStatusToCacheL - read previous values from cache"); + + // Read previous values from cache + MPresenceBuddyInfo2* previousPresInfo = + iPresenceCacheReader->PresenceInfoLC( *cacheUri ); + + if ( previousPresInfo ) + { + DP_SDA(" -> WriteStatusToCacheL - get availability value"); + + MPresenceBuddyInfo2::TAvailabilityValues availability = + previousPresInfo->Availability(); + + DP_SDA(" -> WriteStatusToCacheL - get availability text"); + + TPtrC availabilityText = previousPresInfo->AvailabilityText(); + + DP_SDA(" -> WriteStatusToCacheL - get status message"); + + TPtrC statusMessage = previousPresInfo->StatusMessage(); + CleanupStack::PopAndDestroy(); //previousPresInfo + + DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, OLD STATUS: %d", + availability ); + DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, OLD AVAILABILITY TEXT: %S", + &availabilityText ); + DP_SDA2( "CPresencePluginData::WriteStatusToCacheL, OLD STATUS MESSAGE: %S", + &statusMessage ); + + if ( ( aAvailability == availability ) && + ( aAvailabilityText.Compare( availabilityText ) == 0 ) && + ( aStatusMessage.Compare( statusMessage ) == 0 )) + { + DP_SDA(" -> WriteStatusToCacheL - no need to update cache"); + updateCache = EFalse; + } + } + + if ( updateCache ) + { + MPresenceBuddyInfo2* newPresInfo = MPresenceBuddyInfo2::NewLC(); + newPresInfo->SetIdentityL( *cacheUri ); + + DP_SDA(" -> WriteStatusToCacheL - update cache"); + + TBuf buf; + TBool handled = EFalse; + + buf.Copy( KBlockedExtensionValue ); + + if( aAvailabilityText.Compare( buf ) == 0 ) + { + DP_SDA( " -> WriteStatusToCacheL - set Blocked" ); + newPresInfo->SetAnyFieldL( KExtensionKey, KBlockedExtensionValue ); + handled = ETrue; + } + + buf.Copy( KPendingRequestExtensionValue ); + + if ( aAvailabilityText.Compare( buf ) == 0 ) + { + DP_SDA( " -> WriteStatusToCacheL - set Pending request" ); + newPresInfo->SetAnyFieldL( KExtensionKey, KPendingRequestExtensionValue ); + handled = ETrue; + } + + if ( !handled ) + { + DP_SDA2( " -> WriteStatusToCacheL - set availability text: %S", &aAvailabilityText ); + newPresInfo->SetAvailabilityL( aAvailability, aAvailabilityText ); + } + + if ( aStatusMessage.Length() ) + { + DP_SDA2( " -> WriteStatusToCacheL - set status message: %S", &aStatusMessage ); + newPresInfo->SetStatusMessageL( aStatusMessage ); + } + + DP_SDA( " -> WriteStatusToCacheL - write presence to cache" ); + TInt cacheError = iPresenceCacheWriter->WritePresenceL( newPresInfo ); + DP_SDA2( "CPresencePluginEntityWatcher::WriteStatusToCacheL error: %d", + cacheError ); + + DP_SDA( " -> destroy buddy info" ); + CleanupStack::PopAndDestroy(); // newPresInfo + } + + DP_SDA(" -> destroy uri"); + CleanupStack::PopAndDestroy( cacheUri ); + + DP_SDA("CPresencePluginData::WriteStatusToCacheL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::RemoveCacheL() +// --------------------------------------------------------------------------- +// +void CPresencePluginData::RemoveCacheL() + { + DP_SDA("CPresencePluginData::RemoveCacheL"); + + // Resolve service name (cache xsp identifier) + CSPSettings* spSettings = CSPSettings::NewL(); + CleanupStack::PushL( spSettings ); + + CSPEntry* entry = CSPEntry::NewLC(); + DP_SDA2(" -> RemoveCacheL look for service: %d", ServiceId() ); + spSettings->FindEntryL( ServiceId(), *entry ); + + DP_SDA(" -> RemoveCacheL cache xsp identifier found"); + TInt cacheUriLength = entry->GetServiceName().Length(); + DP_SDA2(" -> cache uri length: %d", cacheUriLength ); + + HBufC* cacheUri = HBufC::NewLC( cacheUriLength ); + TPtr cacheUriPtr( cacheUri->Des() ); + + DP_SDA(" -> RemoveCacheL - form cache entry"); + cacheUriPtr.Append( entry->GetServiceName() ); + + DP_SDA(" -> RemoveCacheL - delete cache entries"); + TInt error = iPresenceCacheWriter->DeleteService( cacheUriPtr ); + DP_SDA2(" -> RemoveCacheL - delete error: %d", error ); + CleanupStack::PopAndDestroy( cacheUri ); + + DP_SDA(" -> destroy sp entry"); + CleanupStack::PopAndDestroy( entry ); + DP_SDA(" -> destroy sp"); + CleanupStack::PopAndDestroy( spSettings ); + DP_SDA("CPresencePluginData::RemoveCacheL out"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::DeletePresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginData::DeletePresenceL( const TDesC& aIdentity ) + { + DP_SDA("CPresencePluginData::DeletePresenceL"); + + // Resolve service name (cache xsp identifier) + CSPSettings* spSettings = CSPSettings::NewL(); + CleanupStack::PushL( spSettings ); + CSPEntry* entry = CSPEntry::NewLC(); + DP_SDA2(" -> DeletePresenceL look for service: %d", ServiceId() ); + spSettings->FindEntryL( ServiceId(), *entry ); + + DP_SDA(" -> DeletePresenceL cache xsp identifier found"); + TInt cacheUriLength = ( entry->GetServiceName().Length() + + aIdentity.Length() + 1 ); + DP_SDA2(" -> cache uri length: %d", cacheUriLength ); + + HBufC* cacheUri = HBufC::NewLC( cacheUriLength ); + TPtr cacheUriPtr( cacheUri->Des() ); + + DP_SDA(" -> DeletePresenceL - form cache entry"); + cacheUriPtr.Append( entry->GetServiceName() ); + cacheUriPtr.Append( ':' ); + cacheUriPtr.Append( aIdentity ); + + iPresenceCacheWriter->DeletePresenceL( cacheUriPtr ); + + CleanupStack::PopAndDestroy( cacheUri ); + CleanupStack::PopAndDestroy( entry ); + DP_SDA(" -> destroy sp"); + CleanupStack::PopAndDestroy( spSettings ); + DP_SDA("CPresencePluginData::DeletePresenceL out"); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginData::StorePresenceOwnPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginData::StorePresenceOwnPresenceL( + const TUint aServiceId, + NPresenceInfo::TAvailabilityValues aAvailability, + const TDesC& aStatusMessage ) + { + DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL IN"); + DP_SDA2(" -> aServiceId: %d", aServiceId ); + + DP_SDA2(" -> SAVE AVAILABILITY VALUE: %d", aAvailability ); + DP_SDA2(" -> SAVE STATUS MESSAGE: %S", &aStatusMessage ); + + MVIMPSTSettingsStore* settings = CVIMPSTSettingsStore::NewLC(); + + DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL 1"); + + // Store availability value to uiservicetabsettings + TInt availabilityInt = ( ( TInt ) aAvailability ); + User::LeaveIfError( settings->SetL( + aServiceId, EServicePresenceAvailablilityValue, availabilityInt ) ); + + DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL 2"); + + // Store custom status message to uiservicetabsettings + User::LeaveIfError( settings->SetL( + aServiceId, EServiceCustomStatusMessage, aStatusMessage ) ); + + CleanupStack::PopAndDestroy(); //settings + + DP_SDA("CPresencePluginData::StorePresenceOwnPresenceL OUT"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::ReadDocumentIdL() +// --------------------------------------------------------------------------- +// +void CPresencePluginData::ReadDocumentIdL( + const TInt aServiceId, + TDes8& aDocumentId ) + { + DP_SDA("CPresencePluginData::ReadDocumentIdL IN"); + + DP_SDA2(" -> aServiceId: %d", aServiceId ); + + MVIMPSTSettingsStore* settings = CVIMPSTSettingsStore::NewLC(); + + RBuf8 documentId; + CleanupClosePushL( documentId ); + documentId.CreateL( KBufSize255 ); + + TInt error = settings->GetL( + aServiceId, EServicePresenceSessionIdentifier, documentId ); + + DP_SDA2(" -> ERROR: %d", error ); + DP_SDA2(" -> DOCUMENT ID LENGTH: %d", documentId.Length() ); + + if ( !error && documentId.Length() ) + { + aDocumentId.Copy( documentId ); + + TBuf printDocumentId; + printDocumentId.Copy( aDocumentId ); + DP_SDA("CPresencePluginData::ReadDocumentIdL - 1"); + DP_SDA2(" -> READ DOCUMENT ID: %S", &printDocumentId ); + } + else if ( KErrNotFound == error || !documentId.Length() ) + { + DP_SDA("CPresencePluginData::ReadDocumentIdL - 2"); + // If document id lenght is zero (KNullDesC8) or error + // is KErrNotFound leave with KErrNotFound + User::Leave( KErrNotFound ); + } + else + { + User::Leave( error ); + } + + CleanupStack::PopAndDestroy( &documentId ); + CleanupStack::PopAndDestroy(); //settings + + DP_SDA("CPresencePluginData::ReadDocumentIdL OUT"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginData::DeletePresenceVariablesL() +// --------------------------------------------------------------------------- +// +void CPresencePluginData::DeletePresenceVariablesL( const TInt aServiceId ) + { + DP_SDA("CPresencePluginData::DeletePresenceVariablesL IN"); + DP_SDA2(" -> aServiceId: %d", aServiceId ); + + MVIMPSTSettingsStore* settings = CVIMPSTSettingsStore::NewLC(); + + // Reset availability value in uiservicetabsettings + User::LeaveIfError( settings->SetL( + aServiceId, EServicePresenceAvailablilityValue, KErrNotFound ) ); + + // Reset status message in uiservicetabsettings + User::LeaveIfError( settings->SetL( + aServiceId, EServiceCustomStatusMessage, KNullDesC ) ); + + // Reset document id value in uiservicetabsettings + User::LeaveIfError( settings->SetL( + aServiceId, EServicePresenceSessionIdentifier, KNullDesC8 ) ); + + CleanupStack::PopAndDestroy(); // settings + + DP_SDA("CPresencePluginData::DeletePresenceVariablesL OUT"); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginData::ResolveNoteElementL +// Returns element corresponding current locale or first +// element if better match is not found. +// --------------------------------------------------------------------------- +// +MSimpleElement* CPresencePluginData::ResolveNoteElementL( + const RPointerArray& aElements ) const + { + DP_SDA("CPresencePluginData::ResolveNoteElementL" ) + + MSimpleElement* bestMatch = NULL; + MSimpleElement* secondBestMatch = NULL; + + for ( TInt i = aElements.Count() - 1; i >= 0 && NULL == bestMatch; i-- ) + { + MSimpleElement* element = aElements[i]; + + using namespace NPresencePlugin::NPresence; + if ( 0 == element->LocalName().CompareF( KPresenceNote8 ) ) + { + if ( IsElementLanguageValidForCurrentLocaleL( *element ) ) + { + DP_SDA("CPresencePluginData::ResolveNoteElementL, BEST MATCH.") + bestMatch = element; + } + else + { + secondBestMatch = element; + } + } + } + + return ( bestMatch ? bestMatch : secondBestMatch ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginData::IsElementLanguageValidForCurrentLocaleL +// --------------------------------------------------------------------------- +// +TBool CPresencePluginData::IsElementLanguageValidForCurrentLocaleL( + MSimpleElement& aElement ) const + { + DP_SDA( "CPresencePluginData::IsElementLanguageValidForCurrentLocaleL" ) + + TBool isLanguageResolved = EFalse; + _LIT8( KLanguageAttribute, "xml:lang" ); + + TLanguage language = User::Language(); + RPointerArray attributes; + CleanupClosePushL( attributes ); + aElement.SimpleAttributesL( attributes ); + for ( TInt i = attributes.Count() - 1; i >= 0 && !isLanguageResolved; i-- ) + { + if ( 0 == KLanguageAttribute().CompareF( attributes[i]->Name() ) ) + { + const TDesC8& attributeValue = attributes[i]->Value(); + for ( TInt index = 0; index < KLanguageCodeMappingsCount; index++ ) + { + if ( language == KLanguageCodeMappings[index].SymbianLanguageCode() && + 0 == attributeValue.CompareF( + KLanguageCodeMappings[index].IsoLanguageCode() ) ) + { + isLanguageResolved = ETrue; + } + } + } + } + CleanupStack::Pop( &attributes ); + + return isLanguageResolved; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginentitywatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginentitywatcher.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,689 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presencepluginentitywatcher.h" +#include "presenceplugindata.h" +#include "presencepluginwatcher.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::CPresencePluginEntityWatcher() +// --------------------------------------------------------------------------- +// +CPresencePluginEntityWatcher::CPresencePluginEntityWatcher( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginWatcher& aWatcher ) + :iConnObs(aObs), iConnection(aConn), + iPluginWatcher(aWatcher), iOperation( EPluginIdle ) + { + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::ConstructL( + CPresencePluginData* aPresenceData ) + { + DP_SDA("CPresencePluginEntityWatcher::ConstructL - begin"); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + iPresenceData = aPresenceData; + DP_SDA("CPresencePluginEntityWatcher::ConstructL - end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginEntityWatcher* CPresencePluginEntityWatcher::NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginWatcher& aWatcher, + CPresencePluginData* aPresenceData ) + { + DP_SDA("CPresencePluginEntityWatcher::NewL"); + CPresencePluginEntityWatcher* self = + new( ELeave ) CPresencePluginEntityWatcher( aObs, aConn, aWatcher ); + CleanupStack::PushL( self ); + self->ConstructL( aPresenceData ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::~CPresencePluginEntityWatcher() +// --------------------------------------------------------------------------- +// +CPresencePluginEntityWatcher::~CPresencePluginEntityWatcher() + { + DP_SDA("CPresencePluginEntityWatcher::~CPresencePluginEntityWatcher"); + if ( iWatcher ) + { + iWatcher->Close(); + } + delete iEntityId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StartSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StartSubscribeL( + const TDesC8& aPresentityId ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL"); + delete iEntityId; + iEntityId = NULL; + DP_SDA(" StartSubscribeL - entity id deleted"); + + TRAPD( error, iSimpleId = iWatcher->SubscribeL( + aPresentityId, NULL, ETrue, EFalse );); + DP_SDA2("StartSubscribeL subscribe error %d",error); + + if( KErrNone != error ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL ERROR"); + if( KErrInUse == error ) + { + DP_SDA(" iWatcher is in use try to close and restart"); + iWatcher->Close(); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + DP_SDA("StartSubscribeL Second try after creating iWatcher again"); + error = KErrNone; + TRAP( error, iSimpleId = iWatcher->GetPresenceL( + aPresentityId, NULL, EFalse );); + DP_SDA2("iWatcher->GetPresenceL error2 = %d",error ); + } + } + + // Save entity id after successful call + DP_SDA("StartSubscribeL - allocate entity id"); + iEntityId = aPresentityId.AllocL(); + DP_SDA("StartSubscribeL - new entity id stored"); + + iOperation = EPluginStart; + + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL End"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StartSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StartSubscribeL( + const TDesC8& aPresentityId, TRequestStatus& aClientRequst ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL 2"); + delete iEntityId; + iEntityId = NULL; + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL - entity id deleted"); + + iClientStatus = &aClientRequst; + *iClientStatus = KRequestPending; // wait for watcher complete + iOperation = EPluginStartNotifyClient; + + TRAPD( error, iSimpleId = iWatcher->SubscribeL( + aPresentityId, NULL, ETrue, EFalse );); + DP_SDA2("StartSubscribeL subscribe error %d",error); + + if( KErrInUse == error ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL ERROR"); + DP_SDA("StartSubscribeL iWatcher is in use try to close and restart"); + iWatcher->Close(); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + DP_SDA("StartSubscribeL Second try after creating iWatcher again"); + error = KErrNone; + TRAP( error, iSimpleId = iWatcher->GetPresenceL( + aPresentityId, NULL, EFalse );); + DP_SDA2("iWatcher->GetPresenceL error2 = %d",error ); + } + User::LeaveIfError( error ); + + // Save entity id after successful call + DP_SDA("StartSubscribeL - allocate entity id"); + iEntityId = aPresentityId.AllocL(); + DP_SDA("StartSubscribeL - new entity id stored"); + + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL End"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StopSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StopSubscribeL( + TRequestStatus& aClientRequst ) + { + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL 2 (list)"); + iClientStatus = &aClientRequst; + *iClientStatus = KRequestPending; // wait for watcher complete + + iSimpleId = iWatcher->UnsubscribeL(); + iOperation = EPluginStop; + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL 2 end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StopSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StopSubscribeL( ) + { + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL"); + iSimpleId = iWatcher->UnsubscribeL(); + iOperation = EPluginStop; + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherReqCompleteL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherReqCompleteL( + TInt /*aOpId*/, TInt aStatus ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherReqCompleteL"); + DP_SDA2("WatcherReqCompleteL status %d",aStatus ); + TPluginEntityWatcherOperation orig = iOperation; + DP_SDA2("WatcherReqCompleteL orig %d",orig ); + iOperation = EPluginIdle; + + if( !aStatus ) + { + iPluginWatcher.AcceptL( this ); + } + + if ( EPluginStartNotifyClient == orig ) + { + orig = EPluginStart; + DP_SDA(" WatcherReqCompleteL complete client"); + CompleteClientReq( aStatus ); + } + else if ( iClientStatus ) + { + DP_SDA(" WatcherReqCompleteL complete client 2"); + CompleteClientReq( aStatus ); + } + + MSimpleWatcher::TSimpleSipSubscriptionState subscribeStatus = + iWatcher->SipSubscriptionState(); + DP_SDA2("WatcherReqCompleteL subscribe status %d",subscribeStatus ); + + if ( aStatus && ( orig == EPluginStop || orig == EPluginStart && + MSimpleWatcher::ESimpleStateTerminated != subscribeStatus ) ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherReqCompleteL if"); + // Delete this entity as useless + DP_SDA("WatcherReqCompleteL DELETE WATCHER"); + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + //Do not call anything, + //since the method call above deletes this instance. + } + else if( !aStatus && ( MSimpleWatcher::ESimpleStateActive == + subscribeStatus && + orig == EPluginStop ) ) + { + DP_SDA(" WatcherReqCompleteL state STOP"); + // Delete this entity as useless + DP_SDA("WatcherReqCompleteL DELETE WATCHER 2"); + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + } + else if ( MSimpleWatcher::ESimpleStatePending == subscribeStatus ) + { + SetPendingToXIMPL(); + } + DP_SDA("CPresencePluginEntityWatcher::WatcherReqCompleteL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetPendingToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetPendingToXIMPL() + { + DP_SDA("CPresencePluginEntityWatcher::SetPendingToXIMPL"); + //check what is grand request list subscribe state + if( iConnObs.GrandListState() ) + { + DP_SDA("CPresencePluginEntityWatcher::SetPendingToXIMPL True"); + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + iPresenceData->NotifyToPendingToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( iEntityId->Des() ); + CleanupStack::PushL( uniBuffer ); + + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *uniBuffer ); + identity2->SetIdentityL( *withoutPrefix ); + + //Call presence cache writer too + TBuf<20> buf; + buf.Copy( KPendingRequestExtensionValue ); + + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + buf, + KNullDesC() ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( uniBuffer ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop(); // >> prInfo + } + DP_SDA("CPresencePluginEntityWatcher::SipSubscriptionState end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetActiveToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetActiveToXIMPL( const TDesC& aIdentity ) + { + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, identity"); + //check what is grand request list subscribe state + if( iConnObs.GrandListState() ) + { + DP_SDA("CPresencePluginEntityWatcher::SetPendingToXIMPL True"); + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + DP_SDA(" SetPendingToXIMPL, notify active"); + iPresenceData->NotifyToActiveToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + DP_SDA(" SetActiveToXIMPL, create new identity"); + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + + DP_SDA(" SetActiveToXIMPL, strip prefix"); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( aIdentity ); + identity2->SetIdentityL( *withoutPrefix ); + + DP_SDA(" SetActiveToXIMPL, write to cache"); + //Call presence cache writer too + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + KDefaultAvailableStatus(), + KNullDesC() ); + + DP_SDA(" SetActiveToXIMPL, ximp api callback"); + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, cleanup"); + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop(); // >> prInfo + } + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetTerminatedToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetTerminatedToXIMPL( + const TDesC& aIdentity ) + { + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL"); + DP_SDA2("CPresencePluginEntityWatcher::SetTerminatedToXIMPL, uri: %S", + &aIdentity ); + //check what is grand request list subscribe state + if( iConnObs.GrandListState() ) + { + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL True"); + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + iPresenceData->NotifyTerminatedToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( aIdentity ); + identity2->SetIdentityL( *withoutPrefix ); + + DP_SDA("SetTerminatedToXIMPL, write offline status to cache"); + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + KNullDesC(), + KNullDesC() ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop( ); // >> prInfo + } + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetActiveToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetActiveToXIMPL( + MSimpleDocument& aDocument ) + { + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, aDocument"); + // No need to check the expiration here since WatcherTerminatedL + // is called then too. + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + DP_SDA(" SetActiveToXIMPL, call NotifyToPrInfoL"); + + iPresenceData->NotifyToPrInfoL( + iConnObs.ObjectFactory(), + iConnObs.PresenceObjectFactoryOwn(), + aDocument, *prInfo ); + DP_SDA(" SetActiveToXIMPL, NotifyToPrInfoL ok"); + + // Get variables from presence info object for cache entry + MPresenceBuddyInfo2::TAvailabilityValues availability = + MPresenceBuddyInfo2::ENotAvailable; + + HBufC* extendedAvailability = HBufC::NewLC( KBufSize255 ); + TPtr extendedAvailabilityPtr( extendedAvailability->Des() ); + + HBufC* statusMessage = HBufC::NewLC( KBufSize255 ); + TPtr statusMessagePtr( statusMessage->Des() ); + + DP_SDA(" SetActiveToXIMPL, NotifyToPrInfoL ok, get cache entries"); + iPresenceData->CacheEntriesFromPrInfo( *prInfo, + availability, extendedAvailabilityPtr, statusMessagePtr ); + + DP_SDA(" SetActiveToXIMPL, create identity"); + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( + *aDocument.EntityURI() ); + CleanupStack::PushL( uniBuffer ); + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, identity ok"); + + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, strip prefix"); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *uniBuffer ); + identity2->SetIdentityL( *withoutPrefix ); + + //Call presence cache writer too + iPresenceData->WriteStatusToCacheL( *withoutPrefix, availability, + extendedAvailabilityPtr, statusMessagePtr ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( uniBuffer ); + CleanupStack::Pop(); // >> identity2 + + CleanupStack::PopAndDestroy( statusMessage ); + CleanupStack::PopAndDestroy( extendedAvailability ); + + CleanupStack::Pop(); // >> prInfo + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetTerminatedToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetTerminatedToXIMPL( ) + { + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL"); + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL True"); + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + iPresenceData->NotifyTerminatedToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( iEntityId->Des() ); + + CleanupStack::PushL( uniBuffer ); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *uniBuffer ); + identity2->SetIdentityL( *withoutPrefix ); + + //Call presence cache writer too + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + KInvisibleState(), + KNullDesC() ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + DP_SDA2("SetTerminatedToXIMPL2: ident %S", &identity2->Identity() ); + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( uniBuffer ); + CleanupStack::Pop(); // >> identity21 + CleanupStack::Pop(); // >> prInfo + + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherNotificationL( + MSimpleDocument& aDocument ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL"); + + MSimpleWatcher::TSimpleSipSubscriptionState subscribeStatus = + iWatcher->SipSubscriptionState(); + DP_SDA2("WatcherNotificationL subscribe status %d",subscribeStatus ); + + //If subscribeStatus = pending + if( MSimpleWatcher::ESimpleStatePending == subscribeStatus ) + { + // Pending + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL PENDING"); + SetPendingToXIMPL(); + } + else if( MSimpleWatcher::ESimpleStateTerminated == subscribeStatus ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL TERMINATED"); + SetTerminatedToXIMPL( ); + } + else + { + //Active + DP_SDA("WatcherNotificationL normal Case"); + SetActiveToXIMPL( aDocument ); + } + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherListNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherListNotificationL( + MSimplePresenceList& aList ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherListNotificationL"); + // call all the necessary callbacks, for new data + teminated ones. + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + + RPointerArray entities; + RPointerArray terminated; + RPointerArray actives; + + TRAPD( err, iPresenceData->NotifyListToPrInfoL( + iConnObs.ObjectFactory(),iConnObs.PresenceObjectFactoryOwn(), + aList, entities, actives, terminated )); + if ( err ) + { + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + actives.ResetAndDestroy(); + entities.Close(); + terminated.Close(); + actives.Close(); + return; + } + + // Start to collect data for HandleSubscribedPresentityPresenceL + TInt counter = entities.Count(); + for ( TInt i = counter-1 ; i>=0; i-- ) + { + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( + actives[i]->Identity() ); + actives[i]->SetIdentityL( *withoutPrefix ); + + watcherHost.HandleSubscribedPresentityPresenceL( + actives[i], entities[i] ); + // Owenership is transferred + actives.Remove(i); + entities.Remove(i); + CleanupStack::PopAndDestroy( withoutPrefix ); + } + + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + actives.ResetAndDestroy(); + + entities.Close(); + terminated.Close(); + actives.Close(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherTerminatedL( + TInt /*aOpId*/, TInt aReason ) + { + DP_SDA2("CPresencePluginEntityWatcher::WatcherTerminatedL -reason: %d", aReason ); + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + + MXIMPDataSubscriptionState *state = + iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + status->SetResultCode( aReason ); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + + HBufC16* buf16 = HBufC16::NewLC( PresentityId().Length()); + buf16->Des().Copy( PresentityId() ); + identity->SetIdentityL( buf16->Des() ); + + //Visualize closed state OpenSer + SetTerminatedToXIMPL( buf16->Des() ); + + CleanupStack::PopAndDestroy( buf16 ); + watcherHost.SetPresentityPresenceDataSubscriptionStateL( + identity, state, status ); + DP_SDA("CPresencePluginEntityWatcher::WatcherTerminatedL pop"); + CleanupStack::Pop( 3 ); + + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + + DP_SDA("CPresencePluginEntityWatcher::WatcherTerminatedL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::CompleteClientReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::CompleteClientReq( TInt aStatus ) + { + DP_SDA("CPresencePluginEntityWatcher::CompleteClientReq"); + iOperation = EPluginIdle; + TRequestStatus* s = iClientStatus; + User::RequestComplete( s, aStatus ); + iClientStatus = NULL; + DP_SDA("CPresencePluginEntityWatcher::CompleteClientReq out"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::PresentityId +// --------------------------------------------------------------------------- +// +TPtrC8 CPresencePluginEntityWatcher::PresentityId( ) + { + DP_SDA("CPresencePluginEntityWatcher::PresentityId"); + return iEntityId ? iEntityId->Des() : TPtrC8(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::XIMPRequestId +// --------------------------------------------------------------------------- +// +TXIMPRequestId CPresencePluginEntityWatcher::XIMPRequestId( ) + { + return iXIMPId; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presenceplugingroup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presenceplugingroup.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,925 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mpresencepluginconnectionobs.h" +#include "presenceplugingroup.h" +#include "presencepluginxdmutils.h" +#include "presenceplugincommon.h" +#include "presencepluginvirtualgroup.h" +#include "presenceplugindata.h" +#include "presencepluginwatcher.h" +#include "presencepluginauthorization.h" +#include "presencepluginutility.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::CPresencePluginGroups +// --------------------------------------------------------------------------- +// +CPresencePluginGroups::CPresencePluginGroups( + MPresencePluginConnectionObs& aObs, + CPresencePluginVirtualGroup* aSubscribedBuddies, + CPresencePluginData* aPresenceData ): + CActive( CActive::EPriorityStandard ), + iConnObs(aObs), + iOperation( ENoOperation), + iState( EPluginIdle ), iCompleted( ETrue ), + iSubscribedBuddies( aSubscribedBuddies ), + iPresenceData( aPresenceData ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::NewL +// --------------------------------------------------------------------------- +// +CPresencePluginGroups* CPresencePluginGroups::NewL( + MPresencePluginConnectionObs& aObs, + CPresencePluginVirtualGroup* aSubscribedBuddies, + CPresencePluginData* aPresenceData ) + { + CPresencePluginGroups* self = + CPresencePluginGroups::NewLC( + aObs, + aSubscribedBuddies, + aPresenceData ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::NewLC +// --------------------------------------------------------------------------- +// +CPresencePluginGroups* CPresencePluginGroups::NewLC( + MPresencePluginConnectionObs& aObs, + CPresencePluginVirtualGroup* aSubscribedBuddies, + CPresencePluginData* aPresenceData ) + { + CPresencePluginGroups* self = + new( ELeave ) CPresencePluginGroups( + aObs, + aSubscribedBuddies, + aPresenceData ); + CleanupStack::PushL( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::~CPresencePluginGroups +// --------------------------------------------------------------------------- +// +CPresencePluginGroups::~CPresencePluginGroups() + { + DP_SDA("CPresencePluginGroups::~CPresencePluginGroups"); + Cancel(); + delete iPresIdentity; + delete iDisplayName; + DP_SDA("CPresencePluginGroups::~CPresencePluginGroups end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoSubscribePresentityGroupListL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoSubscribePresentityGroupListL( + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginGroups::DoSubscribePresentityGroupListL"); + iCompleted = EFalse; + // List of lists under buddylist + StartXdmOperationL( aReqId, EGetListOfLists ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoUnsubscribePresentityGroupListL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoUnsubscribePresentityGroupListL( + TXIMPRequestId /*aReqId*/ ) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoCreatePresentityGroupL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoCreatePresentityGroupL( + const MXIMPIdentity& /*aGroupId*/, + const TDesC16& /*aDisplayName*/, + TXIMPRequestId /*aReqId*/ ) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoDeletePresentityGroupL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoDeletePresentityGroupL( + const MXIMPIdentity& /*aGroupId*/, + TXIMPRequestId /*aReqId*/ ) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoUpdatePresentityGroupDisplayNameL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoUpdatePresentityGroupDisplayNameL( + const MXIMPIdentity& /*aGroupId*/, + const TDesC16& /*aDisplayName*/, + TXIMPRequestId /*aReqId*/ ) + { + // Notice: later + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoSubscribePresentityGroupContentL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoSubscribePresentityGroupContentL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginGroups::DoSubscribePresentityGroupContentL"); + iCompleted = EFalse; + // List of lists under buddylist + StartXdmOperationL( aGroupId, aReqId, EGetListContent ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoUnsubscribePresentityGroupContentL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoUnsubscribePresentityGroupContentL( + const MXIMPIdentity& /*aGroupId*/, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginGroups::DoUnsubscribePresentityGroupContentL"); + + iXIMPId = aReqId; + iConnObs.WatcherHandlerL()->UnSubscribeAllL(); + iCompleted = EFalse; + CompleteXIMPReq( KErrNone ); + DP_SDA("CPresencePluginGroups::DoUnsubscribePresentityGroupContentL out"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoAddPresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoAddPresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + const TDesC16& /*aMemberDisplayName*/, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL"); + __ASSERT_ALWAYS( !IsActive(), User::Leave( KErrNotReady ) ); + + SetPresIdentityL( aMemberId, ETrue ); + + iCompleted = EFalse; + iXIMPId = aReqId; + + if( !aGroupId.Identity().Compare( KPresenceBuddyList ) ) + { + DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL - buddylist"); + TBool contactIsBlocked = EFalse; + RPointerArray blockedList; + CleanupStack::PushL( TCleanupItem( + TPresencePluginUtility::ResetAndDestroyIdentities, + &blockedList ) ); + iXdmUtils->SubscribeBlockListL( blockedList ); + DP_SDA2( "CPresencePluginGroups::DoAddPresentityGroupMemberL - blockedList.Count = %d", + blockedList.Count() ); + + for ( TInt i( 0 ); i < blockedList.Count() && !contactIsBlocked; i++ ) + { + if ( 0 == blockedList[i]->Identity().Compare( aMemberId.Identity() ) ) + { + // contact found from blocked list + contactIsBlocked = ETrue; + } + } + CleanupStack::PopAndDestroy( &blockedList ); + + if ( contactIsBlocked ) + { + DP_SDA( "CPresencePluginGroups::DoAddPresentityGroupMemberL - contact is Blocked" ); + iOperation = EUnblockInAddPresentityGroupMember; + iConnObs.InternalPresenceAuthorization(). + DoPerformCancelPresenceBlockFromPresentityL( + aMemberId, iStatus ); + SetActive(); + } + else + { + DP_SDA( "CPresencePluginGroups::DoAddPresentityGroupMemberL - contact is not Blocked" ); + iOperation = EAddPresentityGroupMember; + // write pending to presence cache + TBuf<20> buf; + buf.Copy( KPendingRequestExtensionValue ); + iPresenceData->WriteStatusToCacheL( aMemberId.Identity(), + MPresenceBuddyInfo2::ENotAvailable, + buf, + KNullDesC() ); + iConnObs.WatcherHandlerL()->DoPerformSubscribePresentityPresenceL( + aMemberId, iStatus ); + SetActive(); + } + } + else if ( !aGroupId.Identity().Compare( KPresenceBlockedList ) ) + { + DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL - blockedlist"); + iOperation = EBlockPresentityGroupMember; + iConnObs.InternalPresenceAuthorization(). + DoPerformBlockPresenceForPresentityL( aMemberId, iStatus ); + SetActive(); + } + else + { + DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL - unknown, leave"); + User::Leave( KErrNotSupported ); + } + + DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL out"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoRemovePresentityGroupMemberL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoRemovePresentityGroupMemberL( + const MXIMPIdentity& aGroupId, + const MXIMPIdentity& aMemberId, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginGroups::DoRemovePresentityGroupMemberL"); + __ASSERT_ALWAYS( !IsActive(), User::Leave( KErrNotReady ) ); + + SetPresIdentityL( aMemberId, ETrue ); + + iCompleted = EFalse; + iXIMPId = aReqId; + iOperation = ERemovePresentityGroupMember; + + if( !aGroupId.Identity().Compare( KPresenceBuddyList ) ) + { + DP_SDA( "DoRemovePresentityGroupMemberL - buddylist" ); + iConnObs.WatcherHandlerL()->DoPerformUnsubscribePresentityPresenceL( + aMemberId, iStatus ); + SetActive(); + } + else if ( !aGroupId.Identity().Compare( KPresenceBlockedList ) ) + { + DP_SDA( "DoRemovePresentityGroupMemberL - blockedlist" ); + // Contact blocking is not cancelled when blocked contact is removed + // user can remove blocking from blocked list later + DeletePersonCacheL(); + CompleteXIMPReq( KErrNone ); + } + else + { + DP_SDA("DoRemovePresentityGroupMemberL - unknown, leave"); + User::Leave( KErrNotSupported ); + } + + DP_SDA("CPresencePluginGroups::DoRemovePresentityGroupMemberL out"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL( + const MXIMPIdentity& /*aGroupId*/, + const MXIMPIdentity& /*aMemberId*/, + const TDesC16& /*aMemberDisplayName*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_SDA("CPresencePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL"); + // Notice: Later + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoCancel( ) + { + if ( iOperation != ENoOperation ) + { + iXdmUtils->Cancel(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::RunL() + { + DP_SDA("CPresencePluginGroups::RunL"); + TInt myStatus = iStatus.Int(); + DP_SDA2("CPresencePluginGroups::RunL myStatus %d", myStatus ); + + if ( !myStatus && !iCompleted ) + { + DP_SDA("CPresencePluginGroups::RunL !myStatus"); + // OK response + CallActualXdmOperationL( myStatus ); + } + else if ( KErrNotFound == myStatus && !iCompleted ) + { + DP_SDA("CPresencePluginGroups::RunL KErrNotFound == myStatus"); + + // DoPerformUnsubscribePresentityPresenceL didn't find watcher + // so it did not execute StopSubscribeL from the watcher. Still + // presentity group member has to be removed. + CallActualXdmOperationL( KErrNone ); + } + else if ( !myStatus && iCompleted ) + { + DP_SDA("CPresencePluginGroups::RunL SEND COMPLETE"); + CompleteXIMPReq( myStatus ); + } + else + { + if ( iOperation == EDeletePresentityGroup && iState == + EPluginCommitRls ) + { + DP_SDA("CPresencePluginGroups::RunL CallActualXdmOperation"); + CallActualXdmOperationL( myStatus ); + } + else + { + DP_SDA("CPresencePluginGroups::RunL SEND COMPLETE 2"); + // Other errors terminated the show + CompleteXIMPReq( myStatus ); + } + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::CallActualXdmOperationL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::CallActualXdmOperationL( TInt aCompleteStatus ) + { + DP_SDA("CPresencePluginGroups::CallActualXdmOperationL"); + + DP_SDA2("CallActualXdmOperationL iOperation %d", iOperation); + switch ( iOperation ) + { + case EGetListOfLists: + { + DP_SDA("PluginGroups::CallActualXdmOperationL EGetListOfLists"); + iOperation = EGetListOfLists; + GetListOfListsL(); + } + break; + + case EGetListContent: + { + DP_SDA("PluginGroups::CallActualXdmOperationL EGetListContent"); + iOperation = EGetListContent; + GetListContentL(); + } + break; + + case EAddPresentityGroupMember: + { + DP_SDA(" CallActualXdmOperationL EAddPresentityGroupMember"); + + iOperation = EGrantPresentityGroupMember; + MXIMPIdentity* newIdentity = + iConnObs.ObjectFactory().NewIdentityLC(); + newIdentity->SetIdentityL( *iPresIdentity ); + + iConnObs.InternalPresenceAuthorization(). + DoPerformGrantPresenceForPresentityL( *newIdentity, iStatus ); + CleanupStack::PopAndDestroy(); // >> newIdentity + SetActive(); + } + break; + + case ERemovePresentityGroupMember: + { + DP_SDA(" CallActualXdmOperationL ERemovePresentityGroupMember"); + iOperation = EWithdrawGrantFromMember; + MXIMPIdentity* newIdentity = iConnObs.ObjectFactory().NewIdentityLC(); + newIdentity->SetIdentityL( *iPresIdentity ); + iConnObs.InternalPresenceAuthorization(). + DoPerformWithdrawPresGrantFromPresentityL( + *newIdentity, iStatus ); + CleanupStack::PopAndDestroy(); // >> newIdentity + SetActive(); + } + break; + + case EGrantPresentityGroupMember: + { + DP_SDA(" CallActualXdmOperationL EGrantPresentityGroupMember"); + CompleteXIMPReq( aCompleteStatus ); + } + break; + + case EWithdrawGrantFromMember: + { + DP_SDA(" CallActualXdmOperationL EWithdrawGrantFromMember"); + if ( !aCompleteStatus ) + { + DP_SDA(" -> succesfully unblocked, store to cache"); + DeletePersonCacheL(); + DP_SDA(" -> store info to cache done"); + } + CompleteXIMPReq( aCompleteStatus ); + } + break; + + case EBlockPresentityGroupMember: + { + DP_SDA(" CallActualXdmOperationL EBlockPresentityGroupMember"); + if ( !aCompleteStatus ) + { + DP_SDA(" -> succesfully blocked, store to cache"); + + DP_SDA(" -> strip prefix from uri"); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( + *iPresIdentity ); + DP_SDA(" -> store info to cache"); + + TBuf<20> buf; + buf.Copy( KBlockedExtensionValue ); + + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::EUnknownAvailability, + buf, + KNullDesC() ); + + CleanupStack::PopAndDestroy( withoutPrefix ); + DP_SDA(" -> store info to cache done"); + } + CompleteXIMPReq( aCompleteStatus ); + } + break; + + case EUnblockPresentityGroupMember: + { + DP_SDA(" CallActualXdmOperationL EUnblockPresentityGroupMember"); + if ( !aCompleteStatus ) + { + DP_SDA(" -> succesfully unblocked, store to cache"); + DeletePersonCacheL(); + DP_SDA(" -> store info to cache done"); + } + CompleteXIMPReq( aCompleteStatus ); + } + break; + + case EUnblockInAddPresentityGroupMember: + { + DP_SDA(" CallActualXdmOperationL EUnblockInAddPresentityGroupMember"); + iOperation = EAddPresentityGroupMember; + MXIMPIdentity* newIdentity = iConnObs.ObjectFactory().NewIdentityLC(); + newIdentity->SetIdentityL( *iPresIdentity ); + + TBuf<20> buf; + buf.Copy( KPendingRequestExtensionValue ); + iPresenceData->WriteStatusToCacheL( *iPresIdentity, + MPresenceBuddyInfo2::ENotAvailable, + buf, KNullDesC() ); + + iConnObs.WatcherHandlerL()->DoPerformSubscribePresentityPresenceL( + *newIdentity, iStatus ); + CleanupStack::PopAndDestroy(); // >> newIdentity + SetActive(); + } + break; + + default: + User::Leave( KErrNotSupported ); + break; + } + DP_SDA("CPresencePluginGroups::CallActualXdmOperationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginGroups::RunError( TInt aError ) + { + DP_SDA("CPresencePluginGroups::RunError SEND COMPLETE"); + // complete the open request + CompleteXIMPReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CPresencePluginGroups::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MProtocolPresentityGroups* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CPresencePluginGroups::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MProtocolPresentityGroups* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginGroups::GetInterfaceId() const + { + return MProtocolPresentityGroups::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::SetPresIdentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::SetPresIdentityL( + const MXIMPIdentity& aPresentityId, + TBool aFormatUri ) + { + DP_SDA2("CPresencePluginGroups::SetPresIdentityL: %S", + &aPresentityId.Identity() ); + + delete iPresIdentity; + iPresIdentity = NULL; + + if ( aFormatUri ) + { + DP_SDA("CPresencePluginGroups::SetPresIdentityL, format uri"); + + HBufC8* identityCopy = HBufC8::NewLC( KBufSize255 ); + TPtr8 identityCopyPtr( identityCopy->Des() ); + identityCopyPtr.Copy( aPresentityId.Identity() ); + + HBufC8* prefixUri = iPresenceData->CreatePresenceUri8LC( + identityCopyPtr ); + + HBufC* prefixUri16 = HBufC::NewLC( KBufSize255 ); + TPtr prefixUri16Ptr( prefixUri16->Des() ); + prefixUri16Ptr.Copy( *prefixUri ); + + iPresIdentity = prefixUri16; + CleanupStack::Pop( prefixUri16 ); + CleanupStack::PopAndDestroy( prefixUri ); + CleanupStack::PopAndDestroy( identityCopy ); + } + else + { + DP_SDA("CPresencePluginGroups::SetPresIdentityL, use as it is"); + iPresIdentity = aPresentityId.Identity().AllocL(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::StartXdmOperationL( + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ) + { + DP_SDA("StartXdmOperationL StartXdmOperationL two param"); + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + iXIMPId = aReqId; + iOperation = aOperation; + StartXdmOperationL(); + DP_SDA("StartXdmOperationL StartXdmOperationL two param end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::StartXdmOperationL( + const MXIMPIdentity& aId, + TXIMPRequestId aReqId, + TPluginGroupsOperation aOperation ) + { + DP_SDA("StartXdmOperationL StartXdmOperationL three param"); + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + SetPresIdentityL( aId, EFalse ); + iXIMPId = aReqId; + iOperation = aOperation; + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::StartXdmOperationL() + { + if ( !iXdmUtils ) + { + DP_SDA("CPresencePluginGroups::StartXdmOperationL Get xdmUtils"); + iXdmUtils = iConnObs.XdmUtilsL(); + } + DP_SDA("CPresencePluginGroups::StartXdmOperationL StartXdmOperationL"); + + iXdmUtils->InitializeXdmL( iStatus ); + iState = EPluginInitXdm; + DP_SDA("CPresencePluginGroups::StartXdmOperationL SetActive"); + SetActive(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::GetListOfListsL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::GetListOfListsL() + { + DP_SDA("CPresencePluginGroups::GetListOfListsL"); + + RPointerArray subscribed; + CleanupClosePushL( subscribed ); + + iXdmUtils->SubscribeBuddyListL( subscribed ); + DP_SDA("CPresencePluginGroups::GetListOfListsL SubscribeBudyList Ready"); + + MXIMPObjectCollection* coll = + iConnObs.ObjectFactory().NewObjectCollectionLC(); // << coll + + TInt count = subscribed.Count(); + DP_SDA2("CPresencePluginGroups::GetListOfListsL soul count %d", count); + + for ( TInt i = 0; i < count; i++ ) + { + MXIMPIdentity* currId = subscribed[i]; + MPresentityGroupInfo* sInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresentityGroupInfoLC(); + sInfo->SetGroupIdL( currId ); // ownership is taken + sInfo->SetGroupDisplayNameL( currId->Identity() ); + + coll->AddObjectL( sInfo ); // ownership is taken + CleanupStack::Pop(); // >> bInfo + } + DP_SDA("SubscribeBudyList For ready SEND COMPLETE continue"); + + CompleteXIMPReq( KErrNone ); + + // Callback for subscription state (terminated). + MXIMPDataSubscriptionState* myState = + iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + + MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC(); + + // Notice: consider XIMP error codes + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + MProtocolPresentityGroupsDataHost& dataHost = + iConnObs.ProtocolPresenceHost().GroupsDataHost(); + + dataHost.SetPresentityGroupListDataSubscriptionStateL( + myState, myStatus ); + + dataHost.HandlePresentityGroupListL( coll ); + + CleanupStack::Pop( 3 ); // >> myState, myStatus, coll + CleanupStack::Pop( &subscribed ); + DP_SDA("CPresencePluginGroups::GetListOfListsL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::GetListContentL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::GetListContentL() + { + DP_SDA("CPresencePluginGroups::GetListContentL"); + + if( !iPresIdentity->Compare( KPresenceBuddyList ) ) + { + DP_SDA("CPresencePluginGroups::GetListContentL - get buddies"); + DoGetSubscribedBuddyListL(); + + // Consider waiting complete for each subscribe before completing + CompleteXIMPReq( KErrNone ); + } + else if( !iPresIdentity->Compare( KPresenceSubcribedBuddys ) ) + { + //Subscribe subscribed buddyes virtual group + DP_SDA("GetListContentL KPresenceSubcribedBuddys"); + DoGetSubscribedBuddyListL(); + } + else + { + DP_SDA("CPresencePluginGroups::GetListContentL Wrong list name"); + User::Leave( KErrNotFound ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoGetBuddyListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoGetBuddyListL() + { + DP_SDA("CPresencePluginGroups::DoGetBuddyListL KPresenceBuddyList"); + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresentityGroupsDataHost& dataHost = + iConnObs.ProtocolPresenceHost().GroupsDataHost(); + + MXIMPObjectCollection* entities = + myFactory.NewObjectCollectionLC(); // << entities + iXdmUtils->GetEntitiesInListL( iPresIdentity->Des(), *entities ); + DP_SDA("DoGetBuddyListL entities get ready SEND COMPLETE"); + + // callback for data + DP_SDA("CPresencePluginGroups::DoGetBuddyListL callback data"); + MXIMPIdentity* id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( iPresIdentity->Des() ); + dataHost.HandlePresentityGroupContentL( id, entities ); + CleanupStack::Pop();// >> id + CleanupStack::Pop();// >> entities + DP_SDA("CPresencePluginGroups::DoGetBuddyListL callback ready"); + + // Callback for subscription state (terminated). + DP_SDA("CPresencePluginGroups::DoGetBuddyListL terminated "); + id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( iPresIdentity->Des() ); + MXIMPDataSubscriptionState* myState = + myFactory.NewDataSubscriptionStateLC(); + MXIMPStatus* myStatus = myFactory.NewStatusLC(); + // Notice: consider XIMP error codes + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + dataHost.SetPresentityGroupContentDataSubscriptionStateL( + id, myState, myStatus ); + + DP_SDA("CPresencePluginGroups::DoGetBuddyListL Pop"); + CleanupStack::Pop( 3 ); + + DP_SDA("CPresencePluginGroups::DoGetBuddyListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DoGetSubscribedBuddyListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DoGetSubscribedBuddyListL() + { + DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL"); + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresentityGroupsDataHost& dataHost = + iConnObs.ProtocolPresenceHost().GroupsDataHost(); + + // Get internal list content + MXIMPObjectCollection* entities = + myFactory.NewObjectCollectionLC(); // << entities + iXdmUtils->GetEntitiesInListL( iPresIdentity->Des(), *entities ); + DP_SDA("DoGetBuddyListL entities get ready SEND COMPLETE"); + CleanupStack::PopAndDestroy(); // entities + + // start getting virtualEntities + MXIMPObjectCollection* virtualEntities = + myFactory.NewObjectCollectionLC();// << virtualEntities + + iSubscribedBuddies->GetVirtualEntitiesL( *virtualEntities ); + + DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL - subscribe all"); + iConnObs.WatcherHandlerL()->SubscribeAllL(); + DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL - subscribe all ok"); + + // callback for data + DP_SDA("DoGetSubscribedBuddyListL callback data"); + MXIMPIdentity* id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( iPresIdentity->Des() ); + dataHost.HandlePresentityGroupContentL( id, virtualEntities ); + CleanupStack::Pop(); // >> id + CleanupStack::Pop(); // >> entities + DP_SDA("DoGetSubscribedBuddyListL callback ready"); + + // Callback for subscription state (terminated). + DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL terminated"); + id = myFactory.NewIdentityLC(); // << id + id->SetIdentityL( iPresIdentity->Des() ); + MXIMPDataSubscriptionState* myState = + myFactory.NewDataSubscriptionStateLC(); + MXIMPStatus* myStatus = myFactory.NewStatusLC(); + // Notice: consider XIMP error codes + myStatus->SetResultCode( KErrNone ); + myState->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionActive ); + dataHost.SetPresentityGroupContentDataSubscriptionStateL( + id, myState, myStatus ); + + CleanupStack::Pop( 3 ); + + DP_SDA("DoGetSubscribedBuddyListL - KPresenceOnlineBuddy case end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::CompleteXIMPReq +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::CompleteXIMPReq( TInt aStatus ) + { + DP_SDA("CPresencePluginGroups::CompleteXIMPReq"); + if ( iCompleted ) + { + DP_SDA("CPresencePluginGroups::CompleteXIMPReq return"); + return; + } + + iCompleted = ETrue; + iOperation = ENoOperation; + iConnObs.CompleteReq( iXIMPId, aStatus ); + iXIMPId = TXIMPRequestId(); + DP_SDA("CPresencePluginGroups::CompleteXIMPReq end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::DeletePersonCacheL +// --------------------------------------------------------------------------- +// +void CPresencePluginGroups::DeletePersonCacheL() + { + DP_SDA("CPresencePluginGroups::DeletePersonCacheL"); + DP_SDA(" -> strip prefix from uri"); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity ); + iPresenceData->DeletePresenceL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + DP_SDA("CPresencePluginGroups::DeletePersonCacheL out"); + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginpublisher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginpublisher.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1440 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // For KSimplePDM +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presenceplugincommon.h" +#include "presencepluginpublisher.h" +#include "presencepluginwinfo.h" +#include "presenceplugindata.h" +#include "presencepluginxdmutils.h" +#include "presencepluginwatcherinfo.h" +#include "presenceplugincommon.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::CPresencePluginPublisher() +// --------------------------------------------------------------------------- +// +CPresencePluginPublisher::CPresencePluginPublisher( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn ) + : CActive( CActive::EPriorityStandard ), + iConnObs(aObs), iConnection(aConn), + iPublisher( NULL ), iWatcher( NULL ), + iSubscribed(EFalse), iSubscribedOwn(EFalse), + iPublished(EFalse), iRePublish(EFalse), + iWatcherList( CPresencePluginWatcherInfo::LinkOffset() ) + { + DP_SDA("CPresencePluginPublisher::CPresencePluginPublisher "); + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::ConstructL( CPresencePluginData* aPresenceData ) + { + DP_SDA("CPresencePluginPublisher::ConstructL "); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + iPublisher = TSimpleFactory::NewPublisherL( iConnection, *this ); + iPresenceData = aPresenceData; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginPublisher* CPresencePluginPublisher::NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginData* aPresenceData ) + { + CPresencePluginPublisher* self = + new( ELeave ) CPresencePluginPublisher( aObs, aConn ); + CleanupStack::PushL( self ); + self->ConstructL( aPresenceData ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::~CPresencePluginPublisher() +// --------------------------------------------------------------------------- +// +CPresencePluginPublisher::~CPresencePluginPublisher() + { + DP_SDA("CPresencePluginPublisher::~CPresencePluginPublisher"); + + if ( iDocument ) + { + iDocument->Close(); + } + + if ( iPublisher ) + { + iPublisher->Close(); + } + + if ( iWatcher ) + { + iWatcher->Close(); + } + + DeleteWatchers(); + iClientStatus = NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DeleteWatchers +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DeleteWatchers() + { + DP_SDA("CPresencePluginPublisher::DeleteWatchers"); + // Delete all buffered transaction requests + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + while ( rIter ) + { + DP_SDA("CPresencePluginPublisher::DeleteWatchers while"); + CPresencePluginWatcherInfo* w = rIter; + rIter++; + // delete wathcer info + w->Destroy(); + } + DP_SDA("CPresencePluginPublisher::DeleteWatchers end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::AddWatcherIfNotExistsL +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::AddWatcherIfNotExistsL( + const TDesC8& aId, + const TDesC& aSipId ) + { + DP_SDA("CPresencePluginPublisher::AddWatcherIfNotExistsL"); + // Delete all buffered transaction requests + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + TBool found(EFalse); + + while ( rIter ) + { + CPresencePluginWatcherInfo* w = rIter; + rIter++; + found = w->Match( aId, aSipId ); + if ( found ) + { + DP_SDA("CPresencePluginPublisher::AddWatcherIfNotExistsL found"); + break; + } + } + if ( !found ) + { + DP_SDA("CPresencePluginPublisher::AddWatcherIfNotExistsL !found"); + CPresencePluginWatcherInfo* w = + CPresencePluginWatcherInfo::NewL( aId, aSipId ); + iWatcherList.AddLast( *w ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::RemoveWatcherIfExistsL +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::RemoveWatcherIfExists( + const TDesC8& aId, const TDesC& aSipId ) + { + DP_SDA("CPresencePluginPublisher::RemoveWatcherIfExistsL"); + // Delete all buffered transaction requests + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + TBool found(EFalse); + + while ( rIter ) + { + CPresencePluginWatcherInfo* w = rIter; + rIter++; + // delete wathcer info + found = w->Match( aId, aSipId ); + if ( found ) + { + w->Destroy(); + break; + } + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DoPublishOwnPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DoPublishOwnPresenceL( + const MPresenceInfo& aOwnPresence, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginPublisher::DoPublishOwnPresenceL"); + const MPersonPresenceInfo* persInfo = aOwnPresence.PersonPresence(); + if ( !persInfo ) + { + // Notice: error codes + CompleteXIMPReq( KErrArgument ); + return; + } + InitializeSimpleDocumentL( ); + AddSimpleDocumentPersL( persInfo ); + + StartXdmOperationL( aReqId ); + iOperation = EPublishOwn; + DP_SDA("CPresencePluginPublisher::DoPublishOwnPresenceL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DoSubscribeOwnPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DoSubscribeOwnPresenceL( + const MPresenceInfoFilter& /*aPif*/, // notice: later + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginPublisher::DoSubscribeOwnPresenceL"); + StartXdmOperationL( aReqId ); + iOperation = ESubscribeOwn; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DoUpdateOwnPresenceSubscriptionPifL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DoUpdateOwnPresenceSubscriptionPifL( + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + // Notice: later + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DoUnsubscribeOwnPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DoUnsubscribeOwnPresenceL( + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginPublisher::DoUnsubscribeOwnPresenceL"); + iSubscribedOwn = EFalse; + iSimpleId = iWatcher->UnsubscribeL(); + iXIMPId = aReqId; + iOperation = EUnsubscribeOwn; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DoSubscribePresenceWatcherListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DoSubscribePresenceWatcherListL( + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginPublisher::DoSubscribePresenceWatcherListL"); + if ( !iSubscribed ) + { + DP_SDA("DoSubscribePresenceWatcherListL !Subscribed"); + iConnObs.WinfoHandlerL()->SubscribeWinfoListL( aReqId ); + iSubscribed = ETrue; + iXIMPId = aReqId; + iOperation = ESubscribeWinfo; + } + else + { + DP_SDA("DoSubscribePresenceWatcherListL else"); + iXIMPId = aReqId; + iOperation = ESubscribeWinfo; + CompleteXIMPReq( KErrNone ); + } + DP_SDA("CPresencePluginPublisher::DoSubscribePresenceWatcherListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DoUnsubscribePresenceWatcherListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DoUnsubscribePresenceWatcherListL( + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginPublisher::DoUnsubscribePresenceWatcherListL"); + if ( iSubscribed ) + { + DP_SDA("DoUnsubscribePresenceWatcherListL: if ( iSubscribed ) - begin"); + iConnObs.WinfoHandlerL()->UnsubscribeWinfoListL( aReqId ); + iSubscribed = EFalse; + iXIMPId = aReqId; + iOperation = EUnsubscribeWinfo; + DP_SDA("DoUnsubscribePresenceWatcherListL: if ( iSubscribed ) - end"); + + } + else + { + DP_SDA("DoUnsubscribePresenceWatcherListL: iSubscribed ) is false"); + iXIMPId = aReqId; + iOperation = EUnsubscribeWinfo; //hameed + CompleteXIMPReq( KErrNone ); + } + } + + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::PublishReqCompleteL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::PublishReqCompleteL( + TInt /*aOpid*/, + TInt aStatus ) + { + DP_SDA("CPresencePluginPublisher::PublishReqCompleteL"); + // Notice: make 415 error code conversion here and other + //SIP code -> XIMP conversions + DP_SDA2("PublishReqCompleteL STATUS %d",aStatus ); + + if( iConnObs.GetSessionStatus() ) + { + DP_SDA2("PublishReqComp stopState %d",iConnObs.GetStopPublishState()); + if ( !aStatus && !iConnObs.GetStopPublishState() ) + { + DP_SDA("CPresencePluginPublisher::PublishReqCompleteL ETrue"); + iPublished = ETrue; + iConnObs.SetStopPublishState( ETrue ); + } + // Save E-Tag + if( !aStatus ) + { + DP_SDA("CPresencePluginPublisher::PublishReqCompleteL Save ETAG"); + TBuf8 buf; + buf.Copy( iPublisher->SIPETag() ); + iConnObs.SetETag( buf ); + } + //Do not complete if error republish is true. XIMPFW is not knowing we + //are sending republish. + if( EFalse == iRePublish && !aStatus ) + { + //Complete Publish request + DP_SDA("CPresencePluginPublisher::PublishReqCompleteL complete"); + if( !(iConnObs.IsStopPublishCalled()) ) + { + DP_SDA("CPresencePluginPublisher::PublishReqCompleteL complete normal"); + // successfull Online / others: store status to cache + StoreOwnStatusToCacheL( ); + CompleteXIMPReq( aStatus ); + } + //Complete stopPublish and close session if stopPublish is called + if( iConnObs.IsStopPublishCalled() ) + { + DP_SDA("PublishReqCompleteL complete closeSession"); + iPresenceData->DeletePresenceVariablesL( iConnObs.ServiceId() ); + // successfull Online / others: store status to cache + StoreOwnStatusToCacheL( ); + //Complete close session + CompleteClientReq( aStatus ); + } + } + if( EFalse == iRePublish && ( KSimpleErrTemporary == aStatus ) ) + { + DP_SDA("PublishReqCompleteL KSimpleErrTemporary"); + // Make new publish request without ETag + CreatePublisherL(); + iSimpleId = iPublisher->StartPublishL( *iDocument, ETrue ); + } + else if( EFalse == iRePublish && ( KErrTimedOut == aStatus ) ) + { + DP_SDA("PublishReqCompleteL KErrTimedOut"); + iPublisher->StopPublishL(); + CompleteXIMPReq( KXIMPErrServicRequestTimeouted ); + } + else if( KErrCommsBreak == aStatus ) + { + DP_SDA("PublishReqCompleteL KErrCommsBreak"); + CompleteXIMPReq( KErrCommsBreak ); + } + else + { + //Set rePublish flag back to false. + iRePublish = EFalse; + } + } + else + { + //Run this case if connection is not good any more + DP_SDA("PublishReqCompleteL No connect CANCEL"); + Cancel(); + } + DP_SDA("CPresencePluginPublisher::PublishReqCompleteL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::PublishTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::PublishTerminatedL( TInt aOpid ) + { + DP_SDA("CPresencePluginPublisher::PublishTerminatedL"); + DP_SDA2("CPresencePluginPublisher::PublishTerminatedL opID %d",aOpid ); + DP_SDA2("PublishTerminatedL iSimpleId %d",iSimpleId ); + DP_SDA2("PublishTerminatedL iStatus %d",iStatus.Int() ); + + if ( iSimpleId == aOpid && iConnObs.GetSessionStatus() ) + { + DP_SDA("CPresencePluginPublisher::PublishTerminatedL NewPublish"); + CreatePublisherL(); + TRAPD( error , iSimpleId = iPublisher->StartPublishL( + *iDocument, ETrue ) ); + if ( KErrNone == error ) + { + DP_SDA("PublishTerminatedL NewPublish KErrNone"); + iRePublish = ETrue; + iConnObs.SetStopPublishState( EFalse ); + } + } + else + { + DP_SDA("CPresencePluginPublisher::PublishTerminatedL else"); + iPublished = EFalse; + if( iPublisher ) + { + iPublisher->Close(); + iPublisher = NULL; + } + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::WatcherReqCompleteL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::WatcherReqCompleteL( TInt /*aOpid*/, + TInt aStatus ) + { + DP_SDA("CPresencePluginPublisher::WatcherReqCompleteL"); + if ( !aStatus ) + { + iSubscribedOwn = ETrue; + } + + CompleteXIMPReq( aStatus ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::WatcherNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::WatcherNotificationL( + MSimpleDocument& aDocument ) + { + // Notice: Do not need to check the expiration here since + // WatcherTerminatedL is called then too. + DP_SDA("CPresencePluginPublisher::WatcherNotificationL"); + + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.ProtocolPresenceHost().PublishingDataHost(); + + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC();// << prInfo + + iPresenceData->NotifyToPrInfoL( + iConnObs.ObjectFactory(), + iConnObs.PresenceObjectFactoryOwn(), + aDocument, + *prInfo ); + + // XIMP Host API callbacks + + publishHost.HandleSubscribedOwnPresenceL( prInfo ); + CleanupStack::Pop(); // >> prInfo + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::WatcherListNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::WatcherListNotificationL( + MSimplePresenceList& /*aList*/ ) + { + //Do nothing now + DP_SDA("CPresencePluginPublisher::WatcherListNotificationL EMPTY"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::WatcherTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::WatcherTerminatedL( + TInt /*aOpId*/, TInt aReason ) + { + DP_SDA("CPresencePluginPublisher::WatcherTerminatedL"); + + iSubscribedOwn = EFalse; + + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.ProtocolPresenceHost().PublishingDataHost(); + + MXIMPDataSubscriptionState *state = + myFactory.NewDataSubscriptionStateLC(); + MXIMPStatus* status = myFactory.NewStatusLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + status->SetResultCode( aReason ); + publishHost.SetOwnPresenceDataSubscriptionStateL( state, status ); + CleanupStack::Pop( 2 ); // status, state + + DP_SDA("CPresencePluginPublisher::WatcherTerminatedL - end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::CompleteXIMPReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::CompleteXIMPReq( TInt aStatus ) + { + DP_SDA("CPresencePluginPublisher::CompleteXIMPReq"); + DP_SDA2("CompleteXIMPReq: iOperation = %d",(TInt) iOperation ); + // Notice: should this yield active scheduler??? + if ( iOperation != ENoOperation ) + { + DP_SDA("CPresencePluginPublisher::CompleteXIMPReq complete"); + iOperation = ENoOperation; + iConnObs.CompleteReq( iXIMPId, aStatus ); + iXIMPId = TXIMPRequestId(); + } + DP_SDA("CPresencePluginPublisher::CompleteXIMPReq end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::CompleteClientReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::CompleteClientReq( TInt aStatus ) + { + DP_SDA2("CPresencePluginPublisher::CompleteClientReq status %d ", aStatus); + iOperation = ENoOperation; + TRequestStatus* s = iClientStatus; + User::RequestComplete( s, aStatus ); + DP_SDA("CPresencePluginPublisher::CompleteClientReq end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::DoCancel( ) + { + DP_SDA("CPresencePluginPublisher::DoCancel CANCEL"); + iXdmUtils->Cancel(); + iPublisher->Close(); + iPublisher = NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::RunL( ) + { + DP_SDA("CPresencePluginPublisher::RunL"); + TInt status = iStatus.Int(); + DP_SDA2("CPresencePluginPublisher::RunL status %d", status ); + if ( !status ) + { + + if ( iOperation == ESubscribeOwn ) + { + DP_SDA("CPresencePluginPublisher::RunL Subscribe Own"); + iSimpleId = iWatcher->SubscribeL( + iConnObs.CurrentSipPresentity8(), + NULL, // aFilter <-> aPif + ETrue, EFalse ); + } + else if( iOperation == EPublishOwn ) + { + DP_SDA("CPresencePluginPublisher::RunL MakePublishReqL"); + MakePublishReqL(); + } + } + else + { + DP_SDA("CPresencePluginPublisher::RunL complete"); + CompleteXIMPReq( status ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginPublisher::RunError( TInt aError ) + { + DP_SDA2("CPresencePluginPublisher::RunError %d",aError ); + + CompleteXIMPReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CPresencePluginPublisher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + DP_SDA("CPresencePluginPublisher::GetInterface"); + + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + MProtocolPresencePublishing* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CPresencePluginPublisher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + DP_SDA("CPresencePluginPublisher::GetInterface 2 "); + + if ( aInterfaceId == GetInterfaceId() ) + { + // caller wants this interface + const MProtocolPresencePublishing* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginPublisher::GetInterfaceId() const + { + DP_SDA("CPresencePluginPublisher::GetInterfaceId"); + + return MProtocolPresencePublishing::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::InitializeSimpleDocumentL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::InitializeSimpleDocumentL( ) + { + _LIT8 ( KCipidNS, "urn:ietf:params:xml:ns:pidf:cipid" ); + _LIT8 ( KCipidCP, "c" ); + if ( iDocument ) + { + DP_SDA("CPresencePluginPublisher:: deletedocument"); + iDocument->Close(); + iDocument = NULL; + iDocument = TSimpleFactory::NewDocumentL(); + } + else + { + DP_SDA("CPresencePluginPublisher:: create document"); + iDocument = TSimpleFactory::NewDocumentL(); + } + iDocument->AddNamespaceL( KSimplePDM, KSimpleNsPDM ); + iDocument->AddNamespaceL( KSimpleRPID, KSimpleNsRPID ); + iDocument->AddNamespaceL( KCipidCP, KCipidNS ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::AddSimpleDocumentPersL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::AddSimpleDocumentPersL( + const MPersonPresenceInfo* aInfo ) + { + TInt tupleId = iConnObs.GetTupleId(); + + DP_SDA2("AddSimpleDocumentPersL tuple id get: %d", tupleId); + if ( tupleId == 0 ) + { + DP_SDA("AddSimpleDocumentPersL tuple generate"); + tupleId = iPresenceData->GenerateTupleId(); + iConnObs.SetTupleId(tupleId); + } + + iPresenceData->AddPrPersToSimpleDocumentL( + aInfo, *iDocument, iConnObs.CurrentSipPresentity8(), tupleId ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::StopPublishL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::StopPublishL( TRequestStatus& aStatus ) + { + DP_SDA2("StopPublish - begin : iPublished= %d ",(TInt) iPublished); + + aStatus = KRequestPending; + iClientStatus = &aStatus; + + TInt err1( 0 ); + TInt err2( 0 ); + + // get stored document id if available + HBufC8* oldDocumentId = HBufC8::NewLC( KBufSize255 ); + TPtr8 oldDocumentIdPtr( oldDocumentId->Des() ); + TRAP( err1, iPresenceData->ReadDocumentIdL( + iConnObs.ServiceId(), oldDocumentIdPtr ) ); + + if ( iConnObs.GetStopPublishState() && iPublished ) + { + DP_SDA("CPresencePluginPublisher::StopPublish really Stop"); + if ( !err1 ) + { + TRAP( err2, iPublisher->StopPublishL( oldDocumentIdPtr ) ); + } + else + { + // if stored document id is not available try with this + TRAP( err2, iPublisher->StopPublishL( iConnObs.GetETag() ) ); + } + DP_SDA2("StopPublish iPublisher->StopPublishL : error = %d ", err2 ); + if ( KErrNone != err2 ) + { + if( iPublisher ) + { + DP_SDA("StopPublish delete and recreate publisher"); + iPublisher->Close(); + iPublisher = NULL; + DP_SDA("StopPublish really Stop try again 1 "); + iPublisher = + TSimpleFactory::NewPublisherL( iConnection, *this ); + DP_SDA("StopPublish really Stop try again 2 "); + err2 = KErrGeneral; + TRAP( err2, iPublisher->StopPublishL( iConnObs.GetETag() );); + DP_SDA2("StopPublishL 2nd try : error = %d ", err2 ); + if ( KErrNone != err2 ) + { + DP_SDA("StopPublish TWO TIME Error, last try without tag "); + TRAP( err2, iPublisher->StopPublishL(); ); + DP_SDA2("StopPublishL 3rd try : error = %d ", err2 ); + } + } + } + iConnObs.SetStopPublishState( ETrue ); + iPublished = EFalse; + } + CleanupStack::PopAndDestroy( oldDocumentId ); + + DP_SDA("CPresencePluginPublisher::StopPublish- end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::Published() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginPublisher::Published() + { + return iPublished; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::MakePublishReqL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::MakePublishReqL( ) + { + DP_SDA("CPresencePluginPublisher::MakePublishReqL"); + + DP_SDA(" -> MakePublishReqL, check for old doc id"); + HBufC8* oldDocumentId = HBufC8::NewLC( KBufSize255 ); + TPtr8 oldDocumentIdPtr( oldDocumentId->Des() ); + TRAPD( error, iPresenceData->ReadDocumentIdL( + iConnObs.ServiceId(), oldDocumentIdPtr ) ); + if ( !iPublished ) + { + DP_SDA("CPresencePluginPublisher::MakePublishReqL 1"); + CreatePublisherL(); + + DP_SDA2(" -> MakePublishReqL, doc id error: %d", error ); + if ( !error ) + { + DP_SDA(" -> MakePublishReqL, publish with old id"); + iSimpleId = iPublisher->ContinuePublishL( + *iDocument, ETrue, oldDocumentIdPtr ); + } + else + { + DP_SDA(" -> MakePublishReqL, publish with new id"); + iSimpleId = iPublisher->StartPublishL( *iDocument, ETrue ); + } + } + else + { + DP_SDA("CPresencePluginPublisher::MakePublishReqL 2"); + CreatePublisherL(); + DP_SDA("CPresencePluginPublisher::MakePublishReqL Continue Publish"); + if ( !error ) + { + DP_SDA(" -> MakePublishReqL, publish with stored id"); + iSimpleId = iPublisher->ContinuePublishL( + *iDocument ,ETrue, oldDocumentIdPtr ); + } + else + { + DP_SDA(" -> MakePublishReqL, stored id not found" ); + DP_SDA(", publish with old id"); + iSimpleId = iPublisher->ContinuePublishL( + *iDocument ,ETrue, iConnObs.GetETag() ); + } + DP_SDA("CPresencePluginPublisher::MakePublishReqL modifyed"); + } + CleanupStack::PopAndDestroy( oldDocumentId ); + DP_SDA("CPresencePluginPublisher::MakePublishReqL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::StartXdmOperationL( + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginPublisher::StartXdmOperationL"); + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrNotReady ) ); + iXIMPId = aReqId; + if ( !iXdmUtils ) + { + DP_SDA("StartXdmOperationL Initialize XDMUtils"); + iXdmUtils = iConnObs.XdmUtilsL(); + } + + // Allways check those XDM files are ok / + //publish seems to be jam if xdm not initialized ? + iXdmUtils->InitializeXdmL( iStatus ); + SetActive(); + DP_SDA("CPresencePluginPublisher::StartXdmOperationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::WinfoNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::WinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + DP_SDA("CPresencePluginPublisher::WinfoNotificationL"); + + RPointerArray elems; + CleanupClosePushL( elems ); // << elems + TInt err = aWinfo.SimpleElementsL( elems ); + User::LeaveIfError( err ); + TInt count = elems.Count(); + + DP_SDA2("WinfoNotificationL elems count%d", count); + + __ASSERT_ALWAYS( count == 1, User::Leave( KErrCorrupt ) ); + + using namespace NPresencePlugin::NPresence; + + const TDesC8* stateVal = aWinfo.AttrValue( KPresenceState8 ); + + if ( stateVal && !stateVal->CompareF( KPresenceFull8 )) //state full + { + // full winfo-list is received (New empty list ) + DP_SDA("CPresencePluginPublisher::WinfoNotificationL full list found"); + DeleteWatchers(); + } + else + { + DP_SDA("PluginPublisher: state != full"); + // Test if state is partitial + if ( stateVal && !stateVal->CompareF( KPresencePartial8 )) + { + DP_SDA("PluginPublisher: state = partitial"); + } + } + + MSimpleElement* elem = elems[0]; + TPtrC8 p8 = elem->LocalName(); + err = p8.CompareF( KPresenceWatcherList8 ); + DP_SDA2("WinfoNotificationL KPresenceWatcherList8 err %d", err); + User::LeaveIfError( err ); + DP_SDA("WinfoNotificationL KPresenceWatcherList8 continue"); + + //Get elemets from document + err = elem->SimpleElementsL( elems ); + User::LeaveIfError( err ); + DP_SDA2("WinfoNotificationL get elems err %d", err); + //Make collect from active watchers + CollectWatchersL( elems ); + + CDesCArrayFlat* watchers = MakeCurrentWatcherListLC();// << watchers + MXIMPObjectCollection *actives = + iConnObs.ObjectFactory().NewObjectCollectionLC();// << actives + + // Create MXIMPPresenceWatcherInfo entities for + // all active watchers and add to actives. + TInt wCount = watchers->MdcaCount(); + DP_SDA2("CPresencePluginPublisher::WinfoNotificationL wCount %d", wCount); + for ( TInt j = 0; j < wCount; j++ ) + { + // create MXIMPPresenceWatcherInfo object + MPresenceWatcherInfo* wInfo = + iConnObs.PresenceObjectFactoryOwn(). + NewPresenceWatcherInfoLC();// << wInfo + + MXIMPIdentity* identity = + iConnObs.ObjectFactory().NewIdentityLC();// << identity + + identity->SetIdentityL( watchers->MdcaPoint( j ) ); + wInfo->SetWatcherIdL( identity ); + CleanupStack::Pop( );// >> identity + + wInfo->SetWatcherDisplayNameL( watchers->MdcaPoint( j ) ); + wInfo->SetWatcherTypeL( MPresenceWatcherInfo::EPresenceSubscriber ); + + actives->AddObjectL( wInfo ); + CleanupStack::Pop( ); // >> wInfo + } + + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); + + publishHost.HandlePresenceWatcherListL( actives ); + + CleanupStack::Pop(); // >> actives + CleanupStack::PopAndDestroy( watchers ); // >> watchers + + CleanupStack::PopAndDestroy( &elems ); // >> elems + DP_SDA("CPresencePluginPublisher::WinfoNotificationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::WinfoTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::WinfoTerminatedL( TInt aReason ) + { + DP_SDA("CPresencePluginPublisher::WinfoTerminatedL - begin"); + + // call SetPresenceWatcherListDataSubscriptionStateL + iSubscribed = EFalse; + + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresencePublishingDataHost& publishHost = + iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); + MXIMPDataSubscriptionState *state = + myFactory.NewDataSubscriptionStateLC(); + + MXIMPStatus* status = myFactory.NewStatusLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + + state->SetDataStateL( MXIMPDataSubscriptionState::EDataUnavailable ); + status->SetResultCode( aReason ); + publishHost.SetPresenceWatcherListDataSubscriptionStateL( state, status ); + CleanupStack::Pop( 2 ); // status, state + DP_SDA("CPresencePluginPublisher::WinfoTerminatedL - end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::NewETagL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::NewETagL( const TDesC8& aVal ) + { + DP_SDA("CPresencePluginPublisher::NewETagL"); + // Set ETag value + DP_SDA("CPresencePluginPublisher::NewETagL Set ETag"); + TBuf8 buf; + buf.Copy( aVal ); + iConnObs.SetETag( buf ); + buf.Zero(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::MakeCurrentWatcherListLC +// --------------------------------------------------------------------------- +// +CDesCArrayFlat* CPresencePluginPublisher::MakeCurrentWatcherListLC() + { + DP_SDA("CPresencePluginPublisher::MakeCurrentWatcherListLC - begin"); + // No one should be added more than once + const TInt KMyGran = 10; + CDesCArrayFlat* watchers = new (ELeave) CDesCArrayFlat( KMyGran ); + CleanupStack::PushL( watchers ); // << watchers + + // add user only once here. + TDblQueIter rIter( iWatcherList ); + rIter.SetToFirst(); + + while ( rIter ) + { + CPresencePluginWatcherInfo* w = rIter; + rIter++; + + TInt dummy = 0; + // Zero -> Found + if ( watchers->Find( w->SipId(), dummy )) + { + watchers->AppendL( w->SipId() ); + } + } + + DP_SDA("CPresencePluginPublisher::MakeCurrentWatcherListLC - end"); + return watchers; + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::CollectWatchers +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::CollectWatchersL( + RPointerArray& aElems ) + { + using namespace NPresencePlugin::NPresence; + HBufC* nodeContent = NULL; + + TInt count = aElems.Count(); + DP_SDA2("CPresencePluginPublisher::CollectWatchers elem count %d",count); + + for ( TInt i = 0; i < count; i++ ) + { + MSimpleElement* elem = aElems[i]; + TPtrC8 p8( elem->LocalName()); + + if (!( p8.CompareF( KPresenceWatcher8 ))) + { + DP_SDA("CPresencePluginPublisher::CollectWatchers watchers found"); + const TDesC8* pp8 = elem->AttrValue( KPresenceStatus8 ); + // Active wathers here + if ( pp8 && !pp8->CompareF( KPresenceActive8 )) + { + DP_SDA("CollectWatchers: ACTIVE found"); + // save id since there may be multiple subscriptions + // from a single watcher SIP identity. + const TDesC8* pId8 = elem->AttrValue( KPresenceId8 ); + + // Build collection of grant requests + // Find the child node containing the SIP entity + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent );// << nodeContent + + AddWatcherIfNotExistsL( + pId8 ? *pId8 : KNullDesC8, nodeContent->Des() ); + + CleanupStack::PopAndDestroy( nodeContent ); //>> nodeContent + } + // Terminated wathers here + else if ( pp8 && !pp8->CompareF( KPresenceTerminated8 )) + { + DP_SDA("CollectWatchers: Terminated"); + const TDesC8* pId8 = elem->AttrValue( KPresenceId8 ); + + // Remove terminated from iWatcherList + nodeContent = elem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent );// << nodeContent + + RemoveWatcherIfExists( + pId8 ? *pId8 : KNullDesC8, nodeContent->Des() ); + + CleanupStack::PopAndDestroy( nodeContent );// >> nodeContent + } + } + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::CreatePublisherL() +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::CreatePublisherL() + { + DP_SDA("CPresencePluginPublisher::CreatePublisherL"); + if( iPublisher ) + { + DP_SDA("CPresencePluginPublisher::CreatePublisherL create"); + iPublisher->Close(); + iPublisher = NULL; + iPublisher = TSimpleFactory::NewPublisherL( iConnection, *this ); + } + DP_SDA("CPresencePluginPublisher::CreatePublisherL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::StoreOwnStatusToCacheL +// --------------------------------------------------------------------------- +// +void CPresencePluginPublisher::StoreOwnStatusToCacheL() + { + DP_SDA("CPresencePluginPublisher::StoreOwnStatusToCacheL" ); + + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceStates; + using namespace NPresenceInfo::NFieldType; + + DP_SDA(" CPresencePluginPublisher -> convert uri" ); + HBufC* entityUri = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( + *iDocument->EntityURI() ); + CleanupStack::PushL( entityUri ); + + DP_SDA(" CPresencePluginPublisher -> strip prefix" ); + HBufC16* prefixStripped = iPresenceData->RemovePrefixLC( + *entityUri ); + + DP_SDA(" CPresencePluginPublisher -> fetch simple elements" ); + RPointerArray simpleElements; + CleanupClosePushL( simpleElements ); + DP_SDA(" CPresencePluginPublisher -> do fetch simple elements" ); + TInt error = iDocument->SimpleElementsL( simpleElements ); + DP_SDA2(" CPresencePluginPublisher -> fetch error: %d", error ); + User::LeaveIfError( error ); + TBool handled = EFalse; + DP_SDA2(" CPresencePluginPublisher -> element count: %d", + simpleElements.Count() ); + + MSimpleElement* basicSimpleElem(NULL); + MSimpleElement* noteSimpleElem(NULL); + + TBuf activitiesContentBuf; + TBool activitiesHandled( EFalse ); + + for( TInt index = 0 ; index < simpleElements.Count() ; index++ ) + { + DP_SDA(" CPresencePluginPublisher -> check for person element" ); + // Check for person element + if (!( simpleElements[index]->LocalName().CompareF( KPresencePerson8 )) || + !( simpleElements[index]->LocalName().CompareF( KPresenceTuple8 )) ) + { + DP_SDA(" CPresencePluginPublisher -> person/tuple element found" ); + RPointerArray personSubElems; + CleanupClosePushL( personSubElems ); + simpleElements[index]->SimpleElementsL( personSubElems ); + DP_SDA2(" CPresencePluginPublisher -> person/tuple sub elemen count: %d", + personSubElems.Count() ); + + for ( TInt j = 0; j < personSubElems.Count(); j++ ) + { + DP_SDA(" CPresencePluginPublisher -> check for status/activities element"); + if ( !personSubElems[j]->LocalName().CompareF( KPresenceStatus8 ) || + !personSubElems[j]->LocalName().CompareF( KPresenceActivities8 )) + { + DP_SDA(" CPresencePluginPublisher -> status/activities element found"); + //Get childs + RPointerArray basicElems; + CleanupClosePushL( basicElems ); + + personSubElems[j]->SimpleElementsL( basicElems ); + DP_SDA2(" CPresencePluginPublisher -> child elem count: %d", + basicElems.Count() ); + for ( TInt k = 0; k < basicElems.Count(); k++ ) + { + DP_SDA(" CPresencePluginPublisher -> check child elems"); + if ( !basicElems[k]->LocalName().CompareF( + KPresenceBasic8 )) + { + DP_SDA(" -> basic element found"); + basicSimpleElem = basicElems[k]; + } + else if ( basicSimpleElem && + !basicElems[k]->LocalName().CompareF( KPresenceActivities8 ) ) + { + DP_SDA(" -> activities found from basic elem"); + RPointerArray activitiesElems; + CleanupClosePushL( activitiesElems ); + + DP_SDA(" -> get activities"); + basicElems[k]->SimpleElementsL( activitiesElems ); + DP_SDA2(" -> activities count: %d", + activitiesElems.Count() ); + if ( activitiesElems.Count() ) + { + DP_SDA(" -> get activities, multiple, use last"); + TInt lastActiviesIndex = + ( activitiesElems.Count() - 1 ); + activitiesContentBuf.Copy( + activitiesElems[lastActiviesIndex]->LocalName() ); + activitiesHandled = ETrue; + DP_SDA(" -> activity elem ok"); + } + CleanupStack::PopAndDestroy( &activitiesElems ); + } + else if ( basicSimpleElem && + !personSubElems[j]->LocalName().CompareF( KPresenceActivities8 ) ) + { + DP_SDA(" -> activities found from person elem"); + RPointerArray activitiesElems; + CleanupClosePushL( activitiesElems ); + + DP_SDA(" -> get activities"); + personSubElems[j]->SimpleElementsL( activitiesElems ); + DP_SDA2(" -> activities count: %d", + activitiesElems.Count() ); + if ( activitiesElems.Count() ) + { + DP_SDA(" -> get activities, multiple, use last"); + TInt lastActiviesIndex = + ( activitiesElems.Count() - 1 ); + activitiesContentBuf.Copy( + activitiesElems[lastActiviesIndex]->LocalName() ); + activitiesHandled = ETrue; + DP_SDA2(" -> activities len: %d", + activitiesContentBuf.Length() ); + DP_SDA(" -> activity elem ok"); + } + CleanupStack::PopAndDestroy( &activitiesElems ); + } + } + CleanupStack::PopAndDestroy( &basicElems ); + } + } + CleanupStack::PopAndDestroy( &personSubElems ); + } + else if ( !simpleElements[index]->LocalName().CompareF( KPresenceNote8 )) + { + DP_SDA(" CPresencePluginPublisher -> note element found" ); + noteSimpleElem = simpleElements[index]; + } + } + DP_SDA(" CPresencePluginPublisher -> elements handled"); + __ASSERT_ALWAYS( basicSimpleElem, User::Leave( KErrCorrupt ) ); + + if ( !activitiesHandled ) + { + DP_SDA(" -> activities not handled, set unknown"); + activitiesContentBuf.Copy( KPresenceUnknow ); + } + + HBufC* nodeContent = basicSimpleElem->ContentUnicodeL(); + CleanupStack::PushL( nodeContent ); + + HBufC* noteContent = NULL; + if ( noteSimpleElem ) + { + noteContent = noteSimpleElem->ContentUnicodeL(); + CleanupStack::PushL( noteContent ); + } + else + { + noteContent = KNullDesC().AllocLC(); + } + + MPresenceBuddyInfo2::TAvailabilityValues cacheAvailability = + MPresenceBuddyInfo2::ENotAvailable; + NPresenceInfo::TAvailabilityValues ximpAvailability = + NPresenceInfo::ENotAvailable; + + HBufC* extendedCacheAvailability = HBufC::NewLC( KBufSize255 ); + TPtr extendedCacheAvailabilityPtr( extendedCacheAvailability->Des() ); + if ( nodeContent ) + { + handled = ResolveOwnCacheValues( *nodeContent, + activitiesContentBuf, cacheAvailability, + extendedCacheAvailabilityPtr, ximpAvailability ); + } + + __ASSERT_ALWAYS( handled, User::Leave( KErrCorrupt )); + + DP_SDA(" CPresencePluginPublisher -> write to cache" ); + + DP_SDA2(" CPresencePluginPublisher -> availability: %d", + cacheAvailability ); + DP_SDA2(" CPresencePluginPublisher -> ext availability len: %d", + extendedCacheAvailabilityPtr.Length() ); + + iPresenceData->WriteStatusToCacheL( + *prefixStripped, cacheAvailability, + extendedCacheAvailabilityPtr, *noteContent ); + + // Store publish variables for republish + iPresenceData->StorePresenceOwnPresenceL( + iConnObs.ServiceId(), ximpAvailability, *noteContent ); + + CleanupStack::PopAndDestroy( extendedCacheAvailability ); + CleanupStack::PopAndDestroy( noteContent ); + CleanupStack::PopAndDestroy( nodeContent ); + + DP_SDA(" CPresencePluginPublisher -> attributes handled" ); + CleanupStack::PopAndDestroy( &simpleElements ); + + DP_SDA(" CPresencePluginPublisher -> write to cache ok, cleanup" ); + + // prefixStripped, entityUri + CleanupStack::PopAndDestroy( 2 ); + DP_SDA("CPresencePluginPublisher::StoreOwnStatusToCacheL out" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginPublisher::ResolveOwnCacheValues +// --------------------------------------------------------------------------- +// +TBool CPresencePluginPublisher::ResolveOwnCacheValues( + const TDesC& aUnicodeContent, + const TDesC& aActivities, + MPresenceBuddyInfo2::TAvailabilityValues& aCacheAvailability, + TPtr& aExtendedCacheAvailability, + NPresenceInfo::TAvailabilityValues& aXimpApiAvailability ) + { + DP_SDA("CPresencePluginPublisher::ResolveOwnCacheValuesL" ); + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceStates; + using namespace NPresenceInfo::NFieldType; + + TBool handled = EFalse; + if ( !aUnicodeContent.CompareF( KPresenceOpen ) && + !aActivities.CompareF ( KPresenceBusy ) ) + { + DP_SDA(" CPresencePluginPublisher -> busy"); + aCacheAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedCacheAvailability.Copy( KDndState() ); + aXimpApiAvailability = NPresenceInfo::EBusy; + handled = ETrue; + } + // On-The-Phone case + else if ( !aUnicodeContent.CompareF( KPresenceOpen ) && + !aActivities.CompareF ( KPresenceOnThePhone ) ) + { + DP_SDA(" CPresencePluginPublisher -> on-the-phone"); + aCacheAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedCacheAvailability.Copy( KOnPhoneState() ); + aXimpApiAvailability = NPresenceInfo::EOnPhone; + handled = ETrue; + } + //Away case + else if ( !aUnicodeContent.CompareF( KPresenceOpen ) && + !aActivities.CompareF ( KPresenceAway ) ) + { + DP_SDA(" CPresencePluginPublisher -> away"); + aCacheAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedCacheAvailability.Copy( KAwayState() ); + aXimpApiAvailability = NPresenceInfo::EAway; + handled = ETrue; + } + //Dnd case + else if ( !aUnicodeContent.CompareF( KPresenceOpen ) && + !aActivities.CompareF ( KPresenceDoNotDisturb ) ) + { + DP_SDA(" CPresencePluginPublisher -> dnd"); + aCacheAvailability = MPresenceBuddyInfo2::EBusy; + aExtendedCacheAvailability.Copy( KDndState() ); + aXimpApiAvailability = NPresenceInfo::EDoNotDisturb; + handled = ETrue; + } + // Unknown open + else if ( !aUnicodeContent.CompareF( KPresenceOpen ) && + !aActivities.CompareF ( KPresenceUnknow ) ) + { + DP_SDA(" CPresencePluginPublisher -> open"); + aCacheAvailability = MPresenceBuddyInfo2::EAvailable; + aExtendedCacheAvailability.Copy( KDefaultAvailableStatus() ); + aXimpApiAvailability = NPresenceInfo::EAvailable; + handled = ETrue; + } + // available open + else if ( !aUnicodeContent.CompareF( KPresenceOpen ) && + !aActivities.CompareF ( KPresenceAvailable ) ) + { + DP_SDA(" CPresencePluginPublisher -> open"); + aCacheAvailability = MPresenceBuddyInfo2::EAvailable; + aExtendedCacheAvailability.Copy( KDefaultAvailableStatus() ); + aXimpApiAvailability = NPresenceInfo::EAvailable; + handled = ETrue; + } + // available open + else if ( !aUnicodeContent.CompareF( KPresenceOpen ) && + !aActivities.CompareF ( KPresenceOpen ) ) + { + DP_SDA(" CPresencePluginPublisher -> open/open"); + aCacheAvailability = MPresenceBuddyInfo2::EAvailable; + aExtendedCacheAvailability.Copy( KDefaultAvailableStatus() ); + aXimpApiAvailability = NPresenceInfo::EAvailable; + handled = ETrue; + } + //Unknown closed + else if ( !aUnicodeContent.CompareF( KPresenceClosed ) && + !aActivities.CompareF ( KPresenceUnknow ) ) + { + DP_SDA(" CPresencePluginPublisher -> closed"); + aCacheAvailability = MPresenceBuddyInfo2::ENotAvailable; + aExtendedCacheAvailability.Copy( KInvisibleState() ); + aXimpApiAvailability = NPresenceInfo::ENotAvailable; + handled = ETrue; + } + //All other states are closed + else + { + DP_SDA(" CPresencePluginPublisher -> else closed"); + aCacheAvailability = MPresenceBuddyInfo2::ENotAvailable; + aExtendedCacheAvailability.Copy( KInvisibleState() ); + aXimpApiAvailability = NPresenceInfo::ENotAvailable; + handled = ETrue; + } + DP_SDA2("CPresencePluginPublisher::ResolveOwnCacheValuesL out, ret: %d", + handled ); + return handled; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginsession.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,498 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include //For MXIMPServiceInfo +#include //Handle command +#include //Connection callback methods +#include //create instances to abstract class +#include //Part of Registration API from SIMPLE engine +#include +#include //for TPresSettingsSet +#include +#include +#include +#include +#include + +#include "presencepluginxdmutils.h" +#include "presencepluginsession.h" +#include "mpresencepluginconnectionobs.h" +#include "presencepluginauthorization.h" +#include "presenceplugindata.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CPresencePluginSession() +// --------------------------------------------------------------------------- +// +CPresencePluginSession::CPresencePluginSession( + MPresencePluginConnectionObs& aObs ) + : CActive( CActive::EPriorityStandard ),iObs(aObs), + iType( MPresencePluginConnectionObs::ENoReq ),iSipConnected( EFalse ), + iXdmConnected( EFalse ), iXdmLocalMode( EFalse ), iOperation( ENoOperation ), + iServiceId( KErrNotFound ) + { + CActiveScheduler::Add(this); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::ConstructL( const MXIMPServiceInfo& aService ) + { + DP_SDA2("CPresencePluginSession::ConstructL: service id: %d", + aService.IapId() ); + + CSPSettings* spSettings = CSPSettings::NewL(); + CleanupStack::PushL( spSettings ); + + CSPProperty* property = CSPProperty::NewLC(); + spSettings->FindPropertyL( aService.IapId(), + ESubPropertyPresenceSettingsId, + *property ); + if ( property ) + { + property->GetValue( iPresSettingId ); + } + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spSettings ); + + DP_SDA2("PluginSession::ConstructL iPresSettingId %d",iPresSettingId ); + __ASSERT_ALWAYS( iPresSettingId > 0, User::Leave( KErrArgument ) ); + iServiceId = aService.IapId(); + + //Create connection + iConnection = TSimpleFactory::NewConnectionL( *this, aService.IapId() ); + + //Check here is xdm settings ok + CheckXDMSettingsL( aService.IapId() ); + + DP_SDA("CPresencePluginSession::ConstructL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginSession* CPresencePluginSession::NewL( + const MXIMPServiceInfo& aService, + MPresencePluginConnectionObs& aObs ) + { + DP_SDA("CPresencePluginSession::NewL"); + CPresencePluginSession* self = + new( ELeave ) CPresencePluginSession( aObs ); + CleanupStack::PushL( self ); + self->ConstructL( aService ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::~CPresencePluginSession() +// --------------------------------------------------------------------------- +// +CPresencePluginSession::~CPresencePluginSession() + { + DP_SDA("CPresencePluginSession::~CPresencePluginSession"); + + delete iUserId8; + delete iDomain; + if ( iConnection ) + { + iConnection->Close(); + } + + DP_SDA("~CPresencePluginSession iXdmUtils"); + delete iXdmUtils; + iXdmUtils = NULL; + DP_SDA("CPresencePluginSession::~CPresencePluginSession end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::SimpleConnection() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginSession::GetPresenceSetId( ) const + { + return iPresSettingId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::SimpleConnection() +// --------------------------------------------------------------------------- +// +MSimpleConnection* CPresencePluginSession::SimpleConnection( ) + { + return iConnection; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::XdmSettingsId() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginSession::XdmSettingsId( ) + { + DP_SDA("CPresencePluginSession::XdmSettingsId"); + return iXdmSetting; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CurrentDomain() +// --------------------------------------------------------------------------- +// +TPtrC16 CPresencePluginSession::CurrentDomain( ) + { + return iDomain ? iDomain->Des() : TPtrC16(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::IsXdmLocalmode() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginSession::IsXdmLocalmode() + { + DP_SDA("CPresencePluginSession::IsXdmLocalmode"); + return iXdmLocalMode; + } +// --------------------------------------------------------------------------- +// CPresencePluginSession::OpenSessionL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::OpenSessionL() + { + DP_SDA("CPresencePluginSession::OpenSessionL"); + //Check connection status + MSimpleConnection::TSimpleState connectionStatus = + iConnection->ConnectionStatus(); + DP_SDA2("OpenSessionL Connection Status %d", connectionStatus); + + if( connectionStatus == MSimpleConnection::EInactive ) + { + DP_SDA("CPresencePluginSession::OpenSessionL Not connected yet"); + iSipConnected = EFalse; + // SIP register using by give presence setting id + iOpId = iConnection->LoginL( iPresSettingId ); + iType = MPresencePluginConnectionObs::EOpenSess; + } + else if ( connectionStatus == MSimpleConnection::EActive ) + { + DP_SDA(":OpenSessionL already connected complete"); + iSipConnected = ETrue; + iType = MPresencePluginConnectionObs::EOpenSess; + RequestCompleteL( iOpId, KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ConnectionStatusL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::ConnectionStatusL( + MSimpleConnection::TSimpleState aState ) + { + DP_SDA2("CPresencePluginSession::ConnectionStatusL aState %d", aState ); + + if ( (aState == MSimpleConnection::EInactive ) + && iSipConnected ) + { + DP_SDA("CPresencePluginSession::ConnectionStatusL EInactive"); + + DP_SDA("CPresencePluginSession::ConnectionStatusL clear pres cache"); + iObs.InternalPresenceAuthorization().PluginData().RemoveCacheL(); + DP_SDA("CPresencePluginSession::ConnectionStatusL clear cache ok"); + + // cancel all XDM request + iObs.XdmUtilsL()->Cancel(); + //Set connection Terminated, terminate will be remove all client binds + iObs.TerminateConnectionL(); + iSipConnected = EFalse; + iXdmConnected = EFalse; + } + else if( ( aState == MSimpleConnection::EUnavailable && iSipConnected ) ) + { + //Its seems that SIP connection is unavaible + DP_SDA("CPresencePluginSession::ConnectionStatusL EUnavailable"); + } + + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CloseConnection() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::CloseConnection() + { + DP_SDA("CPresencePluginSession::CloseConnection"); + if( iConnection ) + { + DP_SDA("CPresencePluginSession::CloseConnection close called"); + iConnection->Close(); + iConnection = NULL; + } + DP_SDA("CPresencePluginSession::CloseConnection end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ConnectionStatus() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginSession::ConnectionStatus() + { + DP_SDA("CPresencePluginSession::ConnectionStatus"); + TBool connection = EFalse; + if( iXdmConnected && iSipConnected ) + { + connection = ETrue; + } + return connection; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::RequestCompleteL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::RequestCompleteL( TInt /*aOpId*/, TInt aStatus ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL"); + MPresencePluginConnectionObs::TReqType current = iType; + + if ( !aStatus ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL SIP session is open"); + iSipConnected = ETrue; + if( iXdmConnected ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL xdm IS OK"); + iType = MPresencePluginConnectionObs::ENoReq; + iObs.CompleteReq( current, aStatus ); + } + else + { + DP_SDA("CPresencePluginSession::RequestCompleteL Initialize XDM"); + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrNotReady ) ); + //Lets test XDM connection before complete + iXdmUtils = CPresencePluginXdmUtils::NewL( + iObs, iXdmSetting, iXdmLocalMode ); + + iOperation = EInitializeXdm; + iXdmUtils->InitializeXdmL( iStatus ); + SetActive(); + } + + } + DP_SDA("CPresencePluginSession::RequestCompleteL END"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CurrentSipPresentity() +// --------------------------------------------------------------------------- +// +TPtrC8 CPresencePluginSession::CurrentSipPresentity() + { + DP_SDA("CPresencePluginSession::CurrentSipPresentity"); + // Get from Simple engine + delete iUserId8; + iUserId8 = NULL; + TRAPD(err, iUserId8 = iConnection->CurrentSIPIdentityL().AllocL() ) + if ( err == KErrNone ) + { + return iUserId8 ? iUserId8->Des() : TPtrC8(); + } + else + { + return iUserId8 ? KNullDesC8() : TPtrC8(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::CheckXDMSettings() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::CheckXDMSettingsL( TUint aServiceId ) + { + //Check if xdm settings not valid or there is text http://localhost + //in settings. If not valid or text found client will be save resourcelist + //to in phonememory + + TPresSettingsSet mySet; + User::LeaveIfError( + PresSettingsApi::SettingsSetL( iPresSettingId, mySet )); + iXdmSetting = mySet.iXDMSetting; + if( iDomain ) + { + delete iDomain; + iDomain = NULL; + } + iDomain = mySet.iDomainSyntax.AllocL(); + + DP_SDA(" -> CheckXDMSettings - store domain to service table"); + // Service table + CSPSettings* spsettings = CSPSettings::NewLC(); + CSPProperty* property = CSPProperty::NewLC(); + + DP_SDA(" -> CheckXDMSettings - spsettings and property created"); + User::LeaveIfError( property->SetName( ESubPropertyPresenceAddrScheme ) ); + DP_SDA(" -> CheckXDMSettings - property name set"); + + TInt atPosInDomain = iDomain->Locate( '@' ); + DP_SDA2(" -> CheckXDMSettings - @ position in domain: %d", atPosInDomain ); + if ( KErrNotFound == atPosInDomain ) + { + DP_SDA(" -> CheckXDMSettings - no @ in domain, set"); + property->SetValue( iDomain->Des() ); + } + else + { + DP_SDA(" -> CheckXDMSettings - @ found in domain, remove"); + HBufC* formattedDomain = HBufC::NewLC( iDomain->Length() ); + TPtr formattedDomainPtr( formattedDomain->Des() ); + formattedDomainPtr.Copy( iDomain->Mid( ( atPosInDomain + 1 ) ) ); + property->SetValue( formattedDomainPtr ); + CleanupStack::PopAndDestroy( formattedDomain ); + } + DP_SDA(" -> CheckXDMSettings - property value set"); + User::LeaveIfError( + spsettings->AddOrUpdatePropertyL( aServiceId, *property ) ); + DP_SDA(" -> CheckXDMSettings - property added or updated"); + + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spsettings ); + +#ifdef _DEBUG + DP_SDA2("XdmSettingsId xdmSetting id %d",iXdmSetting ); + DP_SDA2("CheckXDMSettings::XdmSettingsId domain %S",iDomain ); +#endif + + //Continue check, add localhost to buf2 + HBufC* buf2 = KLocalhost().AllocLC(); + + //Get Uri from XDM settings + HBufC* xcaproot = NULL; + + TRAPD( error, xcaproot = + TXdmSettingsApi::PropertyL( iXdmSetting, EXdmPropUri ) ); + DP_SDA2("CheckXDMSettings Set localmode, err %d", error); + + if( KErrNotFound != error && xcaproot ) + { + //Compare buf2 to xcaproot + if ( !xcaproot->Compare( buf2->Des() ) ) + { + DP_SDA("CheckXDMSettings Set localmode"); + iXdmLocalMode = ETrue; + } + else + { + DP_SDA("CheckXDMSettings Set Normal Mode"); + iXdmLocalMode = EFalse; + } + + DP_SDA("CheckXDMSettings PopAndDestroy buf2"); + } + else + { + //It seems there is no valid XCAP settings, so we try localmode + //Shuld we create automaticaly XCAP localhost settings? + iXdmLocalMode = ETrue; + } + + DP_SDA("CheckXDMSettings PopAndDestroy xcaproot"); + CleanupStack::PopAndDestroy( buf2 ); + delete xcaproot; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::XdmUtilsL() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmUtils* CPresencePluginSession::XdmUtilsL() + { + if ( !iXdmUtils ) + { + DP_SDA("CPresencePluginSession::XdmUtilsL !iXdmUtils"); + iXdmUtils = CPresencePluginXdmUtils::NewL( + iObs, iXdmSetting, iXdmLocalMode ); + } + + return iXdmUtils; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::ServiceId() +// --------------------------------------------------------------------------- +// +TInt& CPresencePluginSession::ServiceId() + { + return iServiceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::DoCancel( ) + { + DP_SDA("CPresencePluginSession::DoCancel CANCEL"); + iXdmUtils->Cancel(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginSession::RunL( ) + { + DP_SDA("CPresencePluginSession::RunL"); + TInt status = iStatus.Int(); + DP_SDA2("CPresencePluginSession::RunL status %d", status ); + + if( ( iOperation == EInitializeXdm ) && !status ) + { + DP_SDA("CPresencePluginSession::RequestCompleteL connection ready"); + iXdmConnected = ETrue; + MPresencePluginConnectionObs::TReqType current = iType; + iType = MPresencePluginConnectionObs::ENoReq; + iObs.CompleteReq( current, status ); + } + else + { + DP_SDA("Connection FAIL terminated"); + iXdmConnected = EFalse; + iSipConnected = EFalse; + iType = MPresencePluginConnectionObs::ECloseSess; + iObs.CompleteReq( iType, status ); + } + + } + +// --------------------------------------------------------------------------- +// CPresencePluginSession::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginSession::RunError( TInt /*aError*/ ) + { + DP_SDA("CPresencePluginSession::RunError"); + return KErrNone; + } + + // End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginutility.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginutility.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include "presencepluginutility.h" +#include "presencelogger.h" + +// ----------------------------------------------------------------------------- +// TPresencePluginUtility::ResetAndDestroyIdentities +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void TPresencePluginUtility::ResetAndDestroyIdentities( TAny* anArray ) + { + DP_SDA("TPresencePluginUtility::ResetAndDestroyIdentities"); + + RPointerArray* array = + reinterpret_cast*>( anArray ); + + if ( array ) + { + DP_SDA(" -> reset and destroy array items"); + array->ResetAndDestroy(); + DP_SDA(" -> close array"); + array->Close(); + } + DP_SDA("TPresencePluginUtility::ResetAndDestroyIdentities out"); + } + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginvirtualgroup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginvirtualgroup.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,222 @@ +/* +* Copyright (c) 2006-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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "presencepluginvirtualgroup.h" +#include "mpresencepluginconnectionobs.h" +#include "presenceplugincommon.h" +#include "presenceplugindata.h" + +const TInt KArrayGranularity = 5; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::~CPresencePluginVirtualGroup +// --------------------------------------------------------------------------- +CPresencePluginVirtualGroup::CPresencePluginVirtualGroup( + MPresencePluginConnectionObs& aObs, + CPresencePluginData* aPresenceData ) + :iConnObs( aObs ), + iPresenceData( aPresenceData ), + iVirtualMember( NULL ) + { + DP_SDA("CPresencePluginVirtualGroup::CPresencePluginVirtualGroup"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::~CPresencePluginVirtualGroup +// --------------------------------------------------------------------------- +CPresencePluginVirtualGroup::~CPresencePluginVirtualGroup() + { + DP_SDA("CPresencePluginVirtualGroup::~CPresencePluginVirtualGroup1"); + delete iVirtualMember; + delete iListName; + DP_SDA("CPresencePluginVirtualGroup::~CPresencePluginVirtualGroup2"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::NewL +// --------------------------------------------------------------------------- +// +CPresencePluginVirtualGroup* CPresencePluginVirtualGroup::NewL( + MPresencePluginConnectionObs& aObs, + const TDesC16& aListName, + CPresencePluginData* aPresenceData ) + { + CPresencePluginVirtualGroup* self = + new (ELeave) CPresencePluginVirtualGroup( aObs, aPresenceData ); + CleanupStack::PushL( self ); + self->ConstructL( aListName ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::ConstructL +// --------------------------------------------------------------------------- +// +void CPresencePluginVirtualGroup::ConstructL( const TDesC16& aListName ) + { + DP_SDA("CPresencePluginVirtualGroup::ConstructL begin"); + iVirtualMember = new (ELeave) CDesCArrayFlat( KArrayGranularity ); + iListName = aListName.AllocL(); + DP_SDA("CPresencePluginVirtualGroup::ConstructL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::GetVirtualEntities +// --------------------------------------------------------------------------- +void CPresencePluginVirtualGroup::GetVirtualEntitiesL( + MXIMPObjectCollection& aColl ) + { + DP_SDA("CPresencePluginVirtualGroup::GetVirtualEntities begin"); + TInt count = iVirtualMember->Count(); + if ( count ) + { + DP_SDA("CPresencePluginVirtualGroup MXIMPObjectFactory& myFactory"); + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + for ( TInt i=0; i < count; i++ ) + { + MXIMPIdentity* member = myFactory.NewIdentityLC(); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( (*iVirtualMember)[i] ); + member->SetIdentityL( *withoutPrefix ); + CleanupStack::PopAndDestroy( withoutPrefix ); + // create here MXIMPPresentityGroupMemberInfo + MPresentityGroupMemberInfo* info = + iConnObs.PresenceObjectFactoryOwn(). + NewPresentityGroupMemberInfoLC(); + + DP_SDA("CPresencePluginVirtualGroup:: info->SetGroupMemberIdL"); + info->SetGroupMemberIdL( member ); //ownership taken + info->SetGroupMemberDisplayNameL( member->Identity() ); + aColl.AddObjectL( info ); + CleanupStack::Pop( 2 ); // >> info, member + DP_SDA2("CPresencePluginVirtualGroup:: done= handle next = %d", i); + } + DP_SDA("CPresencePluginVirtualGroup::GetOnlineEntities all done"); + } + DP_SDA("CPresencePluginVirtualGroup::GetOnlineEntities end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::AddEntityL +// --------------------------------------------------------------------------- +void CPresencePluginVirtualGroup::AddEntityL( const TDesC& aIdentityUri ) + { + DP_SDA("CPresencePluginVirtualGroup::AddOnlineEntity - begin"); + HBufC* prefixStripped = aIdentityUri.AllocLC(); + if ( KErrNotFound == IdentityExists( aIdentityUri ) ) + { + DP_SDA("CPresencePluginVirtualGroup::ivirtuaBuddys->AddObjectL"); + iVirtualMember->AppendL( *prefixStripped ); + } + CleanupStack::PopAndDestroy( prefixStripped ); + DP_SDA("CPresencePluginVirtualGroup::AddOnlineEntity - end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::RemoveOnlineEntity +// --------------------------------------------------------------------------- +void CPresencePluginVirtualGroup::RemoveEntityL( + const TDesC& aIdentityUri ) + { + DP_SDA("CPresencePluginVirtualGroup::RemoveOnlineEntity - begin"); + if ( iVirtualMember->Count() ) + { + DP_SDA("CPresencePluginVirtualGroup::RemoveOnlineEntity - find"); + HBufC* prefixStripped = aIdentityUri.AllocLC(); + TInt result = IdentityExists( *prefixStripped ); + if ( KErrNotFound != result && result < iVirtualMember->Count() ) + { + DP_SDA("CPresencePluginVirtualGroup:: - Remove"); + iVirtualMember->Delete( result ); + } + CleanupStack::PopAndDestroy( prefixStripped ); + } + DP_SDA("CPresencePluginVirtualGroup::RemoveOnlineEntity - end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::IdentityExists +// --------------------------------------------------------------------------- +TInt CPresencePluginVirtualGroup::IdentityExists( const TDesC& aIdentityUri ) + { + DP_SDA("CPresencePluginVirtualGroup::IdentityExists - begin"); + + TInt result( KErrNotFound ); + + for ( TInt i=0; iCount(); i++ ) + { + if ( (*iVirtualMember)[i].CompareF( aIdentityUri ) == 0 ) + { + DP_SDA2("IdentityExists - found at index = %d", i); + result = i; + break; + } + } + + DP_SDA("CPresencePluginVirtualGroup::IdentityExists - end"); + return result; + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::GetVirtualIdentityArray +// --------------------------------------------------------------------------- +CDesCArray* CPresencePluginVirtualGroup::GetVirtualIdentityArray( ) + { + DP_SDA("CPresencePluginVirtualGroup::GetVirtualIdentityArray - begin"); + return iVirtualMember; + } + +// --------------------------------------------------------------------------- +// CPresencePluginVirtualGroup::HandlePresentityGroupMemberAddedL +// --------------------------------------------------------------------------- +void CPresencePluginVirtualGroup::HandlePresentityGroupMemberAddedL( + const TDesC& aIdentityUri ) + { + DP_SDA("CPresencePluginVirtualGroup::HandlePresentityGroupMemberAddedL"); + + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + MProtocolPresentityGroupsDataHost& dataHost = + iConnObs.ProtocolPresenceHost().GroupsDataHost(); + MXIMPIdentity* groupid = myFactory.NewIdentityLC(); + groupid->SetIdentityL( iListName->Des() ); + MXIMPIdentity* member = myFactory.NewIdentityLC(); + member->SetIdentityL( aIdentityUri ); + MPresentityGroupMemberInfo* info = + iConnObs.PresenceObjectFactoryOwn().NewPresentityGroupMemberInfoLC(); + info->SetGroupMemberIdL( member ); //ownership taken + info->SetGroupMemberDisplayNameL( member->Identity() ); + dataHost.HandlePresentityGroupMemberAddedL( + groupid, info );// ownership taken + DP_SDA("CPresencePluginVirtualGroup:: Notify Pop( 3 )"); + CleanupStack::Pop( 3 ); // groupid, member, info + + DP_SDA("CPresencePluginVirtualGroup::HandlePresentityGroupMemberAddedL End"); + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginwatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginwatcher.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,788 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presencepluginvirtualgroup.h" +#include "mpresencepluginconnectionobs.h" +#include "presenceplugincommon.h" +#include "presencepluginwatcher.h" +#include "presencepluginentitywatcher.h" +#include "presencepluginxdmutils.h" +#include "presenceplugindata.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::CPresencePluginWatcher() +// --------------------------------------------------------------------------- +// +CPresencePluginWatcher::CPresencePluginWatcher( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, CPresencePluginData* aPresenceData ) + : CActive( CActive::EPriorityStandard ), + iConnObs(aObs), iConnection(aConn), iPresenceData( aPresenceData ), + iXdmState( EPluginIdle ),iCompleted( ETrue ), + iOperation( EPluginUndef ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginWatcher* CPresencePluginWatcher::NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginData* aPresenceData ) + { + DP_SDA("CPresencePluginWatcher::NewL"); + CPresencePluginWatcher* self = + new( ELeave ) CPresencePluginWatcher( aObs, aConn, aPresenceData ); + CleanupStack::PushL( self ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::~CPresencePluginWatcher() +// --------------------------------------------------------------------------- +// +CPresencePluginWatcher::~CPresencePluginWatcher() + { + iWatchers.ResetAndDestroy(); + iWatchers.Close(); + iWatcherCandidates.ResetAndDestroy(); + delete iPresIdentity; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoSubscribePresentityPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginWatcher::DoSubscribePresentityPresenceL"); + DP_SDA2(" DoSubscribePresentityPresenceL - identity: %S", + &aPresentityId.Identity() ); + + iOperation = EPluginSubscribeSingle; + iXdmState = EPluginIdle; + + SetPresIdentityL( aPresentityId, ETrue ); + + //Saving reguestID + iXIMPId = aReqId; + iCompleted = EFalse; + + HBufC8* pres8 = NULL; + pres8 = + CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); + CleanupStack::PushL( pres8 ); // << pres8 + + CPresencePluginEntityWatcher* watcher = + MatchWatcherL( pres8->Des(), ETrue ); + watcher->StartSubscribeL( pres8->Des() ); + CleanupStack::PopAndDestroy( pres8 ); // >> pres8 + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoPerformSubscribePresentityPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoPerformSubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aStatus ) + { + DP_SDA( "CPresencePluginWatcher::DoPerformSubscribePresentityPresenceL "); + DP_SDA( " -> From list operation"); + + iOperation = EPluginSubscribeByAdding; + iXdmState = EPluginIdle; + + SetPresIdentityL( aPresentityId, ETrue ); + + iCompleted = EFalse; + + HBufC8* pres8 = NULL; + pres8 = + CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); + CleanupStack::PushL( pres8 ); // << pres8 + + // remove escapes + HBufC8* encodedUsername = EscapeUtils::EscapeEncodeL( *pres8, EscapeUtils::EEscapeNormal ); + CleanupStack::PopAndDestroy( pres8 ); + CleanupStack::PushL( encodedUsername ); + + CPresencePluginEntityWatcher* watcher = + MatchWatcherL( encodedUsername->Des(), ETrue ); + watcher->StartSubscribeL( encodedUsername->Des(), aStatus ); + CleanupStack::PopAndDestroy( encodedUsername ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoUpdatePresentityPresenceSubscriptionPifL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoUpdatePresentityPresenceSubscriptionPifL( + const MXIMPIdentity& /*aPresentityId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + // Notice: later + User::Leave( KXIMPErrServiceRequestTypeNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoUnsubscribePresentityPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginWatcher::DoUnsubscribePresentityPresenceL"); + SetPresIdentityL( aPresentityId, ETrue ); + iXIMPId = aReqId; + iCompleted = EFalse; + + HBufC8* pres8 = NULL; + pres8 = + CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); + CleanupStack::PushL( pres8 ); // << pres8 + + CPresencePluginEntityWatcher* watcher = + MatchWatcherL( pres8->Des(), EFalse ); + if ( !watcher ) + { + DP_SDA("DoUnsubscribePresentityPresenceL error"); + User::Leave( KErrNotFound ); // Notice: error code + } + else + { + DP_SDA("DoUnsubscribePresentityPresenceL stop subscripe"); + watcher->StopSubscribeL(); + } + CleanupStack::PopAndDestroy( pres8 ); // >> pres8 + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoPerformUnsubscribePresentityPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoPerformUnsubscribePresentityPresenceL( + const MXIMPIdentity& aPresentityId, + TRequestStatus& aStatus ) + { + DP_SDA("CPresencePluginWatcher::DoPerformUnsubscribePresentityPresenceL"); + + SetPresIdentityL( aPresentityId, ETrue ); + iCompleted = EFalse; + + iOperation = EPluginUnSubscribeByRemoving; + + HBufC8* pres8 = NULL; + pres8 = + CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); + CleanupStack::PushL( pres8 ); // << pres8 + + CPresencePluginEntityWatcher* watcher = + MatchWatcherL( pres8->Des(), EFalse ); + if ( !watcher ) + { + DP_SDA("DoUnsubscribePresentityPresenceL watcher not found"); + aStatus = KRequestPending; + TRequestStatus* temp = &aStatus; + User::RequestComplete( temp, KErrNotFound ); + } + else + { + DP_SDA("DoUnsubscribePresentityPresenceL stop subscribe"); + watcher->StopSubscribeL( aStatus ); + } + CleanupStack::PopAndDestroy( pres8 ); // >> pres8 + + DP_SDA("CPresencePluginWatcher::DoPerformUnsubscribePresentityPresenceL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoSubscribePresentityGroupMembersPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoSubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId aReqId ) + { + DP_SDA("DoSubscribePresentityGroupMembersPresenceL"); + //Subscribe all buddys from virtual group + + iOperation = EPluginSubscribeGroup; + iXdmState = EPluginIdle; + + SetPresIdentityL( aGroupId, EFalse ); + iXIMPId = aReqId; + iCompleted = EFalse; + + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher:: +// DoUpdatePresentityGroupMembersPresenceSubscriptionPifL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher:: + DoUpdatePresentityGroupMembersPresenceSubscriptionPifL( + const MXIMPIdentity& /*aGroupId*/, + const MPresenceInfoFilter& /*aPif*/, + TXIMPRequestId /*aReqId*/ ) + { + User::Leave( KErrNotSupported ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoUnsubscribePresentityGroupMembersPresenceL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoUnsubscribePresentityGroupMembersPresenceL( + const MXIMPIdentity& aGroupId, + TXIMPRequestId aReqId ) + { + DP_SDA("DoUnsubscribePresentityGroupMembersPresenceL"); + + iOperation = EPluginUnsubscribeGroup; + iXdmState = EPluginIdle; + + SetPresIdentityL( aGroupId, EFalse ); + iXIMPId = aReqId; + iCompleted = EFalse; + + StartXdmOperationL(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CPresencePluginWatcher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + DP_SDA("CPresencePluginWatcher::GetInterface (......) "); + if ( aInterfaceId == GetInterfaceId() ) + { + DP_SDA("GetInterface : aInterfaceId == GetInterfaceId()"); + // caller wants this interface + MProtocolPresenceWatching* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + DP_SDA("GetInterface: aOptions == MXIMPBase::EPanicIfUnknown"); + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::GetInterface() +// --------------------------------------------------------------------------- +// +const TAny* CPresencePluginWatcher::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) const + { + DP_SDA("CPresencePluginWatcher::GetInterface (......) const "); + if ( aInterfaceId == GetInterfaceId() ) + { + DP_SDA("GetInterface : aInterfaceId == GetInterfaceId()"); + // caller wants this interface + const MProtocolPresenceWatching* myIf = this; + return myIf; + } + if ( aOptions == MXIMPBase::EPanicIfUnknown ) + { + DP_SDA("GetInterface: aOptions == MXIMPBase::EPanicIfUnknown"); + User::Panic( KPluginName, KErrExtensionNotSupported ); + } + return NULL; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::GetInterfaceId() +// --------------------------------------------------------------------------- +// +TInt32 CPresencePluginWatcher::GetInterfaceId() const + { + DP_SDA("CPresencePluginWatcher::GetInterfaceId() const"); + return MProtocolPresenceWatching::KInterfaceId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::MatchWatcherL +// --------------------------------------------------------------------------- +// +CPresencePluginEntityWatcher* CPresencePluginWatcher::MatchWatcherL( + const TDesC8& aPresentityid, TBool aCreate ) + { + DP_SDA("CPresencePluginWatcher::MatchWatcherL"); + DP_SDA2("CPresencePluginWatcher::MatchWatcherL %d", aCreate ) + TInt count = iWatchers.Count(); + DP_SDA2( "MatchWatcherL watcher count %d", count ); + for ( TInt i = 0; i < count; i++ ) + { + CPresencePluginEntityWatcher* temp = ( iWatchers[i] ); + //Check if prentity found from watcher + if ( !temp->PresentityId().CompareF( aPresentityid )) + { + DP_SDA("CPresencePluginWatcher::MatchWatcherL return temp"); + return temp; + } + } + if ( !aCreate ) + { + DP_SDA("CPresencePluginWatcher::MatchWatcherL return NULL"); + return NULL; + } + else + { + // Run this if like create new wathcer + DP_SDA("CPresencePluginWatcher::MatchWatcherL Else"); + CPresencePluginEntityWatcher* watcher = + CPresencePluginEntityWatcher::NewL( + iConnObs, iConnection, *this, iPresenceData ); + CleanupStack::PushL( watcher ); + iWatcherCandidates.AppendL( watcher ); + CleanupStack::Pop(); + DP_SDA("CPresencePluginWatcher::MatchWatcherL end"); + return watcher; + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DeleteWatcher +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DeleteWatcher( + const TDesC8& aPresentityid ) + { + DP_SDA( "CPresencePluginWatcher::DeleteWatcher" ); + TInt count = iWatchers.Count(); + DP_SDA2( "CPresencePluginWatcher::DeleteWatcher count %d", count); + + for ( TInt i = 0; i < count; i++ ) + { + CPresencePluginEntityWatcher* temp = ( iWatchers[i] ); + if ( !temp->PresentityId().CompareF( aPresentityid ) ) + { + DP_SDA2( "CPresencePluginWatcher::DeleteWatcher %d", i ); + iWatchers.Remove( i ); + iWatchers.GranularCompress(); + delete temp; + temp = NULL; + break; // delete all watchers? + } + } + DP_SDA( "CPresencePluginWatcher::DeleteWatcher end" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::SetPresIdentityL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::SetPresIdentityL( + const MXIMPIdentity& aPresentityId, + TBool aFormatUri ) + { + DP_SDA2("CPresencePluginWatcher::SetPresIdentityL: %S", + &aPresentityId.Identity() ); + + delete iPresIdentity; + iPresIdentity = NULL; + + if( aFormatUri ) + { + HBufC8* identityCopy = HBufC8::NewLC( KBufSize255 ); + TPtr8 identityCopyPtr( identityCopy->Des() ); + identityCopyPtr.Copy( aPresentityId.Identity() ); + DP_SDA2(" SetPresIdentityL, org identity: %S", identityCopy ); + + HBufC8* prefixUri = iPresenceData->CreatePresenceUri8LC( + identityCopyPtr ); + + HBufC* prefixUri16 = HBufC::NewLC( KBufSize255 ); + TPtr prefixUri16Ptr( prefixUri16->Des() ); + prefixUri16Ptr.Copy( *prefixUri ); + + DP_SDA2("CPresencePluginWatcher::SetPresIdentityL: with prefix: %S", + prefixUri16 ); + + iPresIdentity = prefixUri16; + CleanupStack::Pop( prefixUri16 ); + CleanupStack::PopAndDestroy( 2, identityCopy ); + } + else + { + DP_SDA("CPresencePluginWatcher::SetPresIdentityL, use as it is"); + iPresIdentity = aPresentityId.Identity().AllocL(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::CompleteXIMPReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::CompleteXIMPReq( TInt aStatus ) + { + DP_SDA("CPresencePluginWatcher::CompleteXIMPReq"); + iXdmState = EPluginIdle; + if ( iCompleted ) + { + return; + } + iCompleted = ETrue; + iConnObs.CompleteReq( iXIMPId, aStatus ); + iXIMPId = TXIMPRequestId(); + DP_SDA("CPresencePluginWatcher::CompleteXIMPReq END"); + iOperation = EPluginUndef; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::MatchWatcherId +// --------------------------------------------------------------------------- +// +TBool CPresencePluginWatcher::MatchWatcherId( + const TDesC8& aPresentityId ) const + { + DP_SDA("CPresencePluginWatcher::MatchWatcherId"); + + TBool watcherFound( EFalse ); + TInt count = iWatchers.Count(); + + DP_SDA2("CPresencePluginWatcher::MatchWatcherId watcher count %d", count); + + for ( TInt i = 0; i < count; i++ ) + { + CPresencePluginEntityWatcher* temp = ( iWatchers[i] ); + + //Check if ID is found from watcher + if ( !temp->PresentityId().CompareF( aPresentityId ) ) + { + DP_SDA("CPresencePluginWatcher::MatchWatcherId - Match!"); + watcherFound = ETrue; + } + } + + return watcherFound; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::CompleteWatcher +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::CompleteWatcher( TInt aStatus ) + { + + DP_SDA("CPresencePluginWatcher::CompleteWatcher"); + DP_SDA2("CPresencePluginWatcher::CompleteWatcher status %d", aStatus); + // start to remove RLS service when needed. + if ( iOperation == EPluginUnsubscribeGroup ) + { + DP_SDA("CompleteWatcher EPluginUnsubscribeGroup"); + if ( iXdmState == EPluginIdle ) + { + TRAPD( err, iXdmUtils->InitializeXdmsOnlyL( iStatus )); + if ( err ) + { + DP_SDA2("CompleteWatcher EPluginUnsubscribeGroup err %d",err); + CompleteXIMPReq( err ); + } + else + { + DP_SDA("CompleteWatcher EPluginUnsubscribeGroup fetch RLS"); + iXdmState = EPluginFetchRls; + if( !IsActive() ) + { + SetActive(); + } + } + return; + } + } + else + { + DP_SDA("CPresencePluginWatcher::CompleteWatcher complete"); + CompleteXIMPReq( aStatus ); + } + DP_SDA("CPresencePluginWatcher::CompleteWatcher end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::StartXdmOperationL +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::StartXdmOperationL() + { + DP_SDA("CPresencePluginWatcher::StartXdmOperationL"); + __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); + if ( !iXdmUtils ) + { + iXdmUtils = iConnObs.XdmUtilsL(); + } + iXdmUtils->InitializeXdmsOnlyL( iStatus ); + + iXdmState = EPluginInitXdm; + + SetActive(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::DoCancel +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::DoCancel( ) + { + iXdmUtils->Cancel(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::RunL +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::RunL() + { + + TInt status = iStatus.Int(); + + DP_SDA2("CPresencePluginWatcher::RunL mystatus %d ", status); + + if ( !status ) + { + if( iOperation == EPluginUnsubscribeGroup ) + { + DP_SDA("CPresencePluginWatcher::RunL EPluginUnsubscribeGroup "); + UnSubscribeAllL(); + } + if ( iOperation == EPluginSubscribeGroup ) + { + //First check we have complete buddy list from server + if ( iXdmState == EPluginInitXdm ) + { + // get members of the list first + SubscribeAllL(); + return; + } + } + if ( iOperation == EPluginSubscribeSingle ) + { + DP_SDA("CPresencePluginWatcher::RunL EPluginSubscribeSingle "); + if ( iXdmState == EPluginIdle ) + { + DP_SDA("RunL EPluginSubscribeSingle complete"); + iOperation = EPluginUndef; + CompleteXIMPReq( status ); + } + else + { + iOperation = EPluginUndef; + CompleteXIMPReq( status ); + } + } + } + else + { + DP_SDA("CPresencePluginWatcher::RunL error, complete"); + CompleteXIMPReq( status ); + } + DP_SDA("CPresencePluginWatcher::RunL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::SubscribeL +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::SubscribeL( const TDesC& aIdentity ) + { + DP_SDA2("CPresencePluginWatcher::SubscribeL identity: %S", &aIdentity ); + + MXIMPIdentity* member = iConnObs.ObjectFactory().NewIdentityLC(); + member->SetIdentityL( aIdentity ); + + SetPresIdentityL( *member, EFalse ); + + HBufC8* pres8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( + member->Identity() ); + CleanupStack::PushL( pres8 ); + + DP_SDA("CPresencePluginWatcher::SubscribeL try to subsribe"); + + CPresencePluginEntityWatcher* watcher = MatchWatcherL( + pres8->Des(),ETrue ); + if ( !watcher ) + { + DP_SDA("CPresencePluginWatcher::SubscribeL no watcher, create"); + watcher = CPresencePluginEntityWatcher::NewL( + iConnObs, iConnection, *this, iPresenceData ); + CleanupStack::PushL( watcher ); + iWatcherCandidates.AppendL( watcher ); + CleanupStack::Pop( watcher ); + } + DP_SDA("CPresencePluginWatcher::SubscribeL do subsribe"); + watcher->StartSubscribeL( pres8->Des() ); + DP_SDA("CPresencePluginWatcher::SubscribeL do subsribe ok"); + + CleanupStack::PopAndDestroy( pres8 ); + CleanupStack::PopAndDestroy( 1 ); // >> member + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::SubscribeAllL +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::SubscribeAllL() + { + DP_SDA("CPresencePluginWatcher::SubscribeAllL"); + + CDesCArray* subsribed = + iConnObs.SubscribedContacts()->GetVirtualIdentityArray(); + + //Get count + TInt count = subsribed->Count(); + DP_SDA2( "CPresencePluginWatcher::SubscribeAllL contact count %d", count); + + //Subsribe contact one by one + if( count > 0 ) + { + for( TInt i = 0;i < count;i++) + { + DP_SDA2( "SubscribeAllL handle contact no: %d", i ); + SubscribeL( subsribed->MdcaPoint( i ) ); + } + } + DP_SDA( "CPresencePluginWatcher::SubscribeAllL end" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::UnSubscribeAllL +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::UnSubscribeAllL() + { + DP_SDA("CPresencePluginWatcher::UnSubscribeAllL"); + CDesCArray* subsribed = + iConnObs.SubscribedContacts()->GetVirtualIdentityArray(); + + //Get count + TInt count = subsribed->Count(); + DP_SDA2("CPresencePluginWatcher::UnSubscribeAllL contact count %d",count); + //UnSubsribe contact one by one + + for( TInt i = 0;i < count;i++) + { + DP_SDA2("UnSubscribeAllL handle contact no: %d",i); + //Get identity form array + MXIMPIdentity* member = iConnObs.ObjectFactory().NewIdentityLC(); + member->SetIdentityL( (*subsribed)[i] ); + + SetPresIdentityL( *member, EFalse ); + + HBufC8* pres8 = + CnvUtfConverter::ConvertFromUnicodeToUtf8L( member->Identity() ); + CleanupStack::PushL( pres8 ); // << pres8 + + DP_SDA("CPresencePluginWatcher::UnSubscribeAllL try to unsubsribe"); + TInt watcherCount = iWatchers.Count(); + DP_SDA2("UnSubscribeAllL watcher count %d", watcherCount); + + TBool notFound( EFalse ); + for ( TInt j = 0; j < watcherCount; j++ ) + { + CPresencePluginEntityWatcher* watcher = + MatchWatcherL( pres8->Des(), EFalse ); + if ( !watcher ) + { + DP_SDA("UnSubscribeAllL error not found"); + notFound = ETrue; + } + else + { + DP_SDA("UnSubscribeAllL stop subscripe"); + watcher->StopSubscribeL(); + } + DP_SDA2("CPresencePluginWatcher: done= handle next = %d", i); + } + if ( notFound ) + { + DP_SDA("CPresencePluginWatcher::UnSubscribeAllL cotact not found"); + } + CleanupStack::PopAndDestroy( pres8 ); + CleanupStack::PopAndDestroy( 1 ); // >> member + } + DP_SDA("CPresencePluginWatcher::UnSubscribeAllL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::RunError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginWatcher::RunError( TInt aError ) + { + DP_SDA2("CPresencePluginWatcher::RunError = %d", aError); + CompleteXIMPReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::AcceptL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcher::AcceptL( const CPresencePluginEntityWatcher* aWatcher ) + { + DP_SDA( "CPresencePluginWatcher::AcceptL" ); + + if ( KErrNotFound == iWatchers.Find( aWatcher ) ) + { + iWatchers.AppendL( aWatcher ); + + TInt index = iWatcherCandidates.Find( aWatcher ); + if ( KErrNotFound != index ) + { + iWatcherCandidates.Remove( index ); + } + } + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginwatcherinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginwatcherinfo.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,116 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include + +#include "presencepluginwatcherinfo.h" + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +// CPresencePluginWatcherInfo::CPresencePluginWatcherInfo +// --------------------------------------------------------------------------- +CPresencePluginWatcherInfo::CPresencePluginWatcherInfo( ) + {} + +// --------------------------------------------------------------------------- +// CPresencePluginWatcherInfo::~CPresencePluginWatcherInfo +// --------------------------------------------------------------------------- +CPresencePluginWatcherInfo::~CPresencePluginWatcherInfo() + { + delete iId; + delete iSipId; + } + +// ---------------------------------------------------------- +// CPresencePluginWatcherInfo::NewL +// ---------------------------------------------------------- +// +CPresencePluginWatcherInfo* CPresencePluginWatcherInfo::NewL( + const TDesC8& aId, const TDesC& aSipId ) + { + CPresencePluginWatcherInfo* self = + new (ELeave) CPresencePluginWatcherInfo( ); + CleanupStack::PushL( self ); + self->ConstructL( aId, aSipId ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcherInfo::ConstructL +// --------------------------------------------------------------------------- +// +void CPresencePluginWatcherInfo::ConstructL( + const TDesC8& aId, const TDesC& aSipId ) + { + iId = aId.AllocL(); + iSipId = aSipId.AllocL(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcherInfo::Destroy +// --------------------------------------------------------------------------- +void CPresencePluginWatcherInfo::Destroy() + { + DP_SDA("CPresencePluginWatcherInfo::Destroy"); + iLink.Deque(); + delete this; + DP_SDA("CPresencePluginWatcherInfo::Destroy end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcherInfo::Match +// --------------------------------------------------------------------------- +TBool CPresencePluginWatcherInfo::Match( + const TDesC8& aId, + const TDesC& aSipId ) + { + DP_SDA("CPresencePluginWatcherInfo::Match"); + if ( (!iId->Des().CompareF( aId )) && (!iSipId->Des().CompareF( aSipId )) ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcherInfo::SipId +// --------------------------------------------------------------------------- +// +TPtrC CPresencePluginWatcherInfo::SipId( ) + { + DP_SDA("CPresencePluginWatcherInfo::SipId"); + return iSipId ? iSipId->Des() : TPtrC(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcherInfo::LinkOffset +// --------------------------------------------------------------------------- +// +TInt CPresencePluginWatcherInfo::LinkOffset() + { + return _FOFF(CPresencePluginWatcherInfo, iLink); + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginwinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginwinfo.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,181 @@ +/* +* Copyright (c) 2006 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include + +#include "presencepluginwinfo.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::CPresencePluginWinfo() +// --------------------------------------------------------------------------- +// +CPresencePluginWinfo::CPresencePluginWinfo( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn ) + :iConnObs( aObs ), iConnection( aConn ), + iSubscribed( EFalse ), + iWinfoCompleted( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWinfo::ConstructL( ) + { + iWinfoWatcher = TSimpleFactory::NewWinfoWatcherL( iConnection, *this ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginWinfo* CPresencePluginWinfo::NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn ) + { + DP_SDA("CPresencePluginWinfo::NewL"); + CPresencePluginWinfo* self = + new( ELeave ) CPresencePluginWinfo( aObs, aConn ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::~CPresencePluginWinfo() +// --------------------------------------------------------------------------- +// +CPresencePluginWinfo::~CPresencePluginWinfo() + { + if ( iWinfoWatcher ) + { + iWinfoWatcher->Close(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::SetHost() +// --------------------------------------------------------------------------- +// +void CPresencePluginWinfo::SetHost( + MXIMPProtocolConnectionHost* aHost ) + { + iHost = aHost; + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::SubscribeWinfoListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWinfo::SubscribeWinfoListL( TXIMPRequestId aReqId ) + { + DP_SDA("CPresencePluginWinfo::SubscribeWinfoListL"); + iWinfoCompleted = EFalse; + if ( !iSubscribed ) + { + DP_SDA("CPresencePluginWinfo::SubscribeWinfoListL !iSubscribed"); + iSimpleId = iWinfoWatcher->SubscribeWatcherListL( NULL ); + iSubscribed = ETrue; + iXIMPId = aReqId; + } + else + { + DP_SDA("CPresencePluginWinfo::SubscribeWinfoListL else "); + iSimpleId = 0; + iXIMPId = aReqId; + WinfoReqCompleteL( iSimpleId, KErrNone ); + } + DP_SDA("CPresencePluginWinfo::SubscribeWinfoListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::UnsubscribeWinfoListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWinfo::UnsubscribeWinfoListL( TXIMPRequestId aReqId ) + { + if ( iSubscribed ) + { + iSubscribed = EFalse; + iSimpleId = iWinfoWatcher->UnsubscribeL(); + iXIMPId = aReqId; + } + else + { + iSimpleId = 0; + iXIMPId = aReqId; + WinfoReqCompleteL( iSimpleId, KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::WinfoReqCompleteL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWinfo::WinfoReqCompleteL( TInt aOpId, TInt aStatus ) + { + DP_SDA("CPresencePluginWinfo::WinfoReqCompleteL"); + if ( iSimpleId == aOpId ) + { + iWinfoCompleted = ETrue; + iSimpleId = 0; + iConnObs.CompleteReq( iXIMPId, aStatus ); + // Do not wait MXIMPProtocolConnectionHostObserver callback, this + // class is ready to serve the next request now. + iXIMPId = TXIMPRequestId(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::WinfoTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWinfo::WinfoTerminatedL( + TInt aOpId, TInt aReason ) + { + + if ( iSimpleId == aOpId ) + { + iSimpleId = 0; + iConnObs.WinfoTerminatedL( aReason ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginWinfo::WinfoNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginWinfo::WinfoNotificationL( + MSimpleWinfo& aWinfo ) + { + if ( !iWinfoCompleted ) + { + WinfoReqCompleteL( iSimpleId, KErrNone ); + } + iConnObs.WinfoNotification( aWinfo ); + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginxdmpresrules.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginxdmpresrules.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1155 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "presencepluginxdmpresrules.h" +#include "mpresrulesasynchandler.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::NewLC() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmPresRules* CPresencePluginXdmPresRules::NewLC( + const TInt aSettingId, TBool aLocalMode ) + { + CPresencePluginXdmPresRules* self = + new (ELeave) CPresencePluginXdmPresRules( aSettingId ); + CleanupStack::PushL( self ); + self->ConstructL( aSettingId, aLocalMode ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmPresRules* CPresencePluginXdmPresRules::NewL( + const TInt aXmdId, TBool aLocalMode ) + { + CPresencePluginXdmPresRules* self = + new( ELeave ) CPresencePluginXdmPresRules( aXmdId ); + CleanupStack::PushL( self ); + self->ConstructL( aXmdId, aLocalMode ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::CPresencePluginXdmPresRules() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmPresRules::CPresencePluginXdmPresRules( const TInt aXdmId ) + :CActive( EPriorityStandard ), + iSettingsId( aXdmId ), + iXdmState( EStateIdle ), //Listeting xdState + iRulesUpdateState(EStateNoOperation), + iPresXdmOk( EFalse ), + iAsyncReq( ENoOperation ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::ConstructL( + const TInt aXmdId, + TBool aLocalMode ) + { + DP_SDA2("CPresencePluginXdmPresRules::ConstructL - aXdmId: %d", aXmdId ); + using namespace NPresencePlugin::NPresence; + if ( !aLocalMode ) + { + DP_SDA("CPresencePluginXdmPresRules::ConstructL Normal Mode"); + CXdmProtocolInfo* xdmProtocolInfo = CXdmProtocolInfo::NewL( aXmdId ); + CleanupStack::PushL( xdmProtocolInfo ); + DP_SDA("CPresencePluginXdmPresRules::ConstructL - protocol info created"); + xdmProtocolInfo->SetCacheUsage( EFalse ); + DP_SDA("CPresencePluginXdmPresRules::ConstructL - create xdm engine"); + iXdmEngine = CXdmEngine::NewL( *xdmProtocolInfo ); + CleanupStack::PopAndDestroy( xdmProtocolInfo ); + DP_SDA("CPresencePluginXdmPresRules::ConstructL - xdm engine created"); + + DP_SDA("CPresencePluginXdmPresRules::ConstructL - create doc model"); + //Create empty document model + iPresRulesDoc = + iXdmEngine->CreateDocumentModelL( + KPresencePresRules, EXdmOmaPresenceRules ); + DP_SDA("CPresencePluginXdmPresRules::ConstructL - create doc model ok"); + } + else + { + DP_SDA("CPresencePluginXdmPresRules::ConstructL LocalMode Mode"); + //Lets Try localmode + CXdmProtocolInfo* xdmProtocolInfo = + CXdmProtocolInfo::NewL( 0, KLocalProtocol, KNullDesC ); + CleanupStack::PushL( xdmProtocolInfo ); + iXdmEngine = CXdmEngine::NewL( *xdmProtocolInfo ); + CleanupStack::PopAndDestroy( xdmProtocolInfo ); + + //Create empty document model + iPresRulesDoc = + iXdmEngine->CreateDocumentModelL( + KPresencePresRules, EXdmOmaPresenceRules ); + } + DP_SDA("CPresencePluginXdmPresRules::ConstructL create root"); + CreateRootIfNeededL(); + DP_SDA("CPresencePluginXdmPresRules::ConstructL - out" ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules() + { + DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules"); + + if ( iPresRulesDoc ) + { + DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules 2"); + if ( iXdmEngine ) + { + DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules 3"); + TRAP_IGNORE( iXdmEngine->DeleteDocumentModelL( iPresRulesDoc )); + } + } + + delete iXdmEngine; + delete iEntityUri; + + DP_SDA("CPresencePluginXdmPresRules::~CPresencePluginXdmPresRules Done"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::GetXdmRulesL() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginXdmPresRules::GetXdmRulesL( + MPresRulesAsyncHandler* const aHandler ) + { + DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL"); + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + if (IsActive()) + return KErrAlreadyExists; + iAsyncReq = EXdmGetRulesFromServer; + iAsyncHandler = aHandler; + using namespace NPresencePlugin::NPresence; + + if ( !iPresXdmOk ) + { + DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL !iPresXdmOk"); + + + iPresRulesDoc->FetchDataL(); + DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL !iPresXdmOk end"); + } + else + { + // Document already exists, no need to search from a server + DP_SDA("CPresencePluginXdmPresRules::GetXdmRulesL Already exists"); + iStatus = KRequestPending; + SetActive(); + } + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::UpdateXdmRulesL() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginXdmPresRules::UpdateXdmRulesL( + MPresRulesAsyncHandler* const aHandler ) + { + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + if (IsActive()) + { + return KErrAlreadyExists; + } + iAsyncReq = EXdmUpdateRules; + iAsyncHandler = aHandler; + + iPresRulesDoc->AppendL(); + iXdmEngine->UpdateL(iPresRulesDoc, iStatus); + SetActive(); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::MakeInitialRulesDocumentL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::MakeInitialRulesDocumentL( + MPresRulesAsyncHandler* const aHandler ) + { + DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL"); + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + iAsyncReq = EXdmInitialPresDoc; + iAsyncHandler = aHandler; + + CXdmDocumentNode* root = iPresRulesDoc->DocumentRoot(); + if ( !root ) + { + DP_SDA("CPresencePluginXdmPresRules:: Create root"); + root = iPresRulesDoc->CreateRootL(); + } + + using namespace NPresencePlugin::NPresence; + root->SetNameL( KPresenceRuleset ); + + // send to the server and start wait a response + iPresRulesDoc->AppendL( root ); + DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL append"); + iAsyncReq = EXdmInitialPresDoc; + DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::AddWhiteListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::AddWhiteListL( CXdmDocumentNode* aRoot ) + { + DP_SDA("CPresencePluginXdmPresRules::AddWhiteList"); + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceTransformations; + + if ( aRoot->IsEmptyNode() ) + { + DP_SDA("AddWhiteList is empty node"); + aRoot->SetEmptyNode( EFalse ); + } + // whitelist + CXdmDocumentNode* child2 = aRoot->CreateChileNodeL( KPresenceRule ); + CleanupStack::PushL( child2 ); + CXdmNodeAttribute* name2 = child2->CreateAttributeL( KPresenceId ); + CleanupStack::PushL( name2 ); + name2->SetAttributeValueL( KPresenceXdmWhiteList ); + DP_SDA("CPresencePluginXdmPresRules::AddWhiteList 2"); + + CXdmDocumentNode* conditionsNode2 = + child2->CreateChileNodeL( KPresenceConditions ); + + conditionsNode2->CreateChileNodeL( KPresenceIdentity ); + CXdmDocumentNode* actionNode2 = + child2->CreateChileNodeL( KPresenceAction ); + + DP_SDA("CPresencePluginXdmPresRules::AddWhiteList 3"); + CXdmDocumentNode* subNode2 = actionNode2->CreateChileNodeL( KPresenceSub ); + DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL 4"); + + subNode2->SetLeafNode( ETrue ); + subNode2->SetLeafNodeContentL( KPresenceAllow8 ); + DP_SDA("CPresencePluginXdmPresRules::AddWhiteList 5"); + + //Add transformations + /* + + + + + + + + + + + + + + */ + + CXdmDocumentNode* trasform2 = + child2->CreateChileNodeL( KPresenceTrasformations ); + CXdmDocumentNode* services2 = + trasform2->CreateChileNodeL( KPresenceProvideServices ); + services2->CreateChileNodeL( KPresenceAllServices ); + CXdmDocumentNode* person2 = + trasform2->CreateChileNodeL( KPresenceProvidePersons ); + person2->CreateChileNodeL( KPresenceAllPersons ); + CXdmDocumentNode* devices2 = + trasform2->CreateChileNodeL( KPresenceProvidedevices ); + devices2->CreateChileNodeL( KPresenceAlldevices ); + trasform2->CreateChileNodeL( KPresenceProvideAllAttributes ); + + CleanupStack::Pop( name2 ); + CleanupStack::Pop( child2 ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::AddBlackList() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::AddBlackListL( CXdmDocumentNode* aRoot ) + { + DP_SDA("CPresencePluginXdmPresRules::AddBlackList"); + // add all the list nodes + // buddylist + using namespace NPresencePlugin::NPresence; + using namespace NPresencePlugin::NPresenceTransformations; + if ( aRoot->IsEmptyNode() ) + { + DP_SDA("AddBlackList is empty node"); + aRoot->SetEmptyNode( EFalse ); + } + CXdmDocumentNode* child1 = aRoot->CreateChileNodeL( KPresenceRule ); + CleanupStack::PushL( child1 ); + CXdmNodeAttribute* name = child1->CreateAttributeL( KPresenceId ); + CleanupStack::PushL( name ); + + name->SetAttributeValueL( KPresenceXdmBlockRule ); + // add condition + CXdmDocumentNode* conditionsNode = + child1->CreateChileNodeL( KPresenceConditions ); + conditionsNode->CreateChileNodeL( KPresenceIdentity ); + + CXdmDocumentNode* actionNode = + child1->CreateChileNodeL( KPresenceAction ); + + DP_SDA("CPresencePluginXdmPresRules::AddBlackList 1"); + CXdmDocumentNode* subNode = + actionNode->CreateChileNodeL( KPresenceSub ); + DP_SDA("CPresencePluginXdmPresRules::MakeInitialXdmsDocumentL 1/2"); + subNode->SetLeafNode(ETrue); + subNode->SetLeafNodeContentL( KPresenceBlock8 ); + DP_SDA("CPresencePluginXdmPresRules::AddBlackList 1/3"); + + CXdmDocumentNode* trasform = + child1->CreateChileNodeL( KPresenceTrasformations ); + CXdmDocumentNode* services = + trasform->CreateChileNodeL( KPresenceProvideServices ); + services->CreateChileNodeL( KPresenceAllServices ); + + CXdmDocumentNode* person = + trasform->CreateChileNodeL( KPresenceProvidePersons ); + person->CreateChileNodeL( KPresenceAllPersons ); + CXdmDocumentNode* devices = + trasform->CreateChileNodeL( KPresenceProvidedevices ); + devices->CreateChileNodeL( KPresenceAlldevices ); + trasform->CreateChileNodeL( KPresenceProvideAllAttributes ); + CleanupStack::Pop( name ); + CleanupStack::Pop( child1 ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::RunL( ) + { + DP_SDA("CPresencePluginXdmPresRules::RunL"); + TPluginPresRulesXdmOperation origState = iAsyncReq; + iAsyncReq = ENoOperation; + TInt myStatus = iStatus.Int(); + + DP_SDA2("CPresencePluginXdmPresRules::RunL mystatus %d ", myStatus); + DP_SDA2("CPresencePluginXdmPresRules::RunL state %d ", origState); + + switch( origState ) + { + case EXdmGetRulesFromServer: + { + DP_SDA("CPresencePluginXdmPresRules::RunL EXdmGetRulesFromServer"); + iAsyncHandler->HandlePresUpdateDocumentL( + iStatus.Int() ); + } + break; + case EXdmInitialPresDoc: + { + DP_SDA("CPresencePluginXdmPresRules::RunL EXdmInitialPresDoc"); + iAsyncHandler->HandlePresUpdateDocumentL( + iStatus.Int() ); + } + break; + case EXdmUpdateRules: + { + DP_SDA("CPresencePluginXdmPresRules::RunL EXdmUpdateRules"); + iAsyncHandler->HandlePresUpdateDocumentL( + iStatus.Int() ); + } + break; + case EXdmUpdateRulesFromServer: + { + DP_SDA("RunL ExdmUpdateRulesFromServer"); + CreateRootIfNeededL(); //This check is added for Openser/OpenXcap + iAsyncHandler->HandlePresUpdateDocumentL( iStatus.Int() ); + iRulesUpdateState = EStateNoOperation; + } + break; + case ENoOperation: + default: + break; + } + DP_SDA("CPresencePluginXdmPresRules::RunL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::DoCancel( ) + { + DP_SDA("CPresencePluginXdmPresRules::DoCancel"); + iXdmEngine->CancelUpdate(iPresRulesDoc); + iAsyncReq = ECancelDocument; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::RunError() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginXdmPresRules::RunError( TInt /*aError*/ ) + { + DP_SDA("CPresencePluginXdmPresRules::RunError"); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::AddEntityToWhiteListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::AddEntityToWhiteListL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ) + { + DP_SDA("CPresencePluginXdmPresRules::AddEntityToWhiteListL"); + iEntityUri = aUri.Alloc(); + DP_SDA2( "AddEntityToWhiteListL entity %S", iEntityUri ); + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + + iAsyncReq = EXdmUpdateRules; + iAsyncHandler = aHandler; + iRulesUpdateState = EStateAddToWhiteList; + DoOneAddUserL( KPresenceXdmWhiteList, iEntityUri->Des() ); + + UpdateXdmRulesL( aHandler ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::RemoveEntityFromWhiteListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::RemoveEntityFromWhiteListL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ) + { + DP_SDA("CPresencePluginXdmPresRules::RemoveEntityFromWhiteListL"); + iEntityUri = aUri.Alloc(); + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + + iAsyncReq = EXdmUpdateRules; + iAsyncHandler = aHandler; + iRulesUpdateState = EStateRemoveFromWhiteList; + RemoveOneFromRuleL( KPresenceXdmWhiteList, iEntityUri->Des() ); + + UpdateXdmRulesL( aHandler ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::AddEntityToBlockedRulesL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::AddEntityToBlockedRulesL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ) + { + DP_SDA("CPresencePluginXdmPresRules::AddEntityToBlockedRulesL"); + iEntityUri = aUri.Alloc(); + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + + iAsyncReq = EXdmUpdateRules; + iAsyncHandler = aHandler; + iRulesUpdateState = EStateAddToBlockList; + DoOneAddUserL( KPresenceXdmBlockRule, iEntityUri->Des() ); + + UpdateXdmRulesL( aHandler ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL( + const TDesC& aUri, + MPresRulesAsyncHandler* const aHandler ) + { + DP_SDA("CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL"); + iEntityUri = aUri.Alloc(); + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + + iAsyncReq = EXdmUpdateRules; + iAsyncHandler = aHandler; + iRulesUpdateState = EStateRemoveFromBlackList; + RemoveOneFromRuleL( KPresenceXdmBlockRule, iEntityUri->Des() ); + + UpdateXdmRulesL( aHandler ); + DP_SDA("CPresencePluginXdmPresRules::RemoveEntityBlockedRulesL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::RemoveOneFromRule() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::RemoveOneFromRuleL( + const TDesC& aRule, const TDesC& aUri ) + { + DP_SDA("CPresencePluginXdmPresRules::RemoveOneFromRule"); + CXdmDocumentNode* ruleNode = NULL; + CXdmNodeAttribute* attr = NULL; + TBool found( EFalse ); + TBool ruleAvaible( EFalse ); + + using namespace NPresencePlugin::NPresence; + + RPointerArray rules; + CleanupClosePushL( rules ); + + RPointerArray nodes; + CleanupClosePushL( nodes ); + + RPointerArray ones; + CleanupClosePushL( ones ); + + if ( iPresRulesDoc ) + { + DP_SDA("RemoveOneFromRule iPresRulesDoc ok"); + + //Check if rule exist + ruleAvaible = FindRuleL( aRule, EFalse ); + + if ( ruleAvaible ) + { + + TRAPD( err, ruleNode = GetRulesL( aRule, rules ) ); + if( !err ) + { + found = ETrue; + } + } + } + + if ( found ) + { + DP_SDA("CPresencePluginXdmPresRules::RemoveOneFromRule found"); + TInt findErr = ruleNode->Find( KPresenceOne, nodes ); + if ( !findErr ) + { + TInt nodeCount = nodes.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + CXdmDocumentNode* currNode = nodes[i]; + attr = ( currNode )->Attribute( KPresenceId ); + + TBool uriMatch = CompareUriWithoutPrefixL( + aUri, attr->AttributeValue() ); + + if ( attr && uriMatch ) + { + DP_SDA("RemoveOneFromRule Remove"); + //First remove currNode form model + iPresRulesDoc->RemoveFromModelL( currNode ); + + //Check how many rules are in group now + DP_SDA("RemoveOneFromRule Find all one field from rule"); + User::LeaveIfError( ruleNode->Find( KPresenceOne, ones ) ); + TInt oneCount = ones.Count(); + DP_SDA2("RemoveOneFromRule ones count %d", oneCount); + //if there is no any ones in rule remove it + if( KErrNone == oneCount ) + { + //Remove group + DP_SDA("RemoveOneFromRule Remove GROUP"); + RemoveRuleGroupL( aRule ); + } + // Update model to server + iPresRulesDoc->AppendL(); + break; + } + } + } + } + + CleanupStack::PopAndDestroy( &ones ); // >>> nodes + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + CleanupStack::PopAndDestroy( &rules ); // >>> lists + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::DoOneAddUserL() +// --------------------------------------------------------------------------- +// + void CPresencePluginXdmPresRules::DoOneAddUserL( + const TDesC& aRule, const TDesC& aUri ) + { + DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL"); + using namespace NPresencePlugin::NPresence; + + CXdmDocumentNode* ruleNode = NULL; + RPointerArray identityNode; + CleanupClosePushL( identityNode ); + + TBool found( EFalse ); + TBool ruleAvaible( EFalse ); + + using namespace NPresencePlugin::NPresence; + + RPointerArray rules; + CleanupClosePushL( rules ); + + + DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL iPresRulesDoc"); + if ( iPresRulesDoc ) + { + DP_SDA("DoOneAddUserL iPresRulesDoc Exist"); + + ruleAvaible = FindRuleL( aRule, ETrue ); + + if ( ruleAvaible ) + { + TRAPD( err, ruleNode = GetRulesL( aRule, rules ) ); + if( !err ) + { + found = ETrue; + } + } + } + + //Finaly add entity to rules + if ( found ) + { + //Check if enity already in list + if( !CheckIfOneExistL( aRule, aUri ) ) + { + DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL Found"); + // Find identityNode inside rulenode + User::LeaveIfError( + ruleNode->Find( KPresenceIdentity, identityNode ) ); + if ( identityNode[0] ) + { + if ( identityNode[0]->IsEmptyNode() ) + { + DP_SDA("DoOneAddUserL rule node empty"); + identityNode[0]->SetEmptyNode( EFalse ); + } + + // create new one node inside identity + CXdmDocumentNode* newNode = + identityNode[0]->CreateChileNodeL( KPresenceOne ); + CXdmNodeAttribute* attributeOneId = + newNode->CreateAttributeL( KPresenceId ); + + attributeOneId->SetAttributeValueL( aUri ); + iPresRulesDoc->AppendL(); + DP_SDA("DoOneAddUserL added"); + } + } + } + else + { + DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL error not found"); + User::Leave( KErrNotFound ); + } + DP_SDA("CPresencePluginXdmPresRules::DoOneAddUserL end"); + CleanupStack::PopAndDestroy( 2 ); + + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::GetRulesL() +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CPresencePluginXdmPresRules::GetRulesL( const TDesC& aRule, + RPointerArray& aRuleArray ) + { + DP_SDA("GetRulesL find Again if rule now exist"); + using namespace NPresencePlugin::NPresence; + + CXdmDocumentNode* ruleNode = NULL; + CXdmNodeAttribute* attr = NULL; + + TBool result(EFalse); + // find if rule tag is exist + User::LeaveIfError( iPresRulesDoc->Find( KPresenceRule, aRuleArray ) ); + + // How many rules found + TInt count = aRuleArray.Count(); + DP_SDA2("GetRulesL ruleCount %d ", count); + + // Check is needed rule id exist + for ( TInt i=0; i < count; i++ ) + { + ruleNode = aRuleArray[i]; + TBuf buf; + buf.Copy( + ruleNode->Attribute( KPresenceId )->AttributeValue() ); + DP_SDA2("GetRulesL ruleNode %S", &buf); + + attr = ruleNode->Attribute( KPresenceId ); + if ( attr && !attr->AttributeValue().CompareF( aRule ) ) + { + DP_SDA("CPresencePluginXdmPresRules::GetRulesL FOUND"); + result = ETrue; + break; + } + } + + // Make second compare + if( !result ) + { + User::LeaveIfError(iPresRulesDoc->Find( KPresenceRule, aRuleArray )); + TInt count2 = aRuleArray.Count(); + + for ( TInt i=0; i < count2; i++ ) + { + ruleNode = aRuleArray[i]; + attr = ruleNode->Attribute( KPresenceId ); + if ( attr && attr->AttributeValue().CompareF( aRule ) ) + { + DP_SDA("CPresencePluginXdmPresRules::GetRulesL NOT FOUND"); + User::Leave( KErrNotFound ); + } + } + } + + return ruleNode; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::FindRuleL() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginXdmPresRules::FindRuleL( + const TDesC& aRule, TBool aCreateRule ) + { + DP_SDA("CPresencePluginXdmPresRules::FindRuleL"); + using namespace NPresencePlugin::NPresence; + + if ( iPresRulesDoc ) + { + DP_SDA("CPresencePluginXdmPresRules::FindRuleL pres document exists"); + RPointerArray rule; + CleanupClosePushL( rule ); + + CXdmDocumentNode* ruleNode = NULL; + CXdmNodeAttribute* attr = NULL; + + TBool found = EFalse; + //Find all rules from document and but them to array + DP_SDA("CPresencePluginXdmPresRules::FindRuleL find rule"); + TInt err = iPresRulesDoc->Find( KPresenceRule, rule ); + DP_SDA2("FindRuleL find rule error %d", err); + + // There is no any rules yet avaible create + if ( err == KErrNotFound && aCreateRule ) + { + DP_SDA("FindRuleL Not any rules exist"); + if ( iRulesUpdateState == EStateAddToWhiteList ) + { + DP_SDA("FindRuleL add white list"); + AddWhiteListL( iPresRulesDoc->DocumentRoot() ); + CleanupStack::PopAndDestroy( 1 ); + return ETrue; + } + else if ( iRulesUpdateState == EStateAddToBlockList ) + { + DP_SDA("FindRuleL add black list"); + AddBlackListL( iPresRulesDoc->DocumentRoot() ); + CleanupStack::PopAndDestroy( 1 ); + return ETrue; + } + } + + // if rule element found find if aRule exist + TInt count = rule.Count(); + for ( TInt i=0; i < count; i++ ) + { + ruleNode = rule[i]; + TBuf buf; + buf.Copy( + ruleNode->Attribute( KPresenceId )->AttributeValue() ); + DP_SDA2("FindRuleL ruleNode %S", &buf); + + attr = ruleNode->Attribute( KPresenceId ); + if ( attr && !attr->AttributeValue().CompareF( aRule ) ) + { + DP_SDA("CPresencePluginXdmPresRules::FindRuleL FOUND"); + found = ETrue; + } + } + + if ( !found && aCreateRule) + { + // if rule not found create it + DP_SDA("CPresencePluginXdmPresRules::FindRuleL not found"); + //if rule not found add rule and check again + if ( EStateAddToWhiteList == iRulesUpdateState ) + { + DP_SDA("FindRuleL add white list2"); + AddWhiteListL( iPresRulesDoc->DocumentRoot() ); + CleanupStack::PopAndDestroy( 1 ); + return ETrue; + } + else if ( EStateAddToBlockList == iRulesUpdateState ) + { + DP_SDA("FindRuleL add black list 2"); + AddBlackListL( iPresRulesDoc->DocumentRoot() ); + CleanupStack::PopAndDestroy( 1 ); + return ETrue; + } + } + + CleanupStack::PopAndDestroy( 1 ); + return ETrue; + } + else + { + // Should we create presrules document + DP_SDA("CPresencePluginXdmPresRules::FindRuleL end"); + return EFalse; + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::CheckIfOneExistL +// --------------------------------------------------------------------------- +// +TBool CPresencePluginXdmPresRules::CheckIfOneExistL( + const TDesC& aRule, + const TDesC& aUri ) + { + using namespace NPresencePlugin::NPresence; + DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL"); + + using namespace NPresencePlugin::NPresence; + + CXdmNodeAttribute* attr = NULL; + RPointerArray nodes; + CleanupClosePushL( nodes ); + TBool state( EFalse ); + + CXdmDocumentNode* root = iPresRulesDoc->DocumentRoot(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aRule ); + + if ( foundNode ) + { + DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL check nodes"); + TInt findErr = foundNode->Find( KPresenceOne, nodes ); + DP_SDA2("CheckIfEnityExist - findErr: %d", findErr ); + + if ( findErr ) + { + DP_SDA("CheckIfOneExistL One not exist "); + state = EFalse; + } + else + { + DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL Else"); + TInt nodeCount = nodes.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + CXdmDocumentNode* currNode = nodes[i]; + attr = ( currNode )->Attribute( KPresenceId ); + + TBool uriMatch( EFalse ); + uriMatch = CompareUriWithoutPrefixL( + aUri, attr->AttributeValue() ); + + if ( attr && uriMatch ) + { + DP_SDA("CheckIfOneExistL entity exists"); + //Enity is exist + state = ETrue; + break; + } + } + } + } + DP_SDA("CPresencePluginXdmPresRules::CheckIfOneExistL Destroy nodes"); + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + return state; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::RemoveRuleGroupL( ) +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::RemoveRuleGroupL( const TDesC& aRule ) + { + DP_SDA("CPresencePluginXdmUtils::RemoveRuleGroupL"); + CXdmDocumentNode* ruleNode = NULL; + CXdmNodeAttribute* attr = NULL; + TBool found( EFalse ); + TBool ruleAvaible( EFalse ); + + using namespace NPresencePlugin::NPresence; + + RPointerArray rules; + CleanupClosePushL( rules ); + + RPointerArray nodes; + CleanupClosePushL( nodes ); + + //Find rules + if ( iPresRulesDoc ) + { + DP_SDA("RemoveRuleGroupL iPresRulesDoc ok"); + + //Check if rule exist + ruleAvaible = FindRuleL( aRule, EFalse ); + + if ( ruleAvaible ) + { + // If rule found get count how many rules are in xml + TInt findErr = iPresRulesDoc->Find( KPresenceRule, rules ); + DP_SDA2("RemoveRuleGroupL findError %d", findErr); + if ( !findErr ) + { + DP_SDA("RemoveRuleGroupL found EFalse"); + found = EFalse; + } + else + { + TInt count = rules.Count(); + DP_SDA2("RemoveRuleGroupL rule count %d", count); + for ( TInt i=0; i < count; i++ ) + { + ruleNode = rules[i]; + attr = ruleNode->Attribute( KPresenceId ); + if ( attr && !attr->AttributeValue().CompareF( aRule )) + { + found = ETrue; + break; + } + } + } + } + } + + if ( found ) + { + User::LeaveIfError( iPresRulesDoc->Find( KPresenceRule, nodes )); + TInt ruleCount = nodes.Count(); + DP_SDA2("L node count %d", ruleCount); + for ( TInt i = 0; i < ruleCount; i++ ) + { + CXdmDocumentNode* currNode = nodes[i]; + attr = currNode->Attribute( KPresenceId ); + if ( attr && !attr->AttributeValue().CompareF( aRule )) + { + DP_SDA("RemoveRuleGroupL remove rule"); + // This is the user we are looking for deletion. + iPresRulesDoc->RemoveFromModelL( currNode ); + //Update + iPresRulesDoc->AppendL(); + break; + } + } + } + else + { + User::Leave( KErrNotFound ); + } + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + CleanupStack::PopAndDestroy( &rules ); // >>> rules + DP_SDA("CPresencePluginXdmUtils::RemoveRuleGroupL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::UpdateFromServerL() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginXdmPresRules::UpdateFromServerL( + MPresRulesAsyncHandler* const aHandler ) + { + DP_SDA("CPresencePluginXdmPresRules::UpdateFromServer"); + using namespace NPresencePlugin::NPresence; + __ASSERT_ALWAYS(aHandler, User::Leave(KErrArgument)); + + if ( IsActive() ) + { + return KErrAlreadyExists; + } + iPresRulesDoc->ResetContents(); + iPresRulesDoc->FetchDataL(); + iAsyncReq = EXdmUpdateRulesFromServer; + iAsyncHandler = aHandler; + iXdmEngine->UpdateL( iPresRulesDoc, iStatus ); + SetActive(); + DP_SDA("CPresencePluginXdmPresRules::UpdateFromServer end"); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::CreateRootIfNeededL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmPresRules::CreateRootIfNeededL() + { + DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL"); + using namespace NPresencePlugin::NPresence; + + CXdmDocumentNode* myRootNode = iPresRulesDoc->DocumentRoot(); + + if ( myRootNode ) + { + DP_SDA("CreateRootIfNeededL document root exists"); + myRootNode->SetEmptyNode(EFalse); + return; + } + + DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root"); + myRootNode = iPresRulesDoc->CreateRootL(); + DP_SDA("CreateRootIfNeededL create root pushL"); + CleanupStack::PushL( myRootNode ); + myRootNode->SetNameL( KPresenceRuleset ); + DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root POP"); + CleanupStack::Pop( myRootNode ); + DP_SDA("CPresencePluginXdmPresRules::CreateRootIfNeededL create root end"); + } + +void CPresencePluginXdmPresRules::ResetAndDestroy1( TAny* aPointerArray ) + { + if ( aPointerArray ) + { + RPointerArray* array = + static_cast*>( aPointerArray ); + array->ResetAndDestroy(); + array->Close(); + } + } + +void CPresencePluginXdmPresRules::ResetAndDestroy2( TAny* aPointerArray ) + { + if ( aPointerArray ) + { + RPointerArray* array = + static_cast*>( aPointerArray ); + array->ResetAndDestroy(); + array->Close(); + } + } +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::SearchListUnderParentL +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CPresencePluginXdmPresRules::SearchListUnderParentL( + CXdmDocumentNode* aParent, + const TDesC& aName ) + { + DP_SDA("CPresencePluginXdmPresRules::SearchListUnderParentL"); + + using namespace NPresencePlugin::NPresence; + + if ( !aParent ) + { + DP_SDA("CPresencePluginXdmPresRules::SearchListUnderParentL return NULL"); + return NULL; + } + + RPointerArray resultArray; + RPointerArray attributeArray; + + CleanupClosePushL( resultArray ); // <<< resultArray + CleanupClosePushL( attributeArray ); // <<< attributeArray + + SXdmAttribute16 attr; + attr.iName.Set( KPresenceId ); + attr.iValue.Set( aName ); + attributeArray.AppendL( &attr ); + + CXdmDocumentNode* currNode = NULL; + + aParent->Find( KPresenceRule, resultArray, attributeArray ); + + TInt count = resultArray.Count(); + DP_SDA2("SearchListUnderParentL node count %d",count); + for ( TInt i=0; i < count; i++ ) + { + currNode = resultArray[i]; + CXdmDocumentNode* parent = currNode->Parent(); + if ( parent == aParent ) + { + DP_SDA("SearchListUnderParentL parent MATCH"); + break; + } + currNode = NULL; + } + + CleanupStack::PopAndDestroy(); // clItem + CleanupStack::PopAndDestroy(); // clItem2 + DP_SDA("CPresencePluginXdmPresRules::SearchListUnderParentL return"); + return currNode; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginXdmPresRules::SearchListUnderParentL +// --------------------------------------------------------------------------- +// +TBool CPresencePluginXdmPresRules::CompareUriWithoutPrefixL( + const TDesC& aUri, const TDesC& aAttribute ) + { + DP_SDA("CPresencePluginXdmPresRules::CompareUriWithoutPrefixL"); + + TBool match( EFalse ); + + RBuf uriWithoutPrefix; + CleanupClosePushL( uriWithoutPrefix ); + uriWithoutPrefix.CreateL( aUri ); + TInt prefixLocation = uriWithoutPrefix.Locate( ':' ); + + if ( KErrNotFound != prefixLocation ) + { + uriWithoutPrefix.Delete( 0, ( prefixLocation + 1 ) ); + } + + RBuf attributeWithoutprefix; + CleanupClosePushL( attributeWithoutprefix ); + attributeWithoutprefix.CreateL( aAttribute ); + prefixLocation = attributeWithoutprefix.Locate( ':' ); + + if ( KErrNotFound != prefixLocation ) + { + attributeWithoutprefix.Delete( 0, ( prefixLocation + 1 ) ); + } + + DP_SDA2(" --> uri without prefix=%S", &uriWithoutPrefix ); + DP_SDA2(" --> attribute without prefix=%S", &attributeWithoutprefix ); + + if ( uriWithoutPrefix.Compare( attributeWithoutprefix ) == 0 ) + { + match = ETrue; + } + + CleanupStack::PopAndDestroy( &attributeWithoutprefix ); + CleanupStack::PopAndDestroy( &uriWithoutPrefix ); + + return match; + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presencepluginxdmutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginxdmutils.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1687 @@ +/* +* Copyright (c) 2006-2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //for TPresSettingsSet +#include +#include +#include + +#include "presencepluginxdmpresrules.h" +#include "mpresencepluginconnectionobs.h" +#include "presenceplugincommon.h" +#include "presencepluginxdmutils.h" +#include "presencepluginvirtualgroup.h" +#include "presencepluginauthorization.h" +#include "presenceplugindata.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::CPresencePluginXdmUtils() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmUtils::CPresencePluginXdmUtils( + MPresencePluginConnectionObs& aObs , TInt aXmdId, TBool aLocalmode ) + : CActive( CActive::EPriorityStandard ), + iConnObs(aObs), iSettingsId(aXmdId), + iXdmState(EStateIdle), iOperation( ENoOperation ), + iPresXdmOk( EFalse ), iXdmOk( EFalse ), + iRulesUpdateState(EStateNoOperation), iLocalMode( aLocalmode ) + { + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::ConstructL( ) + { + + //If we are in normalmode we need presence rules too + if ( !iLocalMode ) + { + DP_SDA("CPresencePluginXdmUtils::ConstructL NormalMode"); + iXdmPresRules = CPresencePluginXdmPresRules::NewL( + iSettingsId, EFalse ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmUtils* CPresencePluginXdmUtils::NewL( + MPresencePluginConnectionObs& aObs, TInt aXmdId, TBool aLocalmode ) + { + CPresencePluginXdmUtils* self = + new( ELeave ) CPresencePluginXdmUtils( aObs, aXmdId, aLocalmode ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::~CPresencePluginXdmUtils() +// --------------------------------------------------------------------------- +// +CPresencePluginXdmUtils::~CPresencePluginXdmUtils() + { + DP_SDA("CPresencePluginXdmUtils::~CPresencePluginXdmUtils"); + if ( iXdmDoc ) + { + DP_SDA("CPresencePluginXdmUtils::~CPresencePluginXdmUtils 1"); + if (iXdmEngine) + { + DP_SDA("CPresencePluginXdmUtils::~CPresencePluginXdmUtils del doc"); + TRAP_IGNORE( iXdmEngine->DeleteDocumentModelL( iXdmDoc )); + } + } + + DP_SDA("CPresencePluginXdmUtils::~CPresencePluginXdmUtils 3"); + delete iXdmEngine; + iXdmEngine = NULL; + + + DP_SDA("CPresencePluginXdmUtils::~CPresencePluginXdmUtils 4"); + delete iXdmPresRules; + iXdmPresRules = NULL; + + + DP_SDA("CPresencePluginXdmUtils::~CPresencePluginXdmUtils 5"); + delete iEntityUri; + iEntityUri = NULL; + + iBlockedContacts.ResetAndDestroy(); + + DP_SDA("CPresencePluginXdmUtils::~CPresencePluginXdmUtils end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::InitializeXdmL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::InitializeXdmL( TRequestStatus& aStatus ) + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmL"); + + aStatus = KRequestPending; + iClientStatus = &aStatus; + + // if resource-list not ready + if ( !iXdmOk ) + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmL !iXdmOk"); + if ( !iLocalMode ) + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmL NormalMode"); + GetXdmListsL( ETrue, EFalse ); + } + else + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmL LocalMode"); + GetXdmListsL( ETrue, ETrue ); + } + } + else if ( !iPresXdmOk && !iLocalMode ) + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmL !iPresXdmOk"); + GetXdmRulesL(); + } + else + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmL All is OK "); + // All is ok + DP_SDA("CPresencePluginXdmUtils::InitializeXdmL SEND COMPLETE") + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::InitializeXdmL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::InitializePresRulesL( ) + { + DP_SDA("CPresencePluginXdmUtils:: MakeInitialRules"); + iXdmState = ECreateXdmRules; + iRulesUpdateState = EStateInitializeRules; + iXdmPresRules->MakeInitialRulesDocumentL( this ); + UpdateXdmRulesL(); + DP_SDA("CPresencePluginXdmUtils:: MakeInitialRules done"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::GetXdmRulesL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::GetXdmRulesL() + { + DP_SDA("CPresencePluginXdmUtils:: GetXdmRulesL"); + + if ( !iXdmPresRules ) + { + // get data from a network if not done so yet + if ( !iLocalMode ) + { + iXdmPresRules = CPresencePluginXdmPresRules::NewL( + iSettingsId, EFalse ); + } + else + { + /*localmode*/ + //iXdmPresRules + //= CPresencePluginXdmPresRules::NewL( iSettingsId, ETrue ); + } + } + + if( !iLocalMode && iXdmPresRules ) + { + User::LeaveIfError( iXdmPresRules->UpdateFromServerL( this )); + } + iXdmState = EGetXdmRules; + DP_SDA("CPresencePluginXdmUtils:: GetXdmRulesL done"); + DP_SDA("CPresencePluginXdmUtils::GetXdmRulesL - add buddies to virtual"); + AddIdentityToVirtualListL( KPresenceBuddyList ); + + DP_SDA("CPresencePluginXdmUtils::GetXdmRulesL - add blocked to virtual"); + AddIdentityToVirtualListL( KPresenceBlockedList ); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::InitializeXdmsOnlyL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::InitializeXdmsOnlyL( TRequestStatus& aStatus ) + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmsOnlyL"); + aStatus = KRequestPending; + iClientStatus = &aStatus; + + if ( !iXdmOk ) + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmsOnlyL 1"); + GetXdmListsL( EFalse, EFalse ); + } + else + { + DP_SDA("CPresencePluginXdmUtils::InitializeXdmsOnlyL all ok"); + // All is ok + DP_SDA("CPresencePluginXdmUtils::InitializeXdmsOnlyL SEND COMPLETE") + CompleteClientReq( KErrNone ); + } + DP_SDA("CPresencePluginXdmUtils::InitializeXdmsOnlyL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::CheckXdmDoc() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginXdmUtils::CheckXdmDoc() + { + DP_SDA("CPresencePluginXdmUtils::CheckXdmDoc"); + + if ( iXdmDoc ) + { + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + DP_SDA("CPresencePluginXdmUtils::CheckXdmDoc2"); + if( root ) + { + TInt count = root->NodeCount(); + DP_SDA2("CPresencePluginXdmUtils::CheckXdmDoc count %d", count); + if ( !count ) + { + DP_SDA("CPresencePluginXdmUtils::CheckXdmDoc NotFound"); + iXdmOk = EFalse; + } + else + { + DP_SDA("CPresencePluginXdmUtils::CheckXdmDoc file ok"); + iXdmOk = ETrue; + } + } + } + else + { + DP_SDA("CPresencePluginXdmUtils::CheckXdmDoc file False"); + iXdmOk = EFalse; + } + + return iXdmOk; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::CheckIfError +// --------------------------------------------------------------------------- +// +TInt CPresencePluginXdmUtils::CheckIfErrorL( TInt aMyStatus ) + { + TInt myStatus = aMyStatus; + DP_SDA2("CPresencePluginXdmUtils::CheckIfError ErrorCode %d ", myStatus); + if ( myStatus == KErrTimedOut ) + { + DP_SDA("CPresencePluginXdmUtils::CheckIfError TimeOut error"); + myStatus = KErrTimedOut; + User::Leave( KErrTimedOut ); + } + else if ( myStatus == KErrCouldNotConnect || + myStatus == KXcapErrorNetworkNotAvailabe ) + { + DP_SDA("CheckIfError KErrCouldNotConnect error"); + myStatus = aMyStatus; + } + else if ( myStatus == KXcapErrorHttpNotFound ) + { + DP_SDA("CheckIfError KXcapErrorHttpNotFound"); + myStatus = aMyStatus; + } + else if ( myStatus == KXcapErrorAuthentication ) + { + DP_SDA("CPresencePluginXdmUtils::CheckIfError auth error"); + myStatus = aMyStatus; + } + else if ( myStatus == KXcapErrorTooManyOccurencies ) + { + DP_SDA("CPresencePluginXdmUtils KXcapErrorTooManyOccurencies"); + myStatus = 0; + } + else if( myStatus == KErrDisconnected ) + { + myStatus = aMyStatus; + User::Leave( KErrCancel ); + } + else if( myStatus == KXcapErrorHttpPrecondFailed ) + { + DP_SDA("CheckIfError KXcapErrorHttpPrecondFailed"); + myStatus = aMyStatus; + } + else if ( KErrNoMemory == myStatus ) + { + DP_SDA("CheckIfError KErrNoMemory"); + User::Leave( KErrNoMemory ); + } + else + { + DP_SDA("CPresencePluginXdmUtils::CheckIfError ERROR"); + myStatus = aMyStatus; + } + return myStatus; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::RunL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::RunL( ) + { + DP_SDA("CPresencePluginXdmUtils::RunL"); + TPluginXdmState origState = iXdmState; + iXdmState = EStateIdle; + TInt myStatus = iStatus.Int(); + + DP_SDA2("CPresencePluginXdmUtils::RunL mystatus %d ", myStatus); + DP_SDA2("CPresencePluginXdmUtils::RunL state %d ", origState); + DP_SDA2("CPresencePluginXdmUtils:: ClientStatus %d",iClientStatus->Int() ); + + if ( myStatus == KErrCancel ) + { + DP_SDA("CPresencePluginXdmUtils::RunL CANCEL SEND COMPLETE") + CompleteClientReq( KErrCancel ); + } + + switch ( origState ) + { + case EGetXdmLists: + case EGetXdmListsOnly: + { + DoGetXdmListsL( myStatus, origState ); + } + break; + + case ECreateXdmLists: + { + DoCreateXdmListsL( myStatus, origState, EFalse ); + } + break; + + case ECreateXdmListsOnly: + { + DoCreateXdmListsL( myStatus, origState, ETrue ); + } + break; + + case EGetXdmBlockList: + { + DP_SDA("RunL EGetXdmBlockList SEND COMPLETE"); + CompleteClientReq( KErrNone ); + } + break; + + case EUpdateXdmList: + { + DoUpdateXdmListsL( myStatus, origState ); + } + break; + + case EUpdateBlockedContactPresenceCache: + DoUpdateBlockedContactPresenceCacheL( myStatus ); + break; + + default: + { + DP_SDA("CPresencePluginXdmUtils::RunL last else"); + //check myStatus error + myStatus = CheckIfErrorL( myStatus ); + + if ( myStatus ) + { + // complete reqular request + DP_SDA("CPresencePluginXdmUtils::RunL SEND LAST COMPLETE"); + CompleteClientReq( myStatus ); + } + DP_SDA("CPresencePluginXdmUtils::RunL default end") + } + break; + + } + DP_SDA("CPresencePluginXdmUtils::RunL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoUpdateXdmLists() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoUpdateXdmListsL( + TInt aMyStatus, + TPluginXdmState /*aOrigState*/) + { + DP_SDA("CPresencePluginXdmUtils::DoUpdateXdmLists EUpdateXdmList"); + if ( !iLocalMode ) + { + DP_SDA("CPresencePluginXdmUtils::DoUpdateXdmLists updaterules"); + if( aMyStatus ) + { + DP_SDA("DoUpdateXdmLists updaterules error"); + aMyStatus = CheckIfErrorL( aMyStatus ); + CompleteClientReq( aMyStatus ); + } + else + { + DP_SDA("DoUpdateXdmLists updaterules else"); + UpdateXdmRulesL(); + } + } + else + { + DP_SDA("EUpdateXdmList LOCALMODE SEND COMPLETE"); + aMyStatus = CheckIfErrorL( aMyStatus ); + CompleteClientReq( aMyStatus ); + } + iRulesUpdateState = EStateNoOperation; + DP_SDA("CPresencePluginXdmUtils::DoUpdateXdmLists EUpdateXdmList end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoCreateXdmLists() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoCreateXdmListsL( + TInt aMyStatus, + TPluginXdmState /*aOrigState*/, + TBool aOnlyResourceList ) + { + DP_SDA("CPresencePluginXdmUtils::DoCreateXdmListsL ECreateXdmLists"); + //check myStatus error + aMyStatus = CheckIfErrorL( aMyStatus ); + if( !aOnlyResourceList ) + { + if ( aMyStatus ) + { + DP_SDA("DoCreateXdmLists ECreateXdmLists SEND COMPLETE"); + CompleteClientReq( aMyStatus ); + } + else if ( !iLocalMode ) + { + DP_SDA("ECreateXdmLists !myStatus GetXdmRules"); + iXdmOk = ETrue; + GetXdmRulesL(); + } + else if ( iLocalMode ) + { + DP_SDA("DoCreateXdmLists ECreateXdmLists SEND COMPLETE 2"); + iXdmOk = ETrue; + CompleteClientReq( aMyStatus ); + } + } + else + { + //check myStatus error + aMyStatus = CheckIfErrorL( aMyStatus ); + if ( aMyStatus == KErrTimedOut ) + { + DP_SDA("DoCreateXdmLists EGetXdmListsOnly 1"); + aMyStatus = 0; + } + if ( !aMyStatus ) + { + DP_SDA("DoCreateXdmLists EGetXdmListsOnly 2"); + iXdmOk = ETrue; + } + + if( !(KXcapErrorNetworkNotAvailabe == aMyStatus || + KErrCouldNotConnect == aMyStatus ) ) + { + DP_SDA("DoCreateXdmLists EGetXdmListsOnly SEND COMPLETE"); + CompleteClientReq( aMyStatus ); + } + } + DP_SDA("CPresencePluginXdmUtils::DoCreateXdmListsL ECreateXdmLists end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoGetXdmLists() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoGetXdmListsL( + TInt aMyStatus, + TPluginXdmState aOrigState ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetXdmLists EGetXdmLists"); + //check myStatus error + aMyStatus = CheckIfErrorL( aMyStatus ); + + if ( aMyStatus )//Check is file includes nodes + { + DP_SDA("CPresencePluginXdmUtils::DoGetXdmLists CreateXDM"); + // no resource-list, let's start to create it. + CreateXdmListsL( ETrue ); + } + else + { + DP_SDA("CPresencePluginXdmUtils::DoGetXdmLists EGetXdmLists else"); + if( iLocalMode ) + { + //Check if document empty + TBool empty = CheckXdmDoc(); + if( !empty ) + { + CreateXdmListsL( ETrue ); + } + else + { + iXdmOk = ETrue; + DP_SDA("DoGetXdmLists Localmode SEND COMPLETE"); + CompleteClientReq( KErrNone ); + } + } + else + { + iXdmOk = ETrue; + if ( !iPresXdmOk && !iLocalMode && aOrigState == EGetXdmLists ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetXdmLists GetXDM"); + GetXdmRulesL(); + } + else + { + DP_SDA("CPresencePluginXdmUtils::DoGetXdmLists SEND COMPLETE"); + CompleteClientReq( KErrNone ); + } + } + } + DP_SDA("CPresencePluginXdmUtils::DoGetXdmLists end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoCancel() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoCancel( ) + { + DP_SDA("CPresencePluginXdmUtils::DoCancel"); + iOperation = EXdmCancel; + + if ( iXdmState == EGetXdmLists || iXdmState == ECreateXdmLists || + iXdmState == EUpdateXdmRules || iXdmState == EUpdateXdmList || + iXdmState == EGetXdmBlockList || iXdmState == ECreateXdmRules || + iXdmState == ESubsBlockList || + iXdmState == EGetResourceListFromServer || + iXdmState == EGetXdmListsOnly || iXdmState == ECreateXdmListsOnly ) + { + DP_SDA("CPresencePluginXdmUtils::DoCancel list get or create"); + iXdmState = ECancelDocument; + iXdmEngine->CancelUpdate( iXdmDoc ); + // cancel presrules too + iXdmPresRules->Cancel(); + } + else + { + iStatus = KRequestPending; + TRequestStatus* s= &iStatus; + DP_SDA("CPresencePluginXdmUtils::DoCancel SEND COMPLETE"); + User::RequestComplete( s, KErrCancel ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::RunError() +// --------------------------------------------------------------------------- +// +TInt CPresencePluginXdmUtils::RunError( TInt aError ) + { + DP_SDA("CPresencePluginXdmUtils::RunError"); + // complete the open request + CompleteClientReq( aError ); + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::AddEntityToGrantedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::AddEntityToGrantedL( + const TDesC& aUri, + TRequestStatus& aStatus ) + { + DP_SDA("CPresencePluginXdmUtils::AddEntityToGrantedL"); + DP_SDA2("CPresencePluginXdmUtils::AddEntityToGrantedL, uri: %S", &aUri ); + + TRAPD( err, iEntityUri = aUri.AllocL() ); + DP_SDA2(" AddEntityToGrantedL, uri alloc err: %d", err ); + + //Add entity to virtualGroup + iConnObs.SubscribedContacts()->AddEntityL( iEntityUri->Des() ); + + if ( !err ) + { + DP_SDA("CPresencePluginXdmUtils::AddEntityToGrantedL !err"); + iXdmState = EUpdateXdmList; + iClientStatus = &aStatus; + iOperation = EXdmAddUserToGroup; + iRulesUpdateState = EStateAddToWhiteList; + + //add user to resouce-list list + DoAddUserToListL( KPresenceBuddyList, aUri ); + DP_SDA("CPresencePluginXdmUtils::AddEntityToGrantedL 1"); + UpdateXdmsL(); + + *iClientStatus = KRequestPending; + DP_SDA("CPresencePluginXdmUtils::AddEntityToGrantedL end"); + } + else + { + DP_SDA("AddEntityToGrantedL else error SEND COMPLETE"); + //If error we can complete request + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::AddEntityToBlockedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::AddEntityToBlockedL( + const TDesC& aUri, + TRequestStatus& aStatus ) + { + DP_SDA("CPresencePluginXdmUtils::AddEntityToBlockedL"); + iClientStatus = &aStatus; + + if( iLocalMode ) + { + //Block is not used in localmode + DP_SDA("AddEntityToBlockedL localmode rules not support"); + CompleteClientReq( KErrNotSupported ); + } + else + { + DP_SDA("CPresencePluginXdmUtils::AddEntityToBlockedL !localmode"); + TRAPD(err, iEntityUri = aUri.AllocL() ); + //Remove entity form subscribed virtual group + iConnObs.SubscribedContacts()->RemoveEntityL( iEntityUri->Des() ); + + if ( !err ) + { + DP_SDA("CPresencePluginXdmUtils::AddEntityToBlockedL no error"); + iXdmState = EUpdateXdmList; + iOperation = EXdmAddUserToGroup; + iRulesUpdateState = EStateAddToBlockList; + + DoAddUserToListL( KPresenceBlockedList, aUri ); + UpdateXdmsL(); + + *iClientStatus = KRequestPending; + DP_SDA("CPresencePluginXdmUtils::AddEntityToBlockedL ready"); + } + else + { + //If error we can complete request + DP_SDA("AddEntityToBlockedL SEND COMPLETE"); + CompleteClientReq( KErrNone ); + } + } + DP_SDA("CPresencePluginXdmUtils::AddEntityToBlockedL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoAddUserToListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoAddUserToListL( + const TDesC& aList, + const TDesC& aUri ) + { + DP_SDA("CPresencePluginXdmUtils::DoAddUserToListL"); + DP_SDA2("CPresencePluginXdmUtils::DoAddUserToListL aList: %S", &aList); + DP_SDA2("CPresencePluginXdmUtils::DoAddUserToListL aUri: %S", &aUri); + + using namespace NPresencePlugin::NPresence; + + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aList ); + + if ( foundNode ) + { + DP_SDA("CPresencePluginXdmUtils::DoAddUserToListL found"); + if ( !CheckIfEnityExistL( aList, aUri ) ) + { + DP_SDA("DoAddUserToListL entity not exist"); + if ( foundNode->IsEmptyNode() ) + { + DP_SDA("DoAddUserToListL IsEmptyNode"); + foundNode->SetEmptyNode( EFalse ); + } + + DP_SDA("CPresencePluginXdmUtils::DoAddUserToListL newNode"); + CXdmDocumentNode* newNode = + foundNode->CreateChileNodeL( KPresenceEntry ); + DP_SDA("DoAddUserToListL entry attribute"); + CXdmNodeAttribute* attributeEntryUri = + newNode->CreateAttributeL( KPresenceUri ); + DP_SDA("CPresencePluginXdmUtils::DoAddUserToListL set entry"); + attributeEntryUri->SetAttributeValueL( aUri ); + DP_SDA("CPresencePluginXdmUtils::DoAddUserToListL Append"); + iXdmDoc->AppendL( ); + } + } + else + { + DP_SDA("CPresencePluginXdmUtils::DoAddUserToListL leave"); + User::Leave( KErrNotFound ); + } + DP_SDA("CPresencePluginXdmUtils::DoAddUserToListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::CheckIfEnityExistL +// --------------------------------------------------------------------------- +// +TBool CPresencePluginXdmUtils::CheckIfEnityExistL( + const TDesC& aList, + const TDesC& aUri ) + { + DP_SDA("CPresencePluginXdmUtils::CheckIfEnityExist"); + + using namespace NPresencePlugin::NPresence; + + CXdmNodeAttribute* attr = NULL; + RPointerArray nodes; + CleanupClosePushL( nodes ); + TBool state( EFalse ); + + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aList ); + + if ( foundNode ) + { + DP_SDA("CPresencePluginXdmUtils::CheckIfEnityExist check nodes"); + TInt findErr = foundNode->Find( KPresenceEntry, nodes ); + DP_SDA2("CheckIfEnityExist - findErr: %d", findErr ); + + if ( findErr ) + { + DP_SDA("CheckIfEnityExist Enity not exist "); + state = EFalse; + } + else + { + DP_SDA("CPresencePluginXdmUtils::CheckIfEnityExist Else"); + TInt nodeCount = nodes.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + CXdmDocumentNode* currNode = nodes[i]; + attr = ( currNode )->Attribute( KPresenceUri ); + + TBool uriMatch( EFalse ); + uriMatch = CompareUriWithoutPrefixL( + aUri, attr->AttributeValue() ); + + if ( attr && uriMatch ) + { + DP_SDA("CheckIfEnityExist entity exists"); + //Enity is exist + state = ETrue; + break; + } + } + } + } + DP_SDA("CPresencePluginXdmUtils::CheckIfEnityExist Destroy nodes"); + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + return state; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::SearchListUnderParentL +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CPresencePluginXdmUtils::SearchListUnderParentL( + CXdmDocumentNode* aParent, + const TDesC& aName ) + { + DP_SDA("CPresencePluginXdmUtils::SearchListUnderParentL"); + + using namespace NPresencePlugin::NPresence; + + if ( !aParent ) + { + DP_SDA("CPresencePluginXdmUtils::SearchListUnderParentL return NULL"); + return NULL; + } + + RPointerArray resultArray; + RPointerArray attributeArray; + + CleanupClosePushL( resultArray ); // <<< resultArray + CleanupClosePushL( attributeArray ); // <<< attributeArray + + SXdmAttribute16 attr; + attr.iName.Set( KPresenceName ); + attr.iValue.Set( aName ); + attributeArray.AppendL( &attr ); + + CXdmDocumentNode* currNode = NULL; + + aParent->Find( KPresenceList, resultArray, attributeArray ); + + TInt count = resultArray.Count(); + DP_SDA2("SearchListUnderParentL node count %d",count); + for ( TInt i=0; i < count; i++ ) + { + currNode = resultArray[i]; + CXdmDocumentNode* parent = currNode->Parent(); + if ( parent == aParent ) + { + DP_SDA("SearchListUnderParentL parent MATCH"); + break; + } + currNode = NULL; + } + + CleanupStack::PopAndDestroy( &attributeArray); // >>> attributeArray + CleanupStack::PopAndDestroy( &resultArray ); // >>> resultArray + DP_SDA("CPresencePluginXdmUtils::SearchListUnderParentL return"); + return currNode; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::RemoveEntityFromGrantedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::RemoveEntityFromGrantedL( + const TDesC& aUri, + TRequestStatus& aStatus ) + { + DP_SDA("CPresencePluginXdmUtils::RemoveEntityFromGrantedL"); + + iEntityUri = aUri.AllocL(); + iConnObs.SubscribedContacts()->RemoveEntityL( iEntityUri->Des() ); + + iClientStatus = &aStatus; + *iClientStatus = KRequestPending; + + iRulesUpdateState = EStateRemoveFromWhiteList; + iOperation = EXdmRemoveUserFromGroup; + + TRAPD( err, DoRemoveUserFromListL( KPresenceBuddyList, aUri ) ); + + if ( !err ) + { + // send to the server and start wait a response + UpdateXdmsL(); + iXdmState = EUpdateXdmList; + } + else + { + //complete request with error + DP_SDA2( "RemoveEntityFromGrantedL -DoRemoveUserFromListL error = %d", err ); + CompleteClientReq( err ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::RemoveEntityFromBlockedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::RemoveEntityFromBlockedL( + const TDesC& aUri, + TRequestStatus& aStatus ) + { + DP_SDA("CPresencePluginXdmUtils::RemoveEntityFromBlockedL"); + TRAPD(err, iEntityUri = aUri.AllocL() ); + + if ( !err ) + { + iClientStatus = &aStatus; + iRulesUpdateState = EStateRemoveFromBlackList; + iOperation = EXdmRemoveUserFromGroup; + + DoRemoveUserFromListL( KPresenceBlockedList, aUri ); + // send to the server and start wait a response + UpdateXdmsL(); + iXdmState = EUpdateXdmList; + *iClientStatus = KRequestPending; + } + else + { + //If error we can complete request + DP_SDA("RemoveEntityFromBlockedL SEND COMPLETE"); + CompleteClientReq( KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoRemoveUserFromListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoRemoveUserFromListL( + const TDesC& aList, + const TDesC& aUri ) + { + DP_SDA("CPresencePluginXdmUtils::DoRemoveUserFromListL"); + CXdmNodeAttribute* attr = NULL; + + using namespace NPresencePlugin::NPresence; + + RPointerArray lists; + CleanupClosePushL( lists ); + + RPointerArray nodes; + CleanupClosePushL( nodes ); + + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aList ); + if ( foundNode ) + { + DP_SDA("CPresencePluginXdmUtils::DoRemoveUserFromListL Node Found"); + User::LeaveIfError( foundNode->Find( KPresenceEntry, nodes )); + TInt nodeCount = nodes.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + CXdmDocumentNode* currNode = nodes[i]; + attr = ( currNode )->Attribute( KPresenceUri ); + + TBool uriMatch( EFalse ); + uriMatch = CompareUriWithoutPrefixL( + aUri, attr->AttributeValue() ); + + if ( attr && uriMatch ) + { + DP_SDA(" DoRemoveUserFromListL Node Found, do delete"); + + // This is the user we are looking for deletion. + //First remove currNode form model + iXdmDoc->RemoveFromModelL( currNode ); + // Update model to server + iXdmDoc->AppendL(); + break; + } + } + } + else + { + DP_SDA("CPresencePluginXdmUtils::DoRemoveUserFromListL Leave"); + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + CleanupStack::PopAndDestroy( &lists ); // >>> lists + DP_SDA("CPresencePluginXdmUtils::DoRemoveUserFromListL END"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::SubscribeBuddyListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::SubscribeBuddyListL( + RPointerArray& aMembers ) + { + DP_SDA("CPresencePluginXdmUtils::SubscribeBuddyListL"); + + iOperation = EXdmGetBuddyList; + DoGetListMembersL( KPresenceBuddyList, aMembers ); + + DP_SDA("CPresencePluginXdmUtils::SubscribeBuddyListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::SubscribeBlockListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::SubscribeBlockListL( + RPointerArray& aMembers ) + { + DP_SDA("CPresencePluginXdmUtils::SubscribeBlockListL"); + + if ( !iLocalMode ) + { + DP_SDA("CPresencePluginXdmUtils::SubscribeBlockListL !iLocalMode"); + iOperation = EXdmGetBlockedList; + DoGetListMembersL( KPresenceBlockedList, aMembers ); + } + DP_SDA("CPresencePluginXdmUtils::SubscribeBlockListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoGetListMembersL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoGetListMembersL( + const TDesC& aList, + RPointerArray& aMembers ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetListMembersL"); + using namespace NPresencePlugin::NPresence; + + aMembers.Reset(); + + RPointerArray nodes; + CleanupClosePushL( nodes ); + + CXdmDocumentNode* listNode = NULL; + CXdmNodeAttribute* attr = NULL; + + TBool found(EFalse); + + if ( iXdmDoc ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetListMembersL iXdmDoc"); + User::LeaveIfError( iXdmDoc->Find( KPresenceList, nodes ) ); + DP_SDA("CPresencePluginXdmUtils::DoGetListMembersL find ready"); + TInt count = nodes.Count(); + DP_SDA2("DoGetListMembersL find Count %d", count); + for ( TInt i=0; i < count; i++ ) + { + listNode = nodes[i]; + attr = listNode->Attribute( KPresenceName ); + if ( attr && !attr->AttributeValue().CompareF( aList )) + { + // That's the right list + DP_SDA("DoGetListMembersL Target found"); + found = ETrue; + break; + } + } + } + + if ( found ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetListMembersL found"); + MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); + nodes.Reset(); + TInt err = listNode->Find( KPresenceEntry, nodes ); + DP_SDA2("CPresencePluginXdmUtils::DoGetListMembersL err %d", err); + if( !err ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetListMembersL Entry found"); + TInt nodeCount = nodes.Count(); + for ( TInt i = 0; i < nodeCount; i++ ) + { + attr = (nodes[i])->Attribute( KPresenceUri ); + if ( attr ) + { + DP_SDA("DoGetListMembersL attr check"); + MXIMPIdentity* entity = + myFactory.NewIdentityLC(); // << entity + entity->SetIdentityL( attr->AttributeValue() ); + aMembers.AppendL( entity ); + CleanupStack::Pop(); // >> entity + } + } + } + } + CleanupStack::PopAndDestroy( &nodes ); + DP_SDA("CPresencePluginXdmUtils::DoGetListMembersL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::GetXdmListsL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::GetXdmListsL( + TBool aCreateRules, + TBool aLocalMode ) + { + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL"); + //Normal Mode start + if ( !iXdmEngine && !aLocalMode ) + { + DP_SDA2("!iXdmEngine settingID = %d", iSettingsId); + +#ifdef _DEBUG + //Get xdmSettings + HBufC* accesPoint = TXdmSettingsApi::PropertyL( + iSettingsId, EXdmPropToNapId ); + CleanupStack::PushL( accesPoint ); + DP_SDA2("CPresencePluginXdmUtils::GetXdmListsL accesPoint %S", + accesPoint); +#endif + + // get data from a network if not done so yet + CXdmProtocolInfo* info = CXdmProtocolInfo::NewL( iSettingsId ); + CleanupStack::PushL( info ); + + // Notice: we do not use cache for XDM + info->SetCacheUsage( EFalse ); //False in normal case + + iXdmEngine = CXdmEngine::NewL( *info ); + CleanupStack::PopAndDestroy( info ); +#ifdef _DEBUG + CleanupStack::PopAndDestroy( accesPoint ); +#endif + } + //LocalMode Start, !!! THERE IS LIMIT !!! + //Only one settings can use localmode + else if ( !iXdmEngine && aLocalMode ) + { + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL aLocalMode"); + CXdmProtocolInfo* info = + CXdmProtocolInfo::NewL( 0, KLocalProtocol, KNullDesC ); + CleanupStack::PushL( info ); + + iXdmEngine = CXdmEngine::NewL( *info ); + CleanupStack::PopAndDestroy( info ); + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL aLocalMode end"); + } + if ( !iXdmOk ) + { + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL !XdmOK "); + using namespace NPresencePlugin::NPresence; + // Get data from network + DP_SDA("GetXdmListsL Create Document Model "); + + iXdmDoc = iXdmEngine->CreateDocumentModelL( + KPresenceResourceList, EXdmResourceLists ); + + + DP_SDA("Create Document Model FetchData"); + iXdmDoc->FetchDataL(); + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL !XdmOK SETACTIVE "); + UpdateXdmsL(); + iXdmState = aCreateRules ? EGetXdmLists : EGetXdmListsOnly; + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL !XdmOK END"); + } + else + { + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL else"); + // Document already exists, no need to search from a server + iStatus = KRequestPending; + TRequestStatus* s= &iStatus; + DP_SDA("CPresencePluginXdmUtils::GetXdmListsL SEND COMPLETE"); + User::RequestComplete( s, KErrNone ); + iXdmState = aCreateRules ? EGetXdmLists : EGetXdmListsOnly; + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::CreateXdmListsL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::CreateXdmListsL( TBool aCreateRules ) + { + DP_SDA("CPresencePluginXdmUtils::CreateXdmListsL"); + + CXdmDocumentNode* root = iXdmDoc->CreateRootL(); + CleanupStack::PushL( root ); + + using namespace NPresencePlugin::NPresence; + root->SetNameL( KPresenceResourceLists ); + + // add all the list nodes + // buddylist + using namespace NPresencePlugin::NPresence; + if ( root->IsEmptyNode() ) + { + root->SetEmptyNode( EFalse ); + } + //buddy list + CXdmDocumentNode* child1 = root->CreateChileNodeL( KPresenceList ); + CleanupStack::PushL( child1 ); + CXdmNodeAttribute* name = child1->CreateAttributeL( KPresenceName ); + CleanupStack::PushL( name ); + name->SetAttributeValueL( KPresenceBuddyList ); + + // blockedcontacts + CXdmDocumentNode* child2 = root->CreateChileNodeL( KPresenceList ); + CleanupStack::PushL( child2 ); + CXdmNodeAttribute* name2 = child2->CreateAttributeL( KPresenceName ); + CleanupStack::PushL( name2 ); + name2->SetAttributeValueL( KPresenceBlockedList ); + + // send to the server and start wait a response + iXdmDoc->AppendL(); + UpdateXdmsL(); + iXdmState = aCreateRules ? ECreateXdmLists : ECreateXdmListsOnly; + + CleanupStack::Pop( name2 ); + CleanupStack::Pop( child2 ); + CleanupStack::Pop( name ); + CleanupStack::Pop( child1 ); + CleanupStack::Pop( root ); + DP_SDA("CPresencePluginXdmUtils::CreateXdmListsL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::GetEntitiesInListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::GetEntitiesInListL( + const TDesC& aList, + MXIMPObjectCollection& aColl ) + { + DP_SDA("CPresencePluginXdmUtils::GetEntitiesInListL "); + using namespace NPresencePlugin::NPresence; + + CXdmDocumentNode* buddylist = DoGetBuddyListL( aList ); + + // make a collection of MXIMPPresentityGroupMemberInfo + RPointerArray entries; + CleanupClosePushL(entries); // <<< entries + + RPointerArray nodes; + CleanupClosePushL(nodes); // <<< nodes + + buddylist->Find( KPresenceEntry, entries ); + DP_SDA("CPresencePluginXdmUtils::GetEntitiesInListL entries"); + TInt count = entries.Count(); + DP_SDA2("GetEntitiesInListL entries count %d",count); + for ( TInt i=0; i < count; i++ ) + { + DP_SDA("CPresencePluginXdmUtils::GetEntitiesInListL 1"); + // create here MXIMPPresentityGroupMemberInfo + MPresentityGroupMemberInfo* info = + iConnObs.PresenceObjectFactoryOwn(). + NewPresentityGroupMemberInfoLC(); + + // ID + CXdmDocumentNode* entry = entries[i]; + CXdmNodeAttribute* attr = entry->Attribute( KPresenceUri ); + if ( attr ) + { + DP_SDA("CPresencePluginXdmUtils::GetEntitiesInListL 2"); + MXIMPIdentity* id = + iConnObs.ObjectFactory().NewIdentityLC();//<< id + id->SetIdentityL( attr->AttributeValue() ); + info->SetGroupMemberIdL( id ); + CleanupStack::Pop(); // >> id + } + + // Display name + TInt err = entry->Find( KPresenceDisplayName, nodes ); + // Notice: assume there is only one display-name + if ( !err ) + { + DP_SDA("CPresencePluginXdmUtils::GetEntitiesInListL display name"); + CXdmDocumentNode* disName = nodes[0]; + HBufC16* uri16 = NULL; + uri16 = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( + disName->LeafNodeContent() ); + + CleanupStack::PushL( uri16 ); // << uri16 + info->SetGroupMemberDisplayNameL( uri16->Des() ); + CleanupStack::PopAndDestroy( uri16 ); // >> uri16 + } + + DP_SDA("CPresencePluginXdmUtils::GetEntitiesInListL 3"); + aColl.AddObjectL( info ); + + //if contact is from buddylist add it to virtual subscribed list too + if( !aList.CompareF( KPresenceBuddyList ) ) + { + DP_SDA("GetEntitiesInListL add virtualgroup"); + //Add identity to virtual list + iConnObs.SubscribedContacts()->AddEntityL( + info->GroupMemberId().Identity() ); + } + + CleanupStack::Pop(); // >> info + } + + CleanupStack::PopAndDestroy( &nodes ); // >>> nodes + CleanupStack::PopAndDestroy( &entries ); // >>> entries*/ + DP_SDA("CPresencePluginXdmUtils::GetEntitiesInListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::AddIdentityToVirtualListL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::AddIdentityToVirtualListL( const TDesC& aList ) + { + DP_SDA("CPresencePluginXdmUtils::AddIdentityToVirtualListL "); + using namespace NPresencePlugin::NPresence; + + if ( aList.Compare( KPresenceBlockedList ) == NULL ) + { + iBlockedContacts.ResetAndDestroy(); + } + + CXdmDocumentNode* buddylist = DoGetBuddyListL( aList ); + + // make a collection of MXIMPPresentityGroupMemberInfo + RPointerArray entries; + CleanupClosePushL(entries); // <<< entries + + buddylist->Find( KPresenceEntry, entries ); + DP_SDA("CPresencePluginXdmUtils::AddIdentityToVirtualListL entries"); + TInt count = entries.Count(); + DP_SDA2("AddIdentityToVirtualListL entries count %d",count); + for ( TInt i=0; i < count; i++ ) + { + DP_SDA("CPresencePluginXdmUtils::AddIdentityToVirtualListL 1"); + // ID + CXdmDocumentNode* entry = entries[i]; + CXdmNodeAttribute* attr = entry->Attribute( KPresenceUri ); + if ( attr ) + { + if( !aList.CompareF( KPresenceBuddyList ) ) + { + DP_SDA("AddIdentityToVirtualListL add to buddies"); + //Add identity to virtual list + iConnObs.SubscribedContacts()->AddEntityL( + attr->AttributeValue() ); + } + else if ( !aList.CompareF( KPresenceBlockedList ) ) + { + DP_SDA("AddIdentityToVirtualListL add to blocked"); + HBufC* withoutPrefix = + iConnObs.InternalPresenceAuthorization(). + PluginData().RemovePrefixLC( attr->AttributeValue() ); + CleanupStack::Pop( withoutPrefix ); + iBlockedContacts.AppendL( withoutPrefix ); + } + } + } + CleanupStack::PopAndDestroy( &entries ); // >>> entries + DP_SDA("CPresencePluginXdmUtils::AddIdentityToVirtualListL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoGetBuddyListL() +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CPresencePluginXdmUtils::DoGetBuddyListL( + const TDesC& aParent ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetBuddyListL"); + CXdmDocumentNode* root = iXdmDoc->DocumentRoot(); + + CXdmDocumentNode* ret = SearchListUnderParentL( root, aParent ); + if ( !ret ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetBuddyListL !found"); + User::Leave( KErrNotFound ); + } + return ret; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoGetUserListL() +// --------------------------------------------------------------------------- +// +CXdmDocumentNode* CPresencePluginXdmUtils::DoGetUserListL( + const TDesC& aList, CXdmDocumentNode* aBuddyList ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetUserListL"); + CXdmDocumentNode* listNode = NULL; + CXdmNodeAttribute* attr = NULL; + TBool found( EFalse ); + + using namespace NPresencePlugin::NPresence; + + RPointerArray lists; + CleanupClosePushL( lists ); + + User::LeaveIfError( aBuddyList->Find( KPresenceEntry, lists )); + TInt count = lists.Count(); + DP_SDA2("CPresencePluginXdmUtils::DoGetUserListL count %d",count); + for ( TInt i=0; i < count; i++ ) + { + listNode = lists[i]; + attr = listNode->Attribute( KPresenceUri ); + if ( attr && !attr->AttributeValue().CompareF( aList )) + { + // List is found + found = ETrue; + break; + } + } + if ( !found ) + { + DP_SDA("CPresencePluginXdmUtils::DoGetUserListL !found"); + User::Leave( KErrNotFound ); + } + + CleanupStack::PopAndDestroy( &lists ); + DP_SDA("CPresencePluginXdmUtils::DoGetUserListL end"); + return listNode; + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::UpdateXdmsL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::UpdateXdmsL() + { + DP_SDA("CPresencePluginXdmUtils::UpdateXdmsL"); + iXdmEngine->UpdateL( iXdmDoc, iStatus ); + if ( !IsActive() ) + { + DP_SDA("CPresencePluginXdmUtils::UpdateXdmsL SetActive"); + SetActive(); + } + DP_SDA("CPresencePluginXdmUtils::UpdateXdmsL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::UpdateXdmRulesL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::UpdateXdmRulesL() + { + DP_SDA("CPresencePluginXdmUtils::UpdateXdmRulesL"); + iXdmState = EUpdateXdmRules; + + if( iRulesUpdateState == EStateInitializeRules ) + { + User::LeaveIfError( iXdmPresRules->UpdateXdmRulesL( this )); + } + //Add entity to presrules too + if ( iRulesUpdateState == EStateAddToWhiteList ) + { + DP_SDA("EStateAddToWhiteList"); + iXdmPresRules->AddEntityToWhiteListL( + iEntityUri->Des(), this ); + } + if ( iRulesUpdateState == EStateAddToBlockList ) + { + DP_SDA("EStateAddToBlockList"); + iXdmPresRules->AddEntityToBlockedRulesL( + iEntityUri->Des(), this ); + } + if ( iRulesUpdateState == EStateRemoveFromWhiteList) + { + DP_SDA("EStateRemoveFromWhiteList"); + iXdmPresRules->RemoveEntityFromWhiteListL( + iEntityUri->Des(), this ); + } + if ( iRulesUpdateState == EStateRemoveFromBlackList) + { + DP_SDA("EStateRemoveFromBlackList"); + iXdmPresRules->RemoveEntityBlockedRulesL( + iEntityUri->Des(), this ); + } + DP_SDA("CPresencePluginXdmUtils::UpdateXdmRulesL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoHandlePresUpdateDocumentL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoHandlePresUpdateDocumentL( TInt aErrorCode ) + { + DP_SDA("CPresencePluginXdmUtils::DoHandlePresUpdateDocumentL"); + + // check if error + CheckIfErrorL( aErrorCode ); + + if ( iXdmState == EGetXdmRules ) + { + DP_SDA("DoHandlePresUpdateDocumentL EGetXdmRules"); + iXdmState = EStateIdle; + if ( aErrorCode && aErrorCode == KXcapErrorHttpNotFound ) + { + DP_SDA("DoHandlePresUpdateDocumentL EGetXdmRules ini rules ERROR"); + InitializePresRulesL(); + } + else + { + DP_SDA("DoHandlePresUpdateDocumentL EGetXdmRules SEND COMPLETE "); + // Complete with ok or error the last initial opreration + + // update presence cache if needed before complete client req. + iPresXdmOk = ETrue; + + if ( iBlockedContacts.Count() > 0 ) + { + iConnObs.InternalPresenceAuthorization(). + IsBlockedContactFriendRequestL( + *iBlockedContacts[ iBlockedContacts.Count() - 1 ], + *this, iStatus ); + + iXdmState = EUpdateBlockedContactPresenceCache; + SetActive(); + } + else + { + CompleteClientReq( aErrorCode ); + } + } + } + else if ( iXdmState == EUpdateXdmRules ) + { + DP_SDA("DoHandlePresUpdateDocumentL EUpdateXdmRules SEND COMPLETE "); + // Complete with ok or error the last initial opreration + CompleteClientReq( aErrorCode ); + } + else if ( iXdmState == ECreateXdmRules ) + { + DP_SDA("DoHandlePresUpdateDocumentL ECreateXdmRules SEND COMPLETE "); + iPresXdmOk = ETrue; + CompleteClientReq( aErrorCode ); + } + + else if ( iXdmState == EUpdateXdmList) + { + DP_SDA("DoHandlePresUpdateDocumentL EUpdateXdmList SEND COMPLETE"); + CompleteClientReq( aErrorCode ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::CompleteClientReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::CompleteClientReq( TInt aStatus ) + { + DP_SDA("CPresencePluginXdmUtils::CompleteClientReq"); + DP_SDA2("CPresencePluginXdmUtils::CompleteClientReq status %d ", aStatus); + iXdmState = EStateIdle; + iOperation = ENoOperation; + TRequestStatus* s = iClientStatus; + User::RequestComplete( s, aStatus ); + DP_SDA("CPresencePluginXdmUtils::CompleteClientReq end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::HandlePresUpdateDocumentL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::HandlePresUpdateDocumentL( + TInt aErrorCode ) + { +#ifdef _DEBUG + DP_SDA2("HandlePresUpdateDocumentL errorCode %d ", aErrorCode ); + DP_SDA2("HandlePresUpdateDocumentL mystatus %d ", iStatus.Int()); + DP_SDA2("HandlePresUpdateDocumentL state %d ", iXdmState); + DP_SDA2("HandlePresUpdateDocumentL ClientStatus %d",iClientStatus->Int() ); +#endif + + DP_SDA("CPresencePluginXdmUtils::HandlePresUpdateDocumentL"); + if ( aErrorCode == KErrTimedOut ) + { + DP_SDA("CPresencePluginXdmUtils::HandlePresUpdateDocumentL TimeOut"); + aErrorCode = 0; + } + + TRAPD( err, DoHandlePresUpdateDocumentL( aErrorCode )); + if ( err ) + { + DP_SDA("CPresencePluginXdmUtils::HandlePresUpdateDocumentL complete"); + // Complete with ok or error the last initial opreration + CompleteClientReq( err ); + } + } + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::SearchListUnderParentL +// --------------------------------------------------------------------------- +// +TBool CPresencePluginXdmUtils::CompareUriWithoutPrefixL( + const TDesC& aUri, const TDesC& aAttribute ) + { + DP_SDA("CPresencePluginXdmUtils::CompareUriWithoutPrefixL"); + + TBool match( EFalse ); + + RBuf uriWithoutPrefix; + CleanupClosePushL( uriWithoutPrefix ); + uriWithoutPrefix.CreateL( aUri ); + TInt prefixLocation = uriWithoutPrefix.Locate( ':' ); + + if ( KErrNotFound != prefixLocation ) + { + uriWithoutPrefix.Delete( 0, ( prefixLocation + 1 ) ); + } + + RBuf attributeWithoutprefix; + CleanupClosePushL( attributeWithoutprefix ); + attributeWithoutprefix.CreateL( aAttribute ); + prefixLocation = attributeWithoutprefix.Locate( ':' ); + + if ( KErrNotFound != prefixLocation ) + { + attributeWithoutprefix.Delete( 0, ( prefixLocation + 1 ) ); + } + + DP_SDA2(" --> uri without prefix=%S", &uriWithoutPrefix ); + DP_SDA2(" --> attribute without prefix=%S", &attributeWithoutprefix ); + + if ( uriWithoutPrefix.Compare( attributeWithoutprefix ) == 0 ) + { + match = ETrue; + } + + CleanupStack::PopAndDestroy( &attributeWithoutprefix ); + CleanupStack::PopAndDestroy( &uriWithoutPrefix ); + + return match; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginXdmUtils::DoUpdateBlockedContactPresenceCacheL() +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::DoUpdateBlockedContactPresenceCacheL( + TInt aMyStatus ) + { + DP_SDA( "CPresencePluginXdmUtils::DoUpdateBlockedContactPresenceCache" ); + + const TInt KTextBufferSize = 10; + TInt contactsCount = iBlockedContacts.Count(); + + if ( contactsCount > 0 ) + { + if ( iPresenceContactsAsyncReqResult ) + { + DP_SDA(" RunL -write blocked status to cache" ); + TBuf buf; + buf.Copy( KBlockedExtensionValue ); + iConnObs.InternalPresenceAuthorization().PluginData(). + WriteStatusToCacheL( *iBlockedContacts[ contactsCount - 1 ], + MPresenceBuddyInfo2::EUnknownAvailability, + buf, + KNullDesC() ); + } + delete iBlockedContacts[ contactsCount - 1 ]; + iBlockedContacts.Remove( contactsCount - 1 ); + + if ( iBlockedContacts.Count() > 0 ) + { + iConnObs.InternalPresenceAuthorization(). + IsBlockedContactFriendRequestL( + *iBlockedContacts[ iBlockedContacts.Count() - 1 ], + *this, iStatus ); + + iXdmState = EUpdateBlockedContactPresenceCache; + SetActive(); + } + else + { + CompleteClientReq( aMyStatus ); + } + } + } + + +// --------------------------------------------------------------------------- +// From MPresencePluginContactsObs +// CPresencePluginXdmUtils::RequestComplete +// --------------------------------------------------------------------------- +// +void CPresencePluginXdmUtils::RequestComplete( TAny* aResult, + TPresenceContactsOperation /*aOperation*/, TInt aError ) + { + iPresenceContactsAsyncReqResult = EFalse; + if ( NULL != aResult && KErrNone == aError ) + { + iPresenceContactsAsyncReqResult = + *static_cast( aResult ); + } + } + +// End of file diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/src/presensepluginlocalstore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presensepluginlocalstore.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,208 @@ +/* +* Copyright (c) 2010 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + + +#include +#include "presencepluginlocalstore.h" +#include "presencelogger.h" + +_LIT( KContactId, "ContactId" ); +_LIT( KContactTable, "Contacts" ); +_LIT( KStorageExtn, ".db" ); +_LIT( KDbPath, "c:\\MeCo\\" ); + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::CPresencePluginLocalstore +// --------------------------------------------------------------------------- +// +CPresencePluginLocalstore::CPresencePluginLocalstore() + { + } + + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginLocalstore::ConstructL( const TDesC& aServiceName ) + { + DP_SDA( "CPresencePluginLocalstore::ConstructL Start" ); + + iLocalDBName = + HBufC::NewL( aServiceName.Length()+ KStorageExtn().Length() ); + TPtr localDBNamePtr = iLocalDBName->Des(); + localDBNamePtr.Append( aServiceName ); + + _LIT( KSpecialChar, "/\\:*?<>\"" ); + AknTextUtils::StripCharacters( localDBNamePtr, KSpecialChar ); + localDBNamePtr.Append( KStorageExtn() ); + + DP_SDA2( "CPresencePluginLocalstore::ConstructL - localDBName: %S" , &localDBNamePtr ); + + User::LeaveIfError( iFs.Connect() ); + if ( DbExists() ) + { + DP_SDA( "CPresencePluginLocalstore::ConstructL - DB exists" ); + OpenDbL(); + } + else + { + DP_SDA( "CPresencePluginLocalstore::ConstructL - DB does not exist LEAVE!" ); + User::Leave( KErrNotReady ); + } + + User::LeaveIfError( iTable.Open( iDb, KContactTable ) ); + iColset = iDb.ColSetL( KContactTable ); + + DP_SDA( "CPresencePluginLocalstore::ConstructL End" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginLocalstore* CPresencePluginLocalstore::NewL( + const TDesC& aServiceName ) + { + CPresencePluginLocalstore* self = + CPresencePluginLocalstore::NewLC( aServiceName ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::NewLC() +// --------------------------------------------------------------------------- +// +CPresencePluginLocalstore* CPresencePluginLocalstore::NewLC( + const TDesC& aServiceName ) + { + CPresencePluginLocalstore* self = + new( ELeave ) CPresencePluginLocalstore(); + CleanupStack::PushL( self ); + self->ConstructL( aServiceName ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::~CPresencePluginLocalstore() +// --------------------------------------------------------------------------- +// +CPresencePluginLocalstore::~CPresencePluginLocalstore() + { + DP_SDA( "CPresencePluginLocalstore::~CPresencePluginLocalstore Start" ); + + delete iLocalDBName; + delete iFileStore; + delete iColset; + + iTable.Close(); + iDb.Close(); + iFs.Close(); + + DP_SDA( "CPresencePluginLocalstore::~CPresencePluginLocalstore End" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::OpenDbL +// --------------------------------------------------------------------------- +// +void CPresencePluginLocalstore::OpenDbL() + { + DP_SDA( "CPresencePluginLocalstore::OpenDbL() Start" ); + + TBuf< KMaxPath > storagePath; + storagePath.Append( KDbPath ); + storagePath.Append( *iLocalDBName ); + iFileStore = CPermanentFileStore::OpenL( iFs, storagePath, + EFileShareReadersOrWriters|EFileWrite ); + iFileStore->SetTypeL( iFileStore->Layout() ); + iDb.OpenL( iFileStore, iFileStore->Root() ); + + DP_SDA( "CPresencePluginLocalstore::OpenDbL() End" ); + } + + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::DbExists +// --------------------------------------------------------------------------- +// +TBool CPresencePluginLocalstore::DbExists() + { + DP_SDA( "CPresencePluginLocalstore::DbExists() Start" ); + + TBool ret( ETrue ); + RFile temp; + TBuf< KMaxPath > storagePath; + storagePath.Append( KDbPath ); + storagePath.Append( *iLocalDBName ); + + TInt err( temp.Open( iFs, *( &storagePath ), + EFileShareReadersOrWriters|EFileRead ) ); + TInt size( 0 ); + + if ( KErrNone == err ) + { + temp.Size( size ); + } + + temp.Close(); + + if ( ( 0 == size ) || ( KErrNone != err ) ) + { + ret = EFalse; + } + + DP_SDA( "CPresencePluginLocalstore::DbExists() End" ); + return ret; + } + + +// --------------------------------------------------------------------------- +// CPresencePluginLocalstore::SeekRowL() +// --------------------------------------------------------------------------- +// +TBool CPresencePluginLocalstore::SeekRowAtContactColL( + TInt32& aIdentifier ) + { + DP_SDA( "CPresencePluginLocalstore::SeekRowAtContactColL() Start" ); + + TBool ret( EFalse ); + TDbColNo colNo = iColset->ColNo( KContactId ); + iTable.BeginningL(); + + while ( iTable.NextL() ) + { + DP_SDA( "CPresencePluginLocalstore::SeekRowAtContactColL() - next found" ); + iTable.GetL(); + if ( iTable.ColInt32( colNo ) == aIdentifier ) + { + ret = ETrue; + break; + } + } + + DP_SDA2( "CPresencePluginLocalstore::SeekRowAtContactColL() End - ret = %d", ret ); + return ret; + } diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/BWINS/simpleengineU.DEF --- a/simpleengine/engine/BWINS/simpleengineU.DEF Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/BWINS/simpleengineU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -13,4 +13,5 @@ ?NsPrefixL@TSimpleUtils@@SA?AVTPtrC8@@ABVTDesC8@@@Z @ 12 NONAME ; class TPtrC8 TSimpleUtils::NsPrefixL(class TDesC8 const &) ?NsUriL@TSimpleUtils@@SA?AVTPtrC8@@ABVTDesC8@@@Z @ 13 NONAME ; class TPtrC8 TSimpleUtils::NsUriL(class TDesC8 const &) ?NewInstantMessageL@TSimpleFactory@@SAPAVMSimpleInstantMessage@@AAVMSimpleConnection@@AAVMSimpleInstantMsgObserver@@@Z @ 14 NONAME ; class MSimpleInstantMessage * TSimpleFactory::NewInstantMessageL(class MSimpleConnection &, class MSimpleInstantMsgObserver &) + ?NewConnectionL@TSimpleFactory@@SAPAVMSimpleConnection@@AAVMSimpleConnectionObserver@@J@Z @ 15 NONAME ; class MSimpleConnection * TSimpleFactory::NewConnectionL(class MSimpleConnectionObserver &, long) diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/EABI/simpleengineU.DEF --- a/simpleengine/engine/EABI/simpleengineU.DEF Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/EABI/simpleengineU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -29,4 +29,5 @@ _ZN14TSimpleFactory18NewInstantMessageLER17MSimpleConnectionR25MSimpleInstantMsgObserver @ 28 NONAME _ZTI22CSimpleEngineImHandler @ 29 NONAME ; ## _ZTV22CSimpleEngineImHandler @ 30 NONAME ; ## + _ZN14TSimpleFactory14NewConnectionLER25MSimpleConnectionObserverl @ 31 NONAME diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/inc/simpleconnection.h --- a/simpleengine/engine/inc/simpleconnection.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/inc/simpleconnection.h Wed Sep 01 12:23:14 2010 +0100 @@ -53,6 +53,8 @@ */ static CSimpleConnection* NewL( MSimpleConnectionObserver& aObserver ); + static CSimpleConnection* NewL( MSimpleConnectionObserver& aObserver, TInt32 aServiceId ); + /** * Destructor. */ @@ -134,7 +136,7 @@ /** * Two-phase constructor */ - void ConstructL( ); + void ConstructL( TInt32 aServiceId ); /** * constructor diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/inc/simpleengineimhandler.h --- a/simpleengine/engine/inc/simpleengineimhandler.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/inc/simpleengineimhandler.h Wed Sep 01 12:23:14 2010 +0100 @@ -11,11 +11,10 @@ * * Contributors: * -* Description: SIMPLE Engine IM Handler +* Description: SIMPLE Engine IM Handler * */ - #ifndef C_SIMPLEENGINEIMHANDLER_H #define C_SIMPLEENGINEIMHANDLER_H diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/inc/simplepublisher.h --- a/simpleengine/engine/inc/simplepublisher.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/inc/simplepublisher.h Wed Sep 01 12:23:14 2010 +0100 @@ -226,7 +226,7 @@ * Zero length is ignored. * @return operation id */ - TInt DoStartPublishL( MSimpleDocument& aDocument, + TInt CSimplePublisher::DoStartPublishL( MSimpleDocument& aDocument, TBool aRefresh, const TDesC8& aETag ); diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/src/simpleconnection.cpp --- a/simpleengine/engine/src/simpleconnection.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/src/simpleconnection.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -65,7 +65,7 @@ // CSimpleConnection::ConstructL // ---------------------------------------------------------- // -void CSimpleConnection::ConstructL() +void CSimpleConnection::ConstructL( TInt32 aServiceId ) { // Create CSimpleSipConnection entity in simplesiputils.dll iConnection = CSimpleSipConnection::NewL(); @@ -79,6 +79,10 @@ CSimpleEngineRequest* req = CSimpleEngineRequest::NewL( *this, MSimpleEngineRequest::EListenEvents, iOpId ); CleanupStack::PushL( req ); + if ( aServiceId ) + { + iConnection->SetServiceId( aServiceId ); + } iConnection->DispatchReqL( *req ); iRequestList.AddLast( *req ); CleanupStack::Pop( req ); @@ -96,7 +100,24 @@ #endif CSimpleConnection* self = new (ELeave) CSimpleConnection( aObserver ); CleanupStack::PushL( self ); - self->ConstructL(); + self->ConstructL( NULL ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------- +// CSimpleConnection::NewL +// ---------------------------------------------------------- +// +CSimpleConnection* CSimpleConnection::NewL( + MSimpleConnectionObserver& aObserver, TInt32 aServiceId ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: NewL" )); +#endif + CSimpleConnection* self = new (ELeave) CSimpleConnection( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceId ); CleanupStack::Pop( self ); return self; } diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/src/simpleengineimhandler.cpp --- a/simpleengine/engine/src/simpleengineimhandler.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/src/simpleengineimhandler.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -11,11 +11,10 @@ * * Contributors: * -* Description: SIMPLE ENGINE IM Handler +* Description: SIMPLE Engine IM Handler * */ - #include "simpleengineimhandler.h" #include "simpleenginerequest.h" #include "simpleinstantmsgobserver.h" diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/engine/src/simplefactory.cpp --- a/simpleengine/engine/src/simplefactory.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/engine/src/simplefactory.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -47,6 +47,10 @@ #include "msimplewinfowatcher.h" #include "simpleinstantmessage.h" +#ifdef _DEBUG +#include "simpledebugutils.h" +#endif + class MSimpleConnectionObserver; class MSimplePublishObserver; class MSimpleWatcherObserver; @@ -91,6 +95,9 @@ EXPORT_C MSimpleConnection* TSimpleFactory::NewConnectionL( MSimpleConnectionObserver& aObserver) { + #ifdef _DEBUG + TSimpleLogger::Log(_L("TSimpleFactory::NewConnectionL" ) ); + #endif return CSimpleConnection::NewL( aObserver ); } @@ -134,7 +141,11 @@ aContentID, aContentType ); } +EXPORT_C MSimpleConnection* TSimpleFactory::NewConnectionL( + MSimpleConnectionObserver& aObserver, TInt32 aServiceId ) + { + return CSimpleConnection::NewL( aObserver, aServiceId ); + } - diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/inc/simplecommon.h --- a/simpleengine/inc/simplecommon.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/inc/simplecommon.h Wed Sep 01 12:23:14 2010 +0100 @@ -28,6 +28,7 @@ const TInt KRangeSize = 100; // range of operation ids for each client handle const TUint KSimpleOK = 200; // return code for SIP +const TUint KCreatedOK = 201; // return code for SIP const TUint KSimpleAccepted = 202; // return code for SIP _LIT8 ( KSimpleApplicationType, "application"); diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/presencedm/src/presencedmadapter.cpp --- a/simpleengine/presencedm/src/presencedmadapter.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/presencedm/src/presencedmadapter.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -14,9 +14,6 @@ * Description: OMA Presence Settings Device Management Adapter's source file * */ - - - #include #include @@ -362,6 +359,7 @@ TPresSettingsProperty property; HBufC8* luid = Callback().GetLuidAllocL( aUri ); + PRES_DM_LOG(LOG_LIT8(" GetLuidAllocL() => '%S'"), luid ); TInt settingsId = DesToInt( *luid ); PRES_DM_LOG(LOG_LIT(" settingsId after callback:%d"), settingsId); @@ -370,12 +368,16 @@ if (!IsPresIDValidL(settingsId)) { //try to find it another way - TPtrC8 removedLastSeg = NSmlDmURI::RemoveLastSeg(aUri); - TPtrC8 idSegment = NSmlDmURI::LastURISeg(removedLastSeg); - TInt settingsId = DesToInt(idSegment); - if (!IsPresIDValidL(settingsId)) - status = CSmlDmAdapter::ENotFound; - PRES_DM_LOG(LOG_LIT(" settingsId found local way:%d"), settingsId); + if( NSmlDmURI::NumOfURISegs( aUri ) > 1 ) + { + TPtrC8 idSegment = NSmlDmURI::URISeg( aUri, 2 ); + settingsId = DesToInt(idSegment); + if(!IsPresIDValidL(settingsId)) + { + status = CSmlDmAdapter::ENotFound; + } + PRES_DM_LOG(LOG_LIT(" settingsId found local way:%d"), settingsId); + } } // if previous settings id processing was ok @@ -519,12 +521,16 @@ if (!IsPresIDValidL(settingsId)) { //try to find it another way - TPtrC8 removedLastSeg = NSmlDmURI::RemoveLastSeg(aUri); - TPtrC8 idSegment = NSmlDmURI::LastURISeg(removedLastSeg); - TInt settingsId = DesToInt(idSegment); - if (!IsPresIDValidL(settingsId)) - status = CSmlDmAdapter::ENotFound; - PRES_DM_LOG(LOG_LIT(" settingsId found local way:%d"), settingsId); + if( NSmlDmURI::NumOfURISegs( aUri ) > 1 ) + { + TPtrC8 idSegment = NSmlDmURI::URISeg( aUri, 2 ); + settingsId = DesToInt(idSegment); + if (!IsPresIDValidL(settingsId)) + { + status = CSmlDmAdapter::ENotFound; + } + PRES_DM_LOG(LOG_LIT(" settingsId found local way:%d"), settingsId); + } } // if previous settings id processing was ok @@ -722,6 +728,7 @@ const TInt aStatusRef ) { // Not supported + PRES_DM_LOG(LOG_LIT("ExecuteCommandL")); Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); } @@ -736,6 +743,7 @@ const TInt aStatusRef ) { // Not supported + PRES_DM_LOG(LOG_LIT("ExecuteCommandL")); Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); } @@ -751,6 +759,7 @@ TInt aStatusRef ) { // Not supported + PRES_DM_LOG(LOG_LIT("CopyCommandL")); Callback().SetStatusL( aStatusRef, CSmlDmAdapter::EError ); } @@ -760,6 +769,7 @@ // void CPresenceDMAdapter::StartAtomicL() { + PRES_DM_LOG(LOG_LIT("StartAtomicL")); // Not supported } @@ -769,6 +779,7 @@ // void CPresenceDMAdapter::CommitAtomicL() { + PRES_DM_LOG(LOG_LIT("CommitAtomicL")); // Not supported } @@ -778,6 +789,7 @@ // void CPresenceDMAdapter::RollbackAtomicL() { + PRES_DM_LOG(LOG_LIT("RollbackAtomicL")); // Not supported } @@ -787,6 +799,7 @@ // TBool CPresenceDMAdapter::StreamingSupport( TInt& /*aItemSize*/ ) { + PRES_DM_LOG(LOG_LIT("StreamingSupport")); return EFalse; } @@ -796,6 +809,7 @@ // void CPresenceDMAdapter::StreamCommittedL() { + PRES_DM_LOG(LOG_LIT("StreamCommittedL")); // Not supported } @@ -877,10 +891,10 @@ aObject.InsertL( 0, *utfValue ); CleanupStack::PopAndDestroy(utfValue); // >>> utfValue CleanupStack::PopAndDestroy(value); // >>> value - PRES_DM_LOG(LOG_LIT(" return(%d)"),CSmlDmAdapter::EOk); + PRES_DM_LOG(LOG_LIT(" return( EOk )")); return CSmlDmAdapter::EOk; } - PRES_DM_LOG(LOG_LIT(" return(%d)"),CSmlDmAdapter::ENotFound); + PRES_DM_LOG(LOG_LIT(" return( ENotFound )")); return CSmlDmAdapter::ENotFound; } @@ -1056,7 +1070,7 @@ CSmlDmAdapter::TError CPresenceDMAdapter::GetConRefFromSipIDL( TInt aSipID, CBufBase& aObject) { - PRES_DM_LOG(LOG_LIT(" GetConRefFromSipIDL(%d)"),aSipID); + PRES_DM_LOG(LOG_LIT(" GetConRefFromSipIDL(aSipId:%d)"),aSipID); CSmlDmAdapter::TError status = CSmlDmAdapter::EOk; @@ -1069,12 +1083,14 @@ // Request all the sip settings identifiers Callback().FetchLinkL( KPresDMSipDMNode, *result, status); + PRES_DM_LOG(LOG_LIT(" FetchLinkL(SIP) status : %d"), status ); if( status == EOk ) { TPtr8 uriSeg8Ptr = result->Ptr(0); - HBufC8* uriSegBuffer = uriSeg8Ptr.AllocLC(); + HBufC8* uriSegBuffer = uriSeg8Ptr.AllocLC(); // << uriSegBuffer + PRES_DM_LOG(LOG_LIT8(" uri : '%S'"), uriSegBuffer ); TPtr8 uriSegBufferPtr = uriSegBuffer->Des(); @@ -1087,7 +1103,7 @@ // Check if given SIP set id match with any of found // SIP settings identifiers - while( numOfUriSegs > 1) + while( numOfUriSegs > 0 ) { idLinkBuffer = NSmlDmURI::LastURISeg(uriSegBufferPtr); uriSegBufferPtr = NSmlDmURI::RemoveLastSeg(uriSegBufferPtr); @@ -1102,17 +1118,20 @@ //Reqest the ID result->Reset(); Callback().FetchLinkL( finalLink, *result, status); - - foundId = DesToInt(result->Ptr(0)); - - if (foundId == aSipID) + PRES_DM_LOG(LOG_LIT8(" FetchLinkL(%S) status : %d"), &idLinkBuffer, status ); + if( status == EOk ) { - found = ETrue; - aObject.InsertL(0, NSmlDmURI::RemoveLastSeg(finalLink)); + foundId = DesToInt(result->Ptr(0)); + PRES_DM_LOG(LOG_LIT(" foundId : %d"), foundId ); + if (foundId == aSipID) + { + found = ETrue; + aObject.InsertL(0, NSmlDmURI::RemoveLastSeg(finalLink)); break; } + } - numOfUriSegs -= 1; + numOfUriSegs--; } CleanupStack::PopAndDestroy( uriSegBuffer ); // >>> uriSegBuffer } @@ -1137,7 +1156,7 @@ CSmlDmAdapter::TError CPresenceDMAdapter::GetConRefFromXdmIDL( TInt aXdmID, CBufBase& aObject) { - PRES_DM_LOG(LOG_LIT(" GetConRefFromXdmIDL(%d)"),aXdmID); + PRES_DM_LOG(LOG_LIT(" GetConRefFromXdmIDL(aXdmId:%d)"),aXdmID); CSmlDmAdapter::TError status = CSmlDmAdapter::ENotFound; @@ -1148,6 +1167,7 @@ // Request all the XDM settings identifiers Callback().FetchLinkL( KPresDMXdmDMNode, *result, status); + PRES_DM_LOG(LOG_LIT(" FetchLinkL(XDM) status : %d"), status ); TInt id(KErrNotFound); TPtrC8 lastUriSegXdm; @@ -1211,6 +1231,7 @@ TPresSettingsSet tempSet; if ((PresSettingsApi::SettingsSetL(aSetId,tempSet)) == KErrNone) return ETrue; + PRES_DM_LOG(LOG_LIT8(" IsPresIDValidL - Invalid settings : %d"), aSetId ); return EFalse; } @@ -1248,8 +1269,7 @@ if( status == EOk ) { - TUint32 id(NULL); - id = DesToInt( result->Ptr( 0 ) ); + TUint32 id = DesToInt( result->Ptr( 0 ) ); returnId = (TInt)id; } CleanupStack::PopAndDestroy( result ); // >>> result diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/presenceprovisioning/inc/presenceprovitem.h --- a/simpleengine/presenceprovisioning/inc/presenceprovitem.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/presenceprovisioning/inc/presenceprovitem.h Wed Sep 01 12:23:14 2010 +0100 @@ -164,7 +164,7 @@ * @param aName Name of the parameter * @param aValue Value of the parameter */ - void DetermineNamedParameter( const TDesC& aName, const TDesC& aValue ); + void DetermineNamedParameterL( const TDesC& aName, const TDesC& aValue ); /** * Check presence settings duplicate names, provide alternate name diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/presenceprovisioning/src/presenceprovadapter.cpp --- a/simpleengine/presenceprovisioning/src/presenceprovadapter.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/presenceprovisioning/src/presenceprovadapter.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -289,7 +289,7 @@ // APPID into place [0]. TPtrC8 appId ( KPresProvisioningAppId8 ); HBufC8* appIdBuf = appId.AllocLC(); // << appIdBuf - aSavingInfo.Append( appIdBuf ); + aSavingInfo.AppendL( appIdBuf ); CleanupStack::Pop( appIdBuf ); // >> appIdBuf appIdBuf = NULL; diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/presenceprovisioning/src/presenceprovitem.cpp --- a/simpleengine/presenceprovisioning/src/presenceprovitem.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/presenceprovisioning/src/presenceprovitem.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -251,7 +251,7 @@ case EWPParameterToAppRef: { PRES_PROV_LOG(LOG_LIT8( " EWPParameterToAppRef")); - iToAppReferences.Append( aParameter.Value() ); + iToAppReferences.AppendL( aParameter.Value() ); } break; @@ -271,7 +271,7 @@ default: { - DetermineNamedParameter( aParameter.Name(), aParameter.Value() ); + DetermineNamedParameterL( aParameter.Name(), aParameter.Value() ); } break; } @@ -282,7 +282,7 @@ // CPresProvItem::DetermineNamedParameter // ----------------------------------------------------------------------------- // -void CPresProvItem::DetermineNamedParameter( const TDesC& aName, const TDesC& aValue ) +void CPresProvItem::DetermineNamedParameterL( const TDesC& aName, const TDesC& aValue ) { PRES_PROV_LOG(LOG_LIT( "DetermineNamedParameter(%S, %S)"), &aName, &aValue); if ( !aName.Compare( KPresProvClientObjDataLim ) ) @@ -316,7 +316,7 @@ else if (!aName.Compare(KPresIToAppRef)) { if(iToAppReferences.Count() < 2) // if any of SIP or XDM id is missing - iToAppReferences.Append(aValue); + iToAppReferences.AppendL(aValue); } PRES_PROV_LOG(LOG_LIT8( " CPresProvItem::DetermineNamedParameter ends" ) ); } diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/presencesettingsapi/group/bld.inf --- a/simpleengine/presencesettingsapi/group/bld.inf Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/presencesettingsapi/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -27,6 +27,6 @@ presencesettingsapi.mmp PRJ_EXPORTS -../inc/pressettingsapi.h MW_LAYER_PLATFORM_EXPORT_PATH(pressettingsapi.h) -../inc/simpleenginedomaincrkeys.h MW_LAYER_PLATFORM_EXPORT_PATH(simpleenginedomaincrkeys.h) -../inc/pressettingsset.h MW_LAYER_PLATFORM_EXPORT_PATH(pressettingsset.h) +../inc/pressettingsapi.h /epoc32/include/mw/pressettingsapi.h +../inc/simpleenginedomaincrkeys.h /epoc32/include/mw/simpleenginedomaincrkeys.h +../inc/pressettingsset.h /epoc32/include/mw/pressettingsset.h diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/presencesettingsapi/group/presencesettingsapi.mmp --- a/simpleengine/presencesettingsapi/group/presencesettingsapi.mmp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/presencesettingsapi/group/presencesettingsapi.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -43,7 +43,7 @@ LIBRARY centralrepository.lib -#if defined( EABI ) +#if defined( ARMCC ) DEFFILE ../eabi/ #elif defined ( WINSCW ) deffile ../bwinscw/ diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/presencesettingsapi/src/pressettingsapi.cpp --- a/simpleengine/presencesettingsapi/src/pressettingsapi.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/presencesettingsapi/src/pressettingsapi.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -78,7 +78,7 @@ else { sets->AppendL(setName); - aSetIds.Append(setId); + aSetIds.AppendL(setId); } setName.Zero(); } diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/rom/simpleengine.iby --- a/simpleengine/rom/simpleengine.iby Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/rom/simpleengine.iby Wed Sep 01 12:23:14 2010 +0100 @@ -24,17 +24,17 @@ #ifdef __SIP_SIMPLE_PRESENCE_PROTOCOL -file=ABI_DIR\BUILD_DIR\simpleengine.dll SHARED_LIB_DIR\simpleengine.dll -file=ABI_DIR\BUILD_DIR\simplesiputils.dll SHARED_LIB_DIR\simplesiputils.dll -file=ABI_DIR\BUILD_DIR\simplexmlutils.dll SHARED_LIB_DIR\simplexmlutils.dll -file=ABI_DIR\BUILD_DIR\rlspresxdm.dll SHARED_LIB_DIR\rlspresxdm.dll -file=ABI_DIR\BUILD_DIR\presencesettingsapi.dll SHARED_LIB_DIR\presencesettingsapi.dll +file=ABI_DIR/BUILD_DIR/simpleengine.dll SHARED_LIB_DIR/simpleengine.dll +file=ABI_DIR/BUILD_DIR/simplesiputils.dll SHARED_LIB_DIR/simplesiputils.dll +file=ABI_DIR/BUILD_DIR/simplexmlutils.dll SHARED_LIB_DIR/simplexmlutils.dll +file=ABI_DIR/BUILD_DIR/rlspresxdm.dll SHARED_LIB_DIR/rlspresxdm.dll +file=ABI_DIR/BUILD_DIR/presencesettingsapi.dll SHARED_LIB_DIR/presencesettingsapi.dll ECOM_PLUGIN(PresenceDM.dll, 10282415.rsc) ECOM_PLUGIN(PresenceProvisioning.dll, 10282417.rsc) // backup registry -data=DATAZ_\private\10281EEB\backup_registration.xml private\10281EEB\backup_registration.xml +data=DATAZ_/private/10281EEB/backup_registration.xml private/10281EEB/backup_registration.xml #endif // __SIP_SIMPLE_PRESENCE_PROTOCOL #endif diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/rom/simpleengineresources.iby --- a/simpleengine/rom/simpleengineresources.iby Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/rom/simpleengineresources.iby Wed Sep 01 12:23:14 2010 +0100 @@ -25,7 +25,7 @@ #include #ifdef __SIP_SIMPLE_PRESENCE_PROTOCOL -data=DATAZ_\RESOURCE_FILES_DIR\PresenceProvisioningTexts.RSC RESOURCE_FILES_DIR\PresenceProvisioningTexts.RSC +data=DATAZ_/RESOURCE_FILES_DIR/PresenceProvisioningTexts.RSC RESOURCE_FILES_DIR/PresenceProvisioningTexts.RSC #endif //__SIP_SIMPLE_PRESENCE_PROTOCOL diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/BWINS/simplesiputilsU.DEF --- a/simpleengine/siputils/BWINS/simplesiputilsU.DEF Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/BWINS/simplesiputilsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -5,5 +5,5 @@ ?NewL@CSimpleSipConnection@@SAPAV1@XZ @ 4 NONAME ; class CSimpleSipConnection * CSimpleSipConnection::NewL(void) ?SIPState@CSimpleSipConnection@@QAE?AW4TSimpleSipState@@XZ @ 5 NONAME ; enum TSimpleSipState CSimpleSipConnection::SIPState(void) ?SIPStatus@CSimpleSipConnection@@QAEIHAAH@Z @ 6 NONAME ; unsigned int CSimpleSipConnection::SIPStatus(int, int &) - ?SipSubscriptionState@CSimpleSipConnection@@QAE?AW4TSimpleSipSubscriptionState@MSimpleEngineRequest@@AAV3@@Z @ 7 NONAME ; enum MSimpleEngineRequest::TSimpleSipSubscriptionState CSimpleSipConnection::SipSubscriptionState(class MSimpleEngineRequest &) - + ?SetServiceId@CSimpleSipConnection@@QAEXJ@Z @ 7 NONAME ; void CSimpleSipConnection::SetServiceId(long) + ?SipSubscriptionState@CSimpleSipConnection@@QAE?AW4TSimpleSipSubscriptionState@MSimpleEngineRequest@@AAV3@@Z @ 8 NONAME ; enum MSimpleEngineRequest::TSimpleSipSubscriptionState CSimpleSipConnection::SipSubscriptionState(class MSimpleEngineRequest &) diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/EABI/simplesiputilsU.DEF --- a/simpleengine/siputils/EABI/simplesiputilsU.DEF Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/EABI/simplesiputilsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -1,25 +1,28 @@ EXPORTS _ZN20CSimpleSipConnection12DispatchReqLER20MSimpleEngineRequest @ 1 NONAME - _ZN20CSimpleSipConnection19CurrentSIPIdentityLEv @ 2 NONAME - _ZN20CSimpleSipConnection4NewLEv @ 3 NONAME - _ZN20CSimpleSipConnection8SIPStateEv @ 4 NONAME - _ZN20CSimpleSipConnection9SIPStatusEiRi @ 5 NONAME - _ZN20CSimpleSipConnectionD0Ev @ 6 NONAME - _ZN20CSimpleSipConnectionD1Ev @ 7 NONAME - _ZN20CSimpleSipConnectionD2Ev @ 8 NONAME - _ZTI14CSimpleRequest @ 9 NONAME ; ## - _ZTI18CSimpleExpiryTimer @ 10 NONAME ; ## - _ZTI18CSimpleSettingFile @ 11 NONAME ; ## - _ZTI19CSimpleRefreshTimer @ 12 NONAME ; ## - _ZTI20CSimpleSipConnection @ 13 NONAME ; ## - _ZTI25CSimpleSipProfileObserver @ 14 NONAME ; ## - _ZTI28CSimpleSipConnectionObserver @ 15 NONAME ; ## - _ZTV14CSimpleRequest @ 16 NONAME ; ## - _ZTV18CSimpleExpiryTimer @ 17 NONAME ; ## - _ZTV18CSimpleSettingFile @ 18 NONAME ; ## - _ZTV19CSimpleRefreshTimer @ 19 NONAME ; ## - _ZTV20CSimpleSipConnection @ 20 NONAME ; ## - _ZTV25CSimpleSipProfileObserver @ 21 NONAME ; ## - _ZTV28CSimpleSipConnectionObserver @ 22 NONAME ; ## - _ZN20CSimpleSipConnection20SipSubscriptionStateER20MSimpleEngineRequest @ 23 NONAME + _ZN20CSimpleSipConnection12SetServiceIdEl @ 2 NONAME + _ZN20CSimpleSipConnection19CurrentSIPIdentityLEv @ 3 NONAME + _ZN20CSimpleSipConnection20SipSubscriptionStateER20MSimpleEngineRequest @ 4 NONAME + _ZN20CSimpleSipConnection4NewLEv @ 5 NONAME + _ZN20CSimpleSipConnection8SIPStateEv @ 6 NONAME + _ZN20CSimpleSipConnection9SIPStatusEiRi @ 7 NONAME + _ZN20CSimpleSipConnectionD0Ev @ 8 NONAME + _ZN20CSimpleSipConnectionD1Ev @ 9 NONAME + _ZN20CSimpleSipConnectionD2Ev @ 10 NONAME + _ZTI14CSimpleRequest @ 11 NONAME ; ## + _ZTI18CSimpleExpiryTimer @ 12 NONAME ; ## + _ZTI18CSimpleSettingFile @ 13 NONAME ; ## + _ZTI19CSimpleRefreshTimer @ 14 NONAME ; ## + _ZTI20CSimpleSipConnection @ 15 NONAME ; ## + _ZTI25CSimpleSipProfileObserver @ 16 NONAME ; ## + _ZTI28CSimpleSipConnectionObserver @ 17 NONAME ; ## + _ZTV14CSimpleRequest @ 18 NONAME ; ## + _ZTV18CSimpleExpiryTimer @ 19 NONAME ; ## + _ZTV18CSimpleSettingFile @ 20 NONAME ; ## + _ZTV19CSimpleRefreshTimer @ 21 NONAME ; ## + _ZTV20CSimpleSipConnection @ 22 NONAME ; ## + _ZTV25CSimpleSipProfileObserver @ 23 NONAME ; ## + _ZTV28CSimpleSipConnectionObserver @ 24 NONAME ; ## + + diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/group/simplesiputils.mmp --- a/simpleengine/siputils/group/simplesiputils.mmp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/group/simplesiputils.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -42,7 +42,7 @@ USERINCLUDE ../../inc // default system include paths for middleware layer modules -MW_LAYER_SYSTEMINCLUDE +APP_LAYER_SYSTEMINCLUDE DEBUGLIBRARY flogger.lib DEBUGLIBRARY efsrv.lib // file server @@ -56,3 +56,5 @@ LIBRARY bafl.lib // string pool LIBRARY centralrepository.lib LIBRARY presencesettingsapi.lib +// access to uiservicetabsettings +LIBRARY vimpstsettings.lib diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/inc/simplesettings.h --- a/simpleengine/siputils/inc/simplesettings.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/inc/simplesettings.h Wed Sep 01 12:23:14 2010 +0100 @@ -120,7 +120,7 @@ * @param aId key id * @return value of the key */ - TInt GetCenRepIntValueL( + TInt TSimpleSettings::GetCenRepIntValueL( CRepository* aRepository, TUint32 aId ); diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/inc/simplesipconncallback.h --- a/simpleengine/siputils/inc/simplesipconncallback.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/inc/simplesipconncallback.h Wed Sep 01 12:23:14 2010 +0100 @@ -53,6 +53,13 @@ */ virtual void ConnectionStateChange( TSimpleSipState aState, TInt aSipError) = 0; + + /** + * Connection method has changed (Roaming). + * + * @since S60 3.2.3 + */ + virtual void ConnectionChanged() = 0; /** * Time to refresh a request diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/inc/simplesipconnection.h --- a/simpleengine/siputils/inc/simplesipconnection.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/inc/simplesipconnection.h Wed Sep 01 12:23:14 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -120,6 +120,12 @@ MSimpleEngineRequest& aReq ); /** + * Set service id + * @param aServiceId new service id + */ + IMPORT_C void SetServiceId( TInt32 aServiceId ); + + /** * Search the corresponding client request * * @since S60 v3.2 @@ -241,6 +247,13 @@ */ TInt HandleReceivedMessage( const TDesC8& aFrom, const TDesC8& aContent ); + + /** + * Connection method has changed (Roaming). + * + * @since S60 3.2.3 + */ + void ConnectionChanged(); protected: @@ -360,7 +373,15 @@ * @since S60 v3.2 */ void DeleteRequests(); - + + /** + * Delete all pending specified type of requests. + * + * @since S60 5.0 + * @param aRequestType request type + */ + void DeleteRequests( CSimpleRequest::TSimpleSipReqType aRequestType ); + /** * Destroy the request * @@ -559,6 +580,13 @@ */ void DoHandleReceivedMessageL( const TDesC8& aFrom, const TDesC8& aContent, CSimpleRequest& aRequest ); + + /** + * Stores ETag to vimpstsettingstore + * + * @since S60 5.0 + */ + void StoreETagL( HBufC8& aTag ); private: // Data @@ -611,6 +639,11 @@ * Current number of subscriptions */ TUint iCurrentNbrSubs; + + /** + * Service id of current service + */ + TInt32 iServiceId; #ifdef _DEBUG friend class T_CSimpleSipConnection; diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/inc/simplesipconnectionobserver.h --- a/simpleengine/siputils/inc/simplesipconnectionobserver.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/inc/simplesipconnectionobserver.h Wed Sep 01 12:23:14 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -85,7 +85,15 @@ * @param aSipError SIP error code */ void ProfileStateChanged( - CSIPConnection::TState aState, TInt aSipError ); + CSIPConnection::TState aState, TInt aSipError ); + + /** + * SIP Profile has updated. + * + * @see MSIPProfileRegistryObserver::EProfileUpdated + * @since S60 3.2.3 + */ + void ProfileUpdated(); // from base class MSIPConnectionObserver @@ -112,7 +120,6 @@ /** * A SIP response received from the network. * @param aTransaction contains response elements. - * The ownership is transferred. */ void IncomingResponse( CSIPClientTransaction& aTransaction ); @@ -281,7 +288,6 @@ /** * A SIP response received from the network. * @param aTransaction contains response elements. - * The ownership is transferred. */ void DoIncomingResponse( CSIPClientTransaction& aTransaction ); diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/src/simpledebugutils.cpp --- a/simpleengine/siputils/src/simpledebugutils.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/src/simpledebugutils.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -57,6 +57,9 @@ _LIT(KLogFile, "simple.txt"); // Write to log file RFileLogger::Write(KLogDir, KLogFile, EFileLoggingModeAppend, buf); + + _LIT( KSimplePrefix, "[simple] "); + buf.Insert( 0, KSimplePrefix ); RDebug::RawPrint( buf ); } diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/src/simplesettings.cpp --- a/simpleengine/siputils/src/simplesettings.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/src/simplesettings.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -127,8 +127,8 @@ TRAP_IGNORE( repository = CRepository::NewL( KCRUIDSimpleVariation )); if ( repository ) { - TRAP_IGNORE( iExpiryPuhlish = GetCenRepIntValueL( - repository, KSimplePublishRefresh )); + //TRAP_IGNORE( iExpiryPuhlish = GetCenRepIntValueL( + // repository, KSimplePublishRefresh )); TRAP_IGNORE( iExpiryWatcher = GetCenRepIntValueL( repository, KSimpleSubscribeRefresh )); TRAP_IGNORE( iExpiryWinfo = GetCenRepIntValueL( diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/src/simplesipconnection.cpp --- a/simpleengine/siputils/src/simplesipconnection.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/src/simplesipconnection.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -36,6 +36,7 @@ #include #include #include +#include // sip codec api #include @@ -51,6 +52,8 @@ #include #include +#include + // own simple #include "simplesipconnection.h" #include "simplesipconnectionobserver.h" @@ -80,10 +83,6 @@ _LIT8 ( KSimpleNoresource, "Noresource" ); _LIT8 ( KSipPrefix, "sip:" ); -// UID given for CSIP class. SIP Utils listens to new SIP requests -// (when receiving IM) outside SIP dialogs. -const TUid KSimpleSIPUtilsUID = { 0x10281EEC }; - // ================= MEMBER FUNCTIONS ======================= // @@ -114,6 +113,7 @@ delete iConnectionObserver; delete iSip; DeleteRequests(); + DeleteRequests( CSimpleRequest::EReqReceiveIM ); SIPStrings::Close(); } @@ -140,11 +140,8 @@ TSimpleLogger::Log( _L("SipConnection: ConstructL 20-01-07 this=%d" ), (TInt)this ); #endif - // initialize members - iSip = CSIP::NewL( KSimpleSIPUtilsUID, *this ); + iConnectionObserver = CSimpleSipConnectionObserver::NewL( *this); - iProfileObserver = - CSimpleSipProfileObserver::NewL( iSip, *iConnectionObserver); SIPStrings::OpenL(); // read static cenrep settings iSettings.ReadCentRepSettings(); @@ -450,36 +447,22 @@ // Start to fill header, Remote URI CSIPRequestElements* elems = CSIPRequestElements::NewL( uri ); CleanupStack::PushL( elems ); // CS: 3 - + TUriParser8 parser3; User::LeaveIfError( parser3.Parse( iProfileObserver-> GiveUserAorL() )); - uri = CUri8::NewLC( parser3 ); // CS: 4 - + uri = CUri8::NewL( parser3 ); CSIPAddress* sipAddress = CSIPAddress::NewL( uri ); - CleanupStack::Pop( uri ); // ownership given to sipAddress // CS: 3 - CleanupStack::PushL( sipAddress ); // CS: 4 // From Header CSIPFromHeader* fromH = CSIPFromHeader::NewL( sipAddress ); - CleanupStack::Pop( sipAddress ); // ownership given to FromH // CS: 3 - CleanupStack::PushL( fromH ); // CS: 4 - elems->SetFromHeaderL( fromH ); - // fromH, ownership given to elems - CleanupStack::Pop( fromH ); // CS: 3 + elems->SetFromHeaderL( fromH ); // fromH, ownership given to elems - uri = CUri8::NewLC( parser ); // CS: 4 - + uri = CUri8::NewL( parser ); CSIPAddress* addr = CSIPAddress::NewL( uri ); - CleanupStack::Pop( uri ); // CS: 3 - CleanupStack::PushL( addr ); // CS: 4 - // To Header CSIPToHeader* toHeader = CSIPToHeader::NewL( addr ); - CleanupStack::Pop( addr ); // CS: 3 - CleanupStack::PushL( toHeader ); // CS: 4 elems->SetToHeaderL( toHeader ); - CleanupStack::Pop( toHeader ); // CS: 3 CSIPMessageElements& mesElems = elems->MessageElements(); @@ -497,29 +480,30 @@ mesElems.SetUserHeadersL( headers ); // headers ownership given to mesElems - CleanupStack::Pop( &headers ); // CS: 3 + CleanupStack::Pop( &headers ); // CS: 3 } // Set content type and content - CSIPContentTypeHeader* contTypeH = CSIPContentTypeHeader::NewLC( - KSimpleMediaType, KSimpleMediaSubType ); // CS: 4 - HBufC8* buffer = aContent.AllocLC(); // CS: 5 + HBufC8* buffer = aContent.AllocLC(); // CS: 4 + CSIPContentTypeHeader* contTypeH = CSIPContentTypeHeader::NewL( + KSimpleMediaType, KSimpleMediaSubType ); + CleanupStack::Pop( buffer ); // CS: 3 mesElems.SetContentL( buffer, contTypeH ); // buffer ownership given to mesElems - CleanupStack::Pop( buffer ); // CS: 4 // contTypeH ownership given to mesElems - CleanupStack::Pop( contTypeH ); // CS: 3 // Set method elems->SetMethodL( SIPStrings::StringF( SipStrConsts::EMessage ) ); + CleanupStack::Pop( elems ); // CS: 2 // Send the request transaction + // elems, ownership given CSIPClientTransaction* sipTrans = iSipConnection->SendRequestL( elems, *regContext ); // Save SIP client transaction request->SetTransaction( sipTrans ); - CleanupStack::Pop( elems ); // elems, ownership given // CS: 2 + CleanupStack::PopAndDestroy( temp ); // CS: 1 // Start refresh timer, it's used for garbage collection too. @@ -1091,6 +1075,15 @@ KSimpleMultiType, KSimpleMultipartSubType ); User::LeaveIfError( headers.Append( acceH )); ++popCount; + + // add supported header with value eventlist + RPointerArray suppHs = + CSIPSupportedHeader::DecodeL( KSimpleEventlist); + for( TInt count=0; count < suppHs.Count(); count++ ) + { + User::LeaveIfError( headers.Append( suppHs[count] )); + } + suppHs.Close(); } if ( r->Match( CSimpleRequest::EReqSubscribeWinfo )) { @@ -1270,6 +1263,49 @@ } // ---------------------------------------------------------- +// CSimpleSipConnection::ConnectionChanged +// ---------------------------------------------------------- +// +void CSimpleSipConnection::ConnectionChanged() + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipConnection: ConnectionChanged")); + if( iSipConnection ) + { + TSimpleLogger::Log(_L("SipConnection: ConnectionChanged : old conn state %d (internal:%d)"), iSipConnection->State(), iSipState ); + TSimpleLogger::Log(_L("SipConnection: ConnectionChanged : old IAP %d"), iSipConnection->IapId() ); + } +#endif + + iCurrentNbrSubs = 0; + CSIPConnection* conn = NULL; + TRAPD( err, conn = iProfileObserver->GiveConnectionL() ); + if( !err ) + { + delete iSipConnection; + iSipConnection = conn; +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipConnection: ConnectionChanged : new conn state %d"), iSipConnection->State() ); + TSimpleLogger::Log(_L("SipConnection: ConnectionChanged : new IAP %d"), iSipConnection->IapId() ); +#endif + } +#ifdef _DEBUG + else + { + TSimpleLogger::Log(_L("SipConnection: ConnectionChanged : Get SIP connection error %d"), err ); + } +#endif + + if( iSipConnection ) + { + if( iSipState != iSipConnection->State() ) + { + iConnectionObserver->ConnectionStateChanged( iSipConnection->State() ); + } + } + } + +// ---------------------------------------------------------- // CSimpleSipConnection::StartToCheckExpiryL // ---------------------------------------------------------- // @@ -1370,7 +1406,40 @@ { CSimpleRequest* req = rIter; rIter++; //lint !e1757 - req->Destroy(); + + // open request EReqReceiveIM should not be deleted + // will be deleted only when im message received + // or destructor is called. + if ( !req->Match( CSimpleRequest::EReqReceiveIM ) ) + { + req->Destroy(); + } + } + } + +// ----------------------------------------------------------------------------- +// CSimpleSipConnection::DeleteRequests +// ----------------------------------------------------------------------------- +void CSimpleSipConnection::DeleteRequests( + CSimpleRequest::TSimpleSipReqType aRequestType ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipConnection: DeleteRequests type=%d" ), + aRequestType ); +#endif + // Delete buffered transaction requests match to the aRequestType + TDblQueIter rIter( iRequestList ); + rIter.SetToFirst(); + + while ( rIter ) + { + CSimpleRequest* req = rIter; + rIter++; //lint !e1757 + + if ( req->Match( aRequestType ) ) + { + req->Destroy(); + } } } @@ -1676,6 +1745,8 @@ HBufC8* hValue = header->ToTextValueL(); // hValue ownership is transferred aReq->SetETag( hValue ); + // store etag to vimpstsettingstore + StoreETagL( *hValue ); ETagReceived = ETrue; } else if ( header->Name() == SIPStrings::StringF( SipStrConsts::EExpiresHeader)) @@ -1695,6 +1766,12 @@ { // Remove old ETag if nore received or if the expires header was 0 in our request. aReq->SetETag( NULL ); + //TPtrC8 nullETag = nullETag.Alloc( KNullDesC8 ); + TBufC8<1> nullETag( KNullDesC8 ); + HBufC8* buf; + buf = nullETag.Alloc(); + StoreETagL( *buf ); + delete buf; } // PopAndDestroy calls extensionName.Close() CleanupStack::PopAndDestroy( &extensionName ); @@ -2070,7 +2147,19 @@ #endif iSettings.ReadOTASettingsL( aReq.Aux() ); - + + TInt32 uniqueId = iSettings.SipProfileId(); + TUid uniqueUid; + uniqueUid.iUid = uniqueId; + + if ( !iSip && !iProfileObserver ) + { + iSip = CSIP::NewL( uniqueUid, *this ); + + iProfileObserver = CSimpleSipProfileObserver::NewL( + iSip, *iConnectionObserver); + } + iProfileObserver->RegisterGivenProfileL( iSettings.SipProfileId() ); SetSipState( ESimpleSipIdle ); TRAPD( err, iSipConnection = iProfileObserver->GiveConnectionL() ); @@ -2539,11 +2628,9 @@ { if ( aState == ESimpleSipActive ) { - // Check that both SIP Profile and SIP connection are ready. + // Check that SIP Profile is ready. // iProfileObserver is created in ConstructL. - if ( iProfileObserver->IsProfileActive() && - iSipConnection && - iSipConnection->State() == CSIPConnection::EActive ) + if ( iProfileObserver->IsProfileActive() ) { SetSipState( aState ); } @@ -2577,3 +2664,36 @@ #endif } +// ----------------------------------------------------------------------------- +// CSimpleRequest::SetServiceId +// ----------------------------------------------------------------------------- +EXPORT_C void CSimpleSipConnection::SetServiceId( TInt32 aServiceId ) + { +#ifdef _DEBUG + TSimpleLogger::Log( _L( + "CSimpleSipConnection::SetServiceId old serviceId = %d, new serviceId = %d" ), + iServiceId, aServiceId ); +#endif + iServiceId = aServiceId; + } + +// ----------------------------------------------------------------------------- +// CSimpleRequest::StoreETag +// ----------------------------------------------------------------------------- +void CSimpleSipConnection::StoreETagL( HBufC8& aETag ) + { +#ifdef _DEBUG + TBuf<255> printDocumentId; + printDocumentId.Copy( aETag ); + TSimpleLogger::Log(_L("CSimpleSipConnection: StoreETag ETag = %S, serviceId = %d" ), + &printDocumentId, iServiceId ); +#endif + MVIMPSTSettingsStore* settings = CVIMPSTSettingsStore::NewLC(); + + // Store ETag to uiservicetabsettings + User::LeaveIfError( settings->SetL( + iServiceId, EServicePresenceSessionIdentifier, aETag ) ); + + CleanupStack::PopAndDestroy(); //settings + } + diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/src/simplesipconnectionobserver.cpp --- a/simpleengine/siputils/src/simplesipconnectionobserver.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/src/simplesipconnectionobserver.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -160,6 +160,18 @@ } // ----------------------------------------------------------------------------- +// CSimpleSipConnectionObserver::ProfileUpdated +// ----------------------------------------------------------------------------- +// +void CSimpleSipConnectionObserver::ProfileUpdated() + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipConnectionObserver: ProfileUpdated")); +#endif + iCallback.ConnectionChanged(); + } + +// ----------------------------------------------------------------------------- // CSimpleSipConnectionObserver::ConnectionStateChanged2 // ----------------------------------------------------------------------------- // @@ -568,13 +580,15 @@ Extract( EUriUserinfo ); const TDesC8& host = fromHeader->SIPAddress().Uri8().Uri(). Extract( EUriHost ); + + CleanupStack::PushL( aTransaction ); // CS: 1 + HBufC8* from = HBufC8::NewLC( user.Length() + KAt().Length() + host.Length() ); // CS: 1 from->Des().Copy( user ); from->Des().Append( KAt() ); from->Des().Append( host ); - CleanupStack::PushL( aTransaction ); // CS: 2 CSIPResponseElements* respElem = CSIPResponseElements::NewLC( // CS: 3 KSimpleOK, SIPStrings::StringF( SipStrConsts::EPhraseOk ) ); @@ -582,10 +596,10 @@ aTransaction->SendResponseL( respElem ); CleanupStack::Pop( respElem ); // CS: 2 - CleanupStack::Pop( aTransaction ); // CS: 1 - + iCallback.HandleReceivedMessage( *from, content ); - CleanupStack::PopAndDestroy( from ); // CS: 0 + CleanupStack::PopAndDestroy( from ); // CS: 1 + CleanupStack::Pop( aTransaction ); // CS: 0 } // We no longer need aTransaction. Just delete it. diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/siputils/src/simplesipprofileobserver.cpp --- a/simpleengine/siputils/src/simplesipprofileobserver.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/siputils/src/simplesipprofileobserver.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -272,7 +272,14 @@ } else if ( aEvent == EProfileUpdated ) { - iObs.ProfileStateChanged( CSIPConnection::EUnavailable, KErrNone ); +#ifdef _DEBUG + TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - ProfileEnabled : %d" ), iRegistry->IsEnabled( *iProfile ) ); + TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - Profile reg er : %d" ), iRegistry->LastRegistrationError( *iProfile ) ); + TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - IsContextActive : %d" ), iProfile->IsContextActive() ); +#endif + + // Notify observer to refresh SIP connection. + iObs.ProfileUpdated(); } else if ( aEvent == EProfileDestroyed ) { diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xdmrlspres/eabi/rlspresxdmU.DEF --- a/simpleengine/xdmrlspres/eabi/rlspresxdmU.DEF Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xdmrlspres/eabi/rlspresxdmU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -98,14 +98,14 @@ _ZN7CRLSXDM18UpdateDisplayNameLERK7TDesC16S2_S2_ @ 97 NONAME _ZN7CRLSXDM19DeleteAllEmptyListsEP23MRLSPresXDMAsyncHandler @ 98 NONAME _ZN7CRLSXDM19SwitchToServiceURILERK7TDesC16 @ 99 NONAME - _ZN7CRLSXDM20NegotiatedServiceUriEv @ 100 NONAME - _ZN7CRLSXDM20UpdateAllFromServerLEP23MRLSPresXDMAsyncHandler @ 101 NONAME - _ZN7CRLSXDM26DeleteAllEmptyServiceUrisLEv @ 102 NONAME - _ZN7CRLSXDM4NewLEi @ 103 NONAME - _ZN7CRLSXDM5NewLCEi @ 104 NONAME - _ZN7CRLSXDM9DeleteAllEv @ 105 NONAME - _ZTI12CPresenceXDM @ 106 NONAME - _ZTI7CRLSXDM @ 107 NONAME - _ZTV12CPresenceXDM @ 108 NONAME - _ZTV7CRLSXDM @ 109 NONAME + _ZN7CRLSXDM20UpdateAllFromServerLEP23MRLSPresXDMAsyncHandler @ 100 NONAME + _ZN7CRLSXDM26DeleteAllEmptyServiceUrisLEv @ 101 NONAME + _ZN7CRLSXDM4NewLEi @ 102 NONAME + _ZN7CRLSXDM5NewLCEi @ 103 NONAME + _ZN7CRLSXDM9DeleteAllEv @ 104 NONAME + _ZTI12CPresenceXDM @ 105 NONAME ; ## + _ZTI7CRLSXDM @ 106 NONAME ; ## + _ZTV12CPresenceXDM @ 107 NONAME ; ## + _ZTV7CRLSXDM @ 108 NONAME ; ## + _ZN7CRLSXDM20NegotiatedServiceUriEv @ 109 NONAME diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xdmrlspres/group/bld.inf --- a/simpleengine/xdmrlspres/group/bld.inf Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xdmrlspres/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -27,14 +27,14 @@ rlspresxdm.mmp PRJ_EXPORTS -../inc/rlspresxdmconsts.h MW_LAYER_PLATFORM_EXPORT_PATH(rlspresxdmconsts.h) -../inc/cpresencexdm.h MW_LAYER_PLATFORM_EXPORT_PATH(cpresencexdm.h) -../inc/mrlspresxdmasynchandler.h MW_LAYER_PLATFORM_EXPORT_PATH(mrlspresxdmasynchandler.h) -../inc/presenceactionxdm.h MW_LAYER_PLATFORM_EXPORT_PATH(presenceactionxdm.h) -../inc/prescondidentityone.h MW_LAYER_PLATFORM_EXPORT_PATH(prescondidentityone.h) -../inc/prescondidentitymany.h MW_LAYER_PLATFORM_EXPORT_PATH(prescondidentitymany.h) -../inc/prescondvalidity.h MW_LAYER_PLATFORM_EXPORT_PATH(prescondvalidity.h) -../inc/prescondsphere.h MW_LAYER_PLATFORM_EXPORT_PATH(prescondsphere.h) -../inc/presencetransformxdm.h MW_LAYER_PLATFORM_EXPORT_PATH(presencetransformxdm.h) -../inc/crlsxdm.h MW_LAYER_PLATFORM_EXPORT_PATH(crlsxdm.h) -../inc/prescondmisc.h MW_LAYER_PLATFORM_EXPORT_PATH(prescondmisc.h) +../inc/rlspresxdmconsts.h /epoc32/include/mw/rlspresxdmconsts.h +../inc/cpresencexdm.h /epoc32/include/mw/cpresencexdm.h +../inc/mrlspresxdmasynchandler.h /epoc32/include/mw/mrlspresxdmasynchandler.h +../inc/presenceactionxdm.h /epoc32/include/mw/presenceactionxdm.h +../inc/prescondidentityone.h /epoc32/include/mw/prescondidentityone.h +../inc/prescondidentitymany.h /epoc32/include/mw/prescondidentitymany.h +../inc/prescondvalidity.h /epoc32/include/mw/prescondvalidity.h +../inc/prescondsphere.h /epoc32/include/mw/prescondsphere.h +../inc/presencetransformxdm.h /epoc32/include/mw/presencetransformxdm.h +../inc/crlsxdm.h /epoc32/include/mw/crlsxdm.h +../inc/prescondmisc.h /epoc32/include/mw/prescondmisc.h diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xdmrlspres/group/rlspresxdm.mmp --- a/simpleengine/xdmrlspres/group/rlspresxdm.mmp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xdmrlspres/group/rlspresxdm.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -53,7 +53,7 @@ LIBRARY charconv.lib -#if defined( EABI ) +#if defined( ARMCC ) DEFFILE ../eabi/ #elif defined ( WINSCW ) deffile ../bwinscw/ diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xdmrlspres/src/crlsxdm.cpp --- a/simpleengine/xdmrlspres/src/crlsxdm.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xdmrlspres/src/crlsxdm.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -709,7 +709,7 @@ RPointerArray confirmedNodes; CXdmDocumentNode* currentNode = serviceUriNode; - confirmedNodes.Append(currentNode); + confirmedNodes.AppendL(currentNode); if(count>1) // if some list(s) exist in path info { @@ -734,7 +734,7 @@ for (TInt j=0;jAppendL(aLists.MdcaPoint(j)); - iListPointerPath.Append(confirmedNodes[j]); + iListPointerPath.AppendL(confirmedNodes[j]); } confirmedNodes.Close(); diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xdmrlspres/src/prescondvalidity.cpp --- a/simpleengine/xdmrlspres/src/prescondvalidity.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xdmrlspres/src/prescondvalidity.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -61,6 +61,8 @@ OPENG_DP(D_OPENG_LIT( "TPresCondValidity::GetValidity()" ) ); OPENG_DP(D_OPENG_LIT( " aRuleID = %S"),&aRuleID); + CleanupClosePushL (aValidTimes); + CXdmDocumentNode* validityNode = GetValidityNodeL(aRuleID, EFalse); if(validityNode==NULL) return KErrNotFound; @@ -99,7 +101,7 @@ for(TInt i=0; iSetLeafNode(ETrue); @@ -134,6 +136,8 @@ fromNodes.Close(); untilNodes.Close(); + + CleanupStack::Pop(); return KErrNone; } diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xdmrlspres/src/presencetransformxdm.cpp --- a/simpleengine/xdmrlspres/src/presencetransformxdm.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xdmrlspres/src/presencetransformxdm.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -181,7 +181,7 @@ if ((nodeName==KPresAllDevices)||(nodeName==KPresAllPersons)|| (nodeName==KPresAllServices)) { - aTypeAndValues.Append(myDataCompo); + aTypeAndValues.AppendL(myDataCompo); break; } diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xmlutils/inc/simpleelement.h --- a/simpleengine/xmlutils/inc/simpleelement.h Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xmlutils/inc/simpleelement.h Wed Sep 01 12:23:14 2010 +0100 @@ -276,7 +276,7 @@ void ConstructL( const TDesC8& aNsUri, const TDesC8& aLocalName ); - void ConstructL( + void CSimpleElement::ConstructL( CSenElement* aElem, TBool aOwn ); diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xmlutils/src/simpledocument.cpp --- a/simpleengine/xmlutils/src/simpledocument.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xmlutils/src/simpledocument.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -196,12 +196,14 @@ void CSimpleDocument::GetDirectContentsL( RPointerArray& aContents ) { + CleanupClosePushL( aContents ); aContents.Reset(); TInt myCount = iContents.Count(); for ( TInt i = 0; iBaseElement(); // externalize the document into stream @@ -676,7 +678,7 @@ // calculate the size of headers TInt headerSize = KContentTypeSize + KCIDSize; HBufC8* headers = HBufC8::NewL( headerSize ); - aBuffers.Append( headers ); + aBuffers.AppendL( headers ); TPtr8 pH(headers->Des()); // append to MIME headers for the root part pH.Append( NSimpleDocument::NSimpleRoot::KContentType ); @@ -689,7 +691,7 @@ { // Let's convert next element into CBodyPart CBodyPart* cp = CBodyPart::NewL(); - aBodies.Append( cp ); + aBodies.AppendL( cp ); // Set Headers headerSize = NSimpleDocument::NSimpleContent::KContentTypeSize + @@ -700,7 +702,7 @@ headers = HBufC8::NewL( headerSize ); // Append to cleanup array - aBuffers.Append( headers ); + aBuffers.AppendL( headers ); pH.Set( headers->Des() ); // _LIT8( KMyContentType, "Content-Type: %S\r\n"); @@ -716,7 +718,7 @@ // BASE64 encode HBufC8* body64 = HBufC8::NewL( (iContents[i])->Body().Length() * KB64Expand ); - aBuffers.Append( body64 ); + aBuffers.AppendL( body64 ); TImCodecB64 codec64; codec64.Initialise(); TPtr8 desti8 = body64->Des(); diff -r 2669f8761a99 -r fbd2e7cec7ef simpleengine/xmlutils/src/simpleelement.cpp --- a/simpleengine/xmlutils/src/simpleelement.cpp Tue Aug 31 15:35:50 2010 +0300 +++ b/simpleengine/xmlutils/src/simpleelement.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -221,6 +221,7 @@ TInt CSimpleElement::SimpleElementsL( RPointerArray& aElementArray ) { + CleanupClosePushL( aElementArray ); // Reset the output array first. aElementArray.Reset(); iElements.ResetAndDestroy(); @@ -234,10 +235,12 @@ CSenElement* pElement = elems[i]; CSimpleElement* simple = CSimpleElement::NewL( pElement, EFalse ); CleanupStack::PushL( simple ); - User::LeaveIfError( aElementArray.Append( simple )); + iElements.AppendL( simple ); CleanupStack::Pop( simple ); - User::LeaveIfError( iElements.Append( simple ) ); + aElementArray.AppendL( simple ); } + CleanupStack::Pop( &aElementArray ); + return elemCount ? KErrNone : KErrNotFound; } @@ -292,6 +295,8 @@ // TInt CSimpleElement::SimpleAttributesL( RPointerArray& aArray ) { + CleanupClosePushL( aArray ); + // Reset the output array first. aArray.Reset(); iAttributes.ResetAndDestroy(); @@ -304,10 +309,12 @@ CSenBaseAttribute* pAttr = elems[i]; CSimpleAttribute* attr = CSimpleAttribute::NewL( pAttr ); CleanupStack::PushL( attr ); - User::LeaveIfError(iAttributes.Append( attr )); + iAttributes.AppendL( attr ); CleanupStack::Pop( attr ); - User::LeaveIfError(aArray.Append( attr )); + aArray.AppendL( attr ); } + CleanupStack::Pop( &aArray ); + return elemCount ? KErrNone : KErrNotFound; } diff -r 2669f8761a99 -r fbd2e7cec7ef sysdef_1_5_1.dtd --- a/sysdef_1_5_1.dtd Tue Aug 31 15:35:50 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/BWINSCW/LocalOperationsU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/BWINSCW/LocalOperationsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/eabi/LocalOperationsU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/eabi/LocalOperationsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/group/LocalOperations.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/group/LocalOperations.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2005 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: LocalOperations.mmp +* +*/ + + + +#include + +TARGET localoperations.dll +UID 0x10009D8D 0x10275086 +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT +TARGETTYPE PLUGIN + +SOURCEPATH ../src + +START RESOURCE 10275086.rss + + TARGET localoperations.rsc + +END + +SOURCE LocalAddition.cpp +SOURCE LocalDeletion.cpp +SOURCE LocalRetrieval.cpp +SOURCE LocalReplacement.cpp +SOURCE LocalOperationBase.cpp +SOURCE LocalOperationFactory.cpp + +USERINCLUDE ../inc +USERINCLUDE ../../inc +USERINCLUDE ../../../inc + +//Parser +USERINCLUDE ../../../XdmXmlParser/inc + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/xml +SYSTEMINCLUDE /epoc32/include/ecom +SYSTEMINCLUDE ../../../../inc + +LIBRARY hal.lib +LIBRARY ecom.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +LIBRARY xdmengine.lib +LIBRARY xdmxmlparser.lib +LIBRARY localprotocol.lib + +#if defined( ARMCC ) +DEFFILE ../eabi/ +#elif defined ( WINSCW ) +deffile ../BWINSCW/ +#elif defined (WINS ) +deffile ../BWINS/ +#endif + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: LocalOperations bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- +LocalOperations.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/inc/LocalAddition.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/inc/LocalAddition.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2003 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: CLocalAddition +* +*/ + + + + +#ifndef __LOCALADDITION__ +#define __LOCALADDITION__ + +#include +#include "XdmOperation.h" +#include "LocalOperationBase.h" + +//FORWARD DECLARATIONS +class CXdmDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalAddition ) : public CLocalOperationBase + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalAddition* NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ); + + /** + * Destructor. + */ + virtual ~CLocalAddition(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalAddition( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void HandlePartialUpdateL( TInt aDataLength ); + + private: //From MXdmOperation + + /** + * Execute this operation synchronously + */ + void ExecuteL(); + + /** + * Set this operation to completed state. + */ + void Destroy(); + + private: //Data + + + TXdmOperationType iOperationType; + CXdmDocumentNode* iDocumentSubset; + }; + +#endif //__LOCALADDITION__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/inc/LocalDeletion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/inc/LocalDeletion.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2005 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: CLocalDeletion +* +*/ + + + + +#ifndef __LOCALDELETION__ +#define __LOCALDELETION__ + +#include +#include "XdmOperation.h" +#include "LocalOperationBase.h" + +//FORWARD DECLARATIONS +class CXdmDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalDeletion ) : public CLocalOperationBase + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalDeletion* NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ); + + /** + * Destructor. + */ + virtual ~CLocalDeletion(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalDeletion( CLocalDocument& aTargetDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void HandlePartialDeletionL( TInt aDataLength ); + + private: //From MXdmOperation + + /** + * Execute this operation synchronously + */ + void ExecuteL(); + + /** + * Set this operation to completed state. + */ + void Destroy(); + + private: //Data + + CLocalDocumentNode* iDocumentSubset; + TXdmOperationType iOperationType; + }; + +#endif //__LOCALDELETION__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/inc/LocalOperationBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/inc/LocalOperationBase.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,155 @@ +/* +* Copyright (c) 2003 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: CLocalOperationBase +* +*/ + + + + +#ifndef __LOCALOPERATIONBASE__ +#define __LOCALOPERATIONBASE__ + +#include +#include "XdmOperation.h" + +//FORWARD DECLARATIONS +class CXdmXmlParser; +class CLocalDocument; +class CXdmDocumentNode; +class CLocalDocumentNode; +class CLocalOperationFactory; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalOperationBase ) : public CBase, + public MXdmOperation + { + public: + + /** + * Destructor. + */ + virtual ~CLocalOperationBase(); + + protected: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalOperationBase( const CLocalDocument& aTargetDoc, + CLocalOperationFactory& aOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void BaseConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void WriteFileL( const CXdmDocumentNode* aRootNode ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + HBufC8* FetchXmlDataL( TInt aFileSize ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ReplaceDataFileL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void DeleteDataFileL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TInt OpenDataFileL( const TDesC& aFilePath ); + + private: + + /** + * Execute this operation asynchronously. + */ + void ExecuteL( TRequestStatus& aStatus, TUint aOptions ); + + /** + * Cancel this operation. + */ + void CancelOperation(); + + /** + * Get the result of this operation. + */ + TInt Result() const; + + /** + * Get the completion data of this operation. + */ + const TXdmCompletionData& CompletionData() const; + + /** + * Set this operation to completed state. + */ + TBool IsCompleted() const; + + /** + * Set this operation to completed state. + */ + CXdmDocumentNode* TargetNode() const; + + /** + * Set this operation to completed state. + */ + void GenerateTimeStampL(); + + HBufC* ConstructTimestampNameL(); + + /** + * Set this operation to completed state. + */ + HBufC8* TimeLC(); + + protected: //Data + + RFile iXmlFile; + TPtrC iFullPath; + CFileMan* iFileManager; + CLocalDocument& iTargetDoc; + CXdmXmlParser* iXmlParser; + TXdmOperationType iOperationType; + TXdmCompletionData iCompletionData; + CLocalOperationFactory& iOperationFactory; + }; + +#endif //__LOCALOPERATIONBASE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/inc/LocalOperationFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/inc/LocalOperationFactory.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2005 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: CLocalOperationFactory +* +*/ + + + + +#ifndef __LOCALOPERATIONFACTORY__ +#define __LOCALOPERATIONFACTORY__ + +#include +#include "XdmOperationFactory.h" + +_LIT( KLocalOpLogFile, "LocalOperations" ); +const TInt KLocalProtLogBufferMaxSize = 2000; + +//FORWARD DECLARATION +class CXdmDocument; +class MXdmOperation; +class CXdmLogWriter; +class CXdmDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalOperationFactory ) : public CXdmOperationFactory + { + public: + + /** + * Two-phased constructor. + * @param CXdmProtocolInfo Protocol info + * @return CXdmProtocol + */ + static CLocalOperationFactory* NewL(); + + /** + * Destructor. A simple wrapper to the C++ destructor. + * + */ + virtual ~CLocalOperationFactory(); + + private: //From CXdmoperationFactory + + /** + * Return an operation object that knows how to manipulate + * whole documents + */ + MXdmOperation* FetchL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode = NULL ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* InsertL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* ReplaceL( CXdmDocument& aOldDocument, + CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aOldNode ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* AppendL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* DeletionL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const; + + public: + + /** + * Logging function + * @param TRefByValue aFmt,... + * @return void + */ + void WriteToLog( TRefByValue aFmt,... ); + + private: + + /** + * C++ constructor + * @return CImpsTcpCirWatcher + */ + void ConstructL(); + + /** + * C++ constructor + * @return CImpsTcpCirWatcher + */ + CLocalOperationFactory(); + + private: //Data + + CXdmLogWriter* iLogWriter; + }; + +#endif diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/inc/LocalReplacement.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/inc/LocalReplacement.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2005 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: CLocalReplacement +* +*/ + + + + +#ifndef __LOCALREPLACEMENT__ +#define __LOCALREPLACEMENT__ + +#include +#include "XdmOperation.h" +#include "LocalOperationBase.h" + +//FORWARD DECLARATIONS +class CLocalDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalReplacement ) : public CLocalOperationBase + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalReplacement* NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aOldNode, + CLocalDocumentNode* aNewNode, + CLocalOperationFactory& aOperationFactory ); + + /** + * Destructor. + */ + virtual ~CLocalReplacement(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalReplacement( CLocalDocument& aTargetDoc, + CLocalDocumentNode* aOldNode, + CLocalDocumentNode* aNewNode, + CLocalOperationFactory& aOperationFactory ); + + private: //From MXdmOperation + + /** + * Execute this operation synchronously + */ + void ExecuteL(); + + /** + * Execute this operation synchronously + */ + void HandlePartialReplacementL( TInt aDataLength ); + + /** + * Set this operation to completed state. + */ + void Destroy(); + + private: //Data + + CLocalDocumentNode* iNewNode; + CLocalDocumentNode* iTargetNode; + TXdmOperationType iOperationType; + + }; + +#endif //__LOCALREPLACEMENT__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/inc/LocalRetrieval.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/inc/LocalRetrieval.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2005 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: CLocalRetrieval +* +*/ + + + + +#ifndef __LOCALRETRIEVAL__ +#define __LOCALRETRIEVAL__ + +#include +#include "LocalOperationBase.h" + +class CLocalDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalRetrieval ) : public CLocalOperationBase + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalRetrieval* NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aTargetNode, + CLocalOperationFactory& aOperationFactory ); + + /** + * Destructor. + */ + virtual ~CLocalRetrieval(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalRetrieval( CLocalDocument& aTargetDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ); + + private: //From MXdmOperation + + /** + * Execute this operation synchronously + */ + void ExecuteL(); + + /** + * Set this operation to completed state. + */ + void Destroy(); + + private: //Data + + CLocalDocumentNode* iDocumentSubset; + TXdmOperationType iOperationType; + }; + +#endif //__LOCALRETRIEVAL__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/src/10275086.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/10275086.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 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: XdmOperationInfo +* +*/ + + +// 10275086.RSS +// +#include "registryinfo.rh" + +//Declares the interface implementations provided +RESOURCE REGISTRY_INFO XdmOperationInfo + { + dll_uid = 0x10275086; + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10207425; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x10275088; + version_no = 1; + display_name = "Local Operation API||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + } + }; + } + }; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/src/LocalAddition.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalAddition.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,143 @@ +/* +* Copyright (c) 2005 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: CLocalAddition +* +*/ + + + + +// INCLUDES +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalAddition.h" +#include "XdmXmlParser.h" +#include "LocalDocumentNode.h" +#include "LocalNodeAttribute.h" +#include "LocalOperationFactory.h" + +// --------------------------------------------------------- +// CLocalAddition::CLocalAddition +// +// --------------------------------------------------------- +// +CLocalAddition::CLocalAddition( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) : + CLocalOperationBase( aParentDoc, aOperationFactory ), + iOperationType( aDocumentSubset == NULL ? + EXdmDocument : EXdmPartialDocument ), + iDocumentSubset( aDocumentSubset ) + + { + } + +// --------------------------------------------------------- +// CLocalAddition::NewL +// +// --------------------------------------------------------- +// +CLocalAddition* CLocalAddition::NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) + { + CLocalAddition* self = new ( ELeave ) CLocalAddition( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CLocalAddition::ExecuteL +// +// --------------------------------------------------------- +// +void CLocalAddition::ExecuteL() + { + TPtrC fileName = iTargetDoc.XmlFilePath(); + TInt size = OpenDataFileL( fileName ); + if( size > 0 ) //The document already exists + { + //Only a subset of a document + if( iTargetDoc.IsSubset() && iDocumentSubset != NULL ) + HandlePartialUpdateL( size ); + else WriteFileL( iTargetDoc.DocumentRoot() ); + } + else WriteFileL( iTargetDoc.DocumentRoot() ); + iXmlFile.Close(); + } + +// --------------------------------------------------------- +// CLocalAddition::HandlePartialUpdateL +// +// --------------------------------------------------------- +// +void CLocalAddition::HandlePartialUpdateL( TInt aDataLength ) + { + HBufC8* data = FetchXmlDataL( aDataLength ); + CleanupStack::PushL( data ); + CLocalDocument* copy = iTargetDoc.TempCopyL(); + CleanupStack::PushL( copy ); + iXmlParser->ParseDocumentL( copy, *data ); + RPointerArray results; + CleanupClosePushL( results ); + RPointerArray attributes; + CleanupClosePushL( attributes ); + TInt attrCount = iDocumentSubset->AttributeCount(); + if( attrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < attrCount;i++ ) + { + attribute.iName.Set( iDocumentSubset->Attribute( i )->NodeName() ); + attribute.iValue.Set( iDocumentSubset->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( attributes.Append( &attribute ) ); + } + copy->Find( iDocumentSubset->NodeName(), results, attributes ); + if( results.Count() == 1 ) + { + iXmlFile.Close(); + ReplaceDataFileL(); + CLocalDocumentNode* node = ( CLocalDocumentNode* )results[0]; + node->AppendLocalL( ( CLocalDocumentNode* )iDocumentSubset ); + WriteFileL( copy->DocumentRoot() ); + } + else User::Leave( KErrGeneral ); + CleanupStack::PopAndDestroy( 4 ); //attributes, results, copy, data + } + +// --------------------------------------------------------- +// CLocalAddition::Destroy +// +// --------------------------------------------------------- +// +void CLocalAddition::Destroy() + { + delete this; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CLocalAddition::~CLocalAddition() + { + + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/src/LocalDeletion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalDeletion.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2005 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: CLocalDeletion +* +*/ + + + + +// INCLUDES +#include "XdmXmlParser.h" +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalDeletion.h" +#include "LocalDocumentNode.h" +#include "LocalNodeAttribute.h" + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CLocalDeletion::CLocalDeletion( CLocalDocument& aTargetDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) : + CLocalOperationBase( aTargetDoc, aOperationFactory ), + iDocumentSubset( aDocumentSubset ), + iOperationType( aDocumentSubset == NULL ? + EXdmDocument : EXdmPartialDocument ) + { + } + +// --------------------------------------------------------- +// CLocalDeletion::NewL +// +// --------------------------------------------------------- +// +CLocalDeletion* CLocalDeletion::NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) + { + CLocalDeletion* self = new ( ELeave ) CLocalDeletion( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CLocalDeletion::ExecuteL +// +// --------------------------------------------------------- +// +void CLocalDeletion::ExecuteL() + { + TPtrC fileName = iTargetDoc.XmlFilePath(); + TInt size = OpenDataFileL( fileName ); + if( size > 0 ) + { + //Only a subset of a document + if( iTargetDoc.IsSubset() ) + HandlePartialDeletionL( size ); + else if( iDocumentSubset != NULL ) + { + iTargetDoc.RemoveData( ( CLocalDocumentNode* )iDocumentSubset ); + iXmlFile.Close(); + ReplaceDataFileL(); + WriteFileL( iTargetDoc.DocumentRoot() ); + } + else + { + iXmlFile.Close(); + DeleteDataFileL(); //Delete the whole document + } + } + else User::Leave( KErrNotFound ); + iXmlFile.Close(); + } + +// --------------------------------------------------------- +// CLocalAddition::HandlePartialUpdateL +// +// --------------------------------------------------------- +// +void CLocalDeletion::HandlePartialDeletionL( TInt aDataLength ) + { + TInt error = KErrNone; + HBufC8* data = FetchXmlDataL( aDataLength ); + CleanupStack::PushL( data ); + TRAP( error, iXmlParser->ParseDocumentL( &iTargetDoc, *data ) ); + CXdmDocumentNode* parent = iDocumentSubset->Parent(); + RPointerArray parentResults; + CleanupClosePushL( parentResults ); + RPointerArray parentAttributes; + CleanupClosePushL( parentAttributes ); + RPointerArray nodeResults; + CleanupClosePushL( nodeResults ); + RPointerArray nodeAttributes; + CleanupClosePushL( nodeAttributes ); + TInt pAttrCount = parent->AttributeCount(); + TInt dAttrCount = iDocumentSubset->AttributeCount(); + if( pAttrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < pAttrCount;i++ ) + { + attribute.iName.Set( parent->Attribute( i )->NodeName() ); + attribute.iValue.Set( parent->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( parentAttributes.Append( &attribute ) ); + } + if( dAttrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < dAttrCount;i++ ) + { + attribute.iName.Set( iDocumentSubset->Attribute( i )->NodeName() ); + attribute.iValue.Set( iDocumentSubset->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( nodeAttributes.Append( &attribute ) ); + } + iTargetDoc.Find( parent->NodeName(), parentResults, parentAttributes ); + iTargetDoc.Find( iDocumentSubset->NodeName(), nodeResults, nodeAttributes ); + if( parentResults.Count() == 1 && nodeResults.Count() == 1 ) + { + iXmlFile.Close(); + ReplaceDataFileL(); + CLocalDocumentNode* p = ( CLocalDocumentNode* )parentResults[0]; + CLocalDocumentNode* r = ( CLocalDocumentNode* )nodeResults[0]; + p->RemoveLocalL( r ); + WriteFileL( iTargetDoc.DocumentRoot() ); + } + else User::Leave( KErrGeneral ); + CleanupStack::PopAndDestroy( 5 ); //nodeAttributes, nodeResults, + //parentAttributes, parentResults, data + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +void CLocalDeletion::Destroy() + { + delete this; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CLocalDeletion::~CLocalDeletion() + { + + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/src/LocalOperationBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalOperationBase.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,263 @@ +/* +* Copyright (c) 2005 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: CLocalOperationBase +* +*/ + + + + + +// INCLUDES +#include "XdmXmlParser.h" +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalOperationBase.h" + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CLocalOperationBase::CLocalOperationBase( const CLocalDocument& aTargetDoc, + CLocalOperationFactory& aOperationFactory ) : + iTargetDoc( CONST_CAST( CLocalDocument&, aTargetDoc ) ), + iOperationFactory( aOperationFactory ) + { + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CLocalOperationBase::~CLocalOperationBase() + { + iXmlFile.Close(); + delete iXmlParser; + delete iFileManager; + } + +// --------------------------------------------------------- +// CLocalOperationBase::BaseConstructL +// +// --------------------------------------------------------- +// +void CLocalOperationBase::BaseConstructL() + { + iXmlParser = CXdmXmlParser::NewL(); + iFileManager = CFileMan::NewL( CLocalProtocol::FileSession() ); + } + +// --------------------------------------------------------- +// CLocalOperationBase::WriteFileL +// +// --------------------------------------------------------- +// +void CLocalOperationBase::WriteFileL( const CXdmDocumentNode* aRootNode ) + { + __ASSERT_DEBUG( aRootNode != NULL, User::Panic( _L( "CLocalOperationBase" ), 1 ) ); + HBufC8* data = iXmlParser->FormatToXmlLC( ETrue, &iTargetDoc, aRootNode ); + User::LeaveIfError( iXmlFile.Write( data->Des() ) ); + CleanupStack::PopAndDestroy(); //data + GenerateTimeStampL(); + } + +// --------------------------------------------------------- +// CLocalOperationBase::GenerateTimeStampL +// +// --------------------------------------------------------- +// +void CLocalOperationBase::GenerateTimeStampL() + { + RFile timeStamp; + HBufC8* time = TimeLC(); + HBufC* timeStampName = ConstructTimestampNameL(); + CleanupStack::PushL( timeStampName ); + User::LeaveIfError( timeStamp.Replace( CLocalProtocol::FileSession(), timeStampName->Des(), EFileWrite ) ); + User::LeaveIfError( timeStamp.Write( time->Des() ) ); + timeStamp.Close(); + CleanupStack::PopAndDestroy( 2 ); //timeStampName, time + } + +// --------------------------------------------------------- +// CLocalOperationBase::ConstructTimestampNameL +// +// --------------------------------------------------------- +// +HBufC* CLocalOperationBase::ConstructTimestampNameL() + { + const TChar backSlash = 92; + const TChar idSeparator = 46; + TInt index = iFullPath.LocateReverse( backSlash ); + TPtrC path = iFullPath.Left( index + 1 ); + HBufC* fileName = HBufC::NewLC( iTargetDoc.Name().Length() + KTimeStampFileExt().Length() ); + HBufC* fullPath = HBufC::NewLC( path.Length() + fileName->Des().MaxLength() ); + TPtr ptr( fileName->Des() ); + ptr.Copy( iTargetDoc.Name() ); + index = ptr.LocateReverse( idSeparator ); + TPtrC tmspName = index > 0 ? ptr.Left( index ) : ptr; + fullPath->Des().Copy( path ); + fullPath->Des().Append( tmspName ); + fullPath->Des().Append( KTimeStampFileExt ); + CleanupStack::Pop(); //fullPath + CleanupStack::PopAndDestroy(); //fileName + return fullPath; + } + +// --------------------------------------------------------- +// CLocalOperationBase::Time +// +// --------------------------------------------------------- +// +HBufC8* CLocalOperationBase::TimeLC() + { + TTime time; + TBuf dateBuffer; + time.HomeTime(); + time.FormatL( dateBuffer, KDateFormat ); + TBuf timeBuffer; + time.HomeTime(); + time.FormatL( timeBuffer, KTimeFormat ); + TBuf buffer; + buffer.SetLength( 0 ); + buffer.Copy( dateBuffer ); + buffer.Append( _L( " " ) ); + buffer.Append( timeBuffer ); + HBufC8* ret = HBufC8::NewLC( buffer.Length() ); + ret->Des().Copy( buffer ); + return ret; + } + +// --------------------------------------------------------- +// CLocalOperationBase::FetchXmlDataL +// +// --------------------------------------------------------- +// +HBufC8* CLocalOperationBase::FetchXmlDataL( TInt aFileSize ) + { + HBufC8* data = HBufC8::NewLC( aFileSize ); + TPtr8 desc( data->Des() ); + User::LeaveIfError( iXmlFile.Read( desc ) ); + CleanupStack::Pop(); //data + return data; + } + +// --------------------------------------------------------- +// CLocalOperationBase::FetchXmlDataL +// +// --------------------------------------------------------- +// +TInt CLocalOperationBase::OpenDataFileL( const TDesC& aFilePath ) + { + TInt length = 0; + iFullPath.Set( aFilePath ); + TInt error = iXmlFile.Open( CLocalProtocol::FileSession(), iFullPath, + EFileRead | EFileWrite | EFileShareExclusive ); + if( error != KErrNone ) + { + if( error == KErrPathNotFound ) + User::LeaveIfError( CLocalProtocol::FileSession().MkDirAll( CLocalProtocol::RootFolder() ) ); + error = iXmlFile.Create( CLocalProtocol::FileSession(), iFullPath, + EFileRead | EFileWrite | EFileShareExclusive ); + } + error = error == KErrNone ? iXmlFile.Size( length ) : KErrUnknown; + return error == KErrNone ? length : error; + } + +// --------------------------------------------------------- +// CLocalOperationBase::ReplaceDataFileL +// +// --------------------------------------------------------- +// +void CLocalOperationBase::ReplaceDataFileL() + { + User::LeaveIfError( iXmlFile.Replace( CLocalProtocol::FileSession(), iFullPath, + EFileRead | EFileWrite | EFileShareExclusive ) ); + } + +// --------------------------------------------------------- +// CLocalOperationBase::DeleteDataFileL +// +// --------------------------------------------------------- +// +void CLocalOperationBase::DeleteDataFileL() + { + User::LeaveIfError( CLocalProtocol::FileSession().Delete( iFullPath ) ); + HBufC* timeStampName = ConstructTimestampNameL(); + CleanupStack::PushL( timeStampName ); + User::LeaveIfError( CLocalProtocol::FileSession().Delete( timeStampName->Des() ) ); + CleanupStack::PopAndDestroy(); //timeStampName + } + +// --------------------------------------------------------- +// CLocalOperationBase::ExecuteL +// +// --------------------------------------------------------- +// +void CLocalOperationBase::ExecuteL( TRequestStatus& /*aStatus*/, TUint /*aOptions*/ ) + { + } + +// --------------------------------------------------------- +// CLocalOperationBase::CancelOperation +// +// --------------------------------------------------------- +// +void CLocalOperationBase::CancelOperation() + { + } + +// --------------------------------------------------------- +// CLocalOperationBase::CompletionData +// +// --------------------------------------------------------- +// +const TXdmCompletionData& CLocalOperationBase::CompletionData() const + { + return iCompletionData; + } + +// --------------------------------------------------------- +// CLocalOperationBase::IsCompleted +// +// --------------------------------------------------------- +// +TBool CLocalOperationBase::IsCompleted() const + { + return ETrue; + } + +// --------------------------------------------------------- +// CLocalOperationBase::TargetNode +// +// --------------------------------------------------------- +// +CXdmDocumentNode* CLocalOperationBase::TargetNode() const + { + return NULL; + } + +// --------------------------------------------------------- +// CLocalOperationBase::Result +// +// --------------------------------------------------------- +// +TInt CLocalOperationBase::Result() const + { + return KErrNone; + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/src/LocalOperationFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalOperationFactory.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,186 @@ +/* +* Copyright (c) 2005 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: CLocalOperationFactory +* +*/ + + + +#include +#include +#include +#include +#include "XdmOperation.h" +#include "LocalRetrieval.h" +#include "LocalAddition.h" +#include "LocalReplacement.h" +#include "LocalDeletion.h" +#include "LocalProtocol.h" +#include "LocalOperationFactory.h" + +// --------------------------------------------------------- +// CLocalOperationFactory::CLocalOperationFactory +// +// --------------------------------------------------------- +// +CLocalOperationFactory::CLocalOperationFactory() + { + } + +// --------------------------------------------------------- +// CLocalOperationFactory::NewL +// +// --------------------------------------------------------- +// +CLocalOperationFactory* CLocalOperationFactory::NewL() + { + CLocalOperationFactory* self = new ( ELeave ) CLocalOperationFactory(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CLocalOperationFactory::ConstructL +// +// --------------------------------------------------------- +// +void CLocalOperationFactory::ConstructL() + { + #ifdef _DEBUG + iLogWriter = CXdmLogWriter::NewL( KLocalOpLogFile ); + WriteToLog( _L8( "CLocalOperationFactory::ConstructL()" ) ); + #endif + } + +// --------------------------------------------------------- +// CLocalOperationFactory::~CLocalOperationFactory +// +// --------------------------------------------------------- +// +CLocalOperationFactory::~CLocalOperationFactory() + { + #ifdef _DEBUG + WriteToLog( _L8( "CLocalOperationFactory::~CLocalOperationFactory()" ) ); + #endif + delete iLogWriter; + } + +// --------------------------------------------------------- +// CLocalOperationFactory::FetchL +// +// --------------------------------------------------------- +// +MXdmOperation* CLocalOperationFactory::FetchL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CLocalRetrieval::NewL( ( CLocalDocument& )aTargetDocument, + ( CLocalDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CLocalOperationFactory::InsertL +// +// --------------------------------------------------------- +// +MXdmOperation* CLocalOperationFactory::InsertL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CLocalAddition::NewL( ( CLocalDocument& )aTargetDocument, + ( CLocalDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CLocalOperationFactory::ReplaceL +// +// --------------------------------------------------------- +// +MXdmOperation* CLocalOperationFactory::ReplaceL( CXdmDocument& aOldDocument, + CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aOldNode ) const + { + return CLocalReplacement::NewL( ( CLocalDocument& )aOldDocument, + ( CLocalDocumentNode* )aNewNode, + ( CLocalDocumentNode* )aOldNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CLocalOperationFactory::AppendL +// +// --------------------------------------------------------- +// +MXdmOperation* CLocalOperationFactory::AppendL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CLocalAddition::NewL( ( CLocalDocument& )aTargetDocument, + ( CLocalDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CLocalOperationFactory::PartialDeletionL +// +// --------------------------------------------------------- +// +MXdmOperation* CLocalOperationFactory::DeletionL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CLocalDeletion::NewL( ( CLocalDocument& )aTargetDocument, + ( CLocalDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// ---------------------------------------------------------- +// CLocalOperationFactory::WriteToLog +// +// ---------------------------------------------------------- +// +void CLocalOperationFactory::WriteToLog( TRefByValue aFmt,... ) + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + iLogWriter->WriteToLog( buf ); + } + +// --------------------------------------------------------- +// Map the interface UIDs to implementation factory functions +// +// --------------------------------------------------------- +// +const TImplementationProxy ImplementationTable[] = + { +#ifdef __EABI__ + IMPLEMENTATION_PROXY_ENTRY( KLocalOperationFactory, CLocalOperationFactory::NewL ) +#else + { { KLocalOperationFactory }, CLocalOperationFactory::NewL } +#endif + }; + +// --------------------------------------------------------- +// Return the implementation table & number of implementations +// +// --------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/src/LocalReplacement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalReplacement.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,173 @@ +/* +* Copyright (c) 2005 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: CLocalReplacement +* +*/ + + + + +// INCLUDES +#include +#include "XdmXmlParser.h" +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalReplacement.h" +#include "LocalDocumentNode.h" +#include "LocalNodeAttribute.h" + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CLocalReplacement::CLocalReplacement( CLocalDocument& aTargetDoc, + CLocalDocumentNode* aOldNode, + CLocalDocumentNode* aNewNode, + CLocalOperationFactory& aOperationFactory ) : + CLocalOperationBase( aTargetDoc, aOperationFactory ), + iNewNode( ( CLocalDocumentNode* )aNewNode ), + iTargetNode( ( CLocalDocumentNode* )aOldNode ), + iOperationType( iTargetNode == NULL ? + EXdmDocument : EXdmPartialDocument ) + { + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CLocalReplacement* CLocalReplacement::NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aOldNode, + CLocalDocumentNode* aNewNode, + CLocalOperationFactory& aOperationFactory ) + { + CLocalReplacement* self = new ( ELeave ) CLocalReplacement( aParentDoc, aOldNode, aNewNode, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CLocalReplacement::ExecuteL +// +// --------------------------------------------------------- +// +void CLocalReplacement::ExecuteL() + { + TPtrC fileName = iTargetDoc.XmlFilePath(); + TInt size = OpenDataFileL( fileName ); + if( size > 0 ) + { + //Only a subset of a document + if( iTargetDoc.IsSubset() ) + HandlePartialReplacementL( size ); + else if( iTargetNode != NULL ) + { + CLocalDocumentNode* parent = ( CLocalDocumentNode* )iTargetNode->Parent(); + parent->ReplaceLocalL( iNewNode, iTargetNode ); + } + else + { + iXmlFile.Close(); + ReplaceDataFileL(); + WriteFileL( iTargetDoc.DocumentRoot() ); + } + } + else WriteFileL( iTargetDoc.DocumentRoot() ); + iXmlFile.Close(); + } + +// --------------------------------------------------------- +// CLocalReplacement::HandlePartialReplacementL +// +// --------------------------------------------------------- +// +void CLocalReplacement::HandlePartialReplacementL( TInt aDataLength ) + { + TInt error = KErrNone; + HBufC8* data = FetchXmlDataL( aDataLength ); + CleanupStack::PushL( data ); + TRAP( error, iXmlParser->ParseDocumentL( &iTargetDoc, *data ) ); + CXdmDocumentNode* parent = iTargetNode->Parent(); + RPointerArray parentResults; + CleanupClosePushL( parentResults ); + RPointerArray parentAttributes; + CleanupClosePushL( parentAttributes ); + RPointerArray targetResults; + CleanupClosePushL( targetResults ); + RPointerArray targetAttributes; + CleanupClosePushL( targetAttributes ); + TInt pAttrCount = parent->AttributeCount(); + TInt tAttrCount = iTargetNode->AttributeCount(); + if( pAttrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < pAttrCount;i++ ) + { + attribute.iName.Set( parent->Attribute( i )->NodeName() ); + attribute.iValue.Set( parent->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( parentAttributes.Append( &attribute ) ); + } + if( tAttrCount > 0 ) + { + SXdmAttribute16 attribute; + for( TInt i = 0;i < tAttrCount;i++ ) + { + attribute.iName.Set( iTargetNode->Attribute( i )->NodeName() ); + attribute.iValue.Set( iTargetNode->Attribute( i )->AttributeValue() ); + } + User::LeaveIfError( targetAttributes.Append( &attribute ) ); + } + iTargetDoc.Find( parent->NodeName(), parentResults, parentAttributes ); + iTargetDoc.Find( iTargetNode->NodeName(), targetResults, targetAttributes ); + if( parentResults.Count() == 1 && targetResults.Count() == 1 ) + { + iXmlFile.Close(); + ReplaceDataFileL(); + CLocalDocumentNode* node = ( CLocalDocumentNode* )parentResults[0]; + CLocalDocumentNode* target = ( CLocalDocumentNode* )targetResults[0]; + node->ReplaceLocalL( iNewNode, target ); + WriteFileL( iTargetDoc.DocumentRoot() ); + } + else User::Leave( KErrGeneral ); + CleanupStack::PopAndDestroy( 5 ); //targetAttributes, targetResults, + //parentAttributes, parentResults, data + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +void CLocalReplacement::Destroy() + { + delete this; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CLocalReplacement::~CLocalReplacement() + { + + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/LocalOperations/src/LocalRetrieval.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/LocalOperations/src/LocalRetrieval.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,127 @@ +/* +* Copyright (c) 2005 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: CLocalRetrieval +* +*/ + + + + +// INCLUDES +#include "XdmXmlParser.h" +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalRetrieval.h" +#include "LocalDocumentNode.h" +#include "LocalOperationFactory.h" + +// --------------------------------------------------------- +// CLocalRetrieval::CLocalRetrieval +// +// --------------------------------------------------------- +// +CLocalRetrieval::CLocalRetrieval( CLocalDocument& aTargetDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) : + CLocalOperationBase( aTargetDoc, aOperationFactory ), + iDocumentSubset( aDocumentSubset ), + iOperationType( aDocumentSubset == NULL ? + EXdmDocument : EXdmPartialDocument ) + + { + } + +// --------------------------------------------------------- +// CLocalRetrieval::NewL +// +// --------------------------------------------------------- +// +CLocalRetrieval* CLocalRetrieval::NewL( CLocalDocument& aParentDoc, + CLocalDocumentNode* aDocumentSubset, + CLocalOperationFactory& aOperationFactory ) + { + CLocalRetrieval* self = new ( ELeave ) CLocalRetrieval( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CLocalRetrieval::ExecuteL +// +// --------------------------------------------------------- +// +void CLocalRetrieval::ExecuteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CLocalRetrieval::ExecuteL()" ) ); + #endif + HBufC8* data = NULL; + TInt error = KErrNone; + TInt length = OpenDataFileL( iTargetDoc.XmlFilePath() ); + TRAP( error, data = FetchXmlDataL( length ) ); + CleanupStack::PushL( data ); + if( data != NULL ) + { + if( iDocumentSubset == NULL ) + { + TRAP( error, iXmlParser->ParseDocumentL( &iTargetDoc, *data ) ); + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Document fetch complete - Error: %d" ), error ); + #endif + } + else + { + iDocumentSubset->SetEmptyNode( ETrue ); + iDocumentSubset->SetEmptyNode( EFalse ); + TRAP( error, iXmlParser->ParseDocumentL( &iTargetDoc, *data, ( CXdmDocumentNode* )iDocumentSubset ) ); + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Document fetch complete: %d" ), error ); + #endif + } + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Reading of the document data failed: %d" ), error ); + #endif + User::Leave( error ); + } + CleanupStack::PopAndDestroy(); //data + iXmlFile.Close(); + } + +// --------------------------------------------------------- +// CLocalRetrieval::Destroy +// +// --------------------------------------------------------- +// +void CLocalRetrieval::Destroy() + { + delete this; + } + +// --------------------------------------------------------- +// CLocalRetrieval::~CLocalRetrieval +// +// --------------------------------------------------------- +// +CLocalRetrieval::~CLocalRetrieval() + { + + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/bwinscw/LocalProtocolU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/bwinscw/LocalProtocolU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,18 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + ??1CLocalDocumentNode@@UAE@XZ @ 2 NONAME ; CLocalDocumentNode::~CLocalDocumentNode(void) + ??1CXdmNamespace@@UAE@XZ @ 3 NONAME ; CXdmNamespace::~CXdmNamespace(void) + ?AppendLocalL@CLocalDocumentNode@@QAEXPAVCXdmDocumentNode@@@Z @ 4 NONAME ; void CLocalDocumentNode::AppendLocalL(class CXdmDocumentNode *) + ?FileSession@CLocalProtocol@@SAAAVRFs@@XZ @ 5 NONAME ; class RFs & CLocalProtocol::FileSession(void) + ?IsSubset@CLocalDocument@@QBEHXZ @ 6 NONAME ; int CLocalDocument::IsSubset(void) const + ?NewL@CXdmNamespace@@SAPAV1@ABVTDesC8@@0@Z @ 7 NONAME ; class CXdmNamespace * CXdmNamespace::NewL(class TDesC8 const &, class TDesC8 const &) + ?Prefix@CXdmNamespace@@QBE?AVTPtrC8@@XZ @ 8 NONAME ; class TPtrC8 CXdmNamespace::Prefix(void) const + ?RemoveData@CLocalDocument@@QAEXPAVCLocalDocumentNode@@@Z @ 9 NONAME ; void CLocalDocument::RemoveData(class CLocalDocumentNode *) + ?RemoveLocalL@CLocalDocumentNode@@QAEXPAVCXdmDocumentNode@@@Z @ 10 NONAME ; void CLocalDocumentNode::RemoveLocalL(class CXdmDocumentNode *) + ?ReplaceLocalL@CLocalDocumentNode@@QAEXPAVCXdmDocumentNode@@0@Z @ 11 NONAME ; void CLocalDocumentNode::ReplaceLocalL(class CXdmDocumentNode *, class CXdmDocumentNode *) + ?ResetSubset@CLocalDocument@@UAEXXZ @ 12 NONAME ; void CLocalDocument::ResetSubset(void) + ?RootFolder@CLocalProtocol@@SA?AVTPtrC16@@XZ @ 13 NONAME ; class TPtrC16 CLocalProtocol::RootFolder(void) + ?TempCopyL@CLocalDocument@@QAEPAV1@XZ @ 14 NONAME ; class CLocalDocument * CLocalDocument::TempCopyL(void) + ?Uri@CXdmNamespace@@QBE?AVTPtrC8@@XZ @ 15 NONAME ; class TPtrC8 CXdmNamespace::Uri(void) const + ?XmlFilePath@CLocalDocument@@QBE?AVTPtrC16@@XZ @ 16 NONAME ; class TPtrC16 CLocalDocument::XmlFilePath(void) const + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/eabi/LocalProtocolU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/eabi/LocalProtocolU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,26 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + _ZN13CXdmNamespace4NewLERK6TDesC8S2_ @ 2 NONAME + _ZN13CXdmNamespaceD0Ev @ 3 NONAME + _ZN13CXdmNamespaceD1Ev @ 4 NONAME + _ZN13CXdmNamespaceD2Ev @ 5 NONAME + _ZN14CLocalDocument10RemoveDataEP18CLocalDocumentNode @ 6 NONAME + _ZN14CLocalDocument11ResetSubsetEv @ 7 NONAME + _ZN14CLocalDocument9TempCopyLEv @ 8 NONAME + _ZN14CLocalProtocol10RootFolderEv @ 9 NONAME + _ZN14CLocalProtocol11FileSessionEv @ 10 NONAME + _ZN18CLocalDocumentNode12AppendLocalLEP16CXdmDocumentNode @ 11 NONAME + _ZN18CLocalDocumentNode12RemoveLocalLEP16CXdmDocumentNode @ 12 NONAME + _ZN18CLocalDocumentNode13ReplaceLocalLEP16CXdmDocumentNodeS1_ @ 13 NONAME + _ZN18CLocalDocumentNodeD0Ev @ 14 NONAME + _ZN18CLocalDocumentNodeD1Ev @ 15 NONAME + _ZN18CLocalDocumentNodeD2Ev @ 16 NONAME + _ZNK13CXdmNamespace3UriEv @ 17 NONAME + _ZNK13CXdmNamespace6PrefixEv @ 18 NONAME + _ZNK14CLocalDocument11XmlFilePathEv @ 19 NONAME + _ZNK14CLocalDocument8IsSubsetEv @ 20 NONAME + _ZTI14CLocalDocument @ 21 NONAME ; ## + _ZTI14CLocalProtocol @ 22 NONAME ; ## + _ZTV14CLocalDocument @ 23 NONAME ; ## + _ZTV14CLocalProtocol @ 24 NONAME ; ## + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/group/LocalProtocol.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/group/LocalProtocol.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,74 @@ +/* +* Copyright (c) 2005 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: LocalProtocol.mmp +* +*/ + + + +#include + +TARGET localprotocol.dll +UID 0x10009D8D 0x10207458 +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT +TARGETTYPE PLUGIN + +SOURCEPATH ../src + +START RESOURCE 10207458.rss + +TARGET localprotocol.rsc + +END + +SOURCE LocalProtocol.cpp +SOURCE LocalDocument.cpp +SOURCE LocalDirectory.cpp +SOURCE LocalDocumentNode.cpp +SOURCE LocalNodeAttribute.cpp +SOURCE LocalDirectoryEntry.cpp + +//Sources common to all protocols +SOURCEPATH ../../src +SOURCE XdmNamespace.cpp + +USERINCLUDE ../inc +USERINCLUDE ../../inc +USERINCLUDE ../../XdmXmlParser/inc + + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/xml +SYSTEMINCLUDE /epoc32/include/ecom +SYSTEMINCLUDE ../../../inc + +LIBRARY hal.lib +LIBRARY ecom.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +LIBRARY flogger.lib +LIBRARY charconv.lib +LIBRARY xdmengine.lib +LIBRARY xdmxmlparser.lib + +#if defined( ARMCC ) +DEFFILE ../eabi/ +#elif defined ( WINSCW ) +deffile ../bwinscw/ +#elif defined (WINS ) +deffile ../bwins/ +#endif + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: LocalProtocol bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- +LocalProtocol.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/inc/LocalDirectory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/inc/LocalDirectory.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,172 @@ +/* +* Copyright (c) 2005 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: CLocalDirectory +* +*/ + + + + +#ifndef __LOCALDIRECTORY__ +#define __LOCALDIRECTORY__ + +#include +#include "XdmDirectory.h" + +//CONSTANTS + +//FORWARD DECLARATIONS +class CXdmDocument; +class CLocalProtocol; +class CLocalDirectoryEntry; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalDirectory ) : public CXdmDirectory + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalDirectory* NewL( const TDesC& aFilePath, + CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + //void CancelUpdate(); + + /** + * Destructor. + */ + virtual ~CLocalDirectory(); + + private: //From CXdmDirectory + + /** + * Start updating the contents of this directory model + * @param TRequestStatus& Request status of the client + * @param TDirUpdatePhase Phase of the update + * @return void + */ + void StartUpdateL(); + + /** + * Cancel a directory update + * @return void + */ + void CancelUpdate(); + + /** + * Save the client's request status and update status + * @param TDirUpdatePhase The update phase + * @param TRequestStatus The client's request status + * @return void + */ + void SaveRequestData( TDirUpdatePhase aUpdatePhase, + TRequestStatus& aClientStatus ); + + /** + * Return the root element of this document + */ + TInt DocumentCount(); + + /** + * Return the root element of this document + */ + TPtrC Document( TInt aIndex ) const; + + /** + * Returns the path to this directory + * + * @return TPtrC8 The path to the directory this object models + */ + TPtrC DirectoryPath() const; + + /** + * Returns the path to this directory + * + * @return TPtrC8 The path to the directory this object models + */ + TXdmDocType DocumentTypeL( TInt aIndex ) const; + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalDirectory( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * From CActive. + * @return void + */ + void RunL(); + + /** + * From CActive. + * @return void + */ + void DoCancel(); + + /** + * From CXdmDirectory. + * @return void + */ + void FindTimeStampFilesL( const CDir* aDirectory ); + + /** + * From CXdmDirectory. + * @return void + */ + void MatchWithStampFilesL( const CDir* aDirectory ); + + /** + * From CXdmDirectory. + * @return void + */ + TInt OfferEntryL( const TDesC& aEntryName ); + + /** + * From CXdmDirectory. + * @return void + */ + void RefreshEntryArrayL(); + + private: //Data + + TRequestStatus* iClientStatus; + TDirUpdatePhase iUpdatePhase; + CLocalProtocol& iLocalProtocol; + RPointerArray iEntryArray; + }; + +#endif //__LOCALDIRECTORY__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/inc/LocalDirectoryEntry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/inc/LocalDirectoryEntry.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,81 @@ +/* +* Copyright (c) 2005 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: CLocalDirectoryEntry +* +*/ + + + + +#ifndef __LOCALDIRECTORYENTRY__ +#define __LOCALDIRECTORYENTRY__ + +#include + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalDirectoryEntry ) : public CBase + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalDirectoryEntry* NewL( const TDesC& aFileName ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TPtrC EntryName() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TBool OfferEntryL( const TDesC& aEntryName ); + + /** + * Destructor. + */ + virtual ~CLocalDirectoryEntry(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalDirectoryEntry(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL( const TDesC& aFilePath ); + + private: //Data + + HBufC* iXmlEntryName; + HBufC* iTimeStampEntryName; + }; + +#endif //__LOCALDIRECTORYENTRY__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/inc/LocalDocument.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/inc/LocalDocument.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,336 @@ +/* +* Copyright (c) 2005 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: CLocalDocument +* +*/ + + + + +#ifndef __LOCALDOCUMENT__ +#define __LOCALDOCUMENT__ + +#include +#include "XdmDocument.h" + +_LIT( KTimeStampFileExt, ".tmsp"); +_LIT( KDateFormat, "%1-%2-%3"); +_LIT( KTimeFormat, "%H:%T:%S"); +const TInt KDateTimeMaxSize = 200; +const TInt KDateBufferMaxSize = 50; + +//FORWARD DECLARATIONS +class CXdmNamespace; +class MXdmOperation; +class CLocalProtocol; +class CLocalDocumentNode; +class CXdmOperationFactory; + +//CLASS DECLARATION +class CLocalDocument : public CXdmDocument + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalDocument* NewL( CXdmEngine& aXdmEngine, + const TDesC& aDocumentName, + CLocalProtocol& aLocalProtocol ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + //static CLocalDocument* NewL( const TDesC8& aDocumentName ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void StartInternalL( TRequestStatus& aStatus ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void CancelUpdate(); + + /** + * Destructor. + */ + virtual ~CLocalDocument(); + + public: //Exported methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C CLocalDocument* TempCopyL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C TPtrC XmlFilePath() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C TBool IsSubset() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C virtual void ResetSubset(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C void RemoveData( CLocalDocumentNode* aDocumentNode ); + + public: //From CXdmDocument + + /** + * Return the root element of this document + * + * @return CXdmDocumentNode The root element of the document + * + * NOTE: The returning node may or may not contain any data, + * since, in the case that this document model does not + * have content yet, the element is a simple "entry point" + * to the whole document. Thus, for instance, if the client + * application requests the Xdm Engine to fetch a particular + * document, the root element points to nothing until the + * request has been completed. + * + */ + CXdmDocumentNode* DocumentRoot() const; + + private: //From CXdmDocument + + /** + * Construct an "anonymous" entry point for this document. + * This node effectively becomes the root of this document. + * + */ + CXdmDocumentNode* CreateRootL(); + + /* + * Reset the contents of this document model. + */ + void ResetContents(); + + /** + * Return the time stamp for this document + * + * @return TTime + */ + TTime TimeStamp() const; + + /** + * Return an error document for a failed update + * + * NOTE: Error document is not supported in this + * protocol. The returning pointer will be NULL. + * + * @return CXdmDocument* The error document + */ + CXdmDocumentNode* ErrorRoot(); + + /** + * Append an element to the path identifying the + * the current document subset + * @return void + */ + void AppendPathPartL( const TDesC& aString ); + + /** + * Return the current document subset (including descendants) + * @return void + */ + CXdmDocumentNode* CurrentExtent() const; + + /** + * Construct an "anonymous" entry point for this document. + * This node effectively becomes the root of this document. + */ + TXdmDocType DocumentType() const; + + private: //From MXdmNamespaceContainer + + /** + * Return the number of namespace declarations + * @return TInt Namespace declaration count + */ + TInt Count() const; + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void AppendNamespaceL( const TDesC8& aUri, const TDesC8& aPrefix ); + + /** + * Remove a namespace from the document + * @param TDesC8& URI of the namespace + * @param TDesC8& Prefix of the namespace + */ + void RemoveNamespace( const TDesC8& aUri ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + TPtrC8 Uri( const TDesC8& aPrefix ) const; + + /** + * Fetch the aIndex-th URI + * @param TInt The index of the desired URI string + * @return TPtrC URI string + */ + TPtrC8 Uri( TInt aIndex ) const; + + /** + * Fetch the aIndex-th prefix + * @param TDesC8 The index of the desired prefix string + * @return TPtrC Prefix string + */ + TPtrC8 Prefix( TInt aIndex ) const; + + /** + * Resets namespaces from the document + */ + void ResetNamespaces( ); + + private: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalDocument( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ); + + /** + * From CActive. + * @return void + */ + void RunL(); + + /** + * From CActive. + * @return void + */ + void DoCancel(); + + /** + * From CActive. + * @return void + */ + void FinaliseOperation( TInt aIndex ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void StartUpdateL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void SaveClientStatus( TRequestStatus& aStatus ); + + /** + * _DEBUG + */ + void DumpResponseBodyL( const TDesC8& aResponseBody ) const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL( const TDesC8& aDocumentName ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void FetchTimeStampL(); + + private: //Data + + enum TLocalOperation + { + EFetch = 0, + EReplace, + EInsert, + EFetchPartial, + EInsertPartial, + EReplacePartial, + }; + + enum TLocalDocumentState + { + EXdmDocIdle = 0, + EXdmDocUpdating, + EResolvingAsyncConflict, + }; + + TInt iDataLength; + TInt iUpdateIndex; + TInt iOperationCount; + TInt iOperationError; + TTime iLastAccess; + TTime iLastModification; + TBool iWholeDoc; + HBufC* iFullPath; + HBufC* iDocSubsetPath; + TLocalOperation iOperationType; + CLocalProtocol& iLocalProtocol; + CLocalDocumentNode* iDocumentRoot; + TLocalDocumentState iDocumentState; + RPointerArray iNamespaces; + }; + +#endif //__XCAPDOCUMENT__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/inc/LocalDocumentNode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/inc/LocalDocumentNode.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,242 @@ +/* +* Copyright (c) 2005 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: CLocalDocumentNode +* +*/ + + + + +#ifndef __LOCALDOCUMENTNODE__ +#define __LOCALDOCUMENTNODE__ + +#include "XdmNodeFactory.h" +#include "XdmDocumentNode.h" + +class CLocalProtocol; +class CXdmNodeAttribute; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalDocumentNode ) : public CXdmDocumentNode, + public MXdmNodeFactory + { + public: // Constructors and destructor + + /** + * Destructor. + */ + IMPORT_C virtual ~CLocalDocumentNode(); + + public: // New functions + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + static CLocalDocumentNode* NewL( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ); + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + static CLocalDocumentNode* NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CLocalProtocol& aLocalProtocol ); + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + static CLocalDocumentNode* NewL( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol, + const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ); + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @param CXdmDocumentNode* The parent of the new node + * @return CXdmDocumentNode* + */ + static CLocalDocumentNode* NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * Two-phased constructor. + * + * @param TBool Leaf node indicator + * @param TDesC8& Name of the new element + * @param CXdmDocumentNode* The parent of the new node + * @return CXdmDocumentNode* + */ + static CLocalDocumentNode* NewL( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * Two-phased constructor. + * + * @param TBool Leaf node indicator + * @param TDesC8& Name of the new element + * @param CXdmDocumentNode* The parent of the new node + * @return CXdmDocumentNode* + */ + static CLocalDocumentNode* NewL( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * Set the next node in the list + * @param The next node in the list + * @return void + */ + void SetParentNode( CLocalDocumentNode*& aParentNode ); + + public: + + /** + * Set the next node in the list + * @param The next node in the list + * @return void + */ + IMPORT_C void RemoveLocalL( CXdmDocumentNode* aChileNode ); + + /** + * Set the next node in the list + * @param The next node in the list + * @return void + */ + IMPORT_C void AppendLocalL( CXdmDocumentNode* aChileNode ); + + /** + * Set the next node in the list + * @param The next node in the list + * @return void + */ + IMPORT_C void ReplaceLocalL( CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aTargetNode ); + + private: + + /** + * C++ constructor, private version. + */ + CLocalDocumentNode( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ); + + /** + * C++ constructor, protected version. + * + * @param CXdmDocumentNode* The parent node of this element + */ + CLocalDocumentNode( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * C++ constructor, another private version. + */ + CLocalDocumentNode( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * By default Symbian OS constructor is private. + * + * @param TDesC8& Name of this node + * @return void + */ + virtual void CopyConstructL( const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ); + + private: //From MXdmNodeFactory + + /** + * Create a new child element + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + CXdmDocumentNode* ChileNodeL(); + + /** + * Create a new child element + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + CXdmDocumentNode* ChileNodeL( const TDesC& aChildName ); + + /** + * Create a new child element + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + CXdmDocumentNode* ChileNodeL( const CXdmDocumentNode* aAnotherNode ); + + /** + * Create a new attribute + * + * @param TDesC8& Name of the new attribute + * @return CXdmNodeAttribute* + */ + CXdmNodeAttribute* AttributeL(); + + /** + * Create a new attribute + * + * @param TDesC8& Name of the new attribute + * @return CXdmNodeAttribute* + */ + CXdmNodeAttribute* AttributeL( const TDesC& aAttributeName ); + + private: //From MXdmNodeInterface + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + TPtrC8 Prefix() const; + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void SetPrefixL( const TDesC8& aNamespacePrefix ); + + private: + + HBufC8* iPrefix; + CLocalProtocol& iLocalProtocol; + CLocalDocumentNode* iNextNode; + }; + +#endif //__LOCALDOCUMENTNODE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/inc/LocalNodeAttribute.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/inc/LocalNodeAttribute.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,130 @@ +/* +* Copyright (c) 2005 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: CLocalNodeAttribute +* +*/ + + + + +#ifndef __LOCALNODEATTRIBUTE__ +#define __LOCALNODEATTRIBUTE__ + +#include "XdmNodeAttribute.h" + +class CLocalProtocol; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CLocalNodeAttribute ) : public CXdmNodeAttribute + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of this attribute + * @param CXdmDocumentNode* Parent of this attribute + * + * NOTE! "Parent", in this case, denotes the + * element this attribute attributes. + * + * @return CXdmNodeAttribute* + */ + static CLocalNodeAttribute* NewL( CXdmEngine& aXdmEngine, + const TDesC& aAttributeName, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * Two-phased constructor. + * + * @param CXdmDocumentNode* Parent of this attribute + * + * NOTE! "Parent", in this case, denotes the + * element this attribute attributes. + * + * @return CXdmNodeAttribute* + */ + static CLocalNodeAttribute* NewL( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * Destructor. + */ + virtual ~CLocalNodeAttribute(); + + public: // New functions + + + + private: + + /** + * C++ constructor, private version. + */ + CLocalNodeAttribute( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ); + + /** + * C++ constructor, protected version. + * + * @param CXdmDocumentNode* The parent node of this element + */ + CLocalNodeAttribute( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ); + + /** + * By default Symbian OS constructor is private. + * + * @param TDesC8& Name of this node + * @return void + */ + void ConstructL( const TDesC& aNodeName ); + + /** + * C++ constructor, another private version. + */ + CLocalNodeAttribute( const TBool aLeafNode, + CXdmDocumentNode* aParentNode ); + + private: //From MXdmNodeInterface + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + TPtrC8 Prefix() const; + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void SetPrefixL( const TDesC& aNamespacePrefix ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void SetPrefixL( const TDesC8& aNamespacePrefix ); + + private: + + CLocalProtocol& iLocalProtocol; + }; + +#endif //__LOCALNODEATTRIBUTE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/inc/LocalProtocol.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/inc/LocalProtocol.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2005 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: CLocalProtocol +* +*/ + + + + +#ifndef __LOCALPROTOCOL__ +#define __LOCALPROTOCOL__ + +#include +#include "XdmEngine.h" +#include "XdmProtocol.h" +#include "XdmShutdownSwitch.h" + +//CONSTANTS +_LIT( KLocalEngLogFile, "LocalProtocol" ); +_LIT( KLocalEngPrivateRoot, "C:\\private\\" ); +const TInt KLocalEngLogBufferMaxSize = 2000; + +//FORWARD DECLARATIONS +class CXdmXmlParser; +class CXdmLogWriter; +class CXdmOperationFactory; + +//CLASS DECLARATION +class CLocalProtocol : public CXdmProtocol + { + + public: + + /** + * Fetch the capabilities for this protocol. May require + * network operations. + */ + IMPORT_C static RFs& FileSession(); + + + /** + * A Global logging function + * @param TRefByValue aFmt,... + * @return void + */ + IMPORT_C static TPtrC RootFolder(); + + private: //From CXdmProtocol + + /** + * Initialise the media used to transfer Xdm data + */ + void InitTransferMedium( TInt aIdleTimeout, + TRequestStatus& aStatus ); + + /** + * Cancel initialisation of the transfer media. + */ + void CancelTransferMediumInit(); + + /** + * Is the transfer medium ready + */ + TBool IsTransferAvailable() const; + + /** + * Create a new document node. + */ + CXdmDocumentNode* CreateDocumentNodeL(); + + /** + * Create a new protocol dependent document model + */ + CXdmDocument* CreateDocumentL( const TDesC& aDocumentName, + const TXdmDocType aDocumentType ); + + /** + * Create a new protocol dependent document model + */ + CXdmDirectory* CreateDirectoryL( const TDesC& aDirectoryPath ); + + /** + * Destructor. + */ + virtual ~CLocalProtocol(); + + public: //Static + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CLocalProtocol* NewL( const TXdmProtocolParams& aProtocolInfo ); + + /** + * A Global logging function + * @param TRefByValue aFmt,... + * @return void + */ + RFs& RFSession(); + + /** + * A Global logging function + * @param TRefByValue aFmt,... + * @return void + */ + TPtrC Root(); + + public: + + /** + * A logging function + * @param TRefByValue aFmt,... + * @return void + */ + void WriteToLog( TRefByValue aFmt,... ) const; + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CLocalProtocol( const CXdmEngine& aXdmEngine, + const CXdmProtocolInfo& aProtocolInfo ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void SetRootDirectoryL( const TDesC& aRootPath ); + + private: + + /** + * From MXdmShutdownSwitch + * @return void + */ + //void SwitchOff(); + + private: //Data + + RFs iFileSession; + TBool iTransferMediaOpen; + HBufC* iRootFolder; + CXdmEngine& iXdmEngine; + CXdmLogWriter* iLogWriter; + CXdmXmlParser* iXmlParser; + const CXdmProtocolInfo& iProtocolInfo; + }; + +#endif //__LOCALPROTOCOL__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/10207458.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/src/10207458.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 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: XdmLocalProtocolInfo +* +*/ + + +// 10207458.RSS +// +#include "registryinfo.rh" + +//Declares the interface implementations provided +RESOURCE REGISTRY_INFO XdmLocalProtocolInfo + { + dll_uid = 0x10207458; + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10207422; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x10207424; + version_no = 1; + display_name = "XDM Engine Local Protocol||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + } + }; + } + }; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/LocalDirectory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/src/LocalDirectory.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,308 @@ +/* +* Copyright (c) 2005 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: CLocalDirectory +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalDirectory.h" +#include "XdmDocumentNode.h" +#include "XdmNodeAttribute.h" +#include "LocalDirectoryEntry.h" + + +// ---------------------------------------------------------- +// CLocalDirectory::CLocalDirectory +// +// ---------------------------------------------------------- +// +CLocalDirectory::CLocalDirectory( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ) : + CXdmDirectory( aXdmEngine ), + iLocalProtocol( aLocalProtocol ) + { + } + +// ---------------------------------------------------------- +// CLocalDirectory::NewL +// +// ---------------------------------------------------------- +// +CLocalDirectory* CLocalDirectory::NewL( const TDesC& aFilePath, + CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ) + { + CLocalDirectory* self = new ( ELeave ) CLocalDirectory( aXdmEngine, aLocalProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( aFilePath ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------- +// CLocalDirectory::~CLocalDirectory +// +// ---------------------------------------------------- +// +CLocalDirectory::~CLocalDirectory() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::~CLocalDirectory()" ) ); + #endif + Cancel(); + iEntryArray.ResetAndDestroy(); + iEntryArray.Close(); + } + +// ---------------------------------------------------------- +// CLocalDirectory::ConstructL +// +// ---------------------------------------------------------- +// +void CLocalDirectory::ConstructL() + { + RefreshEntryArrayL(); + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------------- +// CLocalDirectory::RefreshEntryArrayL +// +// ---------------------------------------------------------- +// +void CLocalDirectory::RefreshEntryArrayL() + { + CDir* directory = NULL; + iEntryArray.ResetAndDestroy(); + TPtrC path = iDirectoryPath->Des(); + RFs& session = CLocalProtocol::FileSession(); + User::LeaveIfError( session.GetDir( path, KEntryAttNormal, ESortByExt, directory ) ); + CleanupStack::PushL( directory ); + TInt count = directory->Count(); + FindTimeStampFilesL( directory ); + MatchWithStampFilesL( directory ); + CleanupStack::PopAndDestroy(); //directory + } + +// ---------------------------------------------------------- +// CLocalDirectory::FindTimeStampFilesL +// +// ---------------------------------------------------------- +// +void CLocalDirectory::FindTimeStampFilesL( const CDir* aDirectory ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::FindTimeStampFilesL()" ) ); + #endif + TBool ready = EFalse; + TInt count = aDirectory->Count(); + for( TInt i = 0;!ready && i < count;i++ ) + { + TPtrC name = ( *aDirectory )[i].iName; + TInt index = name.Find( KTimeStampFileExt ); + if( index > 0 ) + { + TInt stampIndex = i; + CLocalDirectoryEntry* entry = NULL; + while( !ready ) + { + entry = CLocalDirectoryEntry::NewL( name ); + CleanupStack::PushL( entry ); + User::LeaveIfError( iEntryArray.Append( entry ) ); + CleanupStack::Pop(); //entry + stampIndex++; + if( stampIndex < count ) + { + name.Set( ( *aDirectory )[stampIndex].iName ); + index = name.Find( KTimeStampFileExt ); + if( index <= 0 ) + ready = ETrue; + } + else ready = ETrue; + } + } + } + } + +// ---------------------------------------------------------- +// CLocalDirectory::MatchWithStampFilesL +// +// ---------------------------------------------------------- +// +void CLocalDirectory::MatchWithStampFilesL( const CDir* aDirectory ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::MatchWithStampFilesL()" ) ); + #endif + TInt count = aDirectory->Count(); + for( TInt i = 0;i < count;i++ ) + { + TPtrC name = ( *aDirectory )[i].iName; + TInt index = name.Find( KTimeStampFileExt ); + if( index > 0 ) + continue; + else + { + TBool ready = EFalse; + TInt count = iEntryArray.Count(); + for( TInt i = 0;!ready && i < count;i++ ) + ready = iEntryArray[i]->OfferEntryL( name ); + } + } + } + +// ---------------------------------------------------------- +// CLocalDirectory::DocumentCount +// +// ---------------------------------------------------------- +// +TInt CLocalDirectory::DocumentCount() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::DocumentCount()" ) ); + #endif + RefreshEntryArrayL(); + return iEntryArray.Count(); + } + +// ---------------------------------------------------- +// CLocalDocument::DocumentTypeL +// +// ---------------------------------------------------- +// +TXdmDocType CLocalDirectory::DocumentTypeL( TInt /*aIndex*/ ) const + { + return EXdmDocGeneral; + } + +// ---------------------------------------------------------- +// CLocalDirectory::Document +// +// ---------------------------------------------------------- +// +TPtrC CLocalDirectory::Document( TInt aIndex ) const + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::Document()" ) ); + #endif + return aIndex < 0 || aIndex > iEntryArray.Count() ? TPtrC() : + iEntryArray[aIndex]->EntryName(); + } + +// ---------------------------------------------------------- +// CLocalDirectory::ConstructL +// +// ---------------------------------------------------------- +// +TPtrC CLocalDirectory::DirectoryPath() const + { + return iDirectoryPath != NULL ? iDirectoryPath->Des() : TPtrC(); + } + +// ---------------------------------------------------------- +// CXcapDirectory::SaveRequestData +// +// ---------------------------------------------------------- +// +void CLocalDirectory::SaveRequestData( TDirUpdatePhase aUpdatePhase, + TRequestStatus& aClientStatus ) + { + iUpdatePhase = aUpdatePhase; + iClientStatus = &aClientStatus; + } + +// ---------------------------------------------------------- +// CLocalDirectory::StartUpdateL +// +// ---------------------------------------------------------- +// +void CLocalDirectory::StartUpdateL() + + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::StartUpdateL()" ) ); + #endif + switch( iUpdatePhase ) + { + case EUpdateDocumentList: + RefreshEntryArrayL(); + User::RequestComplete( iClientStatus, KErrNone ); + break; + case ERefreshDocuments: + User::RequestComplete( iClientStatus, KErrNone ); + default: + break; + } + } + +// --------------------------------------------------------- +// CLocalDirectory::RunL() +// +// --------------------------------------------------------- +// +void CLocalDirectory::RunL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::RunL() - Request: %d" ), iStatus.Int() ); + #endif + } + +// ---------------------------------------------------- +// CLocalDirectory::CancelUpdate +// +// ---------------------------------------------------- +// +void CLocalDirectory::CancelUpdate() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::CancelUpdate()" ) ); + #endif + Cancel(); + } + +// --------------------------------------------------------- +// CLocalDirectory::DoCancel +// +// --------------------------------------------------------- +// +void CLocalDirectory::DoCancel() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDirectory::DoCancel()" ) ); + #endif + switch( iUpdatePhase ) + { + case EDirPhaseIdle: + break; + case EUpdateDocumentList: + break; + case ERefreshDocuments: + break; + default: + break; + } + User::RequestComplete( iClientStatus, KErrCancel ); + } + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/LocalDirectoryEntry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/src/LocalDirectoryEntry.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2005 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: CLocalDirectoryEntry +* +*/ + + + + +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalDirectoryEntry.h" + +// ---------------------------------------------------- +// CLocalDirectoryEntry::CLocalDirectoryEntry +// +// ---------------------------------------------------- +// +CLocalDirectoryEntry::CLocalDirectoryEntry() + { + } + +// ---------------------------------------------------- +// CLocalDirectoryEntry::CLocalDirectoryEntry +// +// ---------------------------------------------------- +// +CLocalDirectoryEntry* CLocalDirectoryEntry::NewL( const TDesC& aFileName ) + { + CLocalDirectoryEntry* self = new ( ELeave ) CLocalDirectoryEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aFileName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------- +// CLocalDirectoryEntry::ConstructL +// +// ---------------------------------------------------- +// +void CLocalDirectoryEntry::ConstructL( const TDesC& aFileName ) + { + TChar comma = 46; + TInt index = aFileName.LocateReverse( comma ); + TPtrC temp = aFileName.Left( index ); + iTimeStampEntryName = HBufC::NewL( temp.Length() ); + iTimeStampEntryName->Des().Copy( temp ); + } + +// ---------------------------------------------------- +// CLocalDirectoryEntry::EntryName +// +// ---------------------------------------------------- +// +TPtrC CLocalDirectoryEntry::EntryName() const + { + return iXmlEntryName != NULL ? iXmlEntryName->Des() : TPtrC(); + } + +// ---------------------------------------------------- +// CLocalDirectoryEntry::CLocalDirectoryEntry +// +// ---------------------------------------------------- +// +TBool CLocalDirectoryEntry::OfferEntryL( const TDesC& aEntryName ) + { + TChar comma = 46; + TInt index = aEntryName.LocateReverse( comma ); + TPtrC name( index > 0 ? aEntryName.Left( index ) : aEntryName ); + if( iTimeStampEntryName->Des().Compare( name ) == 0 ) + { + iXmlEntryName = HBufC::NewL( aEntryName.Length() ); + iXmlEntryName->Des().Copy( aEntryName ); + return ETrue; + } + else return EFalse; + } + +// ---------------------------------------------------- +// CLocalDirectoryEntry::CLocalDirectoryEntry +// +// ---------------------------------------------------- +// +CLocalDirectoryEntry::~CLocalDirectoryEntry() + { + delete iXmlEntryName; + delete iTimeStampEntryName; + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/LocalDocument.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/src/LocalDocument.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,525 @@ +/* +* Copyright (c) 2005 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: CLocalDocument +* +*/ + + + + +// INCLUDE FILES +#include +#include "XdmProtocol.h" +#include "XdmNamespace.h" +#include "XdmOperation.h" +#include "XdmXmlParser.h" +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalDocumentNode.h" +#include "XdmOperationFactory.h" + +// ---------------------------------------------------- +// CLocalDocument::CLocalDocument +// +// ---------------------------------------------------- +// +CLocalDocument::CLocalDocument( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ) : + CXdmDocument( aXdmEngine ), + iLocalProtocol( aLocalProtocol ) + { + } + + +// ---------------------------------------------------------- +// CLocalDocument::NewL +// +// ---------------------------------------------------------- +// +CLocalDocument* CLocalDocument::NewL( CXdmEngine& aXdmEngine, + const TDesC& aDocumentName, + CLocalProtocol& aLocalProtocol ) + { + CLocalDocument* self = new ( ELeave ) CLocalDocument( aXdmEngine, aLocalProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( KLocalOperationFactory, aDocumentName ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CLocalDocument::ConstructL +// +// ---------------------------------------------------------- +// +void CLocalDocument::ConstructL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::ConstructL()" ) ); + #endif + TPtrC name = iDocumentName->Des(); + TPtrC root = iLocalProtocol.RootFolder(); + iFullPath = HBufC::NewL( name.Length() + root.Length() ); + iFullPath->Des().Copy( root ); + iFullPath->Des().Append( name ); + FetchTimeStampL(); + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------------- +// CLocalDocument::ResetContents +// +// ---------------------------------------------------------- +// +void CLocalDocument::ResetContents() + { + delete iDocumentRoot; + iDocumentRoot = NULL; + iNamespaces.ResetAndDestroy(); + } + +// ---------------------------------------------------------- +// CLocalDocument::FetchTimeStampL +// +// ---------------------------------------------------------- +// +void CLocalDocument::FetchTimeStampL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::FetchTimeStampL()" ) ); + #endif + RFile timeStamp; + TBuf8 buf; + TBuf buf16; + const TChar idSeparator = 46; + TPtrC fullPath( iFullPath->Des() ); + HBufC* path = HBufC::NewLC( fullPath.Length() + KTimeStampFileExt().Length() ); + TInt index = fullPath.LocateReverse( idSeparator ); + TPtrC tmspName( index > 0 ? fullPath.Left( index ) : fullPath ); + path->Des().Copy( tmspName ); + path->Des().Append( KTimeStampFileExt ); + TInt error = timeStamp.Open( CLocalProtocol::FileSession(), path->Des(), EFileRead ); + if( error == KErrNone ) + { + CleanupClosePushL( timeStamp ); + User::LeaveIfError( timeStamp.Read( buf ) ); + buf16.Copy( buf ); + buf.Zero(); + User::LeaveIfError( iLastModification.Parse( buf16 ) ); + CleanupStack::PopAndDestroy(); //timeStamp + } + CleanupStack::PopAndDestroy(); //path + } +// ---------------------------------------------------- +// CLocalDocument::~CLocalDocument +// +// ---------------------------------------------------- +// +CLocalDocument::~CLocalDocument() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::~CLocalDocument()" ) ); + #endif + Cancel(); + delete iFullPath; + delete iDocumentRoot; + iNamespaces.ResetAndDestroy(); + } + +// ---------------------------------------------------- +// CLocalDocument::CreateRootL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalDocument::CreateRootL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::DocumentSubsetL()" ) ); + #endif + iDocumentRoot = CLocalDocumentNode::NewL( iXdmEngine, iLocalProtocol ); + return iDocumentRoot; + } + +// ---------------------------------------------------- +// CLocalDocument::TempCopyL +// +// ---------------------------------------------------- +// +EXPORT_C CLocalDocument* CLocalDocument::TempCopyL() + { + return CLocalDocument::NewL( iXdmEngine, Name(), iLocalProtocol ); + } + +// ---------------------------------------------------- +// CLocalDocument::DocumentRoot +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalDocument::DocumentRoot() const + { + return iDocumentRoot; + } + +// ---------------------------------------------------- +// CLocalDocument::ErrorRoot +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalDocument::ErrorRoot() + { + return NULL; + } + +// ---------------------------------------------------- +// CLocalDocument::ErrorRoot +// +// ---------------------------------------------------- +// +TXdmDocType CLocalDocument::DocumentType() const + { + return EXdmDocGeneral; + } + +// ---------------------------------------------------- +// CLocalDocument::IsSubset +// +// ---------------------------------------------------- +// +EXPORT_C TBool CLocalDocument::IsSubset() const + { + return iDocSubset; + } + +// ---------------------------------------------------- +// CLocalDocument::ResetSubset +// +// ---------------------------------------------------- +// +EXPORT_C void CLocalDocument::ResetSubset() + { + CXdmDocument::ResetSubset(); + delete iDocumentRoot; + iDocumentRoot = NULL; + } + +// ---------------------------------------------------- +// CLocalDocument::XmlFilePath +// +// ------------------------------ ---------------------- +// +EXPORT_C TPtrC CLocalDocument::XmlFilePath() const + { + return iFullPath != NULL ? iFullPath->Des() : TPtrC(); + } + +// ---------------------------------------------------- +// CLocalDocument::RemoveData +// +// ---------------------------------------------------- +// +EXPORT_C void CLocalDocument::RemoveData( CLocalDocumentNode* /*aDocumentNode*/ ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::RemoveData()" ) ); + #endif + + } + +// ---------------------------------------------------- +// CLocalDocument::StartUpdateL +// +// ---------------------------------------------------- +// +void CLocalDocument::StartUpdateL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::StartUpdateL()" ) ); + #endif + TBool keepGoing = ETrue; + TInt completion = KErrNone; + TInt count = iChangeRequests.Count(); + for( TInt i = 0;keepGoing && i < count;i++ ) + { + //"First in, first served" + TRAPD( error, iChangeRequests[0]->ExecuteL() ); + if( error == KErrNone ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( " Execution of the operation no. %d was successful" ), i ); + #endif + } + else + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( " Execution of the operation no. %d failed with %d" ), i, error ); + #endif + completion = error; + keepGoing = EFalse; + } + FinaliseOperation( 0 ); + } + User::RequestComplete( iClientStatus, completion ); + } + +// ---------------------------------------------------- +// CLocalProtocol::AppendPathPartL +// +// ---------------------------------------------------- +// +void CLocalDocument::AppendPathPartL( const TDesC& aString ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::PathPartL()" ) ); + #endif + if( iDocumentRoot != NULL ) + { + CXdmDocumentNode* node = NULL; + CXdmDocumentNode* parent = iDocumentRoot; + while( parent->NextNode() != NULL ) + parent = parent->NextNode(); + node = CLocalDocumentNode::NewL( iXdmEngine, aString, parent, iLocalProtocol ); + parent->SetNextNode( node ); + } + else + iDocumentRoot = CLocalDocumentNode::NewL( iXdmEngine, aString, iLocalProtocol ); + } + +// ---------------------------------------------------- +// CLocalProtocol::CurrentExtent +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalDocument::CurrentExtent() const + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::CurrentExtent()" ) ); + #endif + CXdmDocumentNode* ret = NULL; + if( iDocumentRoot != NULL ) + { + CXdmDocumentNode* node = iDocumentRoot; + while( node->NextNode() != NULL ) + node = node->NextNode(); + ret = node; + } + else + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( " This document does not yet have a root, leave with KErrGeneral" ) ); + #endif + User::Leave( KErrGeneral ); + } + return ret; + } + +// ---------------------------------------------------- +// CLocalDocument::StartUpdateL +// +// ---------------------------------------------------- +// +void CLocalDocument::StartInternalL( TRequestStatus& aStatus ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::StartInternalL()" ) ); + #endif + aStatus = KRequestPending; + iClientStatus = &aStatus; + StartUpdateL(); + } + +// ---------------------------------------------------- +// CLocalDocument::CancelUpdate +// +// ---------------------------------------------------- +// +void CLocalDocument::CancelUpdate() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::CancelUpdate()" ) ); + #endif + User::RequestComplete( iClientStatus, KErrCancel ); + } + +// --------------------------------------------------------- +// CLocalDocument::RunL() +// +// --------------------------------------------------------- +// +void CLocalDocument::RunL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::RunL()" ) ); + #endif + } + +// ---------------------------------------------------- +// CLocalDocument::FinaliseOperation +// +// ---------------------------------------------------- +// +void CLocalDocument::FinaliseOperation( TInt aIndex ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::FinaliseOperation()" ) ); + #endif + TInt count = iChangeRequests.Count(); + if( count > 0 && ( aIndex >= 0 && aIndex < count ) ) + { + MXdmOperation* operation = NULL; + operation = iChangeRequests[aIndex]; + iChangeRequests.Remove( aIndex ); + operation->Destroy(); + operation = NULL; + } + } + +// --------------------------------------------------------- +// CLocalDocument::AppendNamespaceL +// +// --------------------------------------------------------- +// +void CLocalDocument::AppendNamespaceL( const TDesC8& aUri, const TDesC8& aPrefix ) + { + CXdmNamespace* ns = CXdmNamespace::NewL( aUri, aPrefix ); + CleanupStack::PushL( ns ); + User::LeaveIfError( iNamespaces.Append( ns ) ); + CleanupStack::Pop(); //ns + } + +// --------------------------------------------------------- +// CXcapDocument::RemoveNamespace +// +// --------------------------------------------------------- +// +void CLocalDocument::RemoveNamespace( const TDesC8& aUri ) + { + TBool found = EFalse; + CXdmNamespace* ns = NULL; + TInt count = iNamespaces.Count(); + for( TInt i = 0;!found && i < count;i++ ) + { + ns = iNamespaces[i]; + if( ns->Uri().Compare( aUri ) == 0 ) + { + found = ETrue; + iNamespaces.Remove( i ); + delete ns; + ns = NULL; + } + } + } + +// --------------------------------------------------------- +// CLocalDocument::Uri +// +// --------------------------------------------------------- +// +TPtrC8 CLocalDocument::Uri( const TDesC8& aPrefix ) const + { + TPtrC8 uri( _L8( "" ) ); + TBool found = EFalse; + TInt count = iNamespaces.Count(); + for( TInt i = 0;i < count && !found;i++ ) + { + if( iNamespaces[i]->Prefix().Compare( aPrefix ) == 0 ) + { + uri.Set( iNamespaces[i]->Uri() ); + found = ETrue; + } + } + return uri; + } + +// --------------------------------------------------------- +// CLocalDocument::Count +// +// --------------------------------------------------------- +// +TInt CLocalDocument::Count() const + { + return iNamespaces.Count(); + } + +// --------------------------------------------------------- +// CLocalDocument::Prefix +// +// --------------------------------------------------------- +// +TPtrC8 CLocalDocument::Prefix( TInt aIndex ) const + { + TInt count = iNamespaces.Count(); + if( count > 0 && ( aIndex >= 0 && aIndex < count ) ) + return iNamespaces[aIndex]->Prefix(); + else return TPtrC8(); + } + +// --------------------------------------------------------- +// CLocalDocument::Uri +// +// --------------------------------------------------------- +// +TPtrC8 CLocalDocument::Uri( TInt aIndex ) const + { + TInt count = iNamespaces.Count(); + if( count > 0 && ( aIndex >= 0 && aIndex < count ) ) + return iNamespaces[aIndex]->Uri(); + else return TPtrC8(); + } + +// --------------------------------------------------------- +// CLocalDocument::ResetNamespaces +// +// --------------------------------------------------------- +// +void CLocalDocument::ResetNamespaces( ) + { + iNamespaces.ResetAndDestroy(); + } + +// --------------------------------------------------------- +// CLocalDocument::TimeStamp +// +// --------------------------------------------------------- +// +TTime CLocalDocument::TimeStamp() const + { + return iLastModification; + } + +// --------------------------------------------------------- +// CLocalDocument::SaveClientStatus +// +// --------------------------------------------------------- +// +void CLocalDocument::SaveClientStatus( TRequestStatus& aStatus ) + { + iClientStatus = &aStatus; + } + +// --------------------------------------------------------- +// CLocalDocument::DoCancel +// +// --------------------------------------------------------- +// +void CLocalDocument::DoCancel() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocument::DoCancel()" ) ); + #endif + } + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/LocalDocumentNode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/src/LocalDocumentNode.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,331 @@ +/* +* Copyright (c) 2005 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: CLocalDocumentNode +* +*/ + + + + +// INCLUDE FILES +#include "XdmDocument.h" +#include "LocalProtocol.h" +#include "LocalDocumentNode.h" +#include "LocalNodeAttribute.h" + + +// ---------------------------------------------------------- +// CLocalDocumentNode::CLocalDocumentNode +// +// ---------------------------------------------------------- +// +CLocalDocumentNode::CLocalDocumentNode( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ) : + CXdmDocumentNode( aXdmEngine, ( MXdmNodeFactory& )*this ), + iLocalProtocol( aLocalProtocol ) + { + } + + +// ---------------------------------------------------------- +// CLocalDocumentNode::CLocalDocumentNode +// +// ---------------------------------------------------------- +// +CLocalDocumentNode::CLocalDocumentNode( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) : + CXdmDocumentNode( aXdmEngine, + ( MXdmNodeFactory& )*this, aParentNode ), + iLocalProtocol( aLocalProtocol ) + + { + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::CLocalDocumentNode +// +// ---------------------------------------------------------- +// +CLocalDocumentNode::CLocalDocumentNode( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) : + CXdmDocumentNode( aLeafNode, aXdmEngine, + ( MXdmNodeFactory& )*this, aParentNode ), + iLocalProtocol( aLocalProtocol ) + { + + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CLocalDocumentNode* CLocalDocumentNode::NewL( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ) + { + return new ( ELeave ) CLocalDocumentNode( aXdmEngine, aLocalProtocol ); + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CLocalDocumentNode* CLocalDocumentNode::NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CLocalProtocol& aLocalProtocol ) + { + CLocalDocumentNode* self = new ( ELeave ) CLocalDocumentNode( aXdmEngine, aLocalProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( aNodeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CLocalDocumentNode* CLocalDocumentNode::NewL( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol, + const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ) + { + CLocalDocumentNode* self = new ( ELeave ) CLocalDocumentNode( aXdmEngine, aLocalProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( aAnotherNode.NodeName() ); + self->CopyConstructL( aAnotherNode, aParentNode ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CLocalDocumentNode* CLocalDocumentNode::NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) + { + CLocalDocumentNode* self = new ( ELeave ) CLocalDocumentNode( aXdmEngine, aParentNode, + aLocalProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( aNodeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CLocalDocumentNode* CLocalDocumentNode::NewL( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) + { + CLocalDocumentNode* self = new ( ELeave ) CLocalDocumentNode( aLeafNode, aXdmEngine, + aParentNode, aLocalProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( aNodeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CLocalDocumentNode* CLocalDocumentNode::NewL( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) + { + return new ( ELeave ) CLocalDocumentNode( aLeafNode, aXdmEngine, + aParentNode, aLocalProtocol ); + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::CopyConstructL +// +// ---------------------------------------------------------- +// +void CLocalDocumentNode::CopyConstructL( const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ) + { + CXdmDocumentNode::CopyConstructL( aAnotherNode, aParentNode ); + //TODO: Write the protocol specific copy operations + } + +// ---------------------------------------------------- +// CLocalDocumentNode::~CLocalDocumentNode +// +// ---------------------------------------------------- +// +EXPORT_C CLocalDocumentNode::~CLocalDocumentNode() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocumentNode::~CLocalDocumentNode(): %x" ), this ); + #endif + delete iPrefix; + delete iNextNode; + } + +// ---------------------------------------------------- +// CLocalDocumentNode::RemoveLocalL +// +// ---------------------------------------------------- +// +EXPORT_C void CLocalDocumentNode::RemoveLocalL( CXdmDocumentNode* aChileNode ) + { + RemoveChileNodeL( aChileNode ); + } + +// ---------------------------------------------------- +// CLocalDocumentNode::AppendLocalL +// +// ---------------------------------------------------- +// +EXPORT_C void CLocalDocumentNode::AppendLocalL( CXdmDocumentNode* aChileNode ) + { + if( aChileNode->Match( *this ) ) + { + const TInt count = aChileNode->NodeCount(); + for( TInt i = 0;i < count;i++ ) + AppendChileNodeL( aChileNode->ChileNode( i ) ); + } + else AppendChileNodeL( aChileNode ); + } + +// ---------------------------------------------------- +// CLocalDocumentNode::ReplaceLocalL +// +// ---------------------------------------------------- +// +EXPORT_C void CLocalDocumentNode::ReplaceLocalL( CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aTargetNode ) + { + ReplaceChileNodeL( aNewNode, aTargetNode ); + } + +// ---------------------------------------------------- +// CLocalDocumentNode::CreateChileNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalDocumentNode::ChileNodeL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocumentNode::CreateChileNodeL()" ) ); + #endif + return CLocalDocumentNode::NewL( EFalse, iXdmEngine, this, iLocalProtocol ); + } + +// ---------------------------------------------------- +// CLocalDocumentNode::CreateChileNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalDocumentNode::ChileNodeL( const TDesC& aChildName ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocumentNode::CreateChileNodeL() - Name: %S" ), &aChildName ); + #endif + return CLocalDocumentNode::NewL( EFalse, iXdmEngine, aChildName, this, iLocalProtocol ); + } + +// ---------------------------------------------------- +// CLocalDocumentNode::CreateChileNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalDocumentNode::ChileNodeL( const CXdmDocumentNode* aAnotherNode ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocumentNode::ChileNodeL() - Object: %x" ), aAnotherNode ); + #endif + return CLocalDocumentNode::NewL( iXdmEngine, iLocalProtocol, *aAnotherNode, *this ); + } + +// ---------------------------------------------------- +// CLocalDocumentNode::CreateAttributeL +// +// ---------------------------------------------------- +// +CXdmNodeAttribute* CLocalDocumentNode::AttributeL() + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocumentNode::CreateAttributeL()" ) ); + #endif + return CLocalNodeAttribute::NewL( iXdmEngine, this, iLocalProtocol ); + } + +// ---------------------------------------------------- +// CLocalDocumentNode::CreateAttributeL +// +// ---------------------------------------------------- +// +CXdmNodeAttribute* CLocalDocumentNode::AttributeL( const TDesC& aAttributeName ) + { + #ifdef _DEBUG + iLocalProtocol.WriteToLog( _L8( "CLocalDocumentNode::CreateAttributeL() - Name: %S" ), &aAttributeName ); + #endif + return CLocalNodeAttribute::NewL( iXdmEngine, aAttributeName, this, iLocalProtocol ); + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::SetParentNode +// +// ---------------------------------------------------------- +// +void CLocalDocumentNode::SetParentNode( CLocalDocumentNode*& aParentNode ) + { + iParentNode = aParentNode; + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::NamespacePrefix +// +// ---------------------------------------------------------- +// +TPtrC8 CLocalDocumentNode::Prefix() const + { + return iPrefix != NULL ? iPrefix->Des() : TPtrC8(); + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::SetNamespacePrefixL +// +// ---------------------------------------------------------- +// +void CLocalDocumentNode::SetPrefixL( const TDesC8& aPrefix ) + { + delete iPrefix; + iPrefix = NULL; + iPrefix = HBufC8::NewL( aPrefix.Length() ); + iPrefix->Des().Copy( aPrefix ); + } + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/LocalNodeAttribute.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/src/LocalNodeAttribute.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,124 @@ +/* +* Copyright (c) 2005 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: CLocalNodeAttribute +* +*/ + + + + +// INCLUDE FILES +#include "LocalProtocol.h" +#include "LocalNodeAttribute.h" + +// ---------------------------------------------------------- +// CLocalNodeAttribute::CLocalNodeAttribute +// +// ---------------------------------------------------------- +// +CLocalNodeAttribute::CLocalNodeAttribute( CXdmEngine& aXdmEngine, + CLocalProtocol& aLocalProtocol ) : + CXdmNodeAttribute( aXdmEngine, + ( MXdmNodeFactory& )*this ), + iLocalProtocol( aLocalProtocol ) + + { + } + +// ---------------------------------------------------------- +// CLocalNodeAttribute::CLocalNodeAttribute +// +// ---------------------------------------------------------- +// +CLocalNodeAttribute::CLocalNodeAttribute( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) : + CXdmNodeAttribute( aXdmEngine, + ( MXdmNodeFactory& )*this, aParentNode ), + iLocalProtocol( aLocalProtocol ) + + { + } + +// ---------------------------------------------------------- +// CLocalNodeAttribute::CLocalNodeAttribute +// +// ---------------------------------------------------------- +// +CLocalNodeAttribute* CLocalNodeAttribute::NewL( CXdmEngine& aXdmEngine, + const TDesC& aAttributeName, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) + { + CLocalNodeAttribute* self = new ( ELeave ) CLocalNodeAttribute( aXdmEngine, aParentNode,aLocalProtocol ); + CleanupStack::PushL( self ); + self->CXdmNodeAttribute::BaseConstructL( aAttributeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CLocalNodeAttribute::CLocalNodeAttribute +// +// ---------------------------------------------------------- +// +CLocalNodeAttribute* CLocalNodeAttribute::NewL( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode, + CLocalProtocol& aLocalProtocol ) + { + CLocalNodeAttribute* self = new ( ELeave ) CLocalNodeAttribute( aXdmEngine, aParentNode, aLocalProtocol ); + /*CleanupStack::PushL( self ); + self->BaseConstructL(); + CleanupStack::Pop();*/ + return self; + } + +// ---------------------------------------------------------- +// CLocalNodeAttribute::~CLocalNodeAttribute +// +// ---------------------------------------------------------- +// +CLocalNodeAttribute::~CLocalNodeAttribute() + { + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::NamespacePrefix +// +// ---------------------------------------------------------- +// +TPtrC8 CLocalNodeAttribute::Prefix() const + { + return TPtrC8(); + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::SetNamespacePrefixL +// +// ---------------------------------------------------------- +// +void CLocalNodeAttribute::SetPrefixL( const TDesC& /*aNamespacePrefix*/ ) + { + } + +// ---------------------------------------------------------- +// CLocalDocumentNode::SetNamespacePrefixL +// +// ---------------------------------------------------------- +// +void CLocalNodeAttribute::SetPrefixL( const TDesC8& /*aNamespacePrefix*/ ) + { + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/LocalProtocol/src/LocalProtocol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/LocalProtocol/src/LocalProtocol.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,287 @@ +/* +* Copyright (c) 2005 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: CLocalProtocol +* +*/ + + + +#include +#include +#include +#include +#include "XdmXmlParser.h" +#include "LocalProtocol.h" +#include "LocalDocument.h" +#include "LocalDocumentNode.h" +#include "LocalDirectory.h" +#include "XdmCredentials.h" +#include "XdmProtocolInfo.h" +#include "XdmOperationFactory.h" + +// ---------------------------------------------------------- +// CLocalProtocol::CLocalProtocol +// +// ---------------------------------------------------------- +// +CLocalProtocol::CLocalProtocol( const CXdmEngine& aXdmEngine, + const CXdmProtocolInfo& aProtocolInfo ) : + iTransferMediaOpen( EFalse ), + iXdmEngine( CONST_CAST( CXdmEngine&, aXdmEngine ) ), + iProtocolInfo( aProtocolInfo ) + { + } + +// ---------------------------------------------------------- +// CLocalProtocol::DeleteLogFileL +// +// ---------------------------------------------------------- +// +CLocalProtocol* CLocalProtocol::NewL( const TXdmProtocolParams& aProtocolParams ) + { + CLocalProtocol* self = new ( ELeave ) CLocalProtocol( aProtocolParams.iXdmEngine, + aProtocolParams.iProtocolInfo ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CLocalProtocol::DeleteLogFileL +// +// ---------------------------------------------------------- +// +CLocalProtocol::~CLocalProtocol() + { + #ifdef _DEBUG + WriteToLog( _L8( "CLocalProtocol::~CLocalProtocol()" ) ); + #endif + delete iRootFolder; + delete iXmlParser; + delete iLogWriter; + iFileSession.Close(); + Dll::FreeTls(); + } + +// ---------------------------------------------------------- +// CLocalProtocol::ConstructL +// +// ---------------------------------------------------------- +// +void CLocalProtocol::ConstructL() + { + #ifdef _DEBUG + iLogWriter = CXdmLogWriter::NewL( KLocalEngLogFile ); + WriteToLog( _L8( "CLocalProtocol::ConstructL() " ) ); + #endif + iXmlParser = CXdmXmlParser::NewL(); + SetRootDirectoryL( iProtocolInfo.Root() ); + User::LeaveIfError( iFileSession.Connect() ); + Dll::SetTls( this ); + } + +// ---------------------------------------------------------- +// CLocalProtocol::SetRootDirectoryL +// +// ---------------------------------------------------------- +// +void CLocalProtocol::SetRootDirectoryL( const TDesC& aRootPath ) + { + TUid id = RProcess().Identity(); + TBuf<32> processId; + processId.Zero(); + processId.Format( _L( "%x" ), id ); + #ifdef _DEBUG + WriteToLog( _L8( "CLocalProtocol::SetRootDirectoryL()" ) ); + #endif + if( aRootPath.Length() > 0 ) + { + iRootFolder = HBufC::NewL( aRootPath.Length() + + processId.Length() + + TPtrC( KLocalEngPrivateRoot ).Length() + 4 ); + iRootFolder->Des().Copy( KLocalEngPrivateRoot ); + iRootFolder->Des().Append( processId ); + iRootFolder->Des().Append( _L( "\\" ) ); + iRootFolder->Des().Append( aRootPath ); + iRootFolder->Des().Append( _L( "\\" ) ); + } + else + { + iRootFolder = HBufC::NewL( processId.Length() + + KLocalEngPrivateRoot().Length() + 2 ); + iRootFolder->Des().Copy( KLocalEngPrivateRoot ); + iRootFolder->Des().Append( processId ); + iRootFolder->Des().Append( _L( "\\" ) ); + } + #ifdef _DEBUG + TBuf8<256> eight; + eight.Copy( iRootFolder->Des() ); + WriteToLog( _L8( " Path: %S" ), &eight ); + #endif + } + +// ---------------------------------------------------------- +// CLocalProtocol::.WriteToLog +// +// ---------------------------------------------------------- +// +void CLocalProtocol::WriteToLog( TRefByValue aFmt,... ) const + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + iLogWriter->WriteToLog( buf ); + } + +// ---------------------------------------------------- +// CLocalProtocol::InitTransferMedia +// +// ---------------------------------------------------- +// +void CLocalProtocol::InitTransferMedium( TInt /*aIdleTimeout*/, + TRequestStatus& aStatus ) + { + TRequestStatus* status = &aStatus; + User::RequestComplete( status, KErrNone ); + } + +// ---------------------------------------------------- +// CLocalProtocol::CancelTransferMediaInit +// +// ---------------------------------------------------- +// +void CLocalProtocol::CancelTransferMediumInit() + { + } + +// ---------------------------------------------------- +// CLocalProtocol::IsTransferAvailable +// +// ---------------------------------------------------- +// +TBool CLocalProtocol::IsTransferAvailable() const + { + return ETrue; + } + +// ---------------------------------------------------- +// CLocalProtocol::RFSession +// +// ---------------------------------------------------- +// +RFs& CLocalProtocol::RFSession() + { + return iFileSession; + } + +// ---------------------------------------------------- +// CLocalProtocol::Root +// +// ---------------------------------------------------- +// +TPtrC CLocalProtocol::Root() + { + return iRootFolder != NULL ? iRootFolder->Des() : TPtrC(); + } + +// ---------------------------------------------------------- +// void CXcapProtocol::DeleteLogFileL +// +// ---------------------------------------------------------- +// +EXPORT_C RFs& CLocalProtocol::FileSession() + { + TAny* ptr = Dll::Tls(); + CLocalProtocol* self = ( CLocalProtocol* )ptr; + return self->RFSession(); + } + +// ---------------------------------------------------- +// CLocalProtocol::RootFolder +// +// ---------------------------------------------------- +// +EXPORT_C TPtrC CLocalProtocol::RootFolder() + { + TAny* ptr = Dll::Tls(); + CLocalProtocol* self = ( CLocalProtocol* )ptr; + return self->Root(); + } + +// ---------------------------------------------------- +// CLocalProtocol::CreateDocumentNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CLocalProtocol::CreateDocumentNodeL() + { + return CLocalDocumentNode::NewL( iXdmEngine, *this ); + } + +// ---------------------------------------------------- +// CLocalProtocol::CreateDocumentL +// +// ---------------------------------------------------- +// +CXdmDocument* CLocalProtocol::CreateDocumentL( const TDesC& aDocumentName, + const TXdmDocType /*aDocumentType*/ ) + { + return CLocalDocument::NewL( iXdmEngine, aDocumentName, *this ); + } + +// ---------------------------------------------------- +// CLocalProtocol::CreateDirectoryL +// +// ---------------------------------------------------- +// +CXdmDirectory* CLocalProtocol::CreateDirectoryL( const TDesC& aDirectoryPath ) + { + TPtrC root = iRootFolder->Des(); + HBufC* fullName = HBufC::NewLC( root.Length() + aDirectoryPath.Length() ); + fullName->Des().Copy( root ); + fullName->Des().Append( aDirectoryPath ); + CXdmDirectory* dir = CLocalDirectory::NewL( fullName->Des(), iXdmEngine, *this ); + CleanupStack::PopAndDestroy(); //fullName + return dir; + } + +// --------------------------------------------------------- +// Map the interface UIDs to implementation factory functions +// +// --------------------------------------------------------- +// +const TImplementationProxy ImplementationTable[] = + { + #ifdef __EABI__ + IMPLEMENTATION_PROXY_ENTRY( 0x10207424, CLocalProtocol::NewL ) + #else + { { 0x10207424 }, CLocalProtocol::NewL } + #endif + }; + +// --------------------------------------------------------- +// Return the implementation table & number of implementations +// +// --------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/BWINSCW/XcapAppUsageU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/BWINSCW/XcapAppUsageU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,6 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + ?NewL@CXcapAppUsage@@QAEPAV1@ABVCXdmEngine@@H@Z @ 2 NONAME ; class CXcapAppUsage * CXcapAppUsage::NewL(class CXdmEngine const &, int) + ?Validate@CXcapAppUsage@@QAEHAAVCXdmDocument@@H@Z @ 3 NONAME ; int CXcapAppUsage::Validate(class CXdmDocument &, int) + ?Validate@CXcapAppUsage@@QAEHAAVCXdmDocumentNode@@PAVMXcapUriInterface@@H@Z @ 4 NONAME ; int CXcapAppUsage::Validate(class CXdmDocumentNode &, class MXcapUriInterface *, int) + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/inc/XcapIetfCommonPolicyUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/inc/XcapIetfCommonPolicyUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2005 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: CXcapIetfCommonPolicyUsage +* +*/ + + + + +#ifndef __XCAPIETFCOMMONPOLICYUSAGE__ +#define __XCAPIETFCOMMONPOLICYUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapIetfCommonPolicyUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapIetfCommonPolicyUsage* + */ + static CXcapIetfCommonPolicyUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapIetfCommonPolicyUsage(); + + public: //From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapIetfCommonPolicyUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + + }; + +#endif //__XCAPIETFCOMMONPOLICYUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/inc/XcapOmaCommonPolicyUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/inc/XcapOmaCommonPolicyUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,103 @@ +/* +* Copyright (c) 2005 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: CXcapOmaCommonPolicyUsage +* +*/ + + + + +#ifndef __XCAPOMACOMMONPOLICYUSAGE__ +#define __XCAPOMACOMMONPOLICYUSAGE__ + +#include +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapOmaCommonPolicyUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapOmaCommonPolicyUsage* + */ + static CXcapOmaCommonPolicyUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapOmaCommonPolicyUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapOmaCommonPolicyUsage( const CXdmEngine& aXdmEngine ); + }; + +#endif //__XCAPOMACOMMONPOLICYUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/src/XcapIetfCPUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/src/XcapIetfCPUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,331 @@ +/* +* Copyright (c) 2005 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: CXcapIetfCommonPolicyUsage +* +*/ + + + + +#include +#include +#include +#include "XcapIetfCommonPolicyUsage.h" + +// Used specifications +// draft-ietf-geopriv-common-policy-08, 05 March 2006, expires 06 September 2006 + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::CXcapIetfCommonPolicyUsage +// +// ---------------------------------------------------- +// +CXcapIetfCommonPolicyUsage::CXcapIetfCommonPolicyUsage( const CXdmEngine& aXdmEngine ) +:CXcapAppUsage( aXdmEngine ) + { + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::NewL +// +// ---------------------------------------------------- +// +CXcapIetfCommonPolicyUsage* CXcapIetfCommonPolicyUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapIetfCommonPolicyUsage* self = new ( ELeave ) CXcapIetfCommonPolicyUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::~CXcapIetfCommonPolicyUsage +// +// ---------------------------------------------------- +// +CXcapIetfCommonPolicyUsage::~CXcapIetfCommonPolicyUsage() + { + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapIetfCommonPolicyUsage::ConstructL() + { + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapIetfCommonPolicyUsage::AUID() const + { + return TPtrC8( KXdmIetfCommonPolicyUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapIetfCommonPolicyUsage::ContentType() const + { + return TPtrC8( KXdmIetfCommonPolicyUsageContType ); + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapIetfCommonPolicyUsage::DefaultNamespace() const + { + return TPtrC8( KXdmIetfCommonPolicyNamespace ); + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapIetfCommonPolicyUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmRuleset ) ) + { + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + // ruleset should not contain any other type elements + // than + if ( !Match( aXdmNode.ChileNode(i)->NodeName(), KXdmRule ) ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + } + found = ETrue; + } + // + else if ( Match( element, KXdmRule ) ) + { + // required attribute id + if ( !aXdmNode.HasAttribute( KXdmId ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmConditions ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmActions ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmTransformations ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmValidity ) ) + { + // should contain and + TBool from( EFalse ); + TBool until( EFalse ); + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + TPtrC childName = aXdmNode.ChileNode(i)->NodeName(); + if ( Match( childName, KXdmFrom ) ) + { + from = ETrue; + } + else if ( Match( childName, KXdmUntil ) ) + { + until = ETrue; + } + } + if ( !from || !until ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredElement ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmFrom ) ) + { + dataType = EDataTypeDateTime; + found = ETrue; + } + // + else if ( Match( element, KXdmTo ) ) + { + dataType = EDataTypeDateTime; + found = ETrue; + } + // + else if ( Match( element, KXdmIdentity ) ) + { + // should contain either or + // elements, not both + TBool one( EFalse ); + TBool many( EFalse ); + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + TPtrC childName = aXdmNode.ChileNode(i)->NodeName(); + if ( Match( childName, KXdmOne ) ) + { + one = ETrue; + } + else if ( Match( childName, KXdmMany ) ) + { + many = ETrue; + } + } + if ( one && many ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmId ) ) + { + // required attribute entity + if ( !aXdmNode.HasAttribute( KXdmEntity ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmAnyIdentity ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmExcept ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmSphere ) ) + { + // required attribute value + if ( !aXdmNode.HasAttribute( KXdmValue ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmOne ) ) + { + // required attribute id + if ( !aXdmNode.HasAttribute( KXdmId ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmMany) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmUntil ) ) + { + dataType = EDataTypeDateTime; + found = ETrue; + } + + // if the node is some of the basic types, + // pass it to the base class for data validation + if ( dataType != EDataTypeUndefined ) + { + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapIetfCommonPolicyUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + TDataType dataType ( EDataTypeUndefined ); + TPtrC attribute = aXdmNodeAttr.NodeName(); + + // id + if ( Match( attribute, KXdmId ) ) + { + dataType = EDataTypeString; + } + // domain + else if ( Match( attribute, KXdmDomain ) ) + { + dataType = EDataTypeString; + } + // value + else if ( Match( attribute, KXdmValue ) ) + { + dataType = EDataTypeString; + } + + // pass to base class for data validation + ValidateDataL( dataType, aXdmNodeAttr ); + } + +// ---------------------------------------------------- +// CXcapIetfCommonPolicyUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapIetfCommonPolicyUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmIetfCommonPolicyNamespace, KNullDesC8 ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/src/XcapOmaCPUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XCapCommonPolicyCapsUsage/src/XcapOmaCPUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,184 @@ +/* +* Copyright (c) 2005 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: CXcapOmaCommonPolicyUsage +* +*/ + + + + +// Used specifications +// OMA-TS-XDM_Core-V1_0-20060612, 12 June 2006 + +#include +#include +#include "XcapOmaCommonPolicyUsage.h" + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::CXcapOmaCommonPolicyUsage +// +// ---------------------------------------------------- +// +CXcapOmaCommonPolicyUsage::CXcapOmaCommonPolicyUsage( const CXdmEngine& aXdmEngine ) : +CXcapAppUsage( aXdmEngine ) + { + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::NewL +// +// ---------------------------------------------------- +// +CXcapOmaCommonPolicyUsage* CXcapOmaCommonPolicyUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapOmaCommonPolicyUsage* self = new ( ELeave ) CXcapOmaCommonPolicyUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::~CXcapOmaCommonPolicyUsage +// +// ---------------------------------------------------- +// +CXcapOmaCommonPolicyUsage::~CXcapOmaCommonPolicyUsage() + { + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapOmaCommonPolicyUsage::ConstructL() + { + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapOmaCommonPolicyUsage::AUID() const + { + return TPtrC8( KXdmOmaCommonPolicyUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapOmaCommonPolicyUsage::ContentType() const + { + return TPtrC8( KXdmOmaCommonPolicyUsageContType ); + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapOmaCommonPolicyUsage::DefaultNamespace() const + { + return TPtrC8( KXdmOmaCommonPolicyNamespace ); + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapOmaCommonPolicyUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmOtherIdentity ) ) + { + dataType = EDataTypeEmpty; + found = ETrue; + } + // + else if ( Match( element, KXdmExternalList ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmEntry ) ) + { + // should we check the parent's namespace here + found = ETrue; + } + // + else if ( Match( element, KXdmAnonymousRequest ) ) + { + dataType = EDataTypeEmpty; + found = ETrue; + } + + // if the node is some of the basic types, + // pass it to the base class for data validation + if ( dataType != EDataTypeUndefined ) + { + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapOmaCommonPolicyUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // anc + if ( Match( aXdmNodeAttr.NodeName(), KXdmAnc ) ) + { + // pass to base class for data validation + ValidateDataL( EDataTypeAnyURI, aXdmNodeAttr ); + } + } + +// ---------------------------------------------------- +// CXcapOmaCommonPolicyUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapOmaCommonPolicyUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmOmaCommonPolicyNamespace, KNullDesC8 ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XCapPocUserAccessUsage/inc/XcapPocUserAccessUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XCapPocUserAccessUsage/inc/XcapPocUserAccessUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2005 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: CXcapPocUserAccessUsage +* +*/ + + + + +#ifndef __XCAPPOCUSERACCESSUSAGE__ +#define __XCAPPOCUSERACCESSUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapPocUserAccessUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapPocUserAccessUsage* + */ + static CXcapPocUserAccessUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapPocUserAccessUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapPocUserAccessUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + CXcapAppUsage* iIetfCommonPolicies; + CXcapAppUsage* iOmaCommonPolicies; + }; + +#endif //__XCAPPOCGROUPUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XCapPocUserAccessUsage/src/XcapPocUserAccessUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XCapPocUserAccessUsage/src/XcapPocUserAccessUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,208 @@ +/* +* Copyright (c) 2005 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: CXcapPocUserAccessUsage +* +*/ + + + + +#include +#include +#include +#include "XcapPocUserAccessUsage.h" + +// Used specification +// OMA-TS-PoC_XDM-V1_0-20050317-C, 17 March 2005 +// OMA-TS-PoC_XDM-V1_0-20060127-C, 27 January 2006 + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::CXcapPocUserAccessUsage +// +// ---------------------------------------------------- +// +CXcapPocUserAccessUsage::CXcapPocUserAccessUsage( const CXdmEngine& aXdmEngine ) : +CXcapAppUsage( aXdmEngine ), +iIetfCommonPolicies( NULL ), +iOmaCommonPolicies( NULL ) + { + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::NewL +// +// ---------------------------------------------------- +// +CXcapPocUserAccessUsage* CXcapPocUserAccessUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapPocUserAccessUsage* self = new ( ELeave ) CXcapPocUserAccessUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::~CXcapPocUserAccessUsage +// +// ---------------------------------------------------- +// +CXcapPocUserAccessUsage::~CXcapPocUserAccessUsage() + { + delete iIetfCommonPolicies; + delete iOmaCommonPolicies; + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapPocUserAccessUsage::ConstructL() + { + iIetfCommonPolicies = CXcapAppUsage::NewL( iXdmEngine, EXdmIetfCommonPolicy ); + iOmaCommonPolicies = CXcapAppUsage::NewL( iXdmEngine, EXdmOmaCommonPolicy ); + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapPocUserAccessUsage::AUID() const + { + return TPtrC8( KXdmPocUserAccessUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapPocUserAccessUsage::ContentType() const + { + return TPtrC8( KXdmPocUserAccessUsageContType ); + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapPocUserAccessUsage::DefaultNamespace() const + { +// return TPtrC8( KXdmPocUserAccessNamespace ); + // NOTE the default namespace is IetfCommonPolicy + return TPtrC8( KXdmIetfCommonPolicyNamespace ); + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapPocUserAccessUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TPtrC element = aXdmNode.NodeName(); + + // there is restriction for the value + // of + // check that value is either "reject", "accept" or "pass" + // 0 (reject), 1 (pass), 2 (accept) + if ( Match( element, KXdmAllowInvite ) ) + { + TPtrC8 data = aXdmNode.LeafNodeContent(); + if ( data.CompareF( KXdmReject ) + && data.CompareF( KXdmAccept ) + && data.CompareF( KXdmPass ) ) + { + LeaveWithErrorL( KXcapErrorEnumerationRule ); + } + found = ETrue; + // NOTE the default namespace is IetfCommonPolicy + SetPrefixL( aXdmNode, KXdmPocUserAccessNsPrefix ); + } + // urn:ietf:params:xml:ns:common-policy + if ( !found ) + { + found = iIetfCommonPolicies->ValidateNodeL( aXdmNode ); + // NOTE the default namespace is IetfCommonPolicy + /*if ( found ) + { + SetPrefixL( aXdmNode, KXdmIetfCommonPolicyNsPrefix ); + }*/ + } + // urn:oma:params:xml:ns:common-policy + if ( !found ) + { + found = iOmaCommonPolicies->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmOmaCommonPolicyNsPrefix ); + } + } + return found; + } + +// ---------------------------------------------------- +// CXcapPocUserAccessUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapPocUserAccessUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // there aren't any attributes, all attributes are + // either from urn:ietf:params:xml:ns:common-policy + // or from urn:oma:params:xml:ns:common-policy + + // add parent element namespace checking when available, + // now we don't know the attribute's namespace + iIetfCommonPolicies->ValidateAttributeL( aXdmNodeAttr ); + iOmaCommonPolicies->ValidateAttributeL( aXdmNodeAttr ); + } + + + // ---------------------------------------------------- +// CXcapPocUserAccessUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapPocUserAccessUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmIetfCommonPolicyNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmPocUserAccessNamespace, KXdmPocUserAccessNsPrefix ); + aXdmDocument.AppendNamespaceL( KXdmOmaCommonPolicyNamespace, KXdmOmaCommonPolicyNsPrefix ); +/* aXdmDocument.AppendNamespaceL( KXdmPocUserAccessNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmIetfCommonPolicyNamespace, KXdmIetfCommonPolicyNsPrefix ); + aXdmDocument.AppendNamespaceL( KXdmOmaCommonPolicyNamespace, KXdmOmaCommonPolicyNsPrefix );*/ + } + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapC4/inc/XcapC4.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapC4/inc/XcapC4.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2008 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: CXcapC4 +* +*/ + +#ifndef __XCAPRESCONTENT__ +#define __XCAPRESCONTENT__ + +#include "XcapAppUsage.h" + +// CONSTANTS +#define KC4SettingsCenRepUID 0x20021391 + + +// CLASS DECLARATION +class CXcapC4 : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapC4* + */ + static CXcapC4* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapC4(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapC4( const CXdmEngine& aXdmEngine ); + + private: // member data + /// RCS Global: Old content type setting + TInt iRCSGlobalOldContentType; + }; + +#endif //__XCAPPRESCONTENT__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapC4/src/XcapC4.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapC4/src/XcapC4.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,201 @@ +/* +* Copyright (c) 2008 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: CXcapC4 +* +*/ + +#include +#include +#include +#include +#ifdef _DEBUG +#include +#endif + +#include "XcapC4.h" +//#include "pasvariation.hrh" + + +// Used specification +// Presence Content XDM Specification, draft 1.0 + +// ---------------------------------------------------- +// CXcapC4::CXcapC4 +// +// ---------------------------------------------------- +// +CXcapC4::CXcapC4( const CXdmEngine& aXdmEngine ) : + CXcapAppUsage( aXdmEngine ) + { +#ifdef _DEBUG + WriteToLog( _L8( "CXcapC4 initialized!" ) ); +#endif + } + +// ---------------------------------------------------- +// CXcapC4::NewL +// +// ---------------------------------------------------- +// +CXcapC4* CXcapC4::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapC4* self = new ( ELeave ) CXcapC4( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapC4::~CXcapC4 +// +// ---------------------------------------------------- +// +CXcapC4::~CXcapC4() + { + } + +// ---------------------------------------------------- +// CXcapC4::ConstructL +// +// ---------------------------------------------------- +// +void CXcapC4::ConstructL() + { + CRepository* cenRepRCSGlobal; + cenRepRCSGlobal = CRepository::NewL( TUid::Uid( KC4SettingsCenRepUID ) ); + CleanupStack::PushL( cenRepRCSGlobal ); + + // 0x06 is the index in central repository for content type setting + User::LeaveIfError( cenRepRCSGlobal->Get( 0x06, iRCSGlobalOldContentType ) ); + CleanupStack::PopAndDestroy( ); // cenRepRCSGlobal + } + +// ---------------------------------------------------- +// CXcapC4::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapC4::AUID() const + { + return TPtrC8( KXdmPresContentAUID ); + } + +// ---------------------------------------------------- +// CXcapC4::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapC4::ContentType() const + { + if ( iRCSGlobalOldContentType ) + { + return TPtrC8( KXdmPresContentContTypeOld ); + } + else + { + return TPtrC8( KXdmPresContentContType ); + } + } + +// ---------------------------------------------------- +// CXcapC4::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapC4::DefaultNamespace() const + { + return TPtrC8( KXdmPresContentNamespace ); + } + +// ---------------------------------------------------- +// CXcapC4::ValidateL +// +// ---------------------------------------------------- +// +TBool CXcapC4::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { +#ifdef _DEBUG + WriteToLog( _L8( "CXcapC4::ValidateNodeL" ) ); +#endif + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TPtrC element = aXdmNode.NodeName(); + + // mime-type + if ( Match( element, KXdmMimeType ) ) + { + found = ETrue; + } + else if ( Match( element, KXdmEncoding ) ) + { + found = ETrue; + } + else if ( Match( element, KXdmDescription ) ) + { + found = ETrue; + } + else if ( Match( element, KXdmData ) ) + { + found = ETrue; + } + +#ifdef _DEBUG + WriteToLog( _L8( "CXcapC4::ValidateNodeL - found: %d" ), found ); +#endif + return found; + } + +// ---------------------------------------------------- +// CXcapC4::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapC4::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // there should not be any attributes in pres-content document +#ifdef _DEBUG + WriteToLog( _L8( "CXcapC4::ValidateAttributeL" ) ); +#endif +// User::Leave( KErrNotSupported ); + } + +// ---------------------------------------------------- +// CXcapC4::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapC4::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { +#ifdef _DEBUG + WriteToLog( _L8( "CXcapC4::AddNamespaceInformationL" ) ); +#endif + aXdmDocument.AppendNamespaceL( KXdmPresContentNamespace, KNullDesC8 ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapCapabilityUsage/inc/XcapCapabilityUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapCapabilityUsage/inc/XcapCapabilityUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,102 @@ +/* +* Copyright (c) 2005 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: CXcapCapabilityUsage +* +*/ + + + + +#ifndef __XCAPCAPABILITYUSAGE__ +#define __XCAPCAPABILITYUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapCapabilityUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapCapabilityUsage* + */ + static CXcapCapabilityUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapCapabilityUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapCapabilityUsage( const CXdmEngine& aXdmEngine ); + }; + +#endif //__XCAPCAPABILITYUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapCapabilityUsage/src/XcapCapabilityUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapCapabilityUsage/src/XcapCapabilityUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,188 @@ +/* +* Copyright (c) 2005 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: CXcapCapabilityUsage +* +*/ + + + + +#include +#include "XcapCapabilityUsage.h" + +// Used specification +// OMA-TS-XDM_Core-V1_0-20051103-C, 03 November 2005 + +// ---------------------------------------------------- +// CXcapCapabilityUsage::CXcapCapabilityUsage +// +// ---------------------------------------------------- +// +CXcapCapabilityUsage::CXcapCapabilityUsage( const CXdmEngine& aXdmEngine ) : + CXcapAppUsage( aXdmEngine ) + { + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::NewL +// +// ---------------------------------------------------- +// +CXcapCapabilityUsage* CXcapCapabilityUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapCapabilityUsage* self = new ( ELeave ) CXcapCapabilityUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::~CXcapCapabilityUsage +// +// ---------------------------------------------------- +// +CXcapCapabilityUsage::~CXcapCapabilityUsage() + { + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapCapabilityUsage::ConstructL() + { + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapCapabilityUsage::AUID() const + { + return TPtrC8( KXdmCapabilityUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapCapabilityUsage::ContentType() const + { + return TPtrC8( KXdmCapabilityUsageContType ); + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapCapabilityUsage::DefaultNamespace() const + { + return TPtrC8( KXdmCapabilityNamespace ); + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapCapabilityUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmAuids ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmAuid ) ) + { + dataType = EDataTypeString; + found = ETrue; + } + // + else if ( Match( element, KXdmExtensions ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmExtension ) ) + { + dataType = EDataTypeString; + found = ETrue; + } + // + else if ( Match( element, KXdmNamespace ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmNamespace ) ) + { + dataType = EDataTypeAnyURI; + found = ETrue; + } + + if ( dataType != EDataTypeUndefined ) + { + // pass to the base class for data validation + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapCapabilityUsage::ValidateAttributeL( const CXdmNodeAttribute& /*aXdmNodeAttr*/ ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // There aren't any attributes in + // capability usage schema. + } + +// ---------------------------------------------------- +// CXcapCapabilityUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapCapabilityUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmCapabilityNamespace, KNullDesC8 ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapDirectoryUsage/inc/XcapDirectoryUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapDirectoryUsage/inc/XcapDirectoryUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,102 @@ +/* +* Copyright (c) 2005 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: CXcapDirectoryUsage +* +*/ + + + + +#ifndef __XCAPDIRECTORYUSAGE__ +#define __XCAPDIRECTORYUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapDirectoryUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapDirectoryUsage* + */ + static CXcapDirectoryUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapDirectoryUsage(); + + public: + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapDirectoryUsage( const CXdmEngine& aXdmEngine ); + }; + +#endif //__XCAPDIRECTORYUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapDirectoryUsage/src/XcapDirectoryUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapDirectoryUsage/src/XcapDirectoryUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,234 @@ +/* +* Copyright (c) 2005 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: CXcapDirectoryUsage +* +*/ + + + + +#include +#include +#include +#include "XcapDirectoryUsage.h" + + +// Used specification +// OMA-TS-XDM_Core-V1_0-20051103-C, 03 November 2005 + +// ---------------------------------------------------- +// CXcapDirectoryUsage::CXcapDirectoryUsage +// +// ---------------------------------------------------- +// +CXcapDirectoryUsage::CXcapDirectoryUsage( const CXdmEngine& aXdmEngine ) : + CXcapAppUsage( aXdmEngine ) + { + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::NewL +// +// ---------------------------------------------------- +// +CXcapDirectoryUsage* CXcapDirectoryUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapDirectoryUsage* self = new ( ELeave ) CXcapDirectoryUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::~CXcapDirectoryUsage +// +// ---------------------------------------------------- +// +CXcapDirectoryUsage::~CXcapDirectoryUsage() + { + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapDirectoryUsage::ConstructL() + { + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapDirectoryUsage::AUID() const + { + return TPtrC8( KXdmDirectoryUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapDirectoryUsage::ContentType() const + { + return TPtrC8( KXdmDirectoryUsageContType ); + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapDirectoryUsage::DefaultNamespace() const + { + return TPtrC8( KXdmDirectoryNamespace ); + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapDirectoryUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found( EFalse ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmXcapDirectory ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmFolder ) ) + { + // required attribute auid + if ( !aXdmNode.HasAttribute( KXdmAuid ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + // there should be either or + // element, not both + TBool entry( EFalse ); + TBool errorcode( EFalse ) ; + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + TPtrC childName = aXdmNode.ChileNode(i)->NodeName(); + if ( childName.CompareF( KXdmEntry ) ) + { + entry = ETrue; + } + else if ( childName.CompareF( KXdmErrorCode ) ) + { + errorcode = ETrue; + } + } + if ( entry && errorcode ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmEntry ) ) + { + // required attributes uri and etag + if ( !aXdmNode.HasAttribute( KXdmUri ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + if ( !aXdmNode.HasAttribute( KXdmEtag ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute); + } + found = ETrue; + } + // + else if ( Match( element, KXdmErrorCode ) ) + { + ValidateDataL( EDataTypeString, aXdmNode ); + found = ETrue; + } + return found; + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapDirectoryUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + TDataType dataType ( EDataTypeUndefined ); + TPtrC attribute = aXdmNodeAttr.NodeName(); + // uri + if ( Match( attribute, KXdmUri ) ) + { + dataType = EDataTypeAnyURI; + } + // etag + else if ( Match( attribute, KXdmEtag ) ) + { + dataType = EDataTypeString; + } + // last-modified + else if ( Match( attribute, KXdmLastModified ) ) + { + dataType = EDataTypeDateTime; + } + // size + else if ( Match( attribute, KXdmSize ) ) + { + dataType = EDataTypeNonNegativeInteger; + } + // auid + else if ( Match( attribute, KXdmAuid ) ) + { + dataType = EDataTypeString; + } + // pass to base class for data validation + ValidateDataL( dataType, aXdmNodeAttr ); + } + +// ---------------------------------------------------- +// CXcapDirectoryUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapDirectoryUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmDirectoryNamespace, KNullDesC8 ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapPocGroupUsage/inc/XcapPocGroupUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapPocGroupUsage/inc/XcapPocGroupUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2005 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: CXcapPocGroupUsage +* +*/ + + + + +#ifndef __XCAPPOCGROUPUSAGE__ +#define __XCAPPOCGROUPUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapPocGroupUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapPocGroupUsage* + */ + static CXcapPocGroupUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapPocGroupUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapPocGroupUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + CXcapAppUsage* iIetfCommonPolicies; + CXcapAppUsage* iOmaCommonPolicies; + CXcapAppUsage* iResourceLists; + }; + +#endif //__XCAPPOCGROUPUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapPocGroupUsage/src/XcapPocGroupUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapPocGroupUsage/src/XcapPocGroupUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,330 @@ +/* +* Copyright (c) 2005 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: CXcapPocGroupUsage +* +*/ + + + + +#include +#include +#include +#include "XcapPocGroupUsage.h" + + + +// Used specification +// OMA-TS-PoC_XDM-V1_0-20060609-A, 09 June 2006 +// ---------------------------------------------------- +// CXcapPocGroupUsage::CXcapPocGroupUsage +// +// ---------------------------------------------------- +// +CXcapPocGroupUsage::CXcapPocGroupUsage( const CXdmEngine& aXdmEngine ) : +CXcapAppUsage( aXdmEngine ), +iIetfCommonPolicies( NULL ), +iOmaCommonPolicies( NULL ), +iResourceLists( NULL ) + { + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::NewL +// +// ---------------------------------------------------- +// +CXcapPocGroupUsage* CXcapPocGroupUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapPocGroupUsage* self = new ( ELeave ) CXcapPocGroupUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::~CXcapPocGroupUsage +// +// ---------------------------------------------------- +// +CXcapPocGroupUsage::~CXcapPocGroupUsage() + { + delete iIetfCommonPolicies; + delete iOmaCommonPolicies; + delete iResourceLists; + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapPocGroupUsage::ConstructL() + { + iIetfCommonPolicies = CXcapAppUsage::NewL( iXdmEngine, EXdmIetfCommonPolicy ); + iOmaCommonPolicies = CXcapAppUsage::NewL( iXdmEngine, EXdmOmaCommonPolicy ); + iResourceLists = CXcapAppUsage::NewL( iXdmEngine, EXdmResourceLists ); + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapPocGroupUsage::AUID() const + { + return TPtrC8( KXdmPocGroupUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapPocGroupUsage::ContentType() const + { + return TPtrC8( KXdmPocGroupUsageContType ); + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapPocGroupUsage::DefaultNamespace() const + { + return TPtrC8( KXdmPocGroupNamespace ); + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapPocGroupUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmGroup ) ) + { + // no other elements than + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + if ( !Match( aXdmNode.ChileNode(i)->NodeName(), KXdmListService ) ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + } + found = ETrue; + } + // + else if ( Match( element, KXdmListService ) ) + { + // required attribute uri + if ( !aXdmNode.HasAttribute( KXdmUri ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmDisplayName ) ) + { + CXdmDocumentNode* parent = aXdmNode.Parent(); + if ( parent && !parent->NodeName().CompareF( KXdmEntry ) ) + { + found = iResourceLists->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmResourceListsNsPrefix ); + } + } + else + { + dataType = EDataTypeString; + found = ETrue; + } + } + // + else if ( Match( element, KXdmInviteMembers ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmMaxParticipantCount ) ) + { + dataType = EDataTypeNonNegativeInteger; + found = ETrue; + } + // + else if ( Match( element, KXdmIsListMember ) ) + { + // dataType = EDataTypeBoolean; // OMA-TS-PoC_XDM-V1_0-20050317-C, 17 March 2005 + // changed 4-Nov-2005 PoC XDM + dataType = EDataTypeEmpty; + found = ETrue; + } + // + else if ( Match( element, KXdmAllowConfState ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmAllowInvUsersDyn ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmJoinHandling ) ) + { + // OMA-TS-PoC_XDM-V1_0-20050317-C, 17 March 2005 + // the value must be "allow" or "block" + // 0 (block) and 1 (allow) + /* TPtrC8 data = aXdmNode.LeafNodeContent(); + if ( data.CompareF( KXdmAllow ) + && data.CompareF( KXdmBlock ) ) + { + LeaveWithErrorL( KXcapErrorEnumerationRule ); + } + */ + // changed OMA-TS-PoC_XDM-V1_0-20060127-C, 27 January 2006 + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmAllowInitiateConf ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmAllowAnonymity ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmIsKeyParticipant ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + // type = rl:externalType from urn:ietf:params:xml:ns:resource-lists + // pass to the appropriate usage for validation + // but use default namespace + else if ( Match( element, KXdmExternal ) ) + { + found = iResourceLists->ValidateNodeL( aXdmNode ); + } + // + // type = rl:entryType from urn:ietf:params:xml:ns:resource-lists + // pass to the appropriate usage for validation + // but use default namespace + else if ( Match( element, KXdmEntry ) ) + { + found = iResourceLists->ValidateNodeL( aXdmNode ); + } + + // urn:ietf:params:xml:ns:common-policy + if ( !found ) + { + found = iIetfCommonPolicies->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmIetfCommonPolicyNsPrefix ); + } + } + // urn:oma:params:xml:ns:common-policy + if ( !found ) + { + found = iOmaCommonPolicies->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmOmaCommonPolicyNsPrefix ); + } + } + + // if the node is some of the basic types, + // pass it to the base class for data validation + if ( dataType != EDataTypeUndefined ) + { + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapPocGroupUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + TPtrC attribute = aXdmNodeAttr.NodeName(); + + // uri + if ( Match( attribute, KXdmUri ) ) + { + // pass to base class for data validation + // check if this should be SIP uri + ValidateDataL( EDataTypeAnyURI, aXdmNodeAttr ); + } + else + { + // add parent element namespace checking when available, + // now we don't know the attribute's namespace + iIetfCommonPolicies->ValidateAttributeL( aXdmNodeAttr ); + iOmaCommonPolicies->ValidateAttributeL( aXdmNodeAttr ); + } + } + +// ---------------------------------------------------- +// CXcapPocGroupUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapPocGroupUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmPocGroupNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmResourceListsNamespace, KXdmResourceListsNsPrefix ); + aXdmDocument.AppendNamespaceL( KXdmIetfCommonPolicyNamespace, KXdmIetfCommonPolicyNsPrefix ); + aXdmDocument.AppendNamespaceL( KXdmOmaCommonPolicyNamespace, KXdmOmaCommonPolicyNsPrefix ); + } + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/inc/XcapIetfPresRulesUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/inc/XcapIetfPresRulesUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2005 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: CXcapIetfPresRulesUsage +* +*/ + + + + +#ifndef __XCAPIETFPRESRULESUSAGE__ +#define __XCAPIETFPRESRULESUSAGE__ + +#include "XcapAppUsage.h" + + + +// CLASS DECLARATION +class CXcapIetfPresRulesUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapIetfPresRulesUsage* + */ + static CXcapIetfPresRulesUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapIetfPresRulesUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapIetfPresRulesUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + CXcapAppUsage* iIetfCommonPolicy; + }; + +#endif //__XCAPIETFPRESRULESUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/inc/XcapOmaPresRulesUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/inc/XcapOmaPresRulesUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2005 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: CXcapOmaPresRulesUsage +* +*/ + + + + +#ifndef __XCAPOMAPRESRULESUSAGE__ +#define __XCAPOMAPRESRULESUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapOmaPresRulesUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapOmaPresRulesUsage* + */ + static CXcapOmaPresRulesUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapOmaPresRulesUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapOmaPresRulesUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + CXcapAppUsage* iIetfPresRules; + CXcapAppUsage* iIetfCommonPolicy; + CXcapAppUsage* iOmaCommonPolicy; + }; + +#endif //__XCAPOMAPRESRULESUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/src/XcapIetfPresRulesUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/src/XcapIetfPresRulesUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,520 @@ +/* +* Copyright (c) 2005 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: CXcapIetfPresRulesUsage +* +*/ + + + + +#include "XcapIetfPresRulesUsage.h" +#include "XdmDocumentNode.h" +#include "XdmNodeAttribute.h" +#include "XdmErrors.h" + +// Used specification +// draft-ietf-simple-presence-rules-03, 18 July 2005 +// expires 19 January, 2006 +// draft-ietf-simple-presence-rules-05, 06 March 2006 +// expires 07 September, 2006 + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::CXcapIetfPresRulesUsage +// +// ---------------------------------------------------- +// +CXcapIetfPresRulesUsage::CXcapIetfPresRulesUsage( const CXdmEngine& aXdmEngine ) : +CXcapAppUsage( aXdmEngine ), +iIetfCommonPolicy( NULL ) + { + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::NewL +// +// ---------------------------------------------------- +// +CXcapIetfPresRulesUsage* CXcapIetfPresRulesUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapIetfPresRulesUsage* self = new ( ELeave ) CXcapIetfPresRulesUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::~CXcapIetfPresRulesUsage +// +// ---------------------------------------------------- +// +CXcapIetfPresRulesUsage::~CXcapIetfPresRulesUsage() + { + delete iIetfCommonPolicy; + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapIetfPresRulesUsage::ConstructL() + { + iIetfCommonPolicy = CXcapAppUsage::NewL( iXdmEngine, KXdmIetfCommonPolicyUsageUid ); + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapIetfPresRulesUsage::AUID() const + { + return TPtrC8( KXdmIetfPresRulesUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapIetfPresRulesUsage::ContentType() const + { + return TPtrC8( KXdmIetfPresRulesUsageContType ); + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapIetfPresRulesUsage::DefaultNamespace() const + { + return TPtrC8( KXdmIetfPresRulesNamespace ); + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::ValidateL +// +// ---------------------------------------------------- +// +TBool CXcapIetfPresRulesUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmServiceUriScheme ) ) + { + dataType = EDataTypeToken; + found = ETrue; + } + // + else if ( Match( element, KXdmClass ) ) + { + dataType = EDataTypeToken; + found = ETrue; + } + // + else if ( Match( element, KXdmOccurenceId ) ) + { + dataType = EDataTypeToken; + found = ETrue; + } + // + else if ( Match( element, KXdmServiceUri ) ) + { + dataType = EDataTypeAnyURI; + found = ETrue; + } + // + else if ( Match( element, KXdmAllServices ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmProvideServices ) ) + { + // type = provideServicePermissions + // here we should have either + // or sequence of other elements + TBool allServices( EFalse ); + TBool sequence( EFalse ); + TBool serviceUri( EFalse ); + TBool serviceUriScheme( EFalse ); + TBool occurenceId( EFalse ); + TBool prclass( EFalse ); + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + TPtrC childName = aXdmNode.ChileNode(i)->NodeName(); + if ( Match( childName, KXdmAllServices ) ) + { + allServices = ETrue; + } + else + { + sequence = ETrue; + // in sequence should be either , + // , or + if ( Match( childName, KXdmServiceUri ) ) + { + serviceUri = ETrue; + } + else if ( Match( childName, KXdmServiceUriScheme ) ) + { + serviceUriScheme = ETrue; + } + else if ( Match( childName, KXdmOccurenceId ) ) + { + occurenceId = ETrue; + } + else if ( Match( childName, KXdmClass ) ) + { + prclass = ETrue; + } + } + } + if ( allServices && sequence ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + if ( sequence ) + { + if ( serviceUri && ( serviceUriScheme || occurenceId || prclass ) ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + if ( serviceUriScheme && ( occurenceId || prclass ) ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + if ( occurenceId && prclass ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + } + found = ETrue; + } + // used in presence-rules-03 + // + else if ( Match( element, KXdmDeviceId ) ) + { + dataType = EDataTypeAnyURI; + found = ETrue; + } + // used in presence-rules-05 + // + else if ( Match( element, KXdmDeviceID ) ) + { + dataType = EDataTypeAnyURI; + found = ETrue; + } + // + else if ( Match( element, KXdmAllDevices ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmProvideDevices ) ) + { + // type = provideDevicePermissions + // here we should have either + // or sequence of other elements + TBool allDevices( EFalse ); + TBool sequence( EFalse ); + TBool deviceId( EFalse ); + TBool occurenceId( EFalse ); + TBool prclass( EFalse ); + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + TPtrC childName = aXdmNode.ChileNode(i)->NodeName(); + if ( Match( childName, KXdmAllDevices ) ) + { + allDevices = ETrue; + } + else + { + sequence = ETrue; + // in sequence should be either pres-rules-03 pres-rules-05 , + // or + if ( Match( childName, KXdmDeviceId ) + || Match( childName, KXdmDeviceID ) ) + { + deviceId = ETrue; + } + else if ( Match( childName, KXdmOccurenceId ) ) + { + occurenceId = ETrue; + } + else if ( Match( childName, KXdmClass ) ) + { + prclass = ETrue; + } + } + } + if ( allDevices && sequence ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + if ( sequence ) + { + if ( deviceId && ( occurenceId || prclass ) ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + if ( occurenceId && prclass ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + } + found = ETrue; + } + // + else if ( Match( element, KXdmAllPersons ) ) + { + found = ETrue; + } + // + else if ( !element.CompareF( KXdmProvidePersons ) ) + { + // type = providePersonPermissions + // here we should have either + // or sequence of other elements + TBool allPersons( EFalse ); + TBool sequence( EFalse ); + TBool occurenceId( EFalse ); + TBool prclass( EFalse ); + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + TPtrC childName = aXdmNode.ChileNode(i)->NodeName(); + if ( Match( childName, KXdmAllPersons ) ) + { + allPersons = ETrue; + } + else + { + sequence = ETrue; + // in sequence should be either + // or + if ( Match( childName, KXdmOccurenceId ) ) + { + occurenceId = ETrue; + } + else if ( Match( childName, KXdmClass ) ) + { + prclass = ETrue; + } + } + } + if ( allPersons && sequence ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + if ( sequence ) + { + if ( occurenceId && prclass ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + } + found = ETrue; + } + // + else if ( Match( element, KXdmProvideActivities ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideClass ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideDeviceId ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideMood ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvidePlaceIs ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvidePlaceType ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvidePrivacy ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideRelationship ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideStatusIcon ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideSphere ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideTimeOffset ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideUserInput ) ) + { + // value is restricted, allowed values + // are "false", "bare", "thresholds" and "full" + TPtrC8 data = aXdmNode.LeafNodeContent(); + if ( data.CompareF( KXdmFalse ) + && data.CompareF( KXdmBare ) + && data.CompareF( KXdmThresholds ) + && data.CompareF( KXdmFull ) ) + { + LeaveWithErrorL( KXcapErrorEnumerationRule ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmProvideNote ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideUnknownAttribute ) ) + { + // required attribute name + if ( !aXdmNode.HasAttribute( KXdmName ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmProvideAllAttributes ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmSubHandling ) ) + { + found = ETrue; + // value is restricted, allowed values + // are "block", "confirm", "polite-block" and "allow" + TPtrC8 data = aXdmNode.LeafNodeContent(); + if ( data.CompareF( KXdmBlock ) + && data.CompareF( KXdmConfirm ) + && data.CompareF( KXdmPoliteBlock ) + && data.CompareF( KXdmAllow ) ) + { + LeaveWithErrorL( KXcapErrorEnumerationRule ); + } + } + // urn:ietf:params:xml:ns:common-policy + if ( !found ) + { + found = iIetfCommonPolicy->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmIetfCommonPolicyNsPrefix ); + } + } + + if ( dataType != EDataTypeUndefined ) + { + // pass to the base class for data validation + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapIetfPresRulesUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // name + if ( Match( aXdmNodeAttr.NodeName(), KXdmName ) ) + { + // pass to base class for data validation + ValidateDataL( EDataTypeString, aXdmNodeAttr ); + } + // the rest are from urn:ietf:params:xml:ns:common-policy + else + { + iIetfCommonPolicy->ValidateAttributeL( aXdmNodeAttr ); + } + } + +// ---------------------------------------------------- +// CXcapIetfPresRulesUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapIetfPresRulesUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmIetfPresRulesNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmIetfPresRulesNamespace, KXdmIetfPresRulesNsPrefix ); // ESTI-7AY95P + aXdmDocument.AppendNamespaceL( KXdmIetfCommonPolicyNamespace, KXdmIetfCommonPolicyNsPrefix ); // ESTI-7AY95P + } + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/src/XcapOmaPresRulesUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapPresenceRulesUsage/src/XcapOmaPresRulesUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,267 @@ +/* +* Copyright (c) 2005 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: CXcapOmaPresRulesUsage +* +*/ + + + + +#include +#include +#include "XcapOmaPresRulesUsage.h" + +// Used specification +// OMA-TS-Presence_SIMPLE_XDM-V1_0-20060110-C, 10 January 2006 +// OMA-TS-Presence_SIMPLE_XDM-V1_0-20060418-C, 18 April 2006 + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::CXcapOmaPresRulesUsage +// +// ---------------------------------------------------- +// +CXcapOmaPresRulesUsage::CXcapOmaPresRulesUsage( const CXdmEngine& aXdmEngine ) : +CXcapAppUsage( aXdmEngine ), +iIetfPresRules( NULL ), +iIetfCommonPolicy( NULL ), +iOmaCommonPolicy( NULL ) + { + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::NewL +// +// ---------------------------------------------------- +// +CXcapOmaPresRulesUsage* CXcapOmaPresRulesUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapOmaPresRulesUsage* self = new ( ELeave ) CXcapOmaPresRulesUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::~CXcapOmaPresRulesUsage +// +// ---------------------------------------------------- +// +CXcapOmaPresRulesUsage::~CXcapOmaPresRulesUsage() + { + delete iIetfPresRules; + delete iIetfCommonPolicy; + delete iOmaCommonPolicy; + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapOmaPresRulesUsage::ConstructL() + { + iIetfPresRules = CXcapAppUsage::NewL( iXdmEngine, KXdmIetfPresRulesUsageUid ); + iIetfCommonPolicy = CXcapAppUsage::NewL( iXdmEngine, KXdmIetfCommonPolicyUsageUid ); + iOmaCommonPolicy = CXcapAppUsage::NewL( iXdmEngine, KXdmOmaCommonPolicyUsageUid ); + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapOmaPresRulesUsage::AUID() const + { + return TPtrC8( KXdmOmaPresRulesUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapOmaPresRulesUsage::ContentType() const + { + return TPtrC8( KXdmOmaPresRulesUsageContType ); + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapOmaPresRulesUsage::DefaultNamespace() const + { + //return TPtrC8( KXdmOmaPresRulesNamespace ); + // NOTE the default namespace is IetfCommonPolicy + return TPtrC8( KXdmIetfCommonPolicyNamespace ); + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::ValidateL +// +// ---------------------------------------------------- +// +TBool CXcapOmaPresRulesUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmProvideWillingness ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideNetworkAvailability ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideSessionParticipation ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideRegistrationState ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideBarringState ) ) + { + dataType = EDataTypeBoolean; + found = ETrue; + } + // + else if ( Match( element, KXdmProvideGeopriv ) ) + { + // value must be "false" or "full" + // 0 (false), 1 (full) + TPtrC8 data = aXdmNode.LeafNodeContent(); + if ( data.CompareF( KXdmFalse ) + && data.CompareF( KXdmFull ) ) + { + LeaveWithErrorL( KXcapErrorEnumerationRule ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmServiceId ) ) + { + dataType = EDataTypeString; + found = ETrue; + } + + // NOTE the default namespace is IetfCommonPolicy + if ( found ) + { + SetPrefixL( aXdmNode, KXdmOmaPresRulesNsPrefix ); + } + + // urn:ietf:params:xml:ns:pres-rules + // urn:ietf:params:xml:ns:common-policy + // urn:oma:xml:xdm:common-policy + else + { + // urn:ietf:params:xml:ns:common-policy + found = iIetfCommonPolicy->ValidateNodeL( aXdmNode ); + if ( found ) + { + // this means that this belongs to urn:ietf:params:xml:ns:common-policy, + // there may be the prefix already + // NOTE the default namespace is IetfCommonPolicy + SetPrefixL( aXdmNode, KNullDesC8 ); + } + else + { + // urn:ietf:params:xml:ns:pres-rules + found = iIetfPresRules->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmIetfPresRulesNsPrefix ); + } + else + { + // urn:oma:xml:xdm:common-policy + found = iOmaCommonPolicy->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmOmaCommonPolicyNsPrefix ); + } + } + } + } + + if ( dataType != EDataTypeUndefined ) + { + // pass to the base class for data validation + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapOmaPresRulesUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // there aren't any attributes in + // oma presence rules usage schema + // urn:ietf:params:xml:ns:pres-rules + // urn:ietf:params:xml:ns:common-policy + iIetfPresRules->ValidateAttributeL( aXdmNodeAttr ); + } + +// ---------------------------------------------------- +// CXcapOmaPresRulesUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapOmaPresRulesUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + // NOTE the default namespace is IetfCommonPolicy + aXdmDocument.AppendNamespaceL( KXdmIetfCommonPolicyNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmOmaCommonPolicyNamespace, KXdmOmaCommonPolicyNsPrefix ); + aXdmDocument.AppendNamespaceL( KXdmOmaPresRulesNamespace, KXdmOmaPresRulesNsPrefix ); + aXdmDocument.AppendNamespaceL( KXdmIetfPresRulesNamespace, KXdmIetfPresRulesNsPrefix ); +/* aXdmDocument.AppendNamespaceL( KXdmOmaPresRulesNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmIetfPresRulesNamespace, KXdmIetfPresRulesNsPrefix ); + aXdmDocument.AppendNamespaceL( KXdmIetfCommonPolicyNamespace, KXdmIetfCommonPolicyNsPrefix );*/ + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapResourceListsUsage/inc/XcapResourceListsUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapResourceListsUsage/inc/XcapResourceListsUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,102 @@ +/* +* Copyright (c) 2005 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: CXcapResourceListsUsage +* +*/ + + + + +#ifndef __XCAPRESOURCELISTSUSAGE__ +#define __XCAPRESOURCELISTSUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapResourceListsUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapResourceListsUsage* + */ + static CXcapResourceListsUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapResourceListsUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapResourceListsUsage( const CXdmEngine& aXdmEngine ); + }; + +#endif //__XCAPRESOURCELISTSUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapResourceListsUsage/src/XcapResourceListsUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapResourceListsUsage/src/XcapResourceListsUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,229 @@ +/* +* Copyright (c) 2005 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: CXcapResourceListsUsage +* +*/ + + + + +#include +#include +#include +#include "XcapResourceListsUsage.h" + +// Used specification +// draft-ietf-simple-xcap-list-usage-05, 7 February 2005 +// expires 8 August 2005 + +// ---------------------------------------------------- +// CXcapResourceListsUsage::CXcapResourceListsUsage +// +// ---------------------------------------------------- +// +CXcapResourceListsUsage::CXcapResourceListsUsage( const CXdmEngine& aXdmEngine ) : + CXcapAppUsage( aXdmEngine ) + { + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::NewL +// +// ---------------------------------------------------- +// +CXcapResourceListsUsage* CXcapResourceListsUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapResourceListsUsage* self = new ( ELeave ) CXcapResourceListsUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::~CXcapResourceListsUsage +// +// ---------------------------------------------------- +// +CXcapResourceListsUsage::~CXcapResourceListsUsage() + { + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapResourceListsUsage::ConstructL() + { + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapResourceListsUsage::AUID() const + { + return TPtrC8( KXdmResourceListsUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapResourceListsUsage::ContentType() const + { + return TPtrC8( KXdmResourceListsUsageContType ); + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapResourceListsUsage::DefaultNamespace() const + { + return TPtrC8( KXdmResourceListsNamespace ); + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::ValidateL +// +// ---------------------------------------------------- +// +TBool CXcapResourceListsUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmResourceLists) ) + { + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + // there should not be any other elements than + if ( !Match( aXdmNode.ChileNode(i)->NodeName(), KXdmList ) ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + } + found = ETrue; + } + // + else if ( Match( element, KXdmList ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmEntry ) ) + { + // required attribute uri + if ( !aXdmNode.HasAttribute( KXdmUri ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmEntryRef ) ) + { + if ( !aXdmNode.HasAttribute( KXdmRef ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmDisplayName ) ) + { + dataType = EDataTypeString; + found = ETrue; + } + + if ( dataType != EDataTypeUndefined ) + { + // pass to the base class for data validation + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapResourceListsUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + TDataType dataType ( EDataTypeUndefined ); + TPtrC attribute = aXdmNodeAttr.NodeName(); + + // name + if ( Match( attribute, KXdmName ) ) + { + dataType = EDataTypeString; + } + // uri + else if ( Match( attribute, KXdmUri ) ) + { + dataType = EDataTypeString; + } + // ref + else if ( Match( attribute, KXdmRef ) ) + { + dataType = EDataTypeAnyURI; + } + // anchor + else if ( Match( attribute, KXdmAnchor ) ) + { + dataType = EDataTypeAnyURI; + } + + if ( dataType != EDataTypeUndefined ) + { + // pass to base class for data validation + ValidateDataL( dataType, aXdmNodeAttr ); + } + } + +// ---------------------------------------------------- +// CXcapResourceListsUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapResourceListsUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmResourceListsNamespace, KNullDesC8 ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapRlsServicesUsage/inc/XcapRlsServicesUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapRlsServicesUsage/inc/XcapRlsServicesUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,106 @@ +/* +* Copyright (c) 2005 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: CXcapRlsServicesUsage +* +*/ + + + + +#ifndef __XCAPRLSSERVICESUSAGE__ +#define __XCAPRLSSERVICESUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapRlsServicesUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapRlsServicesUsage* + */ + static CXcapRlsServicesUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapRlsServicesUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapRlsServicesUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + CXcapAppUsage* iResourceLists; + }; + +#endif //__XCAPRLSSERVICESUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapRlsServicesUsage/src/XcapRlsServicesUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapRlsServicesUsage/src/XcapRlsServicesUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,271 @@ +/* +* Copyright (c) 2005 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: CXcapRlsServicesUsage +* +*/ + + + + +#include +#include +#include +#include "XcapRlsServicesUsage.h" + +// Used specification +// OMA-RLS_XDM_Specification-V1_0-20060214-C, 14 February 2006 + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::CXcapRlsServicesUsage +// +// ---------------------------------------------------- +// +CXcapRlsServicesUsage::CXcapRlsServicesUsage( const CXdmEngine& aXdmEngine ) : +CXcapAppUsage( aXdmEngine ), +iResourceLists( NULL ) + { + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::NewL +// +// ---------------------------------------------------- +// +CXcapRlsServicesUsage* CXcapRlsServicesUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapRlsServicesUsage* self = new ( ELeave ) CXcapRlsServicesUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::~CXcapRlsServicesUsage +// +// ---------------------------------------------------- +// +CXcapRlsServicesUsage::~CXcapRlsServicesUsage() + { + delete iResourceLists; + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapRlsServicesUsage::ConstructL() + { + iResourceLists = CXcapAppUsage::NewL( iXdmEngine, KXdmResourceListsUsageUid ); + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapRlsServicesUsage::AUID() const + { + return TPtrC8( KXdmRlsServicesUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapRlsServicesUsage::ContentType() const + { + return TPtrC8( KXdmRlsServicesUsageContType ); + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapRlsServicesUsage::DefaultNamespace() const + { + return TPtrC8( KXdmRlsServicesNamespace ); + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapRlsServicesUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + + TBool found( EFalse ); + TDataType dataType ( EDataTypeUndefined ); + TPtrC element = aXdmNode.NodeName(); + // + if ( Match( element, KXdmRlsServices ) ) + { + found = ETrue; + } + // + else if ( Match( element, KXdmService ) ) + { + // required attribute uri + if ( !aXdmNode.HasAttribute( KXdmUri ) ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + } + + // there should be either or + // element and mandatory element + TBool resourcelist( EFalse ); + TBool list( EFalse ); + TBool packages( EFalse ); + // go through all childs + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + TPtrC childName = aXdmNode.ChileNode(i)->NodeName(); + if ( Match( childName, KXdmResourceList ) ) + { + resourcelist = ETrue; + } + else if ( Match( childName, KXdmList ) ) + { + list = ETrue; + } + else if ( Match( childName, KXdmPackages ) ) + { + packages = ETrue; + } + } + // or , not both + if ( resourcelist && list ) + { + LeaveWithErrorL( KXcapErrorSchemaViolation ); + } + // each must have at least one element + if ( !packages ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredElement ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmResourceList ) ) + { + dataType = EDataTypeAnyURI; + found = ETrue; + } + // + else if ( Match( element, KXdmPackages ) ) + { + // each shall specify at least presence event package, + // go through all childs + TBool presence ( EFalse ); + TInt count( aXdmNode.NodeCount() ); + for ( TInt i(0); i < count; i++ ) + { + if ( Match( aXdmNode.ChileNode(i)->NodeName(), KXdmPackage ) ) + { + TPtrC8 data = aXdmNode.ChileNode(i)->LeafNodeContent(); + if ( !data.CompareF( KXdmPresence ) ) + { + presence = ETrue; + } + } + } + // check that the presence exists + if ( !presence ) + { + LeaveWithErrorL( KXcapErrorMissingRequiredElementValue ); + } + found = ETrue; + } + // + else if ( Match( element, KXdmPackage ) ) + { + dataType = EDataTypeString; + found = ETrue; + } + // type=rl:listType from urn:ietf:params:xml:ns:resource-lists + // however belongs to the default namespace + // ( btw, there is mistake in specification example ) + else if ( Match( element, KXdmList ) ) + { + found = iResourceLists->ValidateNodeL( aXdmNode ); + } + // , from urn:ietf:params:xml:ns:resource-lists + if ( !found ) + { + found = iResourceLists->ValidateNodeL( aXdmNode ); + if ( found ) + { + SetPrefixL( aXdmNode, KXdmResourceListsNsPrefix ); + } + } + if ( dataType != EDataTypeUndefined ) + { + // pass to the base class for data validation + ValidateDataL( dataType, aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapRlsServicesUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // uri + if ( Match( aXdmNodeAttr.NodeName(), KXdmUri ) ) + { + ValidateDataL( EDataTypeAnyURI, aXdmNodeAttr ); + } + // the rest are rom urn:ietf:params:xml:ns:resource-lists + else + { + iResourceLists->ValidateAttributeL( aXdmNodeAttr ); + } + } + +// ---------------------------------------------------- +// CXcapRlsServicesUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapRlsServicesUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + aXdmDocument.AppendNamespaceL( KXdmRlsServicesNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmResourceListsNamespace, KXdmResourceListsNsPrefix ); + } + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapSharedXDMUsage/inc/XcapSharedXDMUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapSharedXDMUsage/inc/XcapSharedXDMUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,107 @@ +/* +* Copyright (c) 2005 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: CXcapSharedXDMUsage +* +*/ + + + + +#ifndef __XCAPSHAREDXDMUSAGE__ +#define __XCAPSHAREDXDMUSAGE__ + +#include "XcapAppUsage.h" + + +// CLASS DECLARATION +class CXcapSharedXDMUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapSharedXDMUsage* + */ + static CXcapSharedXDMUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapSharedXDMUsage(); + + public: // From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapSharedXDMUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + CXcapAppUsage* iResListUsage; + + }; + +#endif //__XCAPSHAREDXDMUSAGE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapSharedXDMUsage/src/XcapSharedXDMUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapSharedXDMUsage/src/XcapSharedXDMUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,180 @@ +/* +* Copyright (c) 2005 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: CXcapSharedXDMUsage +* +*/ + + + + +#include +#include +#include "XcapSharedXDMUsage.h" + +// Used spesifications +// OMA-TS-XDM_Core-V1_0-20051103-C, 03 November 2005 +// OMA-TS-XDM_Shared-V1_0-20051006-C, 12 June 2006 + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::CXcapSharedXDMUsage +// +// ---------------------------------------------------- +// +CXcapSharedXDMUsage::CXcapSharedXDMUsage( +const CXdmEngine& aXdmEngine ) : CXcapAppUsage( aXdmEngine ), +iResListUsage( NULL ) + { + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::NewL +// +// ---------------------------------------------------- +// +CXcapSharedXDMUsage* CXcapSharedXDMUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapSharedXDMUsage* self = new ( ELeave ) CXcapSharedXDMUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::~CXcapSharedXDMUsage +// +// ---------------------------------------------------- +// +CXcapSharedXDMUsage::~CXcapSharedXDMUsage() + { + delete iResListUsage; + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapSharedXDMUsage::ConstructL() + { + iResListUsage = CXcapAppUsage::NewL( iXdmEngine, KXdmResourceListsUsageUid ); + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapSharedXDMUsage::AUID() const + { + return TPtrC8( KXdmSharedXDMUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapSharedXDMUsage::ContentType() const + { + return TPtrC8( KXdmSharedXDMUsageContType ); + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapSharedXDMUsage::DefaultNamespace() const + { + // we use urn:ietf:params:xml:ns:resource-lists + // as a default namespace + return TPtrC8( KXdmResourceListsNamespace ); + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapSharedXDMUsage::ValidateNodeL( CXdmDocumentNode& aXdmNode ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + TBool found ( EFalse ); + TPtrC element = aXdmNode.NodeName(); + + // + if ( Match( element, KXdmUriUsages ) ) + { + SetPrefixL( aXdmNode, KXdmSharedXDMUriUsageNsPrefix ); + found = ETrue; + } + // + else if ( Match( element, KXdmUriUsage ) ) + { + SetPrefixL( aXdmNode, KXdmSharedXDMUriUsageNsPrefix ); + found = ETrue; + } + // the rest are from urn:ietf:params:xml:ns:resource-lists + else + { + // do not append the namespace prefix here, + // since the used default namespace is + // urn:ietf:params:xml:ns:resource-lists + found = iResListUsage->ValidateNodeL( aXdmNode ); + } + return found; + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapSharedXDMUsage::ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // this usage doesn't have any attributes, + // all attributes are from urn:ietf:params:xml:ns:resource-lists + iResListUsage->ValidateAttributeL( aXdmNodeAttr ); + + } + +// ---------------------------------------------------- +// CXcapSharedXDMUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapSharedXDMUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + // we use urn:ietf:params:xml:ns:resource-lists + // as a default namespace + aXdmDocument.AppendNamespaceL( KXdmResourceListsNamespace, KNullDesC8 ); + aXdmDocument.AppendNamespaceL( KXdmSharedXDMUriUsageNamespace, KXdmSharedXDMUriUsageNsPrefix ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapTestAppUsage/inc/XcapTestAppUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapTestAppUsage/inc/XcapTestAppUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,114 @@ +/* +* Copyright (c) 2005 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: CXcapTestAppUsage +* +*/ + + + + +#ifndef __XCAPTESTAPPUSAGE__ +#define __XCAPTESTAPPUSAGE__ + +#include "XcapAppUsage.h" + +// CONSTANTS +// Define here literals for element names if they +// aren't already defined in AppUsageDef.h +// _LIT( KExample, "example" ); +// _LIT( KExampleElement, "example-element" ); +// _LIT( KExampleElement2, "example-element2" ); +// _LIT( KExampleElement3, "example-element3" ); +// _LIT( KExampleAttr1, "exampleAttr1" ); +// _LIT( KExampleAttr2, "exampleAttr2" ); + +// CLASS DECLARATION +class CXcapTestAppUsage : public CXcapAppUsage + { + public: + + /** + * Symbian OS constructor + * @param TXcapAppUsageParams Parameters + * @return CXcapTestAppUsage* + */ + static CXcapTestAppUsage* NewL( const TXcapAppUsageParams& aParameters ); + + /** + * Destructor + */ + virtual ~CXcapTestAppUsage(); + + public: //From CXcapAppUsage + + /** + * AUID for this usage + * @return AUID + */ + TPtrC8 AUID() const; + + /** + * MIME type for this usage + * @return MIME type + */ + TPtrC8 ContentType() const; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + TPtrC8 DefaultNamespace() const; + + /** + * Validate the node in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmDocumentNode& reference to the node + * @return ETrue, if the node belongs to the appusage's namespace + */ + TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ); + + /** + * Validate the attribute in the parameter + * Leaves with system wide error codes or + * with error defined in XdmErrors.h + * @param CXdmNodeAttribute& reference to the attribute + */ + void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * Add namespaces and namespace prefixes used in document + * @param CXdmDocument& reference to the document + */ + void AddNamespaceInformationL( CXdmDocument& aXdmDocument ); + + private: + + /** + * Second phase construction + */ + void ConstructL(); + + /** + * Prohibit copy costructor + */ + CXcapTestAppUsage( const CXdmEngine& aXdmEngine ); + + private: // Data + + }; + +#endif //__XCAPTESTAPPUSAGE__ + + // End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/XcapTestAppUsage/src/XcapTestAppUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/XcapTestAppUsage/src/XcapTestAppUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,203 @@ +/* +* Copyright (c) 2005 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: CXcapTestAppUsage +* +*/ + + + + +#include "XcapTestAppUsage.h" + +// ---------------------------------------------------- +// CXcapTestAppUsage::CXcapTestAppUsage +// +// ---------------------------------------------------- +// +CXcapTestAppUsage::CXcapTestAppUsage( const CXdmEngine& aXdmEngine ) : + CXcapAppUsage( aXdmEngine ) + { + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::NewL +// +// ---------------------------------------------------- +// +CXcapTestAppUsage* CXcapTestAppUsage::NewL( const TXcapAppUsageParams& aParameters ) + { + CXcapTestAppUsage* self = new ( ELeave ) CXcapTestAppUsage( aParameters.iXdmEngine ); + CleanupStack::PushL( self ); // << self + self->ConstructL(); + CleanupStack::Pop( self ); // >> self + return self; + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::~CXcapTestAppUsage +// +// ---------------------------------------------------- +// +CXcapTestAppUsage::~CXcapTestAppUsage() + { + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::ConstructL +// +// ---------------------------------------------------- +// +void CXcapTestAppUsage::ConstructL() + { + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::AUID +// +// ---------------------------------------------------- +// +TPtrC8 CXcapTestAppUsage::AUID() const + { + return TPtrC8( KXdmTestAppUsageAUID ); + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::ContentType +// +// ---------------------------------------------------- +// +TPtrC8 CXcapTestAppUsage::ContentType() const + { + return TPtrC8( KXdmTestAppUsageContType ); + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::DefaultNamespace +// +// ---------------------------------------------------- +// +TPtrC8 CXcapTestAppUsage::DefaultNamespace() const + { + return TPtrC8( KXdmTestAppUsageDefaultNamespace ); + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::ValidateNodeL +// +// ---------------------------------------------------- +// +TBool CXcapTestAppUsage::ValidateNodeL( CXdmDocumentNode& /*aXdmNode*/ ) + { + // This method is called by base class for each element + // in document, here we have to declare every element, check element + // datatype, restrictions for values and also do all checking that concerns + // the structure of the element. If the datatype is some of + // the common datatypes defined in xcapappusage.h, the node + // can pe passed to the base class for value validation. + // If the node belongs to this namespace, the return value + // should be true, false otherwise. + + + // TBool found ( EFalse ); + // TDataType dataType ( EDataTypeUndefined ); + // TPtrC element = aXdmNode.NodeName(); + + // + // if ( Match( element, KExampleElement ) ) + // { + // supported data types are defined in AppUsageDef + // dataType = EDataTypeBoolean; + // found = ETrue; + // } + // + // else if ( Match( element, KExampleElement2 ) ) + // { + // required attribute attribute + // if ( !aXdmNode.HasAttribute( KAttribute ) ) + // { + // LeaveWithErrorL( KXcapErrorMissingRequiredAttribute ); + // } + // found = ETrue; + // } + // + // else if ( Match( element, KExampleElement3 ) ) + // { + // TInt count( aXdmNode.NodeCount() ); + // for ( TInt i(0); i < count; i++ ) + // { + // there should not be any other elements than + // if ( !Match( aXdmNode.ChileNode(i)->NodeName(), KExample ) ) + // { + // LeaveWithErrorL( KXcapErrorSchemaViolation ); + // } + // } + // found = ETrue; + // } + + // if ( dataType != EDataTypeUndefined ) + // { + // pass to the base class for data validation + // ValidateDataL( dataType, aXdmNode ); + // } + // return found; + + return EFalse; + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::ValidateAttributeL +// +// ---------------------------------------------------- +// +void CXcapTestAppUsage::ValidateAttributeL( const CXdmNodeAttribute& /*aXdmNodeAttr*/ ) + { + // This method is called by base class for each attribute + // in document, here we have to define data types + // for attributes, and pass them to the base class + // for the actual data checking. + + // TDataType dataType ( EDataTypeUndefined ); + // TPtrC attribute = aXdmNodeAttr.NodeName(); + + // exampleAttr1 + // if ( Match( attribute, KExampleAttr1 ) ) + // { + // dataType = EDataTypeString; + // } + // exampleAttr2 + // else if ( Match( attribute, KExampleAttr2 ) ) + // { + // dataType = EDataTypeString; + // } + + // if ( dataType != EDataTypeUndefined ) + // { + // pass to base class for data validation + // ValidateDataL( dataType, aXdmNodeAttr ); + // } + } + +// ---------------------------------------------------- +// CXcapTestAppUsage::AddNamespaceInformationL +// +// ---------------------------------------------------- +// +void CXcapTestAppUsage::AddNamespaceInformationL( CXdmDocument& aXdmDocument ) + { + // default namespace prefix should be empty + aXdmDocument.AppendNamespaceL( KXdmTestAppUsageDefaultNamespace, KNullDesC8 ); + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/eabi/XcapAppUsageU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/eabi/XcapAppUsageU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,32 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + _ZN13CXcapAppUsage4NewLERK10CXdmEnginei @ 2 NONAME + _ZN13CXcapAppUsage8ValidateER12CXdmDocumenti @ 3 NONAME + _ZN13CXcapAppUsage8ValidateER16CXdmDocumentNodeP17MXcapUriInterfacei @ 4 NONAME + _ZTI13CXcapAppUsage @ 5 NONAME + _ZTI18CXcapPocGroupUsage @ 6 NONAME + _ZTI19CXcapDirectoryUsage @ 7 NONAME + _ZTI19CXcapSharedXDMUsage @ 8 NONAME + _ZTI20CXcapCapabilityUsage @ 9 NONAME + _ZTI21CXcapRlsServicesUsage @ 10 NONAME + _ZTI22CXcapOmaPresRulesUsage @ 11 NONAME + _ZTI23CXcapIetfPresRulesUsage @ 12 NONAME + _ZTI23CXcapPocUserAccessUsage @ 13 NONAME + _ZTI23CXcapResourceListsUsage @ 14 NONAME + _ZTI25CXcapOmaCommonPolicyUsage @ 15 NONAME + _ZTI26CXcapIetfCommonPolicyUsage @ 16 NONAME + _ZTI7CXcapC4 @ 17 NONAME + _ZTV13CXcapAppUsage @ 18 NONAME + _ZTV18CXcapPocGroupUsage @ 19 NONAME + _ZTV19CXcapDirectoryUsage @ 20 NONAME + _ZTV19CXcapSharedXDMUsage @ 21 NONAME + _ZTV20CXcapCapabilityUsage @ 22 NONAME + _ZTV21CXcapRlsServicesUsage @ 23 NONAME + _ZTV22CXcapOmaPresRulesUsage @ 24 NONAME + _ZTV23CXcapIetfPresRulesUsage @ 25 NONAME + _ZTV23CXcapPocUserAccessUsage @ 26 NONAME + _ZTV23CXcapResourceListsUsage @ 27 NONAME + _ZTV25CXcapOmaCommonPolicyUsage @ 28 NONAME + _ZTV26CXcapIetfCommonPolicyUsage @ 29 NONAME + _ZTV7CXcapC4 @ 30 NONAME + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/group/XcapAppUsage.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/group/XcapAppUsage.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,120 @@ +/* +* Copyright (c) 2005 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: XcapAppUsage.mmp +* +*/ + + + +#include + +TARGET xcapappusage.dll +TARGETTYPE PLUGIN +UID 0x10009D8D 0x10207416 +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT + +SOURCEPATH ../src +SOURCE XcapAppUsage.cpp + +START RESOURCE 10207416.rss + TARGET xcapappusage.rsc +END + +//Capability application usage +SOURCEPATH ../XcapCapabilityUsage/src +SOURCE XcapCapabilityUsage.cpp + +//Directory application usage +SOURCEPATH ../XcapDirectoryUsage/src +SOURCE XcapDirectoryUsage.cpp + +//PocGroup application usage +SOURCEPATH ../XcapPocGroupUsage/src +SOURCE XcapPocGroupUsage.cpp + +//PocUserAccessPolicy application usage +SOURCEPATH ../XCapPocUserAccessUsage/src +SOURCE XcapPocUserAccessUsage.cpp + +// SharedXDM application usage +SOURCEPATH ../XcapSharedXDMUsage/src +SOURCE XcapSharedXDMUsage.cpp + +//RlsServices application usage +SOURCEPATH ../XcapRlsServicesUsage/src +SOURCE XcapRlsServicesUsage.cpp + +//ResourceLists application usage +SOURCEPATH ../XcapResourceListsUsage/src +SOURCE XcapResourceListsUsage.cpp + +//CommonPolicyCaps application usage +SOURCEPATH ../XCapCommonPolicyCapsUsage/src +SOURCE XcapOmaCPUsage.cpp +SOURCE XcapIetfCPUsage.cpp + +// PresenceRules application usage +SOURCEPATH ../XcapPresenceRulesUsage/src +SOURCE XcapIetfPresRulesUsage.cpp +SOURCE XcapOmaPresRulesUsage.cpp + +// Example application usage +// SOURCEPATH ../XcapTestAppUsage/src +// SOURCE XcapTestAppUsage.cpp + +// PRES-CONTENT STARTS +SOURCEPATH ../XcapC4/src +SOURCE XcapC4.cpp +// PRES-CONTENT ENDS +USERINCLUDE ../inc +USERINCLUDE ../../inc +USERINCLUDE ../XcapCapabilityUsage/inc +USERINCLUDE ../XcapDirectoryUsage/inc +USERINCLUDE ../XcapPocGroupUsage/inc +USERINCLUDE ../XCapPocUserAccessUsage/inc +USERINCLUDE ../XcapSharedXDMUsage/inc +USERINCLUDE ../XcapRlsServicesUsage/inc +USERINCLUDE ../XcapResourceListsUsage/inc +USERINCLUDE ../XCapCommonPolicyCapsUsage/inc +USERINCLUDE ../XcapPresenceRulesUsage/inc +// USERINCLUDE ../XcapTestAppUsage/inc + +USERINCLUDE ../../../../inc +// PRES-CONTENT STARTS +USERINCLUDE ../XcapC4/inc +// PRES-CONTENT ENDS +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/ecom +SYSTEMINCLUDE ../../../../inc + +LIBRARY ecom.lib +LIBRARY euser.lib +LIBRARY XdmEngine.lib +LIBRARY centralrepository.lib + +DEBUGLIBRARY efsrv.lib +DEBUGLIBRARY flogger.lib + + + +#if defined( ARMCC ) + DEFFILE ../eabi/ +#elif defined ( WINSCW ) + deffile ../BWINSCW/ +#elif defined (WINS ) + deffile ../BWINS/ +#endif + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2005 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: XcapAppUsage bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_EXPORTS +//-------------------- + + +//-------------------- +PRJ_MMPFILES +//-------------------- + +XcapAppUsage.mmp diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/inc/XcapAppUsage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/inc/XcapAppUsage.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,498 @@ +/* +* Copyright (c) 2005 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: CXcapAppUsage +* +*/ + + + + +#ifndef __XCAPAPPUSAGE__ +#define __XCAPAPPUSAGE__ + +// INCLUDES +#include + +#include +#include +#include "XcapAppUsageDef.h" + +// CONSTANTS +#ifdef _DEBUG +_LIT( KXdmAppUsageLogDir, "Xdm" ); +_LIT( KXdmAppUsageLogFile, "XcapAppUsage.txt" ); +const TInt KAppUsageLogBufferMaxSize = 2000; +#endif + +_LIT( KXdmDefaultNsAttrName, "xmlns"); +_LIT( KXdmNonDefaultNsAttrName, "xmlns:"); +const TInt KXdmMaxPrefixLength = 10; + +// FORWARD DECLARATIONS +class CXdmDocument; +class MXcapUriInterface; + +// NOTE +// If _NAMESPACES_TO_NODE_SELECTOR flag is defined, used namespaces will be added to the node selector +// when updating partial documents. +// The default namespace of the usage will not be added. +#define _NAMESPACES_TO_NODE_SELECTOR + +// If _ADD_NAMESPACE_ATTRIBUTES flag is defined, namespace information is +// added as an node atttribute when updating partial documents. +// The default namespace of the usage will not be added. +#define _ADD_NAMESPACE_ATTRIBUTES + +/** +* A helper class for parameter passing from +* the XCAP protocol to the application usage +* +* NOTE: There will most probably be more than one parameter! +* +*/ +class TXcapAppUsageParams + { + public: + + /** + * @param CXdmEngine& XDM Engine + * @return TXcapAppUsageParams + */ + TXcapAppUsageParams( const CXdmEngine& aXdmEngine ) : + iXdmEngine( aXdmEngine ){} + + public: + + const CXdmEngine& iXdmEngine; + }; + +// CLASS DECLARATION +/** +* Application usage base class +*/ +class CXcapAppUsage : public CBase + { + public: + + /** + * Symbian OS constructor + * @param aXdmEngine XdmEngine reference + * @param aDocumentType Type of the document + * @return CXcapAppUsage* + * REMOVE THIS WHEN USAGE IN ENGINE CHANGED!!! + */ + static CXcapAppUsage* NewL( const CXdmEngine& aXdmEngine, + const TXdmDocType aDocumentType ); + + /** + * Symbian OS constructor + * @param aXdmEngine XdmEngine reference + * @param aDocumentType Type of the document + * @return CXcapAppUsage* + */ + IMPORT_C CXcapAppUsage* NewL( const CXdmEngine& aXdmEngine, + const TInt aDocumentType ); + + /** + * Destructor + */ + virtual ~CXcapAppUsage(); + + /** + * Validate the document in the parameter. + * Calls ValidateNodeL( aXdmNode ) method from derived class + * for each node in document and ValidateAttributeL( aXdmNodeAttr ) + * for each attribute in document. If the document is outgoing, + * calls also AddNamespaceInformationL method from derived class. + * @param aXdmDocument document reference + * @param aAddNamespaces if true, the namespaces will be added + * @return KErrNone or error code. + */ + IMPORT_C TInt Validate( CXdmDocument& aXdmDocument, TBool aAddNamespaces ) ; + + /** + * Validate the node in the parameter. + * Calls ValidateNodeL( aXdmNode ) method from derived class for + * current node and it's descendants and ValidateAttributeL( aXdmNodeAttr ) + * for each attribute. Stores the uri of the node. + * @param aXdmNode node reference + * @param TBool aIsGetOrDelete indication of http get or delete + * @return KErrNone or error code. + */ + IMPORT_C TInt Validate( CXdmDocumentNode& aXdmNode, + MXcapUriInterface* aUriInterface, + TBool aIsGetOrDelete ) ; + + + + public: // Application Usage API + + /** + * AUID for this usage + * @return AUID + */ + virtual TPtrC8 AUID() const = 0; + + /** + * MIME type for this usage + * @return MIME type + */ + virtual TPtrC8 ContentType() const = 0; + + /** + * Default namespace for this usage + * @return Default namespace definition + */ + virtual TPtrC8 DefaultNamespace() const = 0; + + /** + * Validate the node in the parameter + * This method is called by base class for each node + * in document, here we have to check element datatype, + * restrictions for values and also do all checking that concerns + * the structure of the element. If the datatype is some of + * the common datatypes defined in xcapappusage.h, the node + * can pe passed to the base class for value validation. + * @param CXdmDocumentNode& node reference + * @return True, if the node belongs to the current namespace + */ + virtual TBool ValidateNodeL( CXdmDocumentNode& aXdmNode ) = 0; + + /** + * Validate the attribute in the parameter + * This method is called by base class for each attribute + * in document, here we have to define data types + * for attributes, and pass them to the base class + * for the actual data checking. + * @param aXdmNodeAttr attribute reference + */ + virtual void ValidateAttributeL( const CXdmNodeAttribute& aXdmNodeAttr ) = 0; + + /** + * Add namespaces and namespace prefixes used in document + * @param aXdmDocument document reference + */ + virtual void AddNamespaceInformationL( CXdmDocument& aXdmDocument ) = 0; + + + protected: + + /** + * C++ constructor + */ + CXcapAppUsage( const CXdmEngine& aXdmEngine ); + + /** + * Validates basic data types + * @param aDataType type of the data + * @param aXdmNode node reference + */ + void ValidateDataL ( TDataType aDataType, CXdmDocumentNode& aXdmNode ); + + /** + * Validates basic data types + * @param aDataType type of the data + * @param aXdmNodeAttr attribute reference + */ + void ValidateDataL ( TDataType aDataType, const CXdmNodeAttribute& aXdmNodeAttr ); + + /** + * If outgoing document, adds namespacePrefix + * to the node in parameter + * @param aXdmNode node reference + * @param aPrefix namespace prefix + */ + void SetPrefixL( CXdmDocumentNode& aXdmNode, const TDesC8& aPrefix ); + + /** + * Helper method for string comparison + * @param aLeft first string + * @param aRight second string + * @return ETrue, if the strings are equal + */ + TBool Match( const TDesC& aLeft, const TDesC& aRight ); + + /** + * Helper method for string comparison + * @param aLeft first string + * @param aRight second string + * @return ETrue, if the strings are equal + */ + TBool Match( const TDesC8& aLeft, const TDesC8& aRight ); + + /** + * To be used when an error occurs, however if the node is + * for http get or delete request, this do not leave + * @param aErrorCode function will leave with this error code + */ + void LeaveWithErrorL( TInt aErrorCode ); + +#ifdef _DEBUG + /** + * Writes logs to file. + */ + void WriteToLog( TRefByValue aFmt,... ); +#endif + + private: + + /** + * Validate the document in the parameter. + * @param aXdmDocument document reference + */ + void DoValidateL( CXdmDocument& aXdmDocument ) ; + + /** + * Validate the node in the parameter. + * @param aXdmNode node reference + */ + void DoValidateL( CXdmDocumentNode& aXdmNode ) ; + + /** + * Validates basic data types + * @param aDataType type of the data + * @param aData validated data + */ + void ValidateDataL ( TDataType aDataType, TDesC8& aData ); + + /** + * Updates member variables for used namespaces + * @param aPrefix prefix of the namespace + */ + void AddUsedNamespace( const TDesC8& aPrefix ) ; + + /** + * Resets member variables for used namespaces + */ + void ResetUsedNamespaces( ); + + /** + * Appends namespace information to the node's uri interface. + * Called if _NAMESPACES_TO_NODE_SELECTOR defined. + * @param aUriInterface interface for storing the uri + */ + void AppendUsedNamespacesL( MXcapUriInterface* aUriInterface ); + + /** + * Creates namespace attribute for the node. + * Called if _ADD_NAMESPACE_ATTRIBUTES is defined + * and validating partial document. + * @param aXdmNode node for storing the uri + */ + void CreateNamespaceAttributesL( CXdmDocumentNode& aXdmNode, MXcapUriInterface* aUriInterface ); + + /** + * Removes namespace attributes from the node + * and it's child nodes + * @param aXdmNode + */ + void RemoveNamespaceAttributesL( CXdmDocumentNode& aXdmNode ); + + /** + * Adds namespace attributes that are used in + * partial document + * @param aXdmNode + */ + void AppendNamespaceAttributesL( CXdmDocumentNode& aXdmNode ) ; + + /** + * Creates namespace attribute for node + * @param aXdmNode + * @param aPrefix prefix of the namespace + * @param aNamespace namespace definition + */ + void CreateNamespaceAttributeL( CXdmDocumentNode& aXdmNode, const TDesC8& aPrefix, const TDesC8& aNamespace ); + + + /** + * Goes through all nodes and checks if + * default namespace is used in document fragment + * the namespace given in parameter + * @param aXdmNode + * @return ETrue or EFalse + */ + TBool DefaultNamespaceUsed( CXdmDocumentNode& aXdmNode ); + + protected: // Data + + CXdmEngine& iXdmEngine; + + private: // Data + + TBool iAddNamespaces; + TBool iNsToNodeSelector; + TBool iAddNsAttributes; + TBool iIsGetOrDelete; + TUid iDestructorKey; + // Variables for used namespaces + // Add new one here if needed + TBool iRL; + TBool iCR; + TBool iCP ; + TBool iPR; + TBool iLS; + TBool iPOC; + TBool iOPR; + TBool iRLS; + TBool iOU; + // add new prefix definitions here + + + }; + + +// ---------------------------------------------------- +// CXcapAppUsage::NewL +// Create a new application usage implementation +// REMOVE THIS WHEN USAGE IN ENGINE CHANGED!!! +// ---------------------------------------------------- +// +inline CXcapAppUsage* CXcapAppUsage::NewL( const CXdmEngine& aXdmEngine, + const TXdmDocType aDocumentType ) + { + TAny* ptr = NULL; + TXcapAppUsageParams params( aXdmEngine ); + switch( aDocumentType ) + { + case EXdmCapabilities: + { + TUid KDefaultImplementationUid = { 0x10207418 }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmDirectory: + { + TUid KDefaultImplementationUid = { 0x10207419 }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmTestDocType: + { + TUid KDefaultImplementationUid = { 0x1020741A }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmPoCGroup: + { + TUid KDefaultImplementationUid = { 0x1020741B }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmPoCUserAccessPolicy: + { + TUid KDefaultImplementationUid = { 0x1020741C }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmSharedXdm: + { + TUid KDefaultImplementationUid = { 0x1020741D }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmRlsServices: + { + TUid KDefaultImplementationUid = { 0x1020741E }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmResourceLists: + { + TUid KDefaultImplementationUid = { 0x10275080 }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmIetfCommonPolicy: + { + TUid KDefaultImplementationUid = { 0x10275081 }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmOmaCommonPolicy: + { + TUid KDefaultImplementationUid = { 0x10275082 }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmIetfPresenceRules: + { + TUid KDefaultImplementationUid = { 0x10275083 }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; + case EXdmOmaPresenceRules: + { + TUid KDefaultImplementationUid = { 0x102750AB }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; +// PRES-CONTENT STARTS + case EXdmPresContent: + { + TUid KDefaultImplementationUid = { 0x20028701 }; + TRAPD( error, ptr = REComSession::CreateImplementationL( + KDefaultImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ) ); + } + break; +// PRES-CONTENT ENDS + default: + User::Leave( KErrNotSupported ); + } + return reinterpret_cast( ptr ); + } + + +#endif //__XCAPAPPUSAGE__ + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/inc/XcapAppUsageDef.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/inc/XcapAppUsageDef.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2005 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: XcapAppUsage enumerations +* +*/ + + + + +#ifndef __XCAPAPPUSAGEDEF__ +#define __XCAPAPPUSAGEDEF__ + +// Supported data types +enum TDataType + { + EDataTypeUndefined = 0, + EDataTypeString, + EDataTypeNonNegativeInteger, + EDataTypeAnyURI, + EDataTypeDateTime, + EDataTypeBoolean, + EDataTypeToken, + EDataTypeEmpty + }; + +// AUIDs +_LIT8( KXdmResourceListsUsageAUID, "/resource-lists/" ); +_LIT8( KXdmCapabilityUsageAUID, "/xcap-caps/" ); +_LIT8( KXdmDirectoryUsageAUID, "/org.openmobilealliance.xcap-directory/" ); +_LIT8( KXdmIetfCommonPolicyUsageAUID, "/policy-capabilities/" ); +_LIT8( KXdmOmaCommonPolicyUsageAUID, "/org.openmobilealliance.policy-capabilities/" ); +_LIT8( KXdmPocUserAccessUsageAUID, "/org.openmobilealliance.poc-rules/" ); +_LIT8( KXdmIetfPresRulesUsageAUID, "/pres-rules/" ); +_LIT8( KXdmRlsServicesUsageAUID, "/rls-services/" ); +_LIT8( KXdmSharedXDMUsageAUID, "/resource-lists/" ); +_LIT8( KXdmOmaPresRulesUsageAUID, "/org.openmobilealliance.pres-rules/" ); +_LIT8( KXdmPocGroupUsageAUID, "/org.openmobilealliance.poc-groups/" ); +// add new AUID definitions here +//_LIT8( KXdmTestAppUsageAUID, "/org.foo.bar/" ); +// PRES-CONTENT starts +_LIT8( KXdmPresContentAUID, "/org.openmobilealliance.pres-content/" ); +// PRES-CONTENT ends + +// ContentTypes +_LIT8( KXdmResourceListsUsageContType, "application/resource-lists+xml" ); +_LIT8( KXdmCapabilityUsageContType, "application/xcap-caps+xml" ); +_LIT8( KXdmDirectoryUsageContType, "application/oma-directory+xml" ); +_LIT8( KXdmIetfCommonPolicyUsageContType, "application/policy-caps+xml" ); +_LIT8( KXdmOmaCommonPolicyUsageContType, "application/policy-caps+xml" ); +_LIT8( KXdmSharedXDMUsageContType, "application/resource-lists+xml" ); +_LIT8( KXdmIetfPresRulesUsageContType, "application/auth-policy+xml" ); +_LIT8( KXdmPocUserAccessUsageContType, "application/auth-policy+xml" ); +_LIT8( KXdmOmaPresRulesUsageContType, "application/auth-policy+xml" ); +_LIT8( KXdmRlsServicesUsageContType, "application/rls-services+xml" ); +_LIT8( KXdmPocGroupUsageContType, "application/vnd.oma.poc.groups+xml" ); +// add new content types here +//_LIT8( KXdmTestAppUsageContType, "application/test-type+xml" ); +// PRES-CONTENT starts +_LIT8( KXdmPresContentContType, "application/vnd.oma.pres-content+xml" ); +_LIT8( KXdmPresContentContTypeOld, "application/vnd.oma.content+xml" ); +// PRES-CONTENT ends + +// Namespaces +_LIT8( KXdmResourceListsNamespace, "urn:ietf:params:xml:ns:resource-lists" ); +_LIT8( KXdmCapabilityNamespace, "urn:ietf:params:xml:ns:xcap-caps" ); +_LIT8( KXdmDirectoryNamespace, "urn:oma:params:xml:ns:xcap-directory" ); +_LIT8( KXdmIetfCommonPolicyNamespace, "urn:ietf:params:xml:ns:common-policy" ); +_LIT8( KXdmOmaCommonPolicyNamespace, "urn:oma:xml:xdm:common-policy" ); +_LIT8( KXdmOmaPresRulesNamespace, "urn:oma:xml:prs:pres-rules" ); +_LIT8( KXdmIetfPresRulesNamespace, "urn:ietf:params:xml:ns:pres-rules" ); +_LIT8( KXdmRlsServicesNamespace, "urn:ietf:params:xml:ns:rls-services" ); +_LIT8( KXdmSharedXDMUriUsageNamespace, "urn:oma:params:xml:ns:resource-list:oma-uriusage" ); +_LIT8( KXdmPocUserAccessNamespace, "urn:oma:xml:poc:poc-rules" ); +_LIT8( KXdmPocGroupNamespace, "urn:oma:xml:poc:list-service" ); +// add new namespace definitions here +// PRES-CONTENT starts +_LIT8( KXdmPresContentNamespace, "urn:oma:xml:prs:pres-content" ); +// PRES-CONTENT ends + +// Namespace prefixes +_LIT8( KXdmSharedXDMUriUsageNsPrefix, "ou" ); +_LIT8( KXdmResourceListsNsPrefix, "rl" ); +_LIT8( KXdmIetfCommonPolicyNsPrefix, "cr" ); +_LIT8( KXdmOmaCommonPolicyNsPrefix, "ocp" ); +_LIT8( KXdmIetfPresRulesNsPrefix, "pr" ); +_LIT8( KXdmTestAppUsageDefaultNamespace, "ta" ); +_LIT8( KXdmPocUserAccessNsPrefix, "poc" ); +_LIT8( KXdmOmaPresRulesNsPrefix, "opr" ); +_LIT8( KXdmRlsServicesNsPrefix, "rls" ); +_LIT8( KXdmPocGroupNsPrefix, "ls" ); +// add new namespace prefix definitions here + +// Common literals +_LIT( KXdmAuid, "auid" ); +_LIT( KXdmUri, "uri" ); +_LIT( KXdmEtag, "etag" ); +_LIT( KXdmName, "name" ); +_LIT( KXdmRef, "ref" ); +_LIT( KXdmUse, "use" ); +_LIT( KXdmRuleset, "ruleset" ); +_LIT( KXdmEntry, "entry" ); +_LIT( KXdmEntity, "entity" ); +_LIT( KXdmId, "id" ); +_LIT( KXdmAnyIdentity, "any-identity" ); +_LIT( KXdmIdentity, "identity" ); +_LIT( KXdmDomain, "domain" ); +_LIT( KXdmAnc, "anc" ); +_LIT( KXdmDisplayName, "display-name" ); +_LIT( KXdmAnchor, "anchor" ); +_LIT( KXdmExternal, "external" ); +_LIT( KXdmList, "list" ); +_LIT( KXdmServiceId, "service-id" ); +_LIT8( KXdmZero, "0" ); +_LIT8( KXdmOneNbr, "1" ); +_LIT8( KXdmTrue, "true" ); +_LIT8( KXdmFalse, "false"); +_LIT8( KXdmFull, "full" ); +_LIT8( KXdmAllow, "allow" ); +_LIT8( KXdmBlock, "block" ); + +// Literals for capability +_LIT( KXdmExtensions, "extensions" ); +_LIT( KXdmExtension, "extension" ); +_LIT( KXdmAuids, "auids" ); +_LIT( KXdmNamespaces, "namespaces" ); +_LIT( KXdmNamespace, "namespace"); + +// Literals for directory +_LIT( KXdmXcapDirectory, "xcap-directory" ); +_LIT( KXdmFolder, "folder" ); +_LIT( KXdmErrorCode, "error-code" ); +_LIT( KXdmLastModified, "last-modified" ); +_LIT( KXdmSize, "size" ); + +// Literals for presence +_LIT( KXdmServiceUriScheme, "service-uri-scheme" ); +_LIT( KXdmClass, "class" ); +_LIT( KXdmOccurenceId, "occurence-id" ); +_LIT( KXdmServiceUri, "service-uri" ); +_LIT( KXdmAllServices, "all-services" ); +_LIT( KXdmProvideServices, "provide-services" ); +// pres-rules-03 +_LIT( KXdmDeviceId, "device-id" ); +// pres-rules-05 +_LIT( KXdmDeviceID, "deviceID" ); +_LIT( KXdmAllDevices, "all-devices" ); +_LIT( KXdmProvideDevices, "provide-devices" ); +_LIT( KXdmAllPersons, "all-persons" ); +_LIT( KXdmProvidePersons, "provide-persons" ); +_LIT( KXdmProvideActivities, "provide-activities" ); +_LIT( KXdmProvideClass, "provide-class" ); +_LIT( KXdmProvideDeviceId, "provide-device-id" ); +_LIT( KXdmProvideMood, "provide-mood" ); +_LIT( KXdmProvidePlaceIs, "provide-place-is" ); +_LIT( KXdmProvidePlaceType, "provide-place-type" ); +_LIT( KXdmProvidePrivacy, "provide-privacy" ); +_LIT( KXdmProvideRelationship, "provide-relationship" ); +_LIT( KXdmProvideStatusIcon, "provide-status-icon" ); +_LIT( KXdmProvideSphere, "provide-sphere" ); +_LIT( KXdmProvideTimeOffset, "provide-time-offset" ); +_LIT( KXdmProvideUserInput, "provide-user-input" ); +_LIT( KXdmProvideNote, "provide-note" ); +_LIT( KXdmProvideUnknownAttribute, "provide-unknown-attribute" ); +_LIT( KXdmProvideAllAttributes, "provide-all-attributes" ); +_LIT( KXdmSubHandling, "sub-handling" ); +_LIT( KXdmProvideWillingness, "provide-willingness" ); +_LIT( KXdmProvideNetworkAvailability, "provide-network-availability" ); +_LIT( KXdmProvideSessionParticipation, "provide-session-participation" ); +_LIT( KXdmProvideGeopriv, "provide-geopriv" ); +_LIT( KXdmProvideRegistrationState, "provide-registration-state" ); +_LIT( KXdmProvideBarringState, "provide-barring-state" ); +_LIT8( KXdmBare, "bare" ); +_LIT8( KXdmThresholds, "thresholds" ); +_LIT8( KXdmRandomize, "randomize" ); +_LIT8( KXdmObfuscate, "obfuscate" ); +_LIT8( KXdmConfirm, "confirm" ); +_LIT8( KXdmPoliteBlock, "polite-block" ); + +// Literals for commonpolicy +_LIT( KXdmOtherIdentity, "other-identity" ); +_LIT( KXdmExternalList, "external-list" ); +_LIT( KXdmAnonymousRequest, "anonymous-request" ); +_LIT( KXdmRule, "rule" ); +_LIT( KXdmExceptDomain, "except-domain" ); +_LIT( KXdmExcept, "except" ); +_LIT( KXdmFrom, "from" ); +_LIT( KXdmTo, "to" ); +_LIT( KXdmValue, "value" ); +_LIT( KXdmSphere, "sphere" ); +_LIT( KXdmValidity, "validity" ); +_LIT( KXdmConditions, "conditions" ); +_LIT( KXdmActions, "actions" ); +_LIT( KXdmTransformations, "transformations" ); +_LIT( KXdmMany, "many" ); +_LIT( KXdmUntil, "until" ); +_LIT( KXdmOne, "one" ); +_LIT( KXdmScheme, "scheme" ); + +// Literals for poc +_LIT( KXdmGroup, "group"); +_LIT( KXdmListService, "list-service" ); +_LIT( KXdmInviteMembers, "invite-members" ); +_LIT( KXdmMaxParticipantCount, "max-participant-count" ); +_LIT( KXdmIsListMember, "is-list-member" ); +_LIT( KXdmAllowConfState, "allow-conference-state" ); +_LIT( KXdmAllowInvUsersDyn, "allow-invite-users-dynamically" ); +_LIT( KXdmJoinHandling, "join-handling" ); +_LIT( KXdmAllowInitiateConf, "allow-initiate-conference" ); +_LIT( KXdmAllowAnonymity, "allow-anonymity"); +_LIT( KXdmIsKeyParticipant, "list-service" ); +_LIT( KXdmAllowInvite, "allow-invite" ); +_LIT8( KXdmReject, "reject" ); +_LIT8( KXdmAccept, "accept" ); +_LIT8( KXdmPass, "pass" ); + +// Literals for resource list +_LIT( KXdmEntryRef, "entry-ref"); +_LIT( KXdmResourceLists, "resource-lists"); + +// Literals for shared +_LIT( KXdmUriUsages, "uriusages"); +_LIT( KXdmUriUsage, "uriusage"); + +// Literals for rls +_LIT( KXdmRlsServices, "rls-services" ); +_LIT( KXdmService, "service"); +_LIT( KXdmResourceList, "resource-list" ); +_LIT( KXdmPackages, "packages" ); +_LIT( KXdmPackage, "package" ); +_LIT8( KXdmPresence, "presence" ); + +// PRES-CONTENT starts +_LIT( KXdmMimeType, "mime-type"); +_LIT( KXdmEncoding, "encoding"); +_LIT( KXdmDescription, "description"); +_LIT( KXdmData, "data"); +_LIT( KXdmSvg, "svg"); +_LIT( KXdmRect, "rect"); +// PRES-CONTENT ends + +#endif //__XCAPAPPUSAGEDEF__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/src/10207416.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/src/10207416.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,144 @@ +/* +* Copyright (c) 1020 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: Part of XCAP Protocol Application Usage API +* +*/ + + + + +#include "registryinfo.rh" + +//Declares the interface implementations provided +RESOURCE REGISTRY_INFO XcapAppUsageInfo + { + dll_uid = 0x10207416; + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10207417; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x10207418; + version_no = 1; + display_name = "XCAP Capability Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x10207419; + version_no = 1; + display_name = "XCAP Directory Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x1020741A; + version_no = 1; + display_name = "XCAP Test Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x1020741B; + version_no = 1; + display_name = "XCAP PocGroup Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x1020741C; + version_no = 1; + display_name = "XCAP PocUserAccessPolicy Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x1020741D; + version_no = 1; + display_name = "XCAP SharedXDM Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x1020741E; + version_no = 1; + display_name = "XCAP RlsServicesApplication Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x10275080; + version_no = 1; + display_name = "XCAP ResourceLists Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x10275081; + version_no = 1; + display_name = "XCAP IetfCommonPolicy Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x10275082; + version_no = 1; + display_name = "XCAP OmaCommonPolicy Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x10275083; + version_no = 1; + display_name = "XCAP IetfPresenceRules Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x102750AB; + version_no = 1; + display_name = "XCAP OmaPresenceRules Application Usage||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data =""; + }, + // PRES-CONTENT STARTS + IMPLEMENTATION_INFO + { + implementation_uid = 0x20028701; + version_no = 1; + display_name = "XCAP Pres-Content Application Usage||Copyright © 2008 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data =""; + } + // PRES-CONTENT ENDS + }; + } + }; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapAppUsage/src/XcapAppUsage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapAppUsage/src/XcapAppUsage.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,756 @@ +/* +* Copyright (c) 2005 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: CXcapAppUsage +* +*/ + + + + + +// INCLUDE FILES +#ifdef _DEBUG +#include +#endif + +#include + +#include "XcapAppUsageDef.h" + +#include "XcapDirectoryUsage.h" +#include "XcapCapabilityUsage.h" +#include "XcapPocGroupUsage.h" +#include "XcapPocUserAccessUsage.h" +#include "XcapSharedXDMUsage.h" +#include "XcapRlsServicesUsage.h" +#include "XcapResourceListsUsage.h" +#include "XcapIetfCommonPolicyUsage.h" +#include "XcapOmaCommonPolicyUsage.h" +#include "XcapIetfPresRulesUsage.h" +#include "XcapOmaPresRulesUsage.h" +// Add the header of the new app usage here +// #include "XcapTestAppUsage.h" +// PRES-CONTENT STARTS +#include "XcapC4.h" +// PRES-CONTENT ENDS + +#include +#include +#include +#include +#include "XcapUriInterface.h" + + + +// CONSTANTS +// Map the interface UIDs to implementation factory functions +const TImplementationProxy ImplementationTable[] = + { +#ifdef __EABI__ + IMPLEMENTATION_PROXY_ENTRY( KXdmCapabilityUsageUid, CXcapCapabilityUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmDirectoryUsageUid, CXcapDirectoryUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmPocGroupUsageUid, CXcapPocGroupUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmPocUserAccessUsageUid, CXcapPocUserAccessUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmSharedXDMUsageUid, CXcapSharedXDMUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmRlsServicesUsageUid, CXcapRlsServicesUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmResourceListsUsageUid, CXcapResourceListsUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmIetfCommonPolicyUsageUid, CXcapIetfCommonPolicyUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmOmaCommonPolicyUsageUid, CXcapOmaCommonPolicyUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmIetfPresRulesUsageUid, CXcapIetfPresRulesUsage::NewL ), + IMPLEMENTATION_PROXY_ENTRY( KXdmOmaPresRulesUsageUid, CXcapOmaPresRulesUsage::NewL ), + // add new usages here + // IMPLEMENTATION_PROXY_ENTRY( KXdmTestAppUsageUid, CXcapTestAppUsage::NewL ), +// PRES-CONTENT STARTS + IMPLEMENTATION_PROXY_ENTRY( KXdmUsageUid, CXcapC4::NewL ) +// PRES-CONTENT ENDS +#else + { { KXdmCapabilityUsageUid }, CXcapCapabilityUsage::NewL }, + { { KXdmDirectoryUsageUid }, CXcapDirectoryUsage::NewL }, + { { KXdmPocGroupUsageUid }, CXcapPocGroupUsage::NewL }, + { { KXdmPocUserAccessUsageUid }, CXcapPocUserAccessUsage::NewL }, + { { KXdmSharedXDMUsageUid }, CXcapSharedXDMUsage::NewL }, + { { KXdmRlsServicesUsageUid }, CXcapRlsServicesUsage::NewL }, + { { KXdmResourceListsUsageUid }, CXcapResourceListsUsage::NewL }, + { { KXdmIetfCommonPolicyUsageUid }, CXcapIetfCommonPolicyUsage::NewL }, + { { KXdmOmaCommonPolicyUsageUid }, CXcapOmaCommonPolicyUsage::NewL }, + { { KXdmIetfPresRulesUsageUid }, CXcapIetfPresRulesUsage::NewL }, + { { KXdmOmaPresRulesUsageUid }, CXcapOmaPresRulesUsage::NewL }, + // add new usages here + // { { KXdmTestAppUsageUid }, CXcapTestAppUsage::NewL }, +// PRES-CONTENT STARTS + { { KXdmUsageUid }, CXcapC4::NewL } +// PRES-CONTENT ENDS +#endif + }; + +// ---------------------------------------------------- +// ImplementationGroupProxy +// +// ---------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } + + +// ---------------------------------------------------- +// CXcapAppUsage::CXcapAppUsage +// +// ---------------------------------------------------- +// +CXcapAppUsage::CXcapAppUsage( const CXdmEngine& aXdmEngine ) : +iXdmEngine( CONST_CAST( CXdmEngine&, aXdmEngine ) ), +iAddNamespaces( EFalse ), +iNsToNodeSelector( EFalse ), +iAddNsAttributes( EFalse ), +iIsGetOrDelete( EFalse ) + { +#ifdef _NAMESPACES_TO_NODE_SELECTOR + iNsToNodeSelector = ETrue; +#endif + +#ifdef _ADD_NAMESPACE_ATTRIBUTES + iAddNsAttributes = ETrue; +#endif + } + +// ---------------------------------------------------- +// CXcapAppUsage::~CXcapAppUsage +// +// ---------------------------------------------------- +// +CXcapAppUsage::~CXcapAppUsage() + { + REComSession::DestroyedImplementation( iDestructorKey ); + } + +// ---------------------------------------------------- +// CXcapAppUsage::NewL +// +// ---------------------------------------------------- +// +EXPORT_C CXcapAppUsage* CXcapAppUsage::NewL( const CXdmEngine& aXdmEngine, + const TInt aDocumentType ) + { + TAny* ptr = NULL; + TXcapAppUsageParams params( aXdmEngine ); + switch( aDocumentType ) + { + case KXdmCapabilityUsageUid: + case KXdmDirectoryUsageUid: + case KXdmTestAppUsageUid: + case KXdmPocGroupUsageUid: + case KXdmPocUserAccessUsageUid: + case KXdmSharedXDMUsageUid: + case KXdmRlsServicesUsageUid: + case KXdmResourceListsUsageUid: + case KXdmIetfCommonPolicyUsageUid: + case KXdmOmaCommonPolicyUsageUid: + case KXdmIetfPresRulesUsageUid: + case KXdmOmaPresRulesUsageUid: + case KXdmUsageUid: + { + TUid KImplementationUid = { aDocumentType }; + ptr = REComSession::CreateImplementationL( + KImplementationUid, + _FOFF( CXcapAppUsage, iDestructorKey ), + ( TAny* )¶ms ); + } + break; + + default: + User::Leave( KErrNotSupported ); + } + return reinterpret_cast( ptr ); + } + +// ---------------------------------------------------- +// CXcapAppUsage::Validate +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXcapAppUsage::Validate( CXdmDocument& aXdmDocument, TBool aAddNamespaces ) + { + iAddNamespaces = aAddNamespaces; + iIsGetOrDelete = EFalse; + // catch leaves here and return the error code + TInt error ( KErrNone ); + TRAP( error, DoValidateL( aXdmDocument ) ); + // add namespace information for outgoing document + if ( error == KErrNone && iAddNamespaces ) + { + aXdmDocument.ResetNamespaces(); + TRAP( error, AddNamespaceInformationL( aXdmDocument ) ); + } +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::Validate document returns %d" ), error ); +#endif + return error; + } + +// ---------------------------------------------------- +// CXcapAppUsage::Validate +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXcapAppUsage::Validate( CXdmDocumentNode& aXdmNode, + MXcapUriInterface* aUriInterface, + TBool aIsGetOrDelete ) + { + iAddNamespaces = ETrue; + iIsGetOrDelete = aIsGetOrDelete; + ResetUsedNamespaces(); + // catch leaves here and return the error code + TInt error( KErrNone ); + TRAP( error, DoValidateL( aXdmNode ) ); + + // add namespace if defined + if ( error == KErrNone && iAddNsAttributes ) + { + TRAP( error, CreateNamespaceAttributesL( aXdmNode, aUriInterface ) ); + } + +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::Validate node returns %d" ), error ); +#endif + return error; + } + + +// ---------------------------------------------------- +// CXcapAppUsage::DoValidateL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::DoValidateL( CXdmDocumentNode& aXdmNode ) + { + // call method from derived class + ValidateNodeL( aXdmNode ); + + // go through all attributes + TInt attrCount( aXdmNode.AttributeCount() ); + for ( TInt i( 0 ); i < attrCount; i++ ) + { + CXdmNodeAttribute* attr = aXdmNode.Attribute( i ); + ValidateAttributeL( *attr ); + } + + // go through all descendants + TInt count( aXdmNode.NodeCount( ) ); + for ( TInt i = 0; i < count; i++ ) + { + DoValidateL ( *aXdmNode.ChileNode( i ) ); + } + } + +// ---------------------------------------------------- +// CXcapAppUsage::DoValidateL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::DoValidateL ( CXdmDocument& aXdmDocument ) + { + DoValidateL( *aXdmDocument.DocumentRoot() ); + } + +// ---------------------------------------------------- +// CXcapAppUsage::ValidateDataL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::ValidateDataL ( TDataType aDataType, TDesC8& aData ) + { + if ( iIsGetOrDelete ) + { + return; + } + switch ( aDataType ) + { + case EDataTypeString: + { + // TODO + } + break; + case EDataTypeNonNegativeInteger: + { + TInt value( 0 ); + TLex8 lex( aData ); + lex.Val( value ); + if ( value < 0 ) + { + User::Leave( KXcapErrorIllegalDataValue ); + } + } + break; + case EDataTypeAnyURI: + { + // TODO + } + break; + case EDataTypeDateTime: + { + // TODO + } + break; + case EDataTypeBoolean: + { + if ( aData.CompareF( KXdmTrue ) + && aData.CompareF( KXdmFalse ) + && aData.CompareF( KXdmZero ) + && aData.CompareF( KXdmOneNbr ) ) + { + User::Leave( KXcapErrorIllegalDataValue ); + } + } + break; + case EDataTypeToken: + { + // elements that are using datatype token + // scheme, class, occurence-id + } + break; + case EDataTypeEmpty: + { + if ( aData.Length() > 0 ) + { + User::Leave( KXcapErrorIllegalDataValue ); + } + } + break; + default: + break; + } + } + +// ---------------------------------------------------- +// CXcapAppUsage::ValidateDataL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::ValidateDataL ( TDataType aDataType, CXdmDocumentNode& aXdmNode ) + { + TPtrC8 data = aXdmNode.LeafNodeContent(); + ValidateDataL( aDataType, data ); + } + +// ---------------------------------------------------- +// CXcapAppUsage::ValidateDataL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::ValidateDataL ( TDataType aDataType, const CXdmNodeAttribute& aXdmNodeAttr ) + { + HBufC8* dataBuf = aXdmNodeAttr.EightBitValueLC(); // << dataBuf + TPtrC8 data = dataBuf->Des(); + ValidateDataL( aDataType, data ); + CleanupStack::PopAndDestroy( dataBuf ); // >>> dataBuf + } + +// ---------------------------------------------------- +// CXcapAppUsage::SetPrefixL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::SetPrefixL( CXdmDocumentNode& aXdmNode, const TDesC8& aPrefix ) + { + if ( iAddNamespaces ) + { + aXdmNode.SetPrefixL( aPrefix ); + AddUsedNamespace( aPrefix ); + } + } + +// ---------------------------------------------------- +// CXcapAppUsage::AddUsedNamespace +// +// ---------------------------------------------------- +// +void CXcapAppUsage::AddUsedNamespace( const TDesC8& aPrefix ) + { + // rl + if ( Match( aPrefix, KXdmResourceListsNsPrefix ) ) + { + iRL = ETrue; + } + // cr + else if ( Match( aPrefix, KXdmIetfCommonPolicyNsPrefix ) ) + { + iCR = ETrue; + } + // cp + else if ( Match( aPrefix, KXdmOmaCommonPolicyNsPrefix ) ) + { + iCP = ETrue; + } + // pr + else if ( Match( aPrefix, KXdmIetfPresRulesNsPrefix ) ) + { + iPR = ETrue; + } + // ls + else if ( Match( aPrefix, KXdmPocGroupNsPrefix ) ) + { + iLS = ETrue; + } + // poc + else if ( Match( aPrefix, KXdmPocUserAccessNsPrefix ) ) + { + iPOC = ETrue; + } + // opr + else if ( Match( aPrefix, KXdmOmaPresRulesNsPrefix ) ) + { + iOPR = ETrue; + } + // rls + else if ( Match( aPrefix, KXdmRlsServicesNsPrefix ) ) + { + iRLS = ETrue; + } + // ou + else if ( Match( aPrefix, KXdmSharedXDMUriUsageNsPrefix ) ) + { + iOU = ETrue; + } + // add new prefix definitions here + } + +// ---------------------------------------------------- +// CXcapAppUsage::ResetUsedNamespaces +// +// ---------------------------------------------------- +// +void CXcapAppUsage::ResetUsedNamespaces() + { + iRL = EFalse; + iCR = EFalse; + iCP = EFalse; + iPR = EFalse; + iLS = EFalse; + iPOC = EFalse; + iOPR = EFalse; + iRLS = EFalse; + iOU = EFalse; + // add new prefix definitions here + } + +// ---------------------------------------------------- +// CXcapAppUsage::AppendUsedNamespacesL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::AppendUsedNamespacesL( MXcapUriInterface* aUriInterface ) + { + if( iRL ) + { + aUriInterface->AddNamespaceMappingL( KXdmResourceListsNamespace, KXdmResourceListsNsPrefix ); + } + if( iCR ) + { + aUriInterface->AddNamespaceMappingL( KXdmIetfCommonPolicyNamespace, KXdmIetfCommonPolicyNsPrefix ); + } + if( iCP ) + { + aUriInterface->AddNamespaceMappingL( KXdmOmaCommonPolicyNamespace, KXdmOmaCommonPolicyNsPrefix ); + } + if( iPR ) + { + aUriInterface->AddNamespaceMappingL( KXdmIetfPresRulesNamespace, KXdmIetfPresRulesNsPrefix ); + } + if( iLS ) + { + aUriInterface->AddNamespaceMappingL( KXdmPocGroupNamespace, KXdmPocGroupNsPrefix ); + } + if( iPOC ) + { + aUriInterface->AddNamespaceMappingL( KXdmPocUserAccessNamespace, KXdmPocUserAccessNsPrefix ); + } + if( iOPR ) + { + aUriInterface->AddNamespaceMappingL( KXdmOmaPresRulesNamespace, KXdmOmaPresRulesNsPrefix ); + } + if( iRLS ) + { + aUriInterface->AddNamespaceMappingL( KXdmRlsServicesNamespace, KXdmRlsServicesNsPrefix ); + } + if( iOU ) + { + aUriInterface->AddNamespaceMappingL( KXdmSharedXDMUriUsageNamespace, KXdmSharedXDMUriUsageNsPrefix ); + } + // add new prefix definitions here + } + +// ---------------------------------------------------- +// CXcapAppUsage::CreateNamespaceAttributesL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::CreateNamespaceAttributesL( CXdmDocumentNode& aXdmNode, MXcapUriInterface* aUriInterface ) + { + // First remove all existing xmlns attributes + RemoveNamespaceAttributesL( aXdmNode ); + + TPtrC8 nameSpace; + TPtrC8 prefix = aXdmNode.Prefix(); + + // if the root node belongs to the default namespace, + // it's enough that we add attribute for it and also + // attributes for all other used namespaces + if ( Match( prefix, KNullDesC8 ) ) + { + CXdmNodeAttribute* ns = aXdmNode.CreateAttributeL( KXdmDefaultNsAttrName ); + ns->SetAttributeValueL( DefaultNamespace() ); + AppendNamespaceAttributesL( aXdmNode ); + + if ( iNsToNodeSelector ) + { + //aUriInterface->AddNamespaceMappingL( DefaultNamespace(), KNullDesC8 ); + CXdmDocumentNode* parent = aXdmNode.Parent(); + while ( parent ) + { + AddUsedNamespace ( parent->Prefix() ); + parent = parent->Parent(); + } + AppendUsedNamespacesL( aUriInterface ); + } + // we are done +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::CreateNamespaceAttributesL root belongs to default" ) ); +#endif + return; + } +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::CreateNamespaceAttributesL root doesn't belong to default" ) ); +#endif + // if the default namespace is used in fragment, + // the attribute for it has to be added + if ( DefaultNamespaceUsed( aXdmNode ) ) + { + CXdmNodeAttribute* ns = aXdmNode.CreateAttributeL( KXdmDefaultNsAttrName ); + ns->SetAttributeValueL( DefaultNamespace() ); + } + // finally, create new xmlns attributes + AppendNamespaceAttributesL( aXdmNode ); + if ( iNsToNodeSelector ) + { + //aUriInterface->AddNamespaceMappingL( DefaultNamespace(), KNullDesC8 ); + CXdmDocumentNode* parent = aXdmNode.Parent(); + while ( parent ) + { + AddUsedNamespace ( parent->Prefix() ); + parent = parent->Parent(); + } + AppendUsedNamespacesL( aUriInterface ); + } + } + +// ---------------------------------------------------- +// CXcapAppUsage::RemoveNamespaceAttributesL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::RemoveNamespaceAttributesL( CXdmDocumentNode& aXdmNode ) + { +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::RemoveNamespaceAttributesL begin" ) ); +#endif + // go through all attributes + for ( TInt i( aXdmNode.AttributeCount() - 1 ); i > KErrNotFound; i-- ) + { + CXdmNodeAttribute* attr = aXdmNode.Attribute( i ); + if ( attr->NodeName().FindF( KXdmDefaultNsAttrName ) != KErrNotFound ) + { +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::RemoveNamespaceAttributesL AttrCount=%d i=%d" ), aXdmNode.AttributeCount(), i ); +#endif + aXdmNode.RemoveChileNodeL( attr ); + } + } + + // go through all descendants + TInt count( aXdmNode.NodeCount( ) ); + for ( TInt i(0); i < count; i++ ) + { + RemoveNamespaceAttributesL ( *aXdmNode.ChileNode( i ) ); + } +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::RemoveNamespaceAttributesL done" ) ); +#endif + } + +// ---------------------------------------------------- +// CXcapAppUsage::DefaultNamespaceUsed +// +// ---------------------------------------------------- +// +TBool CXcapAppUsage::DefaultNamespaceUsed( CXdmDocumentNode& aXdmNode ) + { + if ( Match( aXdmNode.Prefix(), KNullDesC8 ) ) + { +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::DefaultNamespaceUsed returns true" ) ); +#endif + return ETrue; + } + // go through all descendants + TInt count( aXdmNode.NodeCount( ) ); + for ( TInt i = 0; i < count; i++ ) + { + if ( DefaultNamespaceUsed ( *aXdmNode.ChileNode( i ) ) ) + { +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::DefaultNamespaceUsed returns true" ) ); +#endif + return ETrue; + } + } +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::DefaultNamespaceUsed returns false" ) ); +#endif + return EFalse; + } +// ---------------------------------------------------- +// CXcapAppUsage::AppendNamespaceAttributesL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::AppendNamespaceAttributesL( CXdmDocumentNode& aXdmNode ) + { + if( iRL ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmResourceListsNsPrefix, KXdmResourceListsNamespace ); + } + if( iCR ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmIetfCommonPolicyNsPrefix, KXdmIetfCommonPolicyNamespace ); + } + if( iCP ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmOmaCommonPolicyNsPrefix, KXdmOmaCommonPolicyNamespace ); + } + if( iPR ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmIetfPresRulesNsPrefix, KXdmIetfPresRulesNamespace ); + } + if( iLS ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmPocGroupNsPrefix, KXdmPocGroupNamespace ); + } + if( iPOC ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmPocUserAccessNsPrefix, KXdmPocUserAccessNamespace ); + } + if( iOPR ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmOmaPresRulesNsPrefix, KXdmOmaPresRulesNamespace ); + } + if( iRLS ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmRlsServicesNsPrefix, KXdmRlsServicesNamespace ); + } + if( iOU ) + { + CreateNamespaceAttributeL( aXdmNode, KXdmSharedXDMUriUsageNsPrefix, KXdmSharedXDMUriUsageNamespace ); + } + // add new prefix definitions here +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::AppendNamespaceAttributesL done" ) ); +#endif + } + +// ---------------------------------------------------- +// CXcapAppUsage::CreateNamespaceAttributeL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::CreateNamespaceAttributeL( CXdmDocumentNode& aXdmNode, const TDesC8& aPrefix, const TDesC8& aNamespace ) + { + TBuf8 name; + name.Copy( KXdmNonDefaultNsAttrName ); + name.Append( aPrefix ); + HBufC8* attrName = name.AllocLC(); // << attrName + CXdmNodeAttribute* ns = aXdmNode.CreateAttributeL( ); + CleanupStack::PushL( ns ); // << ns + ns->SetNameL( *attrName ); + ns->SetAttributeValueL( aNamespace ); + CleanupStack::Pop( ns ); // >> ns + CleanupStack::PopAndDestroy(); // >>> attrName +#ifdef _DEBUG + WriteToLog( _L8( "CXcapAppUsage::CreateNamespaceAttributeL done" ) ); +#endif + } + +// ---------------------------------------------------- +// CXcapAppUsage::Match +// +// ---------------------------------------------------- +// +TBool CXcapAppUsage::Match( const TDesC& aLeft, const TDesC& aRight ) + { + if ( !aLeft.CompareF( aRight ) ) + { + return ETrue; + } + return EFalse; + } + +// ---------------------------------------------------- +// CXcapAppUsage::Match +// +// ---------------------------------------------------- +// +TBool CXcapAppUsage::Match( const TDesC8& aLeft, const TDesC8& aRight ) + { + if ( !aLeft.CompareF( aRight ) ) + { + return ETrue; + } + return EFalse; + } + +// ---------------------------------------------------- +// CXcapAppUsage::LeaveWithErrorL +// +// ---------------------------------------------------- +// +void CXcapAppUsage::LeaveWithErrorL( TInt aErrorCode ) + { + if ( !iIsGetOrDelete ) + { + User::Leave( aErrorCode ); + } + } + + +// ---------------------------------------------------- +// CXcapAppUsage::WriteToLog +// _DEBUG only +// ---------------------------------------------------- +// +#ifdef _DEBUG +void CXcapAppUsage::WriteToLog( TRefByValue aFmt,... ) + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + RFileLogger::Write( KXdmAppUsageLogDir, KXdmAppUsageLogFile, EFileLoggingModeAppend, buf ); + } +#endif + +// End of File + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Client/BWINSCW/XcapCacheClientU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Client/BWINSCW/XcapCacheClientU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,12 @@ +EXPORTS + ??0RXcapCache@@QAE@XZ @ 1 NONAME ; RXcapCache::RXcapCache(void) + ??1RXcapCache@@QAE@XZ @ 2 NONAME ; RXcapCache::~RXcapCache(void) + ?Connect@RXcapCache@@QAEHXZ @ 3 NONAME ; int RXcapCache::Connect(void) + ?Delete@RXcapCache@@QAEHABVTDesC16@@ABVTDesC8@@@Z @ 4 NONAME ; int RXcapCache::Delete(class TDesC16 const &, class TDesC8 const &) + ?FetchDocumentContent@RXcapCache@@QAEXAAVTDes8@@ABVTDesC16@@ABVTDesC8@@@Z @ 5 NONAME ; void RXcapCache::FetchDocumentContent(class TDes8 &, class TDesC16 const &, class TDesC8 const &) + ?FetchDocumentInfo@RXcapCache@@QAEHAAVTDes8@@ABVTDesC16@@ABVTDesC8@@AAVTCacheEntryInfo@@@Z @ 6 NONAME ; int RXcapCache::FetchDocumentInfo(class TDes8 &, class TDesC16 const &, class TDesC8 const &, class TCacheEntryInfo &) + ?Flush@RXcapCache@@QAEXXZ @ 7 NONAME ; void RXcapCache::Flush(void) + ?IsCurrent@RXcapCache@@QAEHABVTDesC8@@ABVTDesC16@@0@Z @ 8 NONAME ; int RXcapCache::IsCurrent(class TDesC8 const &, class TDesC16 const &, class TDesC8 const &) + ?Store@RXcapCache@@QAEXABVTDesC8@@ABVTDesC16@@00@Z @ 9 NONAME ; void RXcapCache::Store(class TDesC8 const &, class TDesC16 const &, class TDesC8 const &, class TDesC8 const &) + ?Version@RXcapCache@@QBE?AVTVersion@@XZ @ 10 NONAME ; class TVersion RXcapCache::Version(void) const + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Client/eabi/XcapCacheClientU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Client/eabi/XcapCacheClientU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,14 @@ +EXPORTS + _ZN10RXcapCache17FetchDocumentInfoER5TDes8RK7TDesC16RK6TDesC8R15TCacheEntryInfo @ 1 NONAME + _ZN10RXcapCache20FetchDocumentContentER5TDes8RK7TDesC16RK6TDesC8 @ 2 NONAME + _ZN10RXcapCache5FlushEv @ 3 NONAME + _ZN10RXcapCache5StoreERK6TDesC8RK7TDesC16S2_S2_ @ 4 NONAME + _ZN10RXcapCache6DeleteERK7TDesC16RK6TDesC8 @ 5 NONAME + _ZN10RXcapCache7ConnectEv @ 6 NONAME + _ZN10RXcapCache9IsCurrentERK6TDesC8RK7TDesC16S2_ @ 7 NONAME + _ZN10RXcapCacheC1Ev @ 8 NONAME + _ZN10RXcapCacheC2Ev @ 9 NONAME + _ZN10RXcapCacheD1Ev @ 10 NONAME + _ZN10RXcapCacheD2Ev @ 11 NONAME + _ZNK10RXcapCache7VersionEv @ 12 NONAME + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Client/group/XcapCacheClient.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Client/group/XcapCacheClient.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2005 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: XcapCacheClient.mmp +* +*/ + + + +#include + +TARGET xcapcacheclient.dll +TARGETTYPE dll +UID 0x1000008d 0x10207413 +VENDORID VID_DEFAULT +CAPABILITY CAP_CLIENT_DLL + +SOURCEPATH ../src +USERINCLUDE ../../inc + +SOURCE XcapCache.cpp + +MW_LAYER_SYSTEMINCLUDE + +LIBRARY euser.lib +LIBRARY efsrv.lib +DEBUGLIBRARY flogger.lib + +#if defined( ARMCC ) + DEFFILE ../eabi/ +#elif defined ( WINSCW ) +deffile ../BWINSCW/ +#elif defined (WINS ) + deffile ../bwins/ +#endif + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Client/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Client/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: XcapCacheClient bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- +XcapCacheClient.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Client/src/XcapCache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Client/src/XcapCache.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,188 @@ +/* +* Copyright (c) 2005 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: RXcapCache +* +*/ + + + +#include "XcapCache.h" +#include "CommonDefines.h" + + +//CLASS DECLARATION +EXPORT_C RXcapCache::RXcapCache() : iConnected( EFalse ) + { + } + +// ---------------------------------------------------- +// RXcapCache::Store +// +// ---------------------------------------------------- +// +EXPORT_C void RXcapCache::Store( const TDesC8& aETag, + const TDesC& aDocumentName, + const TDesC8& aRootLocation, + const TDesC8& aResponseData ) + { + SendReceive( EXcapCacheStore, TIpcArgs( &aDocumentName, &aRootLocation, &aETag, &aResponseData ) ); + } + +// ---------------------------------------------------- +// RXcapCache::Delete +// +// ---------------------------------------------------- +// +EXPORT_C TInt RXcapCache::Delete( const TDesC& aDocumentName, + const TDesC8& aRootLocation ) + { + TCacheEntryInfo entryInfo; + entryInfo.iRootUri = CONST_CAST( TDesC8*, &aRootLocation ); + entryInfo.iDocumentUri = CONST_CAST( TDesC*, &aDocumentName ); + TPckgC package( entryInfo ); + return SendReceive( EXcapCacheDelete, TIpcArgs( &package ) ); + } + +// ---------------------------------------------------- +// RXcapCache::FetchDocumentInfo +// +// ---------------------------------------------------- +// +EXPORT_C TInt RXcapCache::FetchDocumentInfo( TDes8& aETagDescriptor, + const TDesC& aDocumentName, + const TDesC8& aRootLocation, + TCacheEntryInfo& aEntryInfo ) + { + TPckg package( aEntryInfo ); + return SendReceive( EXcapCacheFetchInfo, TIpcArgs( &package, &aETagDescriptor, + &aDocumentName, &aRootLocation ) ); + } + +// ---------------------------------------------------- +// RXcapCache::FetchDocumentContent +// +// ---------------------------------------------------- +// +EXPORT_C void RXcapCache::FetchDocumentContent( TDes8& aContentDescriptor, + const TDesC& aDocumentName, + const TDesC8& aRootLocation ) + { + SendReceive( EXcapCacheFetchData, TIpcArgs( + &aDocumentName, &aRootLocation, &aContentDescriptor ) ); + } + +// ---------------------------------------------------- +// RXcapCache::IsCurrent +// +// ---------------------------------------------------- +// +EXPORT_C TInt RXcapCache::IsCurrent( const TDesC8& aETag, + const TDesC& aDocumentName, + const TDesC8& aRootLocation ) + { + return SendReceive( EXcapCacheCheckValidity, TIpcArgs( + &aETag, &aDocumentName, &aRootLocation ) ); + } + +// ---------------------------------------------------- +// RXcapCache::Flush +// +// ---------------------------------------------------- +// +EXPORT_C void RXcapCache::Flush() + { + SendReceive( EXcapCacheFlush ); + } + +// ---------------------------------------------------- +// RXcapCache::Version +// +// ---------------------------------------------------- +// +EXPORT_C TVersion RXcapCache::Version() const + { + return TVersion( KCacheServerMajorVersionNumber, + KCacheServerMinorVersionNumber, + KCacheServerBuildVersionNumber ); + } + +// ---------------------------------------------------- +// RXcapCache::~RXcapCache +// +// ---------------------------------------------------- +// +EXPORT_C RXcapCache::~RXcapCache() + { + } + +// ---------------------------------------------------- +// RXcapCache::Connect() +// +// ---------------------------------------------------- +// +EXPORT_C TInt RXcapCache::Connect() + { + TInt ret = KErrNone; + if( !iConnected ) + { + ret = StartServer(); + if( ret == KErrNone || ret == KErrAlreadyExists ) + { + ret = CreateSession( KXcapCacheServerLib, Version(), KTTDefaultMessageSlots ); + iConnected = ( ret == KErrNone ); + } + } + return ret; + } + +// ---------------------------------------------------- +// RXcapCache::StartServer +// +// ---------------------------------------------------- +// +TInt RXcapCache::StartServer() + { + TInt ret = KErrNone; + TRequestStatus status = KRequestPending; + if ( !IsRunning() ) + { + RProcess server; + ret = server.Create( KXcapCacheServerExe, KNullDesC ); + if( ret != KErrNone ) + return ret; + server.Rendezvous( status ); + status != KRequestPending ? server.Kill( 0 ) : server.Resume(); + //Wait for start or death + User::WaitForRequest( status ); + ret = server.ExitType() == EExitPanic ? KErrGeneral : status.Int(); + server.Close(); + } + return ret; + } + +// ---------------------------------------------------- +// RXcapCache::IsRunning +// +// ---------------------------------------------------- +// +TBool RXcapCache::IsRunning() + { + TFindServer findServer( KXcapCacheServerName ); + TFullName name; + return ( findServer.Next( name ) == KErrNone ); + } + +// End of File + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Client/src/XcapCacheClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Client/src/XcapCacheClient.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,79 @@ +/* +* Copyright (c) 2005 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: CXcapCacheClient +* +*/ + + + +#include +#include "XcapCache.h" +#include "CommonDefines.h" +#include "XcapCacheClient.h" + +//CLASS DECLARATION +CXcapCacheClient::CXcapCacheClient( RXcapCache& aCacheMain ) : + CActive( EPriorityStandard ), + iClientMain( aCacheMain ) + { + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------- +// CXcapCacheClient::Store +// +// ---------------------------------------------------- +// +void CXcapCacheClient::Reset() + { + #ifdef _DEBUG + RXcapCache::WriteToLog( _L8( "CXcapCacheClient::Reset()" ) ); + #endif + } + +// ---------------------------------------------------- +// CXcapCacheClient::SendMessageL +// +// ---------------------------------------------------- +// +void CXcapCacheClient::ReceiveAsync( TRequestStatus& aStatus ) + { + iClientStatus = &aStatus; + aStatus = KRequestPending; + SetActive(); + } + +// ---------------------------------------------------- +// CXcapCacheClient::RunL +// +// ---------------------------------------------------- +// +void CXcapCacheClient::RunL() + { + + } + +// ---------------------------------------------------- +// CXcapCacheClient::DoCancel +// +// ---------------------------------------------------- +// +void CXcapCacheClient::DoCancel() + { + + } + +// End of File + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/BWINSCW/XcapCacheServerU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/BWINSCW/XcapCacheServerU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,4 @@ +EXPORTS + ?StartThread@CXcapCacheServer@@SAHXZ @ 1 NONAME ; int CXcapCacheServer::StartThread(void) + ?WriteToLog@CXcapCacheServer@@SAXV?$TRefByValue@$$CBVTDesC8@@@@ZZ @ 2 NONAME ; void CXcapCacheServer::WriteToLog(class TRefByValue, ...) + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/eabi/XcapCacheServerU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/eabi/XcapCacheServerU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,6 @@ +EXPORTS + _ZN16CXcapCacheServer10WriteToLogE11TRefByValueIK6TDesC8Ez @ 1 NONAME + _ZN16CXcapCacheServer11StartThreadEv @ 2 NONAME + _ZTI16CXcapCacheServer @ 3 NONAME ; ## + _ZTV16CXcapCacheServer @ 4 NONAME ; ## + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/group/XcapCache.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/group/XcapCache.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2005 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: XcapCache.mmp +* XcapCache.exe from XcapCache.mmp +* +*/ + + + +#include + +TARGET xcapcache.exe +TARGETTYPE exe +UID 0 0x10207421 +CAPABILITY CAP_SERVER +VENDORID VID_DEFAULT + +SOURCEPATH ../src + +SOURCE XcapCacheIndex.cpp +SOURCE XcapCacheServer.cpp +SOURCE XcapCacheSession.cpp +SOURCE XcapShutdownTimer.cpp +SOURCE XcapCacheIndexAdmin.cpp +SOURCE XcapCacheIndexEntry.cpp +SOURCE XcapCacheServerMain.cpp +SOURCE XcapCacheEntryProperty.cpp +SOURCE XcapCacheIndexTableEntry.cpp + +USERINCLUDE ../inc +USERINCLUDE ../../inc + +MW_LAYER_SYSTEMINCLUDE + +LIBRARY bafl.lib +LIBRARY euser.lib +LIBRARY efsrv.lib +LIBRARY flogger.lib +LIBRARY centralrepository.lib + +EPOCSTACKSIZE 0x8000 diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: XcapCache bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- +XcapCache.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/ServerDefines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/ServerDefines.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2005 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: XCapServerDefines +* +*/ + + + + +#ifndef __SERVERDEFINES_H__ +#define __SERVERDEFINES_H__ + +#include + +const TInt KPageFilePosSeparator = 32; +_LIT8( KPageFileSeparator, " " ); +_LIT8( KIndexFileEndOfLine, "\r\n" ); +_LIT8( KIndexFileEndOfEntry, "\r\n\r\n" ); +_LIT8( KValuePropertySeparator, "=" ); +_LIT8( KValueFieldSeparator, ";" ); + +//Array of characters available for random string creation +const TInt KRandomStringCharArray[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, + 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A }; + +const TReal KDefaultCompression = 0.75; +const TInt KRandStringLength = 20; +const TInt KDateMaxSize = 100; +const TInt KDateTimeMaxSize = 200; +_LIT( KDateFormatFileName, "%1%2%3"); +_LIT( KTimeFormatFileName, "%H%T%S"); +_LIT( KCacheDateFormat, "%1-%2-%3"); +_LIT( KCacheTimeFormat, "%H:%T:%S"); +_LIT( KDateTimeFormat, "%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S"); + + + +#endif // #ifndef __SERVERDEFINES_H__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheEntryProperty.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheEntryProperty.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,101 @@ +/* +* Copyright (c) 2005 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: CXcapCacheEntryProperty +* +*/ + + + + +#ifndef __XCAPCACHEINDEXPROPERTY_H__ +#define __XCAPCACHEINDEXPROPERTY_H__ + +// INCLUDES +#include +#include "CommonDefines.h" + +//FORWARD DECLARATIONs + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapCacheEntryProperty ) : public CBase + { + public: // Constructors and destructor + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CXcapCacheEntryProperty* NewL( TInt aPropertyName, + const TDesC8& aPropertyValue ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt IntValue() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TTime TimeValue() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TPtrC DesValue16() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TPtrC8 DesValue8() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt Name() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + ~CXcapCacheEntryProperty(); + + private: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL( const TDesC8& aPropertyValue ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheEntryProperty( TInt aPropertyName ); + + private: // Data + + HBufC* iPropertyValue16; + HBufC8* iPropertyValue8; + const TInt iPropertyName; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndex.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndex.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,125 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndex +* +*/ + + + + +#ifndef __XCAPCACHEINDEX_H__ +#define __XCAPCACHEINDEX_H__ + +// INCLUDES +#include +#include +#include "CommonDefines.h" + +//FORWARD DECLARATIONs +class CXcapCacheIndexEntry; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapCacheIndex ) : public CBase + { + public: // Constructors and destructor + + /** + * Returns Cache Index + * @return Created Cache Index + */ + static CXcapCacheIndex* NewL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static TInt Compare( const CXcapCacheIndexEntry& aFirst, + const CXcapCacheIndexEntry& aSecond ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt UpdateIndexL( const CXcapCacheIndexEntry* aEntry ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndexEntry* Entry( TInt aIndex ) const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt EntryCount() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void SortEntriesL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void RemoveEntry( TInt aIndex ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void StoreCacheDataL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + ~CXcapCacheIndex(); + + private: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndex(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + RFile InitialiseIndexL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ReadEntriesL( TPtr8& aIndexData ); + + private: // Data + + RPointerArray iEntryList; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndexAdmin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndexAdmin.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,122 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndexAdmin +* +*/ + + + + +#ifndef __XCAPCACHEINDEXADMIN_H__ +#define __XCAPCACHEINDEXADMIN_H__ + +// INCLUDES +#include +#include +#include "CommonDefines.h" + +//CONSTANTS + +//FORWARD DECLARATIONs +class CXcapCacheIndexTableEntry; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapCacheIndexAdmin ) : public CBase + { + public: // Constructors and destructor + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CXcapCacheIndexAdmin* NewL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void UpdateIndexTableL( TInt aIndex, const TCacheEntryInfo* aStorageHeader ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndexTableEntry* FindL( TInt& aTableIndex, + const TDesC8& aRootUri, + const TDesC& aDocumentUri ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt ReadIndexL( const CXcapCacheIndexTableEntry& aEntry ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void RemoveTableIndex( TInt aIndex ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void StoreIndexTableL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + ~CXcapCacheIndexAdmin(); + + private: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndexAdmin(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + RFile InitialisePageFileL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ReadEntriesL( TPtr8& aDataDesc ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndexTableEntry* ParseOneEntryL( const TDesC8& aEntryData ); + + private: // Data + + RPointerArray iEntryList; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndexEntry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndexEntry.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,197 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndexEntry +* +*/ + + + + +#ifndef __XCAPCACHEINDEXENTRY_H__ +#define __XCAPCACHEINDEXENTRY_H__ + +// INCLUDES +#include +#include +//#include "XcapCacheClient.h" + +//CONSTANTS +const TUint KCacheEntryETag = 0; +const TUint KCacheXmlSize = 1; +const TUint KCacheXmlFile = 2; +const TUint KCacheLastAccess = 3; +const TUint KCacheLastModified = 4; + +//ENUMS +enum TCacheIndexEntry + { + EEntryETag = KCacheEntryETag, + EEntryXmlSize = KCacheXmlSize, + EEntryXmlFile = KCacheXmlFile, + EEntryLastAccess = KCacheLastAccess, + EEntryLastModified = KCacheLastModified + }; + +//Specifies the cache file "protocol" +const TText8* const KCacheEntryArray[] = { _S8( "etag" ), + _S8( "size" ), + _S8( "file" ), + _S8( "access" ), + _S8( "modify" ) + }; + +//FORWARD DECLARATIONs +class CXcapCacheEntryProperty; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapCacheIndexEntry ) : public CBase + { + public: // Constructors and destructor + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CXcapCacheIndexEntry* NewL( const TCacheEntryInfo* aHeader ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CXcapCacheIndexEntry* NewL( TPtr8& aEntryData ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void UpdateEntryL( const TCacheEntryInfo* aHeader ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TTime LastAccess() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TTime LastModified() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt XmlSize() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TPtrC8 ETag() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TPtrC8 FileNameL() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TPtrC FileName16L() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + HBufC8* PrintLC() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + ~CXcapCacheIndexEntry(); + + private: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL( const TCacheEntryInfo* aHeader ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL( TPtr8& aEntryData ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndexEntry(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheEntryProperty* CreatePropertyL( const TInt aPropertyName, + const TDesC8& aPropertyValue ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void CreateFromHeaderL( const TCacheEntryInfo* aHeader ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + const CXcapCacheEntryProperty& FindProperty( const TInt aPropId ) const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt FindPropNameId( const TDesC8& aNameString ) const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + HBufC8* HourStringLC(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void DeleteFileL( const TDesC8& aFileName ); + + /** + * Second-phase constructor. + */ + HBufC8* StoreXmlFileLC( const TDesC8& aXmlData ); + + private: // Data + + RPointerArray iPropertyList; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndexTableEntry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheIndexTableEntry.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,139 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndexTableEntry +* +*/ + + + + +#ifndef __XCAPCACHEINDEXTABLEENTRY_H__ +#define __XCAPCACHEINDEXTABLEENTRY_H__ + +// INCLUDES +#include +#include "CommonDefines.h" + +//CONSTANTS + +//FORWARD DECLARATIONs + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapCacheIndexTableEntry ) : public CBase + { + public: // Constructors and destructor + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CXcapCacheIndexTableEntry* NewL( const TInt aEntryIndex, + const TDesC8& aRootUri, + const TDesC& aDocumentUri ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CXcapCacheIndexTableEntry* NewL( const TInt aEntryIndex, + const TDesC8& aRootUri, + const TDesC8& aDocumentUri ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CXcapCacheIndexTableEntry* NewL( const TDesC8& aRootUri, + const TDesC& aDocumentUri ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TPtrC8 RootUri() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TPtrC8 DocumentUri() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void Increase(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void Decrease(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TBool operator==( const CXcapCacheIndexTableEntry& aEntry ) const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt Index() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + ~CXcapCacheIndexTableEntry(); + + private: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndexTableEntry(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL( const TDesC8& aRootUri, + const TDesC& aDocumentUri ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL( const TDesC8& aRootUri, + const TDesC8& aDocumentUri ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheIndexTableEntry( const TInt aEntryIndex ); + + private: // Data + + TInt iEntryIndex; + HBufC8* iRootUri; + HBufC8* iDocumentUri; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheServer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheServer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,206 @@ +/* +* Copyright (c) 2005 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: CXcapCacheServer +* +*/ + + + + +#ifndef __XCAPCACHESERVER_H__ +#define __XCAPCACHESERVER_H__ + +// INCLUDES +#include +#include +#include "ServerDefines.h" +#include "CommonDefines.h" +#include "XcapShutdownTimer.h" + +//CONSTANTS +_LIT( KCacheServerRoot, "C:\\private\\10207421\\" ); +_LIT( KCacheServerIndex, "C:\\private\\10207421\\index.ch" ); +_LIT( KCacheServerPageFile, "C:\\private\\10207421\\pagefile.ch" ); +_LIT( KCacheServerIndexF, "index.ch" ); +_LIT( KCacheServerPageFileF, "pagefile.ch" ); + +_LIT( KCacheServerLogDir, "XDM" ); +_LIT( KCacheServerLogFile, "CacheServer.txt" ); +const TUint KAppDefaultHeapSize = 0x10000; + +//FORWARD DECLARATIONs +class CXcapCacheIndex; +class CXcapCacheIndexAdmin; + +// CLASS DECLARATION +class CXcapCacheServer : public CServer2 + { + public: // Constructors and destructor + + /** + * Returns KErrNone + * @return TInt System wide error code + */ + IMPORT_C static TInt StartThreadL(); + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + IMPORT_C static void WriteToLog( TRefByValue aFmt,... ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + static CServer2* NewLC( void ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + virtual CSession2* NewSessionL( const TVersion& aVersion, + const RMessage2& /*aMessage*/ ) const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + RFs* Session(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt CacheSize( TInt& aEntryCount ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + TInt MaxCacheSize() const; + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + ~CXcapCacheServer(); + + public: //static + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + static RFs& FileSession(); + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + static CXcapCacheIndex* Index(); + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + static CXcapCacheIndexAdmin* IndexAdmin(); + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + static TInt ConvertDesc( const TDesC8& aNumberDesc ); + + /** + * A function to handle descriptor data. + * @return Date in heap descriptor + */ + static HBufC* DateL(); + + /** + * A function to handle descriptor data. + * @return Time in heap descriptor + */ + static HBufC* TimeL(); + + /** + * A function to handle descriptor data. + * @return Random string heap descriptor + */ + static HBufC* RandomStringL(); + + /** + * A function to handle descriptor data. + * @return Date and time heap descriptor + */ + static HBufC* DateTimeL(); + + /** + * A function to handle descriptor data. + * @return Date and time heap descriptor + */ + static HBufC* DateTimeL( const TTime& aTime ); + + /** + * A function to handle descriptor data. + * @param aCommand command to be handled + */ + static TPtr8 DescriptorCast( const TDesC8& aConstData ); + + private: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapCacheServer( TInt aPriority ); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ReadMaxCacheSizeL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void AddSession(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void DropSession(); + + private: // Data + + RFs iFileSession; + TInt iMaxCacheSize; + TUint iSessionCount; + CDir* iCacheDirectory; + CXcapShutdownTimer iShutdownTimer; + friend class CXcapCacheSession; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheServerMain.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheServerMain.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,37 @@ +/* +* Copyright (c) 2005 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: XcapCacheServerMain +* +*/ + + + + +#ifndef __XCAPCACHESERVERMAIN_H__ +#define __XCAPCACHESERVERMAIN_H__ + +// INCLUDES +#include +#include + +class CXcapCacheIndex; +class CXcapCacheIndexAdmin; + +RFs FsSession; +CXcapCacheIndex* CacheIndex = NULL; +CXcapCacheIndexAdmin* CacheIndexAdmin = NULL; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheSession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapCacheSession.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,227 @@ +/* +* Copyright (c) 2005 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: CXcapCacheSession +* +*/ + + + + +#ifndef __XCAPCACHESESSION_H__ +#define __XCAPCACHESESSION_H__ + +// INCLUDES +#include +#include +#include +#include +#include "XcapCacheServer.h" + +class MDesC16Array; +class CXcapCacheIndex; +class CXcapCacheIndexAdmin; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapCacheSession ) : public CSession2 + { + public: // Constructors and destructor + + /** + * Symbian OS default constructor + * + * @param CXcapCacheServer Pointer to the server object + * @return CXcapCacheSession* New session object + */ + static CXcapCacheSession* NewL( CXcapCacheServer* aServer ); + + /** + * Service a request + * + * @param RMessage& Kernel message + * @return void + */ + virtual void ServiceL ( const RMessage2& aMessage ); + + /** + * Destructor. + */ + virtual ~CXcapCacheSession(); + + private: + + /** + * Second-phase constructor + * + * @return void + */ + void ConstructL(); + + /** + * C++ default constructor is private. + * + * @param CXcapCacheServer Pointer to the server object + * @return CXcapCacheSession New session object + */ + CXcapCacheSession( CXcapCacheServer* aServer ); + + /** + * Check the capabilities of the connecting client + * + * @param RMessage2& Kernel message + * @return TBool Does the client have proper capabilities + */ + TBool Capabilities( const RMessage2& aMessage ); + + /** + * Panic the client + * + * @param TInt Panic code + * @return void + */ + void PanicClient( TInt aPanic ); + + /** + * Dispatch the client's request + * + * @param RMessage2& Kernel message + * @return void + */ + void DispatchMessageL( const RMessage2& aMessage ); + + /** + * Fetch the meta information for a document + * + * @param RMessage2& Kernel message + * @return void + */ + void FetchDocumentInfoL( const RMessage2& aMessage ); + + /** + * Fetch the contents of a document + * + * @param RMessage2& Kernel message + * @return void + */ + void FetchDocumentContentsL( const RMessage2& aMessage ); + + /** + * Store a document + * + * @param RMessage2& Kernel message + * @return void + */ + void CacheXcapDataL( const RMessage2& aMessage ); + + /** + * Delete a document from the cache + * + * @param RMessage2& Kernel message + * @return void + */ + void DeleteCacheDataL( const RMessage2& aMessage ); + + /** + * Check the currency of a document + * + * @param RMessage2& Kernel message + * @return void + */ + void CheckValidityL( const RMessage2& aMessage ); + + /** + * Externalize the meta information + * + * @return void + */ + void FlushCacheDataL(); + + /** + * Delete unindexed documents from the cache + * + * @param MDesC16Array Indexed documents + * @return void + */ + void DeleteExcessL( const MDesC16Array& aIndexedEntries ); + + /** + * Check for unindexed entries in the cache + * + * @param TInt Total number of documents in the cache + * @return void + */ + void CheckUnindexedEntriesL( TInt aTotalCount ); + + /** + * Check whether the "aFileName" document is indexed + * + * @param MDesC16Array& The indexed entries + * @param TDesC& Name of the dile to be checked + * @return TBool Is the document indexed + */ + TBool IsIndexed( const MDesC16Array& aIndexedEntries, const TDesC& aFileName ); + + /** + * Read the specified parameter from the kernel message + * + * @param TInt The parameter to be read + * @param RMessage2& Kernel message + * @return HBufC* The parameter data (16-bit) + */ + HBufC* ReadMsgParam16LC( TInt aMsgIndex, const RMessage2& aMessage ); + + /** + * Read the specified parameter from the kernel message + * + * @param TInt The parameter to be read + * @param RMessage2& Kernel message + * @return HBufC8* The parameter data (8-bit) + */ + HBufC8* ReadMsgParam8LC( TInt aMsgIndex, const RMessage2& aMessage ); + + /** + * Check the temporary buffer for data + * + * @return void + */ + void CheckTempBuffer(); + + /** + * Delete a named document from the store + * + * @param TDesC& Name of the document to be deleted + * @return TInt Error code + */ + TInt DeleteFromStorageL( const TDesC& aFileName ); + + /** + * Read a named document from the store + * + * @param TDesC& Name of the document to be deleted + * @return HBufC* The contents of the document + */ + HBufC8* ReadFromStorageL( const TDesC& aFileName ); + + private: //Data + + HBufC8* iTempBuffer; + CFileMan* iFileManager; + CXcapCacheServer* iCacheServer; + CXcapCacheIndex& iCacheIndex; + CXcapCacheIndexAdmin& iCacheIndexAdmin; + }; + + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapShutdownTimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/inc/XcapShutdownTimer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2005 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: CXcapShutdownTimer +* +*/ + + + + +#ifndef __XCAPSHUTDOWNTIMER__ +#define __XCAPSHUTDOWNTIMER__ + +NONSHARABLE_CLASS( CXcapShutdownTimer ) : public CTimer + { + public: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + CXcapShutdownTimer(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void ConstructL(); + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void Start(); + + private: + + /** + * Returns the MIME type of the messages + * @return TPtrC8 The MIME type of the messages + */ + void RunL(); + + private: + + enum { KXcapCacheShutdownDelay = 0x200000 }; + }; + +#endif diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheEntryProperty.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheEntryProperty.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,125 @@ +/* +* Copyright (c) 2005 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: CXcapCacheEntryPropertyProperty from XcapCacheIndexProperty.cpp +* +*/ + + + + +// INCLUDE FILES +#include "XcapCacheServer.h" +#include "XcapCacheEntryProperty.h" + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::CXcapCacheEntryProperty +// +// ---------------------------------------------------------- +// +CXcapCacheEntryProperty::CXcapCacheEntryProperty( TInt aPropertyName ) : + iPropertyName( aPropertyName ) + { + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheEntryProperty* CXcapCacheEntryProperty::NewL( TInt aPropertyName, + const TDesC8& aPropertyValue ) + { + CXcapCacheEntryProperty* self = new( ELeave ) CXcapCacheEntryProperty( aPropertyName ); + CleanupStack::PushL( self ); + self->ConstructL( aPropertyValue ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheEntryProperty::ConstructL( const TDesC8& aPropertyValue ) + { + iPropertyValue8 = aPropertyValue.AllocL(); + iPropertyValue16 = HBufC::NewL( aPropertyValue.Length() ); + iPropertyValue16->Des().Copy( aPropertyValue ); + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::~CXcapCacheEntryProperty +// +// ---------------------------------------------------------- +// +CXcapCacheEntryProperty::~CXcapCacheEntryProperty() + { + delete iPropertyValue8; + delete iPropertyValue16; + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::ConstructL +// +// ---------------------------------------------------------- +// +TInt CXcapCacheEntryProperty::Name() const + { + return iPropertyName; + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::ConstructL +// +// ---------------------------------------------------------- +// +TInt CXcapCacheEntryProperty::IntValue() const + { + return CXcapCacheServer::ConvertDesc( iPropertyValue8->Des() ); + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::ConstructL +// +// ---------------------------------------------------------- +// +TTime CXcapCacheEntryProperty::TimeValue() const + { + TTime ret; + ret.Parse( iPropertyValue16->Des() ); + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::ConstructL +// +// ---------------------------------------------------------- +// +TPtrC CXcapCacheEntryProperty::DesValue16() const + { + return iPropertyValue16 != NULL ? iPropertyValue16->Des() : TPtrC(); + } + +// ---------------------------------------------------------- +// CXcapCacheEntryProperty::ConstructL +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapCacheEntryProperty::DesValue8() const + { + return iPropertyValue8 != NULL ? iPropertyValue8->Des() : TPtrC8(); + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndex.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndex.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,268 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndex +* +*/ + + + + +// INCLUDE FILES +#include "ServerDefines.h" +#include "XcapCacheIndex.h" +#include "XcapCacheServer.h" +#include "XcapCacheIndexEntry.h" + +// ---------------------------------------------------------- +// CXcapCacheIndex::CXcapCacheIndex +// +// ---------------------------------------------------------- +// +CXcapCacheIndex::CXcapCacheIndex() + { + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndex* CXcapCacheIndex::NewL() + { + CXcapCacheIndex* self = new( ELeave ) CXcapCacheIndex(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndex::ConstructL() + { + TInt length = 0; + RFile index = InitialiseIndexL(); + CleanupClosePushL( index ); + User::LeaveIfError( index.Size( length ) ); + if( length > 0 ) + { + HBufC8* data = HBufC8::NewLC( length ); + TPtr8 pointer( data->Des() ); + User::LeaveIfError( index.Read( pointer ) ); + ReadEntriesL( pointer ); + CleanupStack::PopAndDestroy(); //data + } + CleanupStack::PopAndDestroy(); //index + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::InitialiseIndexL +// +// ---------------------------------------------------------- +// +RFile CXcapCacheIndex::InitialiseIndexL() + { + RFile ret; + TUid process = RProcess().Identity(); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheIndex::InitialiseIndexL() - Process: %x" ), process ) ; + #endif + TInt error = ret.Open( CXcapCacheServer::FileSession(), KCacheServerIndex, + EFileShareExclusive | EFileRead | EFileWrite ); + if( error != KErrNone ) + { + if( error == KErrPathNotFound ) + User::LeaveIfError( CXcapCacheServer::FileSession().MkDirAll( KCacheServerRoot ) ); + User::LeaveIfError( ret.Create( CXcapCacheServer::FileSession(), KCacheServerIndex, + EFileShareExclusive | EFileRead | EFileWrite ) ); + } + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::~CXcapCacheIndex +// +// ---------------------------------------------------------- +// +CXcapCacheIndex::~CXcapCacheIndex() + { + iEntryList.ResetAndDestroy(); + iEntryList.Close(); + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::ConstructL +// +// ---------------------------------------------------------- +// +TInt CXcapCacheIndex::UpdateIndexL( const CXcapCacheIndexEntry* aEntry ) + { + if( aEntry != NULL ) + { + User::LeaveIfError( iEntryList.Append( aEntry ) ); + return iEntryList.Find( aEntry ); + } + else return KErrNotFound; + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::Entry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry* CXcapCacheIndex::Entry( TInt aIndex ) const + { + TInt count = iEntryList.Count(); + CXcapCacheIndexEntry* entry = NULL; + if( count > 0 && aIndex >= 0 && aIndex < count ) + entry = iEntryList[aIndex]; + return entry; + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::EntryCount +// +// ---------------------------------------------------------- +// +TInt CXcapCacheIndex::EntryCount() const + { + return iEntryList.Count(); + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::Compare +// +// ---------------------------------------------------------- +// +TInt CXcapCacheIndex::Compare( const CXcapCacheIndexEntry& aFirst, + const CXcapCacheIndexEntry& aSecond ) + { + if( aFirst.LastModified() == aSecond.LastModified() ) + return 0; + else if( aFirst.LastModified() > aSecond.LastModified() ) + return 1; + else return -1; + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::SortEntries +// +// ---------------------------------------------------------- +// +void CXcapCacheIndex::SortEntriesL() + { + TLinearOrder order( CXcapCacheIndex::Compare ); + iEntryList.Sort( order ); + #ifdef _DEBUG + TPtrC8 entryDesc; + TInt count = iEntryList.Count(); + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheIndex::SortEntriesL()" ) ); + CXcapCacheServer::WriteToLog( _L8( "------------------------------------------" ) ); + CXcapCacheServer::WriteToLog( _L8( " Sorted list:" ) ); + for( TInt i = 0;i < count;i++ ) + { + HBufC* buffer = NULL; + buffer = CXcapCacheServer::DateTimeL( iEntryList[i]->LastModified() ); + TBuf8 printBuffer( _L8( " " ) ); + printBuffer.AppendFormat( _L8( "%d: " ), i ); + printBuffer.Append( *buffer ); + CXcapCacheServer::WriteToLog( printBuffer ); + } + CXcapCacheServer::WriteToLog( _L8( "------------------------------------------" ) ); + #endif + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::RemoveEntry +// +// ---------------------------------------------------------- +// +void CXcapCacheIndex::RemoveEntry( TInt aIndex ) + { + TInt count = iEntryList.Count(); + if( count > 0 && aIndex >= 0 && aIndex < count ) + { + CXcapCacheIndexEntry* entry = iEntryList[aIndex]; + iEntryList.Remove( aIndex ); + delete entry; + entry = NULL; + } + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::ReadEntriesL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndex::ReadEntriesL( TPtr8& aIndexData ) + { + TBool finished = EFalse; + while( !finished && aIndexData.Length() > 0 ) + { + //If we find that there is still more data, but no \r\n + //to denote the end of an entry, simply quit. The data + //format has most probably been corrupted at some point. + TInt entryIndex = aIndexData.FindF( KIndexFileEndOfLine ); + if( entryIndex > 0 ) + { + TPtr8 entryData = CXcapCacheServer::DescriptorCast( + aIndexData.Left( entryIndex ) ); + CXcapCacheIndexEntry* entry = CXcapCacheIndexEntry::NewL( entryData ); + CleanupStack::PushL( entry ); + User::LeaveIfError( iEntryList.Append( entry ) ); + CleanupStack::Pop(); + aIndexData.Delete( 0, entryIndex + 2 ); + } + else finished = ETrue; + } + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndex::StoreCacheDataL() + { + RFile index; + TInt count = iEntryList.Count(); + if( count > 0 ) + { + User::LeaveIfError( index.Replace( CXcapCacheServer::FileSession(), + KCacheServerIndex, EFileWrite ) ); + CleanupClosePushL( index ); + for( TInt i = 0;i < count;i++ ) + { + CXcapCacheIndexEntry* entry = iEntryList[i]; + HBufC8* entryData = entry->PrintLC(); + if( entryData ) + { + User::LeaveIfError( index.Write( entryData->Des() ) ); + CleanupStack::PopAndDestroy(); //entryData + } + } + CleanupStack::PopAndDestroy(); //index + } + else + { + CFileMan* manager = CFileMan::NewL( CXcapCacheServer::FileSession() ); + manager->Delete( KCacheServerIndex ); + delete manager; + manager = NULL; + } + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexAdmin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexAdmin.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,284 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndexAdmin +* +*/ + + + + +// INCLUDE FILES +#include "ServerDefines.h" +#include "XcapCacheServer.h" +#include "XcapCacheIndexAdmin.h" +#include "XcapCacheIndexTableEntry.h" + +// ---------------------------------------------------------- +// CXcapCacheIndexAdmin::CXcapCacheIndexAdmin +// +// ---------------------------------------------------------- +// +CXcapCacheIndexAdmin::CXcapCacheIndexAdmin() + { + } + +// ---------------------------------------------------------- +// CXcapCacheIndexAdmin::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexAdmin* CXcapCacheIndexAdmin::NewL() + { + CXcapCacheIndexAdmin* self = new( ELeave ) CXcapCacheIndexAdmin(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexAdmin::~CXcapCacheIndexAdmin +// +// ---------------------------------------------------------- +// +CXcapCacheIndexAdmin::~CXcapCacheIndexAdmin() + { + iEntryList.ResetAndDestroy(); + iEntryList.Close(); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexAdmin::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexAdmin::ConstructL() + { + TInt length = 0; + RFile indexTable = InitialisePageFileL(); + CleanupClosePushL( indexTable ); + User::LeaveIfError( indexTable.Size( length ) ); + if( length > 0 ) + { + HBufC8* data = HBufC8::NewLC( length ); + TPtr8 pointer( data->Des() ); + User::LeaveIfError( indexTable.Read( pointer ) ); + ReadEntriesL( pointer ); + CleanupStack::PopAndDestroy(); //data + } + CleanupStack::PopAndDestroy(); //index + } + +// ---------------------------------------------------------- +// CXcapCacheIndex::InitialisePageFileL +// +// ---------------------------------------------------------- +// +RFile CXcapCacheIndexAdmin::InitialisePageFileL() + { + RFile ret; + TInt error = ret.Open( CXcapCacheServer::FileSession(), KCacheServerPageFile, + EFileShareExclusive | EFileRead | EFileWrite ); + //No need to check the path at this time, because needed + //directories have already been created by the CacheIndex + //object if they didn't exist before the server was launched + if( error != KErrNone ) + User::LeaveIfError( ret.Create( CXcapCacheServer::FileSession(), KCacheServerPageFile, + EFileShareExclusive | EFileRead | EFileWrite ) ); + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexAdmin::UpdateIndexTableL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexAdmin::UpdateIndexTableL( TInt aIndex, const TCacheEntryInfo* aHeader ) + { + CXcapCacheIndexTableEntry* entry = + CXcapCacheIndexTableEntry::NewL( aIndex, *aHeader->iRootUri, + *aHeader->iDocumentUri ); + CleanupStack::PushL( entry ); + User::LeaveIfError( iEntryList.Append( entry ) ); + CleanupStack::Pop(); //entry + } + +// ---------------------------------------------------------- +// CXcapCacheSession::ReadIndexL +// +// ---------------------------------------------------------- +// +TInt CXcapCacheIndexAdmin::ReadIndexL( const CXcapCacheIndexTableEntry& aEntry ) + { + TBool found = EFalse; + TInt ret = KErrNotFound; + TInt count = iEntryList.Count(); + CXcapCacheIndexTableEntry* entry = NULL; + for( TInt i = 0;!found && i < count;i++ ) + { + entry = iEntryList[i]; + if( *entry == aEntry ) + { + ret = entry->Index(); + found = ETrue; + } + } + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheSession::FindL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry* CXcapCacheIndexAdmin::FindL( TInt& aTableIndex, + const TDesC8& aRootUri, + const TDesC& aDocumentUri ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheIndexAdmin::FindL()" ) ); + #endif + TBool found = EFalse; + TInt count = iEntryList.Count(); + CXcapCacheIndexTableEntry* entry = NULL; + if( count > 0 ) + { + CXcapCacheIndexTableEntry* newEntry = CXcapCacheIndexTableEntry::NewL( + aRootUri, aDocumentUri ); + for( TInt i = 0;!found && i < count;i++ ) + { + CXcapCacheIndexTableEntry* listEntry = iEntryList[i]; + if( *newEntry == *listEntry ) + { + aTableIndex = i; + entry = iEntryList[i]; + found = ETrue; + } + } + delete newEntry; + newEntry = NULL; + } + return entry; + } + +// ---------------------------------------------------------- +// CXcapCacheSession::RemoveTableIndexL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexAdmin::RemoveTableIndex( TInt aIndex ) + { + TInt count = iEntryList.Count(); + if( count > 0 && aIndex >= 0 && aIndex < count ) + { + CXcapCacheIndexTableEntry* entry = iEntryList[aIndex]; + iEntryList.Remove( aIndex ); + delete entry; + entry = NULL; + for( TInt i = aIndex;i < count - 1;i++ ) + { + CXcapCacheIndexTableEntry* z = iEntryList[i]; + z->Decrease(); + } + } + } + +// ---------------------------------------------------------- +// CXcapCacheSession::StoreIndexTableL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexAdmin::StoreIndexTableL() + { + RFile indexTable; + TInt count = iEntryList.Count(); + if( count > 0 ) + { + TBuf8<7> numBuf; + User::LeaveIfError( indexTable.Replace( CXcapCacheServer::FileSession(), + KCacheServerPageFile, EFileWrite ) ); + CleanupClosePushL( indexTable ); + for( TInt i = 0;i < count;i++ ) + { + numBuf.AppendNum( iEntryList[i]->Index() ); + indexTable.Write( iEntryList[i]->RootUri() ); + indexTable.Write( KValueFieldSeparator ); + indexTable.Write( iEntryList[i]->DocumentUri() ); + indexTable.Write( KPageFileSeparator ); + indexTable.Write( numBuf ); + indexTable.Write( KIndexFileEndOfLine ); + numBuf.Zero(); + } + CleanupStack::PopAndDestroy(); //indexTable + } + else + { + CFileMan* manager = CFileMan::NewL( CXcapCacheServer::FileSession() ); + manager->Delete( KCacheServerPageFile ); + delete manager; + manager = NULL; + } + } + +// ---------------------------------------------------------- +// CXcapCacheSession::UpdatePageFileL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexAdmin::ReadEntriesL( TPtr8& aDataDesc ) + { + TBool finished = EFalse; + while( !finished && aDataDesc.Length() > 0 ) + { + //If we find that there is still more data, but no \r\n + //to denote the end of an entry, simply quit. The data + //format has most probably been corrupted at some point. + TInt entryIndex = aDataDesc.FindF( KIndexFileEndOfLine ); + if( entryIndex > 0 ) + { + TPtrC8 one = aDataDesc.Left( entryIndex ); + CXcapCacheIndexTableEntry* entry = ParseOneEntryL( one ); + CleanupStack::PushL( entry ); + User::LeaveIfError( iEntryList.Append( entry ) ); + CleanupStack::Pop(); + aDataDesc.Delete( 0, entryIndex + 2 ); + } + else finished = ETrue; + } + } + +// ---------------------------------------------------------- +// CXcapCacheSession::ParseOneEntryL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry* CXcapCacheIndexAdmin::ParseOneEntryL( const TDesC8& aEntryData ) + { + CXcapCacheIndexTableEntry* ret = NULL; + TInt rootIndex = aEntryData.FindF( KValueFieldSeparator ); + if( rootIndex > 0 ) + { + TPtrC8 root( aEntryData.Left( rootIndex ) ); + TInt docIndex = aEntryData.FindF( KPageFileSeparator ); + TPtrC8 doc( aEntryData.Mid( rootIndex + 1, docIndex - ( rootIndex + 1 ) ) ); + TPtrC8 pos( aEntryData.Mid( docIndex + 1, aEntryData.Length() - ( docIndex + 1 ) ) ); + TInt index( CXcapCacheServer::ConvertDesc( pos ) ); + ret = CXcapCacheIndexTableEntry::NewL( index, root, doc ); + } + return ret; + } + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexEntry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexEntry.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,410 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndexEntry +* +*/ + + + + +// INCLUDE FILES +#include "ServerDefines.h" +#include "XcapCacheServer.h" +#include "XcapCacheIndexEntry.h" +#include "XcapCacheEntryProperty.h" + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::CXcapCacheIndexEntry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry::CXcapCacheIndexEntry() + { + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry* CXcapCacheIndexEntry::NewL( const TCacheEntryInfo* aHeader ) + { + CXcapCacheIndexEntry* self = new( ELeave ) CXcapCacheIndexEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aHeader ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry* CXcapCacheIndexEntry::NewL( TPtr8& aEntryData ) + { + CXcapCacheIndexEntry* self = new( ELeave ) CXcapCacheIndexEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aEntryData ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::~CXcapCacheIndexEntry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexEntry::~CXcapCacheIndexEntry() + { + iPropertyList.ResetAndDestroy(); + iPropertyList.Close(); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::ConstructL( TPtr8& aEntryData ) + { + while( aEntryData.Length() > 0 ) + { + CXcapCacheEntryProperty* prop = NULL; + TInt index = aEntryData.FindF( KValueFieldSeparator ); + if( index > 0 ) + { + TPtrC8 propData = aEntryData.Left( index ); + TInt separator = propData.FindF( KValuePropertySeparator ); + if( separator > 0 ) + { + TPtrC8 name = propData.Left( separator ); + TPtrC8 value = propData.Right( propData.Length() - separator - 1 ); + const TInt nameId = FindPropNameId( name ); + __ASSERT_DEBUG( nameId != KErrNotFound, User::Leave( KErrCorrupt ) ); + prop = CreatePropertyL( nameId, value ); + CleanupStack::PushL( prop ); + User::LeaveIfError( iPropertyList.Append( prop ) ); + CleanupStack::Pop(); //prop + } + aEntryData.Delete( 0, index + 1 ); + } + } + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::ConstructL( const TCacheEntryInfo* aHeader ) + { + CreateFromHeaderL( aHeader ); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::FindPropNameId +// +// ---------------------------------------------------------- +// +TInt CXcapCacheIndexEntry::FindPropNameId( const TDesC8& aNameString ) const + { + TBool found = EFalse; + TInt ret = KErrNotFound; + TInt arrayLength = sizeof( KCacheEntryArray ) / + sizeof( KCacheEntryArray[0] ); + for( TInt i = 0;!found && i < arrayLength;i++ ) + { + if( aNameString.CompareF( TPtrC8( KCacheEntryArray[i] ) ) == 0 ) + { + ret = i; + found = ETrue; + } + } + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::UpdateEntryL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::UpdateEntryL( const TCacheEntryInfo* aHeader ) + { + TTime access = LastAccess(); + DeleteFileL( FileNameL() ); + iPropertyList.ResetAndDestroy(); + CreateFromHeaderL( aHeader ); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::DeleteFileL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::DeleteFileL( const TDesC8& aFileName ) + { + HBufC* buf = HBufC::NewLC( aFileName.Length() ); + buf->Des().Copy( aFileName ); + CFileMan* manager = CFileMan::NewL( CXcapCacheServer::FileSession() ); + CleanupStack::PushL( manager ); + TInt error = manager->Delete( buf->Des() ); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::DeleteFileL() - Error: %d" ), error ); + #endif + CleanupStack::PopAndDestroy( 2 ); //manager, buf + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::CreatePropertyL +// +// ---------------------------------------------------------- +// +CXcapCacheEntryProperty* CXcapCacheIndexEntry::CreatePropertyL( const TInt aPropertyName, + const TDesC8& aPropertyValue ) + { + return CXcapCacheEntryProperty::NewL( aPropertyName, aPropertyValue ); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::FindProperty +// +// --------------------------------------------------------- +// +const CXcapCacheEntryProperty& CXcapCacheIndexEntry::FindProperty( const TInt aPropId ) const + { + TBool found = EFalse; + TInt count = iPropertyList.Count(); + CXcapCacheEntryProperty* property = NULL; + for( TInt i = 0;!found && i < count;i++ ) + { + property = iPropertyList[i]; + if( property->Name() == aPropId ) + found = ETrue; + } + return *property; + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::LastAccess +// +// --------------------------------------------------------- +// +TTime CXcapCacheIndexEntry::LastAccess() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheLastAccess ); + return property.TimeValue(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::LastModified +// +// --------------------------------------------------------- +// +TTime CXcapCacheIndexEntry::LastModified() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheLastModified ); + return property.TimeValue(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::XmlSize +// +// --------------------------------------------------------- +// +TInt CXcapCacheIndexEntry::XmlSize() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheXmlSize ); + return property.IntValue(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::FileNameL +// +// --------------------------------------------------------- +// +TPtrC8 CXcapCacheIndexEntry::FileNameL() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheXmlFile ); + return property.DesValue8(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::FileName16L +// +// --------------------------------------------------------- +// +TPtrC CXcapCacheIndexEntry::FileName16L() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheXmlFile ); + return property.DesValue16(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::ETag +// +// --------------------------------------------------------- +// +TPtrC8 CXcapCacheIndexEntry::ETag() const + { + const CXcapCacheEntryProperty& property = FindProperty( KCacheEntryETag ); + return property.DesValue8(); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::CreateFromHeaderL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexEntry::CreateFromHeaderL( const TCacheEntryInfo* aHeader ) + { + TInt arrayLength = sizeof( KCacheEntryArray ) / + sizeof( KCacheEntryArray[0] ); + HBufC8* hour = HourStringLC(); + for( TInt i = 0;i < arrayLength;i++ ) + { + CXcapCacheEntryProperty* prop = NULL; + switch( i ) + { + case KCacheEntryETag: + prop = CreatePropertyL( KCacheEntryETag, *aHeader->iEtag ); + break; + case KCacheXmlSize: + { + TBuf8<10> sizeBuf; + sizeBuf.AppendNum( aHeader->iDataLength ); + prop = CreatePropertyL( KCacheXmlSize, sizeBuf ); + } + break; + case KCacheXmlFile: + { + HBufC8* fileName = StoreXmlFileLC( *aHeader->iRespData ); + prop = CreatePropertyL( KCacheXmlFile, fileName->Des() ); + CleanupStack::PopAndDestroy(); //fileName + } + break; + case KCacheLastAccess: + prop = CreatePropertyL( KCacheLastAccess, hour->Des() ); + break; + case KCacheLastModified: + prop = CreatePropertyL( KCacheLastModified, hour->Des() ); + break; + default: + break; + } + if( prop != NULL ) + User::LeaveIfError( iPropertyList.Append( prop ) ); + } + CleanupStack::PopAndDestroy(); //hour + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::HourStringLC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheIndexEntry::HourStringLC() + { + HBufC8* hourString = NULL; + HBufC* date = CXcapCacheServer::DateL(); + HBufC* time = CXcapCacheServer::TimeL(); + hourString = HBufC8::NewLC( date->Length() + time->Length() + 1 ); + TPtr8 pointer( hourString->Des() ); + pointer.Copy( *date ); + pointer.Append( KPageFileSeparator ); + pointer.Append( *time ); + delete date; + date = NULL; + delete time; + time = NULL; + return hourString; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::StoreXmlFileLC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheIndexEntry::StoreXmlFileLC( const TDesC8& aXmlData ) + { + RFile file; + HBufC* nameBuf = NULL; + HBufC* randomString = NULL; + TPtrC randomName( _L( "" ) ); + TInt error = KErrAlreadyExists; + //It is extremely unlikely that the random string generator + //creates two exact same patterns, but let's check for it, anyway. + while( error == KErrAlreadyExists ) + { + randomString = CXcapCacheServer::RandomStringL(); + randomName.Set( *randomString ); + nameBuf = HBufC::NewLC( KCacheServerRoot().Length() + randomName.Length() ); + nameBuf->Des().Copy( KCacheServerRoot ); + nameBuf->Des().Append( randomName ); + error = file.Create( CXcapCacheServer::FileSession(), + nameBuf->Des(), EFileWrite ); + if( error != KErrNone ) + CleanupStack::PopAndDestroy(); //nameBuf + } + file.Write( aXmlData ); + file.Close(); + __ASSERT_ALWAYS( nameBuf != NULL, User::Leave( KErrCorrupt ) ); + HBufC8* ret = HBufC8::NewLC( nameBuf->Des().Length() ); + ret->Des().Copy( nameBuf->Des() ); + CleanupStack::Pop(); //ret + CleanupStack::PopAndDestroy(); //nameBuf + CleanupStack::PushL( ret ); + return ret; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexEntry::PrintLC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheIndexEntry::PrintLC() const + { + TInt position = 0; + CBufFlat* buffer = NULL; + HBufC8* entryString = NULL; + TInt count = iPropertyList.Count(); + if( count > 0 ) + { + buffer = CBufFlat::NewL( 50 ); + CleanupStack::PushL( buffer ); + for( TInt i = 0;i < count;i++ ) + { + TPtrC8 name = TPtrC8( KCacheEntryArray[iPropertyList[i]->Name()] ); + TPtrC8 value = iPropertyList[i]->DesValue8(); + buffer->InsertL( position, name ); + position = position + name.Length(); + buffer->InsertL( position, KValuePropertySeparator ); + position = position + KValuePropertySeparator().Length(); + buffer->InsertL( position, value ); + position = position + value.Length(); + buffer->InsertL( position, KValueFieldSeparator ); + position = position + KValueFieldSeparator().Length(); + } + buffer->InsertL( position, KIndexFileEndOfLine ); + TPtr8 pointer( buffer->Ptr( 0 ) ); + entryString = HBufC8::NewL( pointer.Length() ); + entryString->Des().Copy( pointer ); + CleanupStack::PopAndDestroy(); //buffer + CleanupStack::PushL( entryString ); + } + return entryString; + } + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexTableEntry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheIndexTableEntry.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,210 @@ +/* +* Copyright (c) 2005 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: CXcapCacheIndexTableEntry +* +*/ + + + + +// INCLUDE FILES +#include "ServerDefines.h" +#include "XcapCacheServer.h" +#include "XcapCacheIndexTableEntry.h" + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::CXcapCacheIndexTableEntry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry::CXcapCacheIndexTableEntry() : iEntryIndex( KErrNotFound ) + { + } + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::CXcapCacheIndexTableEntry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry::CXcapCacheIndexTableEntry( const TInt aEntryIndex ) : + iEntryIndex( aEntryIndex ) + { + } + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry* CXcapCacheIndexTableEntry::NewL( const TInt aEntryIndex, + const TDesC8& aRootUri, + const TDesC& aDocumentUri ) + { + CXcapCacheIndexTableEntry* self = new( ELeave ) CXcapCacheIndexTableEntry( aEntryIndex ); + CleanupStack::PushL( self ); + self->ConstructL( aRootUri, aDocumentUri ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry* CXcapCacheIndexTableEntry::NewL( const TInt aEntryIndex, + const TDesC8& aRootUri, + const TDesC8& aDocumentUri ) + { + CXcapCacheIndexTableEntry* self = new( ELeave ) CXcapCacheIndexTableEntry( aEntryIndex ); + CleanupStack::PushL( self ); + self->ConstructL( aRootUri, aDocumentUri ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry* CXcapCacheIndexTableEntry::NewL( const TDesC8& aRootUri, + const TDesC& aDocumentUri ) + { + CXcapCacheIndexTableEntry* self = new( ELeave ) CXcapCacheIndexTableEntry(); + CleanupStack::PushL( self ); + self->ConstructL( aRootUri, aDocumentUri ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::~CXcapCacheIndexTableEntry +// +// ---------------------------------------------------------- +// +CXcapCacheIndexTableEntry::~CXcapCacheIndexTableEntry() + { + delete iRootUri; + delete iDocumentUri; + } + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexTableEntry::ConstructL( const TDesC8& aRootUri, + const TDesC& aDocumentUri ) + { + #ifdef _DEBUG + HBufC8* eightBuffer = HBufC8::NewLC( aDocumentUri.Length() ); + TPtr8 desc( eightBuffer->Des() ); + desc.Copy( aDocumentUri ); + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheIndexTableEntry::ConstructL" ) ); + CXcapCacheServer::WriteToLog( _L8( " Root: %S" ), &aRootUri ); + CXcapCacheServer::WriteToLog( _L8( " Document: %S" ), &desc ); + CleanupStack::PopAndDestroy(); //eightBuffer + #endif + iRootUri = aRootUri.AllocL(); + iDocumentUri = HBufC8::NewL( aDocumentUri.Length() ); + iDocumentUri->Des().Copy( aDocumentUri ); + } + +// ---------------------------------------------------------- +// CXcapCacheIndexTableEntry::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheIndexTableEntry::ConstructL( const TDesC8& aRootUri, + const TDesC8& aDocumentUri ) + { + #ifdef _DEBUG + HBufC8* eightBuffer = HBufC8::NewLC( aDocumentUri.Length() ); + TPtr8 desc( eightBuffer->Des() ); + desc.Copy( aDocumentUri ); + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheIndexTableEntry::ConstructL" ) ); + CXcapCacheServer::WriteToLog( _L8( " Root: %S" ), &aRootUri ); + CXcapCacheServer::WriteToLog( _L8( " Document: %S" ), &desc ); + CleanupStack::PopAndDestroy(); //eightBuffer + #endif + iRootUri = aRootUri.AllocL(); + iDocumentUri = HBufC8::NewL( aDocumentUri.Length() ); + iDocumentUri->Des().Copy( aDocumentUri ); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::EntryData +// +// --------------------------------------------------------- +// +TPtrC8 CXcapCacheIndexTableEntry::RootUri() const + { + return iRootUri != NULL ? iRootUri->Des() : TPtrC8(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::EntryData +// +// --------------------------------------------------------- +// +TPtrC8 CXcapCacheIndexTableEntry::DocumentUri() const + { + return iDocumentUri != NULL ? iDocumentUri->Des() : TPtrC8(); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::EntryData +// +// --------------------------------------------------------- +// +void CXcapCacheIndexTableEntry::Increase() + { + iEntryIndex++; + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::EntryData +// +// --------------------------------------------------------- +// +void CXcapCacheIndexTableEntry::Decrease() + { + iEntryIndex--; + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::operator++ +// +// --------------------------------------------------------- +// +TBool CXcapCacheIndexTableEntry::operator==( const CXcapCacheIndexTableEntry& aEntry ) const + { + return ( iRootUri != NULL && iDocumentUri != NULL ) && + ( iRootUri->Des().CompareF( aEntry.RootUri() ) == 0 ) && + ( iDocumentUri->Des().CompareF( aEntry.DocumentUri() ) == 0 ); + } + +// --------------------------------------------------------- +// CXcapCacheIndexTableEntry::operator++ +// +// --------------------------------------------------------- +// +TInt CXcapCacheIndexTableEntry::Index() const + { + return iEntryIndex; + } + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheServer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,387 @@ +/* +* Copyright (c) 2005 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: CXcapCacheServer +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include "XcapCacheIndex.h" +#include "XcapCacheServer.h" +#include "XcapCacheSession.h" +#include "XcapCacheIndexAdmin.h" +#include "XcapCacheServerMain.h" + +GLDEF_C void PanicServer( TXcapCacheServerPanic aPanic ) + { + _LIT( KCacheServerPanic, "XcapCacheServer"); + User::Panic( KCacheServerPanic, aPanic ); + } + +// ---------------------------------------------------------- +// CXcapCacheServer::New +// +// ---------------------------------------------------------- +// +CServer2* CXcapCacheServer::NewLC() + { + CXcapCacheServer* self = new CXcapCacheServer( EPriorityHigh ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheServer::New +// +// ---------------------------------------------------------- +// +void CXcapCacheServer::ConstructL() + { + ReadMaxCacheSizeL(); + User::LeaveIfError( iFileSession.Connect() ); + StartL( KXcapCacheServerLib ); + iShutdownTimer.ConstructL(); + iShutdownTimer.Start(); + } + +// ---------------------------------------------------------- +// CXcapCacheServer::NewSessionL +// +// ---------------------------------------------------------- +// +CSession2* CXcapCacheServer::NewSessionL( const TVersion& aVersion, + const RMessage2& /*aMessage*/ ) const + { + // Check version number of API against our known version number. + TVersion thisVersion( KCacheServerMajorVersionNumber, + KCacheServerMinorVersionNumber, + KCacheServerBuildVersionNumber ); + if( !User::QueryVersionSupported( thisVersion, aVersion ) ) + User::Leave( KErrNotSupported ); + return CXcapCacheSession::NewL( ( CXcapCacheServer* )this ); + } + +// ---------------------------------------------------------- +// CXcapCacheServer::CXcapCacheServer +// +// ---------------------------------------------------------- +// +CXcapCacheServer::~CXcapCacheServer() + { + iFileSession.Close(); + } + +// ---------------------------------------------------------- +// CXcapCacheServer::ReadMaxCacheSizeL +// +// ---------------------------------------------------------- +// +void CXcapCacheServer::ReadMaxCacheSizeL() + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::ReadMaxCacheSizeL()" ) ); + #endif + CRepository* repository = CRepository::NewL( KCRUIDXDMEngineXcapLocal ); + CleanupStack::PushL( repository ); + TInt error = repository->Get( KXDMXcapCacheSize, iMaxCacheSize ); + //If something went wrong, just use 30 KB as a default value + if( error != KErrNone ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "Reading from CenRep failed: %d => Default to 30 KB" ), error ); + #endif + iMaxCacheSize = 30000; + } + else + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( " Max cache size is %d KB" ), iMaxCacheSize ); + #endif + iMaxCacheSize = iMaxCacheSize * 1000; + } + CleanupStack::PopAndDestroy(); //repository + } + +// ---------------------------------------------------------- +// CXcapCacheServer::CXcapCacheServer +// +// ---------------------------------------------------------- +// +CXcapCacheServer::CXcapCacheServer( TInt aPriority ) : CServer2( aPriority ) + { + } + +// ---------------------------------------------------------- +// CXcapCacheServer::AddSession +// +// ---------------------------------------------------------- +// +void CXcapCacheServer::AddSession() + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::AddSession()" ) ); + #endif + ++iSessionCount; + iShutdownTimer.Cancel(); + } + +// ---------------------------------------------------------- +// CXcapCacheServer::DropSession +// +// ---------------------------------------------------------- +// +void CXcapCacheServer::DropSession() + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::DropSession()" ) ); + #endif + if( --iSessionCount == 0 ) + CActiveScheduler::Stop(); + } + +// ---------------------------------------------------------- +// CXcapCacheServer::ConvertDesc +// +// ---------------------------------------------------------- +// +TInt CXcapCacheServer::ConvertDesc( const TDesC8& aNumberDesc ) + { + TInt ret = 0; + TLex8 lex( aNumberDesc ); + TInt error = lex.Val( ret ); + return error == KErrNone ? ret : error; + } + +// --------------------------------------------------------- +// CXcapCacheServer::DateL +// +// --------------------------------------------------------- +// +HBufC* CXcapCacheServer::DateL() + { + TTime time; + TBuf dateBuffer; + dateBuffer.SetLength( 0 ); + time.HomeTime(); + time.FormatL( dateBuffer, KCacheDateFormat ); + HBufC* heapDate = dateBuffer.AllocL(); + return heapDate; + } + +// --------------------------------------------------------- +// CXcapCacheServer::DateTimeL +// +// --------------------------------------------------------- +// +HBufC* CXcapCacheServer::DateTimeL() + { + TTime time; + TBuf dateBuffer; + time.HomeTime(); + time.FormatL( dateBuffer, KDateFormatFileName ); + TBuf timeBuffer; + time.HomeTime(); + time.FormatL( timeBuffer, KTimeFormatFileName ); + TBuf buffer; + buffer.SetLength( 0 ); + buffer.Copy( dateBuffer ); + buffer.Append( timeBuffer ); + HBufC* ret = HBufC::NewL( buffer.Length() ); + ret->Des().Copy( buffer ); + return ret; + } + +// --------------------------------------------------------- +// CXcapCacheServer::DateTimeL +// +// --------------------------------------------------------- +// +HBufC* CXcapCacheServer::DateTimeL( const TTime& aTime ) + { + TBuf dateTimeBuffer; + aTime.FormatL( dateTimeBuffer, KDateTimeFormat ); + HBufC* heapDateTime = dateTimeBuffer.AllocL(); + return heapDateTime; + } + +// ---------------------------------------------------------- +// CXcapCacheServer::MaxCacheSize +// +// ---------------------------------------------------------- +// +TInt CXcapCacheServer::MaxCacheSize() const + { + return iMaxCacheSize; + } + +// --------------------------------------------------------- +// CXcapCacheServer::CacheSize +// +// --------------------------------------------------------- +// +TInt CXcapCacheServer::CacheSize( TInt& aEntryCount ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::CacheSize()" ) ); + #endif + TInt total = 0; + TInt entryCount = 0; + CDir* directory = NULL; + User::LeaveIfError( iFileSession.GetDir( KCacheServerRoot, KEntryAttNormal, + ESortNone, directory ) ); + CleanupStack::PushL( directory ); + entryCount = directory->Count(); + for( TInt i = 0;i < entryCount;i++ ) + total = total + ( *directory )[i].iSize; + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( " Entries: %d " ), entryCount ); + CXcapCacheServer::WriteToLog( _L8( " Total size: %d bytes" ), total ); + #endif + CleanupStack::PopAndDestroy(); + aEntryCount = entryCount; + return total; + } + +// --------------------------------------------------------- +// CXcapCacheServer::RandomStringL +// +// --------------------------------------------------------- +// +HBufC* CXcapCacheServer::RandomStringL() + { + const TInt charCount( sizeof( KRandomStringCharArray ) / sizeof( TInt ) ); + TBuf buffer; + buffer.Zero(); + for( TInt i = 0; i < KRandStringLength;i++ ) + { + TInt index = Math::Random() % charCount; + buffer.Append( ( TChar )KRandomStringCharArray[index] ); + } + HBufC* randomHeapBuffer = buffer.AllocL(); + return randomHeapBuffer; + } + +// --------------------------------------------------------- +// CXcapCacheServer::TimeL +// +// --------------------------------------------------------- +// +HBufC* CXcapCacheServer::TimeL() + { + TTime time; + TBuf timeBuffer; + timeBuffer.SetLength( 0 ); + time.HomeTime(); + time.FormatL( timeBuffer, KCacheTimeFormat ); + HBufC* heapTime = timeBuffer.AllocL(); + return heapTime; + } + +// --------------------------------------------------------- +// CXcapCacheServer::DescriptorCast +// +// --------------------------------------------------------- +// +TPtr8 CXcapCacheServer::DescriptorCast( const TDesC8& aConstData ) + { + TInt length = aConstData.Length(); + TPtr8 constCast( CONST_CAST( TUint8*, aConstData.Ptr() ), length, length ); + constCast.TrimAll(); + return constCast; + } + +// ---------------------------------------------------- +// CXcapCacheServer::FileSession +// +// ---------------------------------------------------- +// +RFs& CXcapCacheServer::FileSession() + { + return FsSession; + } + +// ---------------------------------------------------- +// CXcapCacheServer::FileSession +// +// ---------------------------------------------------- +// +CXcapCacheIndex* CXcapCacheServer::Index() + { + return CacheIndex; + } + +// ---------------------------------------------------- +// CXcapCacheServer::FileSession +// +// ---------------------------------------------------- +// +CXcapCacheIndexAdmin* CXcapCacheServer::IndexAdmin() + { + return CacheIndexAdmin; + } + +// ---------------------------------------------------- +// CXcapCacheServer::StartThreadL +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXcapCacheServer::StartThreadL() + { + User::LeaveIfError( User::RenameThread( KXcapCacheServerName ) ); + CActiveScheduler* scheduler = new ( ELeave ) CActiveScheduler; + CleanupStack::PushL( scheduler ); + CActiveScheduler::Install( scheduler ); + User::LeaveIfError( FsSession.Connect() ); + CleanupClosePushL( FsSession ); + CXcapCacheServer::NewLC(); + CacheIndex = CXcapCacheIndex::NewL(); + CleanupStack::PushL( CacheIndex ); + CacheIndexAdmin = CXcapCacheIndexAdmin::NewL(); + CleanupStack::PushL( CacheIndexAdmin ); + RProcess::Rendezvous( KErrNone ); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "XcapCacheServer fully running" ) ); + #endif + CActiveScheduler::Start(); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "XcapCacheServer closing..." ) ); + #endif + CleanupStack::PopAndDestroy( 5 ); //CacheIndexAdmin, CacheIndex, server, FsSession, scheduler + return KErrNone; + } + +// ---------------------------------------------------- +// CXcapCacheServer::WriteToLog +// +// ---------------------------------------------------- +// +EXPORT_C void CXcapCacheServer::WriteToLog( TRefByValue aFmt,... ) + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + RFileLogger::Write( KCacheServerLogDir, KCacheServerLogFile, EFileLoggingModeAppend, buf ); + RDebug::RawPrint( buf ); + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheServerMain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheServerMain.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2005 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: XcapCacheServerMain.cpp +* +*/ + + + +#include "XcapCacheServer.h" + +// ---------------------------------------------------------- +// DeleteLogFiles +// +// ---------------------------------------------------------- +// +TInt DeleteLogFileL() + { + RFs session; + TInt error = session.Connect(); + if( error == KErrNone ) + { + CFileMan* manager = CFileMan::NewL( session ); + error = manager->Delete( _L( "C:\\logs\\XDM\\CacheServer.txt" ) ); + session.Close(); + delete manager; + manager = NULL; + } + return error; + } + +// ---------------------------------------------------------- +// E32Main +// +// ---------------------------------------------------------- +// +GLDEF_C TInt E32Main() + { + __UHEAP_MARK; + TInt error = KErrNoMemory; + CTrapCleanup* cleanup = CTrapCleanup::New(); + #ifdef _DEBUG + TRAPD( logErr, DeleteLogFileL() ); + TBuf8 exe; + TFileName name( RProcess().FileName() ); + exe.Copy( name ); + CXcapCacheServer::WriteToLog( _L8( "*** E32Main(): Exe loaded from %S - Log deletion: %d"), + &exe, logErr ); + #endif + if( cleanup ) + { + TRAP( error, CXcapCacheServer::StartThreadL() ); + delete cleanup; + } + __UHEAP_MARKEND; + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "*** E32Main() completes: %d" ), error ); + #endif + return error; + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapCacheSession.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,588 @@ +/* +* Copyright (c) 2005 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: CXcapCacheSession +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include "XcapCacheIndex.h" +#include "XcapCacheSession.h" +#include "XcapCacheIndexAdmin.h" +#include "XcapCacheIndexEntry.h" +#include "XcapCacheIndexTableEntry.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapCacheSession::NewL +// +// ---------------------------------------------------------- +// +CXcapCacheSession* CXcapCacheSession::NewL( CXcapCacheServer* aServer ) + { + CXcapCacheSession* self = new( ELeave ) CXcapCacheSession( aServer ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapCacheSession::~CXcapCacheSession +// +// ---------------------------------------------------------- +// +CXcapCacheSession::~CXcapCacheSession() + { + delete iFileManager; + //Reduce number of active clients within server + if( iCacheServer ) + iCacheServer->DropSession(); + } + +// ---------------------------------------------------------- +// CXcapCacheSession::ServiceL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::ServiceL( const RMessage2& aMessage ) + { + TInt ret = KErrNone; + if( Capabilities( aMessage ) ) + { + CheckTempBuffer(); + TRAPD( err, DispatchMessageL( aMessage ) ); + if( err != KErrNone ) + ret = err; + } + else ret = KErrPermissionDenied; + aMessage.Complete( ret ); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "** Message completed - Error: %d" ), ret ); + #endif + } + +// ---------------------------------------------------------- +// CXcapCacheSession::Capabilities +// +// ---------------------------------------------------------- +// +TBool CXcapCacheSession::Capabilities( const RMessage2& aMessage ) + { + return aMessage.HasCapability( ECapabilityReadUserData ) && + aMessage.HasCapability( ECapabilityWriteUserData ); + } + +// ---------------------------------------------------------- +// CXcapCacheSession::CheckTempBuffer +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::CheckTempBuffer() + { + if( iTempBuffer ) + { + delete iTempBuffer; + iTempBuffer = NULL; + } + } + +// ---------------------------------------------------------- +// CXcapCacheSession::CXcapCacheSession +// +// ---------------------------------------------------------- +// +CXcapCacheSession::CXcapCacheSession( CXcapCacheServer* aServer ) : + iCacheServer( aServer ), + iCacheIndex( *CXcapCacheServer::Index() ), + iCacheIndexAdmin( *CXcapCacheServer::IndexAdmin() ) + { + } + +// ---------------------------------------------------------- +// CXcapCacheSession::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::ConstructL() + { + iCacheServer->AddSession(); + iFileManager = CFileMan::NewL( iCacheServer->FileSession() ); + #ifdef _DEBUG + TInt count = 0; + iCacheServer->CacheSize( count ); + #endif + } + +// ---------------------------------------------------------- +// CXcapCacheSession::PanicClient +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::PanicClient( TInt aPanic ) + { + _LIT( KTxtSessionPanic,"Test Server Session panic"); + User::Panic( KTxtSessionPanic, aPanic ); + } + +// ---------------------------------------------------------- +// CXcapCacheSession::DispatchMessageL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::DispatchMessageL( const RMessage2& aMessage ) + { + switch( aMessage.Function() ) + { + case EXcapCacheFetchInfo: + FetchDocumentInfoL( aMessage ); + break; + case EXcapCacheFetchData: + FetchDocumentContentsL( aMessage ); + break; + case EXcapCacheStore: + { + TInt entryCount = 0; + CacheXcapDataL( aMessage ); + TInt size = iCacheServer->CacheSize( entryCount ); + CheckUnindexedEntriesL( entryCount ); + //Recheck the size + size = iCacheServer->CacheSize( entryCount ); + const TInt maxSize = iCacheServer->MaxCacheSize(); + //If there's only one document filling the + //whole data area, there's not much to be done + //NOTE: Index & pagefile are always there => 3 + if( size >= maxSize && entryCount > 3 ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( " Cache too large: %d bytes" ), size ); + #endif + iCacheIndex.SortEntriesL(); + const TInt compression( iCacheServer->MaxCacheSize() * KDefaultCompression ); + //NOTE: Index & pagefile are always there -> 3 + TBool ready = EFalse; + while( entryCount > 3 && size > compression && !ready ) + { + //The entries have been sorted => FIFO + CXcapCacheIndexEntry* entry = iCacheIndex.Entry( 0 ); + if( entry ) + { + DeleteFromStorageL( entry->FileName16L() ); + iCacheIndex.RemoveEntry( 0 ); + iCacheIndexAdmin.RemoveTableIndex( 0 ); + FlushCacheDataL(); + size = iCacheServer->CacheSize( entryCount ); + } + else ready = ETrue; + } + } + } + break; + case EXcapCacheDelete: + DeleteCacheDataL( aMessage ); + break; + case EXcapCacheCheckValidity: + CheckValidityL( aMessage ); + break; + case EXcapCacheFlush: + FlushCacheDataL(); + break; + default: + PanicClient( EBadRequest ); + } + } + +// ---------------------------------------------------------- +// CXcapCacheSession::CheckUnindexedEntriesL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::CheckUnindexedEntriesL( TInt aTotalCount ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheSession::CheckUnindexedEntriesL()" ) ); + CXcapCacheServer::WriteToLog( _L8( " Total count: %d" ), aTotalCount ); + #endif + const TInt indexed = iCacheIndex.EntryCount(); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( " Indexed entries: %d" ), indexed ); + #endif + if( aTotalCount > indexed + 2 ) //index + pagefile = 2 + { + CDesC16ArraySeg* array = new ( ELeave ) CDesC16ArraySeg( indexed ); + CleanupStack::PushL( array ); + array->AppendL( KCacheServerIndexF() ); + array->AppendL( KCacheServerPageFileF() ); + for( TInt i = 0;i < indexed;i++ ) + { + const TChar delimiter = 92; + TPtrC temp( iCacheIndex.Entry( i )->FileName16L() ); + TPtrC entry( temp.Right( temp.LocateReverse( delimiter ) + 1 ) ); + array->AppendL( entry ); + } + DeleteExcessL( *array ); + array->Reset(); + CleanupStack::PopAndDestroy(); //array + } + } + +// ---------------------------------------------------------- +// CXcapCacheSession::DeleteExcessL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::DeleteExcessL( const MDesC16Array& aIndexedEntries ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheSession::DeleteExcessL()" ) ); + #endif + CDir* directory = NULL; + RFs& session = CXcapCacheServer::FileSession(); + User::LeaveIfError( session.GetDir( KCacheServerRoot, KEntryAttNormal, + ESortNone, directory ) ); + CleanupStack::PushL( directory ); + const TInt count = directory->Count(); + for( TInt i = 0;i < count;i++ ) + { + TPtrC targetName( ( *directory )[i].iName ); + if( !IsIndexed( aIndexedEntries, targetName ) ) + { + HBufC* fileName = HBufC::NewLC( targetName.Length() + + KCacheServerRoot().Length() ); + fileName->Des().Copy( KCacheServerRoot ); + fileName->Des().Append( targetName ); + TPtrC name( fileName->Des() ); + User::LeaveIfError( iFileManager->Delete( name ) ); + CleanupStack::PopAndDestroy(); //fileName + } + } + CleanupStack::PopAndDestroy(); //directory + } + +// ---------------------------------------------------------- +// CXcapCacheSession::IsIndexed +// +// ---------------------------------------------------------- +// +TBool CXcapCacheSession::IsIndexed( const MDesC16Array& aIndexedEntries, const TDesC& aFileName ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheSession::IsIndexed()" ) ); + #endif + TBool indexed = EFalse; + const TInt count = aIndexedEntries.MdcaCount(); + for( TInt i = 0;!indexed && i < count;i++ ) + { + if( aIndexedEntries.MdcaPoint( i ).Compare( aFileName ) == 0 ) + { + indexed = ETrue; + } + } + return indexed; + } + +// ---------------------------------------------------------- +// CXcapCacheSession::ReadMsgParamLC +// +// ---------------------------------------------------------- +// +HBufC* CXcapCacheSession::ReadMsgParam16LC( TInt aMsgIndex, const RMessage2& aMessage ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::ReadMsgParam16LC()" ) ); + #endif + TInt length = aMessage.GetDesLength( aMsgIndex ); + HBufC* buffer = HBufC::NewLC( length ); + TPtr descriptor( buffer->Des() ); + aMessage.ReadL( aMsgIndex, descriptor ); + return buffer; + } + +// ---------------------------------------------------------- +// CXcapCacheSession::ReadMsgParam8LC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheSession::ReadMsgParam8LC( TInt aMsgIndex, const RMessage2& aMessage ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::ReadMsgParam8LC()" ) ); + #endif + TInt length = aMessage.GetDesLength( aMsgIndex ); + HBufC8* buffer = HBufC8::NewLC( length ); + TPtr8 descriptor( buffer->Des() ); + aMessage.ReadL( aMsgIndex, descriptor ); + return buffer; + } + +// ---------------------------------------------------------- +// CXcapCacheSession::CheckValidityL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::CheckValidityL( const RMessage2& aMessage ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "** CXcapCacheServer::CheckValidityL()" ) ); + #endif + TPtrC8 etag( ReadMsgParam8LC( 0, aMessage )->Des() ); + TPtrC name( ReadMsgParam16LC( 1, aMessage )->Des() ); + TPtrC8 root( ReadMsgParam8LC( 2, aMessage )->Des() ); + TInt tableIndex = KErrNotFound; + CXcapCacheIndexTableEntry* tableEntry = iCacheIndexAdmin.FindL( tableIndex, root, name ); + if( tableEntry != NULL ) + { + CXcapCacheIndexEntry* entry = iCacheIndex.Entry( tableEntry->Index() ); + User::Leave( entry->ETag().Compare( etag ) == 0 ? KErrNone : KErrGeneral ); + } + else User::Leave( KErrNotFound ); + CleanupStack::PopAndDestroy( 3 ); //root, name, etag + } + +// ---------------------------------------------------------- +// CXcapCacheSession::DeleteCacheDataL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::DeleteCacheDataL( const RMessage2& aMessage ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "** CXcapCacheServer::DeleteCacheDataL()" ) ); + #endif + TCacheEntryInfo header; + TPckg pack( header ); + aMessage.ReadL( 0, pack ); + TInt tableIndex = KErrNotFound; + CXcapCacheIndexTableEntry* tableEntry = + iCacheIndexAdmin.FindL( tableIndex, *header.iRootUri, *header.iDocumentUri ); + if( tableEntry ) + { + TInt error = KErrNone; + TInt index( tableEntry->Index() ); + CXcapCacheIndexEntry* entry = iCacheIndex.Entry( index ); + error = DeleteFromStorageL( entry->FileName16L() ); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( + _L8( "CXcapCacheSession::DeleteCacheDataL() - error: %d"), error ); + #endif + iCacheIndex.RemoveEntry( index ); + iCacheIndexAdmin.RemoveTableIndex( tableIndex ); + FlushCacheDataL(); + } + else User::Leave( KErrNotFound ); + } + +// ---------------------------------------------------------- +// CXcapCacheSession::FetchDocumentInfoL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::FetchDocumentInfoL( const RMessage2& aMessage ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "** CXcapCacheServer::FetchDocumentInfoL()" ) ); + #endif + TInt error = KErrNone; + //Read info header + TCacheEntryInfo header; + TPckg pack( header ); + aMessage.ReadL( 0, pack ); + TPtrC name( ReadMsgParam16LC( 2, aMessage )->Des() ); + TPtrC8 root( ReadMsgParam8LC( 3, aMessage )->Des() ); + TInt tableIndex = KErrNotFound; + #ifdef _DEBUG + HBufC8* temp = HBufC8::NewLC( name.Length() ); + TPtr8 tempDesc( temp->Des() ); + tempDesc.Copy( name ); + CXcapCacheServer::WriteToLog( _L8( " Root: %S" ), &root ); + CXcapCacheServer::WriteToLog( _L8( " Document: %S" ), &tempDesc ); + CleanupStack::PopAndDestroy(); //temp + #endif + CXcapCacheIndexTableEntry* tableEntry = iCacheIndexAdmin.FindL( tableIndex, root, name ); + if( tableEntry != NULL ) + { + TInt index = tableEntry->Index(); + CXcapCacheIndexEntry* entry = iCacheIndex.Entry( index ); + TPtrC8 eTag = entry->ETag(); + header.iDataLength = entry->XmlSize(); + header.iLastAccess = entry->LastAccess(); + header.iLastUpdate = entry->LastModified(); + TPckgC package( header ); + TRAP( error, aMessage.WriteL( 0, package ) ); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( " Write header: %d" ), error ); + #endif + TRAP( error, aMessage.WriteL( 1, eTag ) ); + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( " Write ETag: %d" ), error ); + #endif + } + else User::Leave( KErrNotFound ); + CleanupStack::PopAndDestroy( 2 ); //root, name + } + +// ---------------------------------------------------------- +// CXcapCacheSession::FetchDocumentContentsL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::FetchDocumentContentsL( const RMessage2& aMessage ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "** CXcapCacheServer::FetchDocumentContentsL()" ) ); + #endif + TPtrC name( ReadMsgParam16LC( 0, aMessage )->Des() ); + TPtrC8 root( ReadMsgParam8LC( 1, aMessage )->Des() ); + #ifdef _DEBUG + HBufC8* document = HBufC8::NewLC( name.Length() ); + TPtr8 docDesc( document->Des() ); + docDesc.Copy( name ); + CXcapCacheServer::WriteToLog( _L8( " Document: %S" ), &docDesc ); + CXcapCacheServer::WriteToLog( _L8( " Root URI: %S" ), &root ); + CleanupStack::PopAndDestroy(); //document + #endif + TInt tableIndex = KErrNotFound; + CXcapCacheIndexTableEntry* tableEntry = iCacheIndexAdmin.FindL( tableIndex, root, name ); + if( tableEntry != NULL ) + { + CXcapCacheIndexEntry* entry = iCacheIndex.Entry( tableEntry->Index() ); + iTempBuffer = ReadFromStorageL( entry->FileName16L() ); + TPtrC8 dataDesc = iTempBuffer->Des(); + aMessage.Write( 2, dataDesc ); + } + else User::Leave( KErrNotFound ); + CleanupStack::PopAndDestroy( 2 ); //name, root + } + +// ---------------------------------------------------------- +// CXcapCacheSession::CacheXcapData +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::CacheXcapDataL( const RMessage2& aMessage ) + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "** CXcapCacheServer::CacheXcapDataL()" ) ); + #endif + TPtrC doc( ReadMsgParam16LC( 0, aMessage )->Des() ); + TPtrC8 root( ReadMsgParam8LC( 1, aMessage )->Des() ); + TPtrC8 etag( ReadMsgParam8LC( 2, aMessage )->Des() ); + TPtrC8 data( ReadMsgParam8LC( 3, aMessage )->Des() ); + #ifdef _DEBUG + HBufC8* document = HBufC8::NewLC( doc.Length() ); + TPtr8 docDesc( document->Des() ); + docDesc.Copy( doc ); + CXcapCacheServer::WriteToLog( _L8( " Document: %S" ), &docDesc ); + CXcapCacheServer::WriteToLog( _L8( " ETag: %S" ), &etag ); + CXcapCacheServer::WriteToLog( _L8( " Root URI: %S" ), &root ); + CXcapCacheServer::WriteToLog( _L8( " Data: %d bytes" ), data.Length() ); + CleanupStack::PopAndDestroy(); //document + #endif + TInt tableIndex = KErrNotFound; + TCacheEntryInfo header; + header.iEtag = &etag; + header.iRootUri = &root; + header.iRespData = &data; + header.iDocumentUri = &doc; + header.iDataLength = data.Length(); + CXcapCacheIndexTableEntry* tableEntry = iCacheIndexAdmin.FindL( tableIndex, root, doc ); + CXcapCacheIndexEntry* entry = NULL; + if( tableEntry != NULL ) + { + entry = iCacheIndex.Entry( tableEntry->Index() ); + entry->UpdateEntryL( &header ); + } + else + { + entry = CXcapCacheIndexEntry::NewL( &header ); + CleanupStack::PushL( entry ); + TInt index = iCacheIndex.UpdateIndexL( entry ); + CleanupStack::Pop(); //entry + iCacheIndexAdmin.UpdateIndexTableL( index, &header ); + } + CleanupStack::PopAndDestroy( 4 ); //data, etag, root, name + FlushCacheDataL(); + } + +// ---------------------------------------------------------- +// CXcapCacheSession::FlushCacheDataL +// +// ---------------------------------------------------------- +// +void CXcapCacheSession::FlushCacheDataL() + { + #ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::FlushCacheDataL()" ) ); + #endif + iCacheIndex.StoreCacheDataL(); + iCacheIndexAdmin.StoreIndexTableL(); + } + +// ---------------------------------------------------------- +// CXcapCacheSession::DeleteFromStorageL +// +// ---------------------------------------------------------- +// +TInt CXcapCacheSession::DeleteFromStorageL( const TDesC& aFileName ) + { + #ifdef _DEBUG + HBufC8* name = HBufC8::NewLC( aFileName.Length() ); + TPtr8 nameDesc( name->Des() ); + nameDesc.Copy( aFileName ); + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::DeleteFromStorageL() - Filename: %S" ), &nameDesc ); + CleanupStack::PopAndDestroy(); //name + #endif + TInt error = iFileManager->Delete( aFileName ); + return error; + } + +// ---------------------------------------------------------- +// CXcapCacheSession::FlushCacheDataL +// +// ---------------------------------------------------------- +// +HBufC8* CXcapCacheSession::ReadFromStorageL( const TDesC& aFileName ) + { + #ifdef _DEBUG + HBufC8* name = HBufC8::NewLC( aFileName.Length() ); + TPtr8 nameDesc( name->Des() ); + nameDesc.Copy( aFileName ); + CXcapCacheServer::WriteToLog( _L8( "CXcapCacheServer::ReadFromStorageL() - Filename: %S" ), &nameDesc ); + CleanupStack::PopAndDestroy(); //name + #endif + RFile file; + HBufC8* data = NULL; + User::LeaveIfError( file.Open( CXcapCacheServer::FileSession(), aFileName, EFileRead ) ); + CleanupClosePushL( file ); + TInt size = 0; + User::LeaveIfError( file.Size( size ) ); + data = HBufC8::NewL( size ); + TPtr8 pointer( data->Des() ); + file.Read( pointer ); + CleanupStack::PopAndDestroy(); //file + return data; + } + + + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapShutdownTimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/Server/src/XcapShutdownTimer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2005 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: CXcapShutdownTimer +* +*/ + + + +#include "XcapCacheServer.h" +#include "XcapShutdownTimer.h" + +// ---------------------------------------------------- +// CXcapShutdownTimer::CXcapShutdownTimer +// +// ---------------------------------------------------- +// +CXcapShutdownTimer::CXcapShutdownTimer() : CTimer( -1 ) + { + /*#ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapShutdownTimer::CXcapShutdownTimer()" ) ); + #endif*/ + CActiveScheduler::Add(this); + } + +// ---------------------------------------------------- +// CXcapShutdownTimer::ConstructL +// +// ---------------------------------------------------- +// +void CXcapShutdownTimer::ConstructL() + { + /*#ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapShutdownTimer::ConstructL()" ) ); + #endif*/ + CTimer::ConstructL(); + } + +// ---------------------------------------------------- +// CXcapShutdownTimer::Start +// +// ---------------------------------------------------- +// +void CXcapShutdownTimer::Start() + { + /*#ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapShutdownTimer::Start()" ) ); + #endif*/ + After( KXcapCacheShutdownDelay ); + } + +// ---------------------------------------------------- +// CXcapShutdownTimer::RunL +// +// ---------------------------------------------------- +// +void CXcapShutdownTimer::RunL() + { + /*#ifdef _DEBUG + CXcapCacheServer::WriteToLog( _L8( "CXcapShutdownTimer::RunL() - Closing down server" ) ); + #endif*/ + CActiveScheduler::Stop(); + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/inc/CommonDefines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/inc/CommonDefines.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,88 @@ +/* +* Copyright (c) 2005 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: XcapCache common defines +* +*/ + + + + +#ifndef __COMMONDEFINES_H__ +#define __COMMONDEFINES_H__ + +#include + +//Information about the data in the cache +class TCacheEntryInfo + { + public: + + TTime iLastUpdate; + TTime iLastAccess; + TInt32 iDataLength; + const TDesC* iDocumentUri; + const TDesC8* iEtag; + const TDesC8* iRootUri; + const TDesC8* iRespData; + }; + +// server name +_LIT( KXcapCacheServerName, "!CXcapCacheServer" ); +_LIT( KXcapCacheServerLib, "XcapCacheServer" ); +_LIT( KXcapCacheServerExe, "XcapCache.exe"); + +// A version must be specifyed when creating a session with the server +const TUint KCacheServerMajorVersionNumber = 0; +const TUint KCacheServerMinorVersionNumber = 1; +const TUint KCacheServerBuildVersionNumber = 1; + +// Server panic codes +enum TXcapCacheServerPanic + { + ECacheCreateServer = 0, + ECacheStartServer, + ECacheFileServerConnect, + ECacheIndexFileOpen, + ECachePageFileOpen, + EMainSchedulerError, + EBadRequest + }; + +//Opcodes used in message passing between client and server +enum TTransportServerRequest + { + EXcapCacheFetchInfo = 0, + EXcapCacheFetchData, + EXcapCacheStore, + EXcapCacheDelete, + EXcapCacheCheckValidity, + EXcapCacheFlush + }; + +//Number of asynchronous requests +const TUint KTTMaxAsyncRequests = 4; + +//Number of data transfer requests +const TUint KTTDataTransferRequests = 3; + +//Default number of message slots per session +const TUint KTTDefaultMessageSlots = KTTMaxAsyncRequests + 2; + +const TInt KServerLogBufferMaxSize = 2000; + +const TInt KMaxCacheSize = 30000; + +#endif // #ifndef __COMMONDEFINES_H__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapCache/inc/XcapCache.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapCache/inc/XcapCache.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,159 @@ +/* +* Copyright (c) 2005 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: RXcapCache +* +*/ + + + + +#ifndef __XCAPCACHE_H__ +#define __XCAPCACHE_H__ + +// INCLUDES +#include +#include + +//Constants +#ifdef _DEBUG + _LIT( KCacheClientLogDir, "XDM" ); + _LIT( KCacheClientLogFile, "CacheClient.txt" ); +#endif + +//FORWARD DECLARATIONS +class TCacheEntryInfo; +class CXcapCacheClient; + +//CLASS DECLARATION +class RXcapCache : public RSessionBase + { + public: // New functions + + /** + * C++ Constructor. + */ + IMPORT_C RXcapCache(); + + /** + * Return the version of this component + * + * @return TVersion The version number + */ + IMPORT_C TVersion Version() const; + + /** + * Connect to the server side session object + * + * @return TInt Error code + */ + IMPORT_C TInt Connect(); + + /** + * Destructor + */ + IMPORT_C ~RXcapCache(); + + /** + * Store a new document + * + * @param TDesC8& ETag of the new document + * @param TDesC& Name of the document + * @param TDesC8& Root location of the document + * @param TDesC8& The document content + * @return void + */ + IMPORT_C void Store( const TDesC8& aETag, + const TDesC& aDocumentName, + const TDesC8& aRootLocation, + const TDesC8& aResponseData ); + + /** + * Remove a named document from the cache + * + * @param TDesC& Name of the document + * @param TDesC8& Root location of the document + * @return TInt Error code + */ + IMPORT_C TInt Delete( const TDesC& aDocumentName, + const TDesC8& aRootLocation ); + + /** + * Fetch information on a named document + * + * @param TDes8& Contains the ETag string on completion + * @param TCacheEntryInfo& Encapsulates root & name + * @return TInt Error code + */ + IMPORT_C TInt FetchDocumentInfo( TDes8& aETagDescriptor, + const TDesC& aDocumentName, + const TDesC8& aRootLocation, + TCacheEntryInfo& aEntryInfo ); + + /** + * Fetch content for the named document + * + * @param TRequestStatus& Request status of the client + * @param TDes8& Contains the document contents on completion + * @param TCacheEntryInfo& Encapsulates root & name + * @return TInt Error code + */ + IMPORT_C void FetchDocumentContent( TDes8& aContentDescriptor, + const TDesC& aDocumentName, + const TDesC8& aRootLocation ); + + /** + * Check validity of the named document + * + * @param TDesC8& ETag of the document + * @param TDesC& Name of the document + * @param TDesC8& Root location of the document + * @return TInt Error code + */ + IMPORT_C TInt IsCurrent( const TDesC8& aETag, + const TDesC& aDocumentName, + const TDesC8& aRootLocation ); + + /** + * Flush (externalise) cache metadata to disk + * + * @return void + */ + IMPORT_C void Flush(); + + public: //Not exported + + /** + * Start the server + * + * @return TInt Error code + */ + TInt StartServer(); + + /** + * Check whether the server is already running + * + * @return TBool Is the server running + */ + TBool IsRunning(); + + + private: //Data + + TBool iConnected; + }; + +#endif //__XCAPCACHE_H__ + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/BWINSCW/XcapHttpTransportU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/BWINSCW/XcapHttpTransportU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,24 @@ +EXPORTS + ??1CXcapHttpRequest@@UAE@XZ @ 1 NONAME ; CXcapHttpRequest::~CXcapHttpRequest(void) + ??1CXcapHttpTransport@@UAE@XZ @ 2 NONAME ; CXcapHttpTransport::~CXcapHttpTransport(void) + ?CancelRequest@CXcapHttpRequest@@QAEXXZ @ 3 NONAME ; void CXcapHttpRequest::CancelRequest(void) + ?DeleteL@CXcapHttpTransport@@QAEPAVCXcapHttpReqDelete@@ABVTDesC16@@@Z @ 4 NONAME ; class CXcapHttpReqDelete * CXcapHttpTransport::DeleteL(class TDesC16 const &) + ?DispatchRequestL@CXcapHttpRequest@@QAEXAAVTRequestStatus@@@Z @ 5 NONAME ; void CXcapHttpRequest::DispatchRequestL(class TRequestStatus &) + ?GetL@CXcapHttpTransport@@QAEPAVCXcapHttpReqGet@@ABVTDesC16@@@Z @ 6 NONAME ; class CXcapHttpReqGet * CXcapHttpTransport::GetL(class TDesC16 const &) + ?HeadL@CXcapHttpTransport@@QAEPAVCXcapHttpReqHead@@ABVTDesC16@@@Z @ 7 NONAME ; class CXcapHttpReqHead * CXcapHttpTransport::HeadL(class TDesC16 const &) + ?HeaderValue@CXcapHttpRequest@@QBE?AVTPtrC8@@W4TStrings@HTTP@@@Z @ 8 NONAME ; class TPtrC8 CXcapHttpRequest::HeaderValue(enum HTTP::TStrings) const + ?MkcolL@CXcapHttpTransport@@QAEPAVCXcapHttpReqMkcol@@ABVTDesC16@@@Z @ 9 NONAME ; class CXcapHttpReqMkcol * CXcapHttpTransport::MkcolL(class TDesC16 const &) + ?NewL@CXcapHttpTransport@@SAPAV1@ABVTDesC16@@AAVMMsgConnManager@@ABVTXdmCredentials@@@Z @ 10 NONAME ; class CXcapHttpTransport * CXcapHttpTransport::NewL(class TDesC16 const &, class MMsgConnManager &, class TXdmCredentials const &) + ?PutL@CXcapHttpTransport@@QAEPAVCXcapHttpReqPut@@ABVTDesC16@@@Z @ 11 NONAME ; class CXcapHttpReqPut * CXcapHttpTransport::PutL(class TDesC16 const &) + ?ReleaseResponseData@CXcapHttpRequest@@QAEXXZ @ 12 NONAME ; void CXcapHttpRequest::ReleaseResponseData(void) + ?RequestBody@CXcapHttpContSupplier@@QBE?AVTPtrC8@@XZ @ 13 NONAME ; class TPtrC8 CXcapHttpContSupplier::RequestBody(void) const + ?RequestUriL@CXcapHttpRequest@@QBE?AVTPtrC8@@XZ @ 14 NONAME ; class TPtrC8 CXcapHttpRequest::RequestUriL(void) const + ?ResetUriL@CXcapHttpRequest@@QAEXABVTDesC16@@@Z @ 15 NONAME ; void CXcapHttpRequest::ResetUriL(class TDesC16 const &) + ?ResponseData@CXcapHttpRequest@@QAEPAVTXdmCompletionData@@XZ @ 16 NONAME ; class TXdmCompletionData * CXcapHttpRequest::ResponseData(void) + ?RootUri@CXcapHttpTransport@@QAE?AVTPtrC8@@XZ @ 17 NONAME ; class TPtrC8 CXcapHttpTransport::RootUri(void) + ?SetExpiryTimeL@CXcapHttpRequest@@QAEXPAVMXcapHttpRequestTimerCallback@@VTTimeIntervalMicroSeconds32@@@Z @ 18 NONAME ; void CXcapHttpRequest::SetExpiryTimeL(class MXcapHttpRequestTimerCallback *, class TTimeIntervalMicroSeconds32) + ?SetHeaderL@CXcapHttpRequest@@QAEXABVTDesC8@@0@Z @ 19 NONAME ; void CXcapHttpRequest::SetHeaderL(class TDesC8 const &, class TDesC8 const &) + ?SetRequestBodyL@CXcapHttpContSupplier@@QAEXABVTDesC8@@@Z @ 20 NONAME ; void CXcapHttpContSupplier::SetRequestBodyL(class TDesC8 const &) + ?SetRootUriL@CXcapHttpTransport@@QAEXABVTDesC16@@@Z @ 21 NONAME ; void CXcapHttpTransport::SetRootUriL(class TDesC16 const &) + ?UpdateRequestUriL@CXcapHttpRequest@@QAEXABVTDesC8@@@Z @ 22 NONAME ; void CXcapHttpRequest::UpdateRequestUriL(class TDesC8 const &) + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/eabi/XcapHttpTransportU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/eabi/XcapHttpTransportU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,32 @@ +EXPORTS + _ZN16CXcapHttpRequest10SetHeaderLERK6TDesC8S2_ @ 1 NONAME + _ZN16CXcapHttpRequest12ResponseDataEv @ 2 NONAME + _ZN16CXcapHttpRequest13CancelRequestEv @ 3 NONAME + _ZN16CXcapHttpRequest14SetExpiryTimeLEP29MXcapHttpRequestTimerCallback27TTimeIntervalMicroSeconds32 @ 4 NONAME + _ZN16CXcapHttpRequest16DispatchRequestLER14TRequestStatus @ 5 NONAME + _ZN16CXcapHttpRequest17UpdateRequestUriLERK6TDesC8 @ 6 NONAME + _ZN16CXcapHttpRequest19ReleaseResponseDataEv @ 7 NONAME + _ZN16CXcapHttpRequest9ResetUriLERK7TDesC16 @ 8 NONAME + _ZN18CXcapHttpTransport11SetRootUriLERK7TDesC16 @ 9 NONAME + _ZN18CXcapHttpTransport4GetLERK7TDesC16 @ 10 NONAME + _ZN18CXcapHttpTransport4NewLERK7TDesC16R15MMsgConnManagerRK15TXdmCredentials @ 11 NONAME + _ZN18CXcapHttpTransport4PutLERK7TDesC16 @ 12 NONAME + _ZN18CXcapHttpTransport5HeadLERK7TDesC16 @ 13 NONAME + _ZN18CXcapHttpTransport6MkcolLERK7TDesC16 @ 14 NONAME + _ZN18CXcapHttpTransport7DeleteLERK7TDesC16 @ 15 NONAME + _ZN18CXcapHttpTransport7RootUriEv @ 16 NONAME + _ZN21CXcapHttpContSupplier15SetRequestBodyLERK6TDesC8 @ 17 NONAME + _ZNK16CXcapHttpRequest11HeaderValueEN4HTTP8TStringsE @ 18 NONAME + _ZNK16CXcapHttpRequest11RequestUriLEv @ 19 NONAME + _ZNK21CXcapHttpContSupplier11RequestBodyEv @ 20 NONAME + _ZTI16CXcapHttpRequest @ 21 NONAME ; ## + _ZTI18CXcapHttpTransport @ 22 NONAME ; ## + _ZTI20CXcapHttpAuthManager @ 23 NONAME ; ## + _ZTI21CXcapHttpContSupplier @ 24 NONAME ; ## + _ZTV16CXcapHttpRequest @ 25 NONAME ; ## + _ZTV18CXcapHttpTransport @ 26 NONAME ; ## + _ZTV20CXcapHttpAuthManager @ 27 NONAME ; ## + _ZTV21CXcapHttpContSupplier @ 28 NONAME ; ## + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/group/XcapHttpTransport.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/group/XcapHttpTransport.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,78 @@ +/* +* Copyright (c) 2004 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: XcapHttpTransport.dll from XcapHttpTransport.mmp +* +*/ + + + +#include + +TARGET xcaphttptransport.dll +TARGETTYPE dll +UID 0x1000008d 0x10207411 +CAPABILITY CAP_GENERAL_DLL +VENDORID VID_DEFAULT + +SOURCEPATH ../src + +SOURCE XcapHttpTransport.cpp +SOURCE XcapHttpReqGet.cpp +SOURCE XcapHttpReqPut.cpp +SOURCE XcapHttpRequest.cpp +SOURCE XcapHttpResponse.cpp +SOURCE XcapHttpReqDelete.cpp +SOURCE XcapHttpHeaderModel.cpp +SOURCE XcapHttpAuthManager.cpp +SOURCE XcapHttpContSupplier.cpp +SOURCE XcapHttpRequestTimer.cpp +// SONERA SOLUTION +SOURCE XcapHttpReqHead.cpp +SOURCE XcapHttpReqMkcol.cpp + +//Internal +USERINCLUDE ../inc +USERINCLUDE ../../inc +USERINCLUDE ../../../inc +USERINCLUDE ../../XcapOperations/inc + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/http +SYSTEMINCLUDE /epoc32/include/ecom +SYSTEMINCLUDE ../../../../inc + + +LIBRARY hal.lib +LIBRARY bafl.lib +LIBRARY http.lib +LIBRARY ecom.lib +LIBRARY hash.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +LIBRARY xdmengine.lib +LIBRARY inetprotutil.lib +DEBUGLIBRARY flogger.lib + + + +#if defined( ARMCC ) + deffile ../eabi/ +#elif defined ( WINSCW ) + deffile ../BWINSCW/ +#elif defined ( WINS ) + deffile ../bwins/ +#endif + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2005 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: XcapHttpTransport bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- + +XcapHttpTransport.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpAuthManager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpAuthManager.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,163 @@ +/* +* Copyright (c) 2005 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: CXcapHttpAuthManager +* +*/ + + + + +#ifndef __XCAPHTTPTAUTHMANAGER__ +#define __XCAPHTTPTAUTHMANAGER__ + +// INCLUDES +#include +#include +#include "XcapHttpConsts.h" + +//FORWARD DECLARATION +class CMD5; + +//CLASS DECLARATION +class CXcapHttpAuthManager : public CBase + + { + public: // Constructors and destructor + + /** + * Symbian OS default constructor. + */ + static CXcapHttpAuthManager* NewL( RHTTPSession& iHttpSession, + CXcapHttpTransport& aTransportMain, + const TXdmCredentials& aDigestCredentials ); + + /** + * Symbian OS default constructor. + */ + void SetAuthorized( TBool aAuthorized ); + + /** + * Symbian OS default constructor. + */ + TBool IsAuthorized() const; + + /** + * Symbian OS default constructor. + */ + TBool ParseHeaderL( RHTTPTransaction& aTransaction, TInt aAuthType ); + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + HBufC8* AuthorizationL( CXcapHttpRequest& aHttpRequest ); + + /** + * Symbian OS default constructor. + */ + TBool ConsumeAuthInfoParamL( TAuthInfoParam aName, const TDesC8& aValue ); + + /** + * Destructor. + */ + virtual ~CXcapHttpAuthManager(); + + private: + + /** + * C++ default constructor. + */ + CXcapHttpAuthManager( RHTTPSession& iHttpSession, + CXcapHttpTransport& aTransportMain ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void ConstructL( const TXdmCredentials& aDigestCredentials ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void Unquote( TPtr8& aParamValue ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void ConstructHA1L( TDes8& aResult ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void ConstructHA2L( TDes8& aResult, CXcapHttpRequest& aHttpRequest ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void Hash( const TDesC8& aMessage, TDes8& aHash ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + HBufC8* RequestDigestLC( CXcapHttpRequest& aHttpRequest ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void SetNextNonceL( const TDesC8& aNextnonce ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void GenerateClientNonce(); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void ParseQopL( const TDesC8& aQopString ); + + private: //Data + + TInt iNonceCount; + TBool iAuthorized; + TBool iUnauthReceived; + TBool iNextnonce; + CMD5* iMD5; + TInt64 iSeed; + HBufC8* iOpaque; + HBufC8* iServerNonce; + HBufC8* iRealm; + HBufC8* iDomain; + HBufC8* iAlgorithm; + HBufC8* iQopString; + TXcapAuthQop iQop; + RHTTPSession iHttpSession; + CXcapHttpTransport& iTransportMain; + TBuf8 iClientNonce; + TBuf8 iUserName; + TBuf8 iPassword; + RStringPool iStringPool; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpConsts.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpConsts.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2005 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: XcapHttpConsts +* +*/ + + + + +#ifndef __XCAPHTTPCONSTS__ +#define __XCAPHTTPCONSTS__ + +#include + +const TInt KXcapHashLength = 32; +const TInt KXcapRawHashLength = 16; + +_LIT8( KAuthHeaderParamEnd, "," ); +_LIT8( KAuthHeaderParamEndQ, "\"," ); +_LIT8( KAuthHeaderParamQuote, "\"" ); +_LIT8( KAuthHeaderStart, "Digest username=\"" ); +_LIT8( KAuthHeaderRealm, "realm=\"" ); +_LIT8( KAuthHeaderNonce, "nonce=\"" ); +_LIT8( KAuthHeaderUri, "uri=\"" ); +_LIT8( KAuthHeaderResponse, "response=\"" ); +_LIT8( KAuthHeaderCNonce, "cnonce=\"" ); +_LIT8( KAuthHeaderOpaque, "opaque=\"" ); +_LIT8( KAuthHeaderNonceCount, "nc=" ); +_LIT8( KAuthHeaderQop, "qop=" ); + +const TText8* const KAuthInfoParamArray[] = + { + _S8( "Authentication-Info" ), + _S8( "Proxy-Authentication-Info" ), + _S8( "nextnonce" ), + _S8( "rspauth" ), + _S8( "cnonce" ), + _S8( "nc" ), + _S8( "qop" ), + }; + +enum TAuthInfoParam + { + ENfoAuthInfo = 0, + ENfoPrxAuthInfo, + ENfoNextnonce, + ENfoRspauth, + ENfoCnonce, + ENfoNc, + ENfoQop, + }; +enum TXcapAuthQop + { + EXcapAuth = 0, + EXcapAuthInt, + EXcapAuthNone + }; + +#endif //__XCAPHTTPCONSTS__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpContSupplier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpContSupplier.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,91 @@ +/* +* Copyright (c) 2003 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: CXcapHttpContSupplier +* +*/ + + + + +#ifndef __XCAPHTTPCONTSUPPLIER__ +#define __XCAPHTTPCONTSUPPLIER__ + +// INCLUDES +#include "XcapHttpRequest.h" + +//FORWARD DECLARATIONS +class CXdmHttpResponse; + +// CLASS DECLARATION +class CXcapHttpContSupplier : public CXcapHttpRequest, + public MHTTPDataSupplier + { + public: + + /** + * C++ default constructor is private. + */ + IMPORT_C void SetRequestBodyL( const TDesC8& aRequestBody ); + + /** + * C++ default constructor is private. + */ + IMPORT_C TPtrC8 RequestBody() const; + + protected: + + /** + * C++ default constructor is private. + */ + CXcapHttpContSupplier( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Destructor. + */ + virtual ~CXcapHttpContSupplier(); + + private: + + /** + * Second-phase constructor. + */ + TBool GetNextDataPart( TPtrC8& aDataPart ); + + /** + * Second-phase constructor. + */ + void ReleaseData(); + + /** + * Second-phase constructor. + */ + TInt Reset(); + + /** + * Second-phase constructor. + */ + TInt OverallDataSize(); + + protected: //Data + + private: //Data + + HBufC8* iRequestBody; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpHeaderModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpHeaderModel.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2003 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: CXcapHttpHeaderModel +* +*/ + + + + +#ifndef __XCAPHTTPHEADERMODEL__ +#define __XCAPHTTPHEADERMODEL__ + +// INCLUDES +#include "XcapHttpRequest.h" + +//FORWARD DECLARATIONS +class CXcapHttpResponse; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpHeaderModel ) : public CBase + { + public: + + /** + * C++ default constructor is private. + */ + static CXcapHttpHeaderModel* NewL( const TDesC8& aHeaderName, + const TDesC8& aHeaderValue, + CXcapHttpTransport& aTransportMain ); + + /** + * C++ default constructor is private. + */ + TPtrC8 HeaderValue() const; + + /** + * C++ default constructor is private. + */ + TPtrC8 HeaderName() const; + + /** + * Destructor. + */ + virtual ~CXcapHttpHeaderModel(); + + private: + + /** + * C++ default constructor is private. + */ + CXcapHttpHeaderModel( CXcapHttpTransport& aTransportMain ); + + /** + * C++ default constructor is private. + */ + void ConstructL( const TDesC8& aHeaderName, + const TDesC8& aHeaderValue ); + + protected: //Data + + private: //Data + + HBufC8* iHeaderName; + HBufC8* iHeaderValue; + CXcapHttpTransport& iTransportMain; + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqDelete.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqDelete.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2003 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: CXcapHttpReqDelete +* +*/ + + + + +#ifndef __XCAPHTTPREQDELETE__ +#define __XCAPHTTPREQDELETE__ + +// INCLUDES +#include "http.h" +#include "XcapHttpRequest.h" + +//CONSTANTS + +//FORWARD DECLARATIONS +class CXcapHttpResponse; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpReqDelete ) : public CXcapHttpRequest + { + public: + + /** + * C++ default constructor is private. + */ + static CXcapHttpReqDelete* NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Destructor. + */ + virtual ~CXcapHttpReqDelete(); + + private: // Constructors and destructor + + /** + * C++ default constructor is private. + */ + CXcapHttpReqDelete( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + virtual void ConstructRequestL(); + + /** + * Append data to the response buffer. + */ + virtual RStringF ConstructMethodStringL(); + + private: + + /** + * Second-phase constructor. + */ + void ConstructL(); + + private: //Data + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqGet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqGet.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2003 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: CXcapHttpReqGet +* +*/ + + + + +#ifndef __XCAPHTTPREQGET__ +#define __XCAPHTTPREQGET__ + +// INCLUDES +#include "http.h" +#include "XcapHttpRequest.h" + +//CONSTANTS + +//FORWARD DECLARATIONS +class CXdmHttpResponse; +class CXcapHttpAuthManager; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpReqGet ) : public CXcapHttpRequest + { + public: + + /** + * C++ default constructor is private. + */ + static CXcapHttpReqGet* NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Destructor. + */ + virtual ~CXcapHttpReqGet(); + + private: // Constructors and destructor + + /** + * C++ default constructor is private. + */ + CXcapHttpReqGet( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + virtual void ConstructRequestL(); + + /** + * Append data to the response buffer. + */ + virtual RStringF ConstructMethodStringL(); + + private: + + /** + * Second-phase constructor. + */ + void ConstructL(); + + private: //Data + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqHead.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqHead.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2008 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: CXcapHttpReqHead +* +*/ + +#ifndef __XCAPHTTPREQHEAD__ +#define __XCAPHTTPREQHEAD__ + +// INCLUDES +#include "http.h" +#include "XcapHttpRequest.h" + +//CONSTANTS +_LIT8( KXcapRequestHead, "HEAD" ); + +//FORWARD DECLARATIONS +class CXdmHttpResponse; +class CXcapHttpAuthManager; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpReqHead ) : public CXcapHttpRequest + { + public: + + /** + * C++ default constructor is private. + */ + static CXcapHttpReqHead* NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Destructor. + */ + virtual ~CXcapHttpReqHead(); + + private: // Constructors and destructor + + /** + * C++ default constructor is private. + */ + CXcapHttpReqHead( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + virtual void ConstructRequestL(); + + /** + * Append data to the response buffer. + */ + virtual RStringF ConstructMethodStringL(); + + private: + + /** + * Second-phase constructor. + */ + void ConstructL(); + + private: //Data + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqMkcol.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqMkcol.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2003 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: CXcapHttpReqMkcol +* +*/ + +#ifndef __XCAPHTTPREQMKCOL__ +#define __XCAPHTTPREQMKCOL__ + +// INCLUDES +#include "http.h" +#include "XcapHttpContSupplier.h" + +//CONSTANTS +_LIT8( KXcapRequestMkcol, "MKCOL" ); + +//FORWARD DECLARATIONS +class CXcapHttpResponse; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpReqMkcol ) : public CXcapHttpContSupplier + { + public: + + /** + * C++ default constructor is private. + */ + static CXcapHttpReqMkcol* NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Destructor. + */ + virtual ~CXcapHttpReqMkcol(); + + private: // Constructors and destructor + + /** + * C++ default constructor is private. + */ + CXcapHttpReqMkcol( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + virtual void ConstructRequestL(); + + /** + * Append data to the response buffer. + */ + virtual RStringF ConstructMethodStringL(); + + private: + + /** + * Second-phase constructor. + */ + void ConstructL(); + + private: //Data + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqPut.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpReqPut.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,84 @@ +/* +* Copyright (c) 2003 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: CXcapHttpReqPut +* +*/ + + + + +#ifndef __XCAPHTTPREQPUT__ +#define __XCAPHTTPREQPUT__ + +// INCLUDES +#include "http.h" +#include "XcapHttpContSupplier.h" + +//CONSTANTS + +//FORWARD DECLARATIONS +class CXcapHttpResponse; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpReqPut ) : public CXcapHttpContSupplier + { + public: + + /** + * C++ default constructor is private. + */ + static CXcapHttpReqPut* NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Destructor. + */ + virtual ~CXcapHttpReqPut(); + + private: // Constructors and destructor + + /** + * C++ default constructor is private. + */ + CXcapHttpReqPut( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + virtual void ConstructRequestL(); + + /** + * Append data to the response buffer. + */ + virtual RStringF ConstructMethodStringL(); + + private: + + /** + * Second-phase constructor. + */ + void ConstructL(); + + private: //Data + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpRequest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpRequest.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,312 @@ +/* +* Copyright (c) 2003 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: CXcapHttpRequest +* +*/ + + + + +#ifndef __XCAPHTTPREQUEST__ +#define __XCAPHTTPREQUEST__ + +// INCLUDES +#include +#include "XdmOperation.h" +#include "XcapHttpRequestTimerCallback.h" + +//CONSTANTS +//const TInt KMaxNumberOfRetries = 3; +const TInt KAuthTypeProxy = 407; +const TInt KAuthTypeNormal = 401; + +_LIT8( KXcapRequestPost, "POST" ); +_LIT8( KXcapRequestGet, "GET" ); +_LIT8( KXcapRequestPut, "PUT" ); +_LIT8( KXcapRequestDelete, "DELETE" ); + +_LIT8( KHttpHeaderAccept, "Accept" ); +_LIT8( KHttpHeaderIfMatch, "If-Match" ); +_LIT8( KHttpHeaderIfNoneMatch, "If-None-Match" ); +_LIT8( KHttpHeaderContentType, "Content-Type" ); +_LIT8( KHttpHeaderIntIdentity, "X-3GPP-Intended-Identity" ); + +//FORWARD DECLARATIONS +class TXdmCredentials; +class CXcapHttpResponse; +class CXcapHttpTransport; +class CXcapHttpHeaderModel; +class CXcapHttpAuthManager; +class CXcapHttpRequestTimer; + +// CLASS DECLARATION +class CXcapHttpRequest : public CBase, + public MXcapHttpRequestTimerCallback + + { + public: + + /** + * C++ default constructor is private. + */ + IMPORT_C void SetHeaderL( const TDesC8& aHeaderName, + const TDesC8& aHeaderValue ); + + /** + * Sets the expiry time of this transaction + * @param aExpiryTime Time period after which this transaction expires + * @param aCallback Handle to the receiver of the expiry event + */ + IMPORT_C void SetExpiryTimeL( MXcapHttpRequestTimerCallback* aCallback, + const TTimeIntervalMicroSeconds32 aExpiryTime ); + + /** + * Cancel this transaction + */ + IMPORT_C void CancelRequest(); + + /** + * C++ default constructor is private. + */ + IMPORT_C void DispatchRequestL( TRequestStatus& aClientStatus ); + + /** + * Sets the expiry time of this transaction + * @param aExpiryTime Time period after which this transaction expires + * @param aCallback Handle to the receiver of the expiry event + */ + IMPORT_C void ResetUriL( const TDesC& aNewUri ); + + /** + * Sets the expiry time of this transaction + * @param aExpiryTime Time period after which this transaction expires + * @param aCallback Handle to the receiver of the expiry event + */ + IMPORT_C void UpdateRequestUriL( const TDesC8& aUpdatedUri ); + + /** + * Sets the expiry time of this transaction + * @param aExpiryTime Time period after which this transaction expires + * @param aCallback Handle to the receiver of the expiry event + */ + IMPORT_C TPtrC8 RequestUriL() const; + + /** + * Sets the expiry time of this transaction + * @param aExpiryTime Time period after which this transaction expires + * @param aCallback Handle to the receiver of the expiry event + */ + IMPORT_C TPtrC8 HeaderValue( const HTTP::TStrings aHeaderName ) const; + + /** + * C++ default constructor is private. + */ + IMPORT_C TXdmCompletionData* ResponseData(); + + /** + * C++ default constructor is private. + */ + IMPORT_C void ReleaseResponseData(); + + /** + * Destructor. + */ + IMPORT_C virtual ~CXcapHttpRequest(); + + public: + + /** + * Try to resend this request + * @return TBool Resent or not + */ + TPtrC8 RelativeUri() const; + + /** + * Try to resend this request + * @return TBool Resent or not + */ + void ResendWithAuthL( TInt aAuthtype ); + + /** + * Has this transaction been cancelled. + * @return TBool + */ + CXcapHttpAuthManager& AuthManager(); + + /** + * C++ default constructor is private. + */ + RHTTPSession& Session(); + + /** + * Return the HTTP transaction associated with this transaction + * @return RHTTPTransaction + */ + RHTTPTransaction& Transaction(); + + /** + * C++ default constructor is private. + */ + void AppendDataL( const TPtrC8& aBodyPart ); + + /** + * Complete this request + * @param aErrorCode The completion code + */ + void FinaliseRequestL( TInt aErrorCode ); + + + protected: // Constructors and destructor + + /** + * C++ default constructor is private. + */ + CXcapHttpRequest( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void BaseConstructL( const TDesC& aRequestUri ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + virtual void ConstructRequestL(); + + /** + * Append data to the response buffer. + */ + virtual RStringF ConstructMethodStringL() = 0; + + /** + * Sets the status of this transaction + * @param aSent Has this transaction been sent or not + */ + void SetStatus( const TBool aSent ); + + /** + * Has this transaction been cancelled. + * @return TBool + */ + TBool IsCancelled(); + + /** + * Has this transaction been sent + * @return TBool + */ + TBool Status() const; + + /** + * Return the time stamp of this transaction + * @return TInt + */ + const TInt SendTime() const; + + /** + * Get the current time (System tick count) + */ + TInt TimeL() const; + + private: + + /** + * Second-phase constructor. + */ + void ConstructL( const TDesC8& aRequestBody ); + + /** + * Second-phase constructor. + */ + void DoSetHeadersL(); + + /** + * Second-phase constructor. + */ + void RemoveDuplicateAuth(); + + /** + * Append authorization header + */ + void AppendAuthorizationHeaderL( RHTTPHeaders& aHeaderCollection, TInt aAuthType ); + + /** + * Second-phase constructor. + */ + void SetRequestUriL( const TDesC& aRequestUri ); + + /** + * Second-phase constructor. + */ + void PrepareResponseBodyL(); + + #ifdef _DEBUG + + /** + * Second-phase constructor. + */ + void DumpResponseL( const TDesC8& aRespData, const TDesC& aDumpName ); + + #endif + + /** + * Second-phase constructor. + */ + void CompileResponseDataL( TInt aErrorCode ); + + /** + * Second-phase constructor. + */ + TInt ReinterpretErrorCode( const TInt aHttpStatus ) const; + + /** + * Second-phase constructor. + */ + virtual void HandleTimerEventL(); + + protected: //Data + + RHTTPSession& iHttpSession; + RHTTPTransaction iHttpTransaction; + CXcapHttpTransport& iTransportMain; + + private: //Data + + HBufC8* iFlatResponse; + HBufC8* iRequestUriBuf; + HBufC8* iWholeUri; + CXcapHttpResponse* iHttpResponse; + CBufSeg* iResponseBuffer; + TRequestStatus* iClientStatus; + CXcapHttpRequestTimer* iExpiryTimer; + TUriParser8 iRequestUri; + TInt iCurrentDataLength; + TInt iNumberOfRetries; + TInt iSendTime; + TBool iSent; + TBool iActive; + TBool iCancelled; + TBool iConstructed; + TXdmCompletionData iRespData; + CXcapHttpAuthManager& iAuthManager; + TTimeIntervalMicroSeconds32 iExpiryTime; + RPointerArray iHeaderCollection; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpRequestTimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpRequestTimer.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2003 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: CXcapHttpRequestTimer +* +*/ + + + + +#ifndef __XCAPHTTPREQUESTTIMER__ +#define __XCAPHTTPREQUESTTIMER__ + +// INCLUDES +#include +#include "XcapHttpRequestTimerCallback.h" + +class CXcapHttpTransport; + +NONSHARABLE_CLASS( CXcapHttpRequestTimer ) : public CActive + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * @param aCallback A pointer to MMmsViewerTimerCallback class + */ + static CXcapHttpRequestTimer* NewL( CXcapHttpTransport& aTransportMain, + MXcapHttpRequestTimerCallback* aCallback ); + + /** + * Destructor. + */ + virtual ~CXcapHttpRequestTimer(); + + public: // New functions + + /** + * Request to activate timer + * @param aDelay Time in microsecoXcap after which + * the callback function is called. + */ + void ActivateTimer( TTimeIntervalMicroSeconds32 aDelay ); + + private: + + /** + * By default Symbian OS constructor is private. + */ + void ConstructL(); + + /** + * C++ constructor. + * @param aCallback A pointer to MImpsTransportTimerCallback class + * @param aRequester Who constructed and/or activated the timer + * @param aLogging Trace or not + */ + CXcapHttpRequestTimer( CXcapHttpTransport& aTransportMain, + MXcapHttpRequestTimerCallback* aCallback ); + + /** + * From CActive. + * @return void + */ + void RunL(); + + /** + * From CActive. + * @return void + */ + void DoCancel(); + + private: // Data + + RTimer iTimer; + CXcapHttpTransport& iTransportMain; + MXcapHttpRequestTimerCallback* iCallback; + }; + +#endif //__XcapHTTPREQUESTTIMER__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpRequestTimerCallback.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpRequestTimerCallback.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2003 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: MXcapHttpRequestTimerCallback +* +*/ + + + + +#ifndef __XCAPHTTPREQUESTTIMERCALLBACK__ +#define __XCAPHTTPREQUESTTIMERCALLBACK__ + +// CLASS DECLARATION + +/** +* A callback class for the timer class of IMPS Transport layer +*/ +NONSHARABLE_CLASS( MXcapHttpRequestTimerCallback ) + { + public: + + /** + * Pure virtual callback function to be implemented in the + * derived class. This function is called when timer has + * compeleted. + * @param aStatus The integer value of iStatus of the timer class + */ + virtual void HandleTimerEventL() = 0; + }; + +#endif //__XCAPHTTPREQUESTTIMERCALLBACK__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpResponse.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpResponse.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,150 @@ +/* +* Copyright (c) 2004 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: CXcapHttpResponse +* +*/ + + + + +#ifndef __XCAPHTTPRESPONSE__ +#define __XCAPHTTPRESPONSE__ + +// INCLUDES +#include +#include "XcapHttpConsts.h" + +//FORWARD DECLARATIONs +class CXcapHttpRequest; +class CXcapHttpAuthManager; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpResponse ) : public CBase, + public MHTTPTransactionCallback + { + public: // Constructors and destructor + + /** + * A global logging function for 16 bit data. + * @param aCommand command to be handled + */ + static CXcapHttpResponse* CXcapHttpResponse::NewL( CXcapHttpRequest* aHttpRequest, + CXcapHttpTransport& aTransportMain ); + + /** + * Destructor. + */ + virtual ~CXcapHttpResponse(); + + public: //New functions + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + TInt ContentLengthL() const; + + private: + + /** + * A global logging function for 16 bit data. + * @param aCommand command to be handled + */ + CXcapHttpResponse( CXcapHttpRequest* aHttpRequest, + CXcapHttpTransport& aTransportMain ); + + /** + * A global logging function for 16 bit data. + * @param aCommand command to be handled + */ + void ConstructL(); + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + RHTTPHeaders ResponseHeaderCollection() const; + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + RHTTPHeaders RequestHeaderCollection() const; + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + TBool HandleReceivedBodyDataL( const RHTTPTransaction aTransaction ); + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + TBool IsUnauthRequest( RHTTPTransaction aTransaction, TInt& aAuthType ); + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + TBool ParseAuthInfoParam( TInt& aLength, TAuthInfoParam& aName, + TPtrC8& aValue, TPtr8& aParam ); + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + TBool CheckAuthInfoHeaderL( RHTTPHeaders aHeaders ); + + #ifdef _DEBUG + + /** + * Convert undefined HTTP stack errors + */ + void DumpHeadersL( RHTTPHeaders aHeaders, TInt aId ); + + #endif + + private: //From MHTTPTransactionCallback + + /** + * Handles all responses + * coming from the remote host + * @param aTransaction The finished transaction + * @param aEvent Type of the event + */ + void MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent ); + + /** + * From MHTTPTransactionCallback, called when the RunL() of a transaction leaves + * @param aInt The error the HTTP framework left with + * @param aTransaction The failed transaction + * @param aEvent The event that was being processed + * @return KErrNone (HTTP framework panics if client returns any other error) + */ + TInt MHFRunError( TInt aInt, RHTTPTransaction aTransaction, const THTTPEvent& aEvent ); + + private: //Data + + TBool iAuthPending; + CXcapHttpRequest* iHttpRequest; + CXcapHttpTransport& iTransportMain; + CXcapHttpAuthManager& iAuthManager; + TInt iUnauthRequestCounter; + }; + + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpTransport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/inc/XcapHttpTransport.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,164 @@ +/* +* Copyright (c) 2005 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: CXcapHttpTransport +* +*/ + + + + +#ifndef __XCAPHTTPTRANSPORT__ +#define __XCAPHTTPTRANSPORT__ + +// INCLUDES +#include +#include + +//COMMON CONSTANTS +_LIT( KTransportLogFile, "HttpTransport" ); +const TInt KTransportLogBufMaxSize = 2000; +_LIT( KTransportDateFormat, "%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S.%C%:3"); +const TInt KMaxSubmitSize = 1024; +const TInt KMaxHeaderNameLen = 32; +const TInt KMaxHeaderValueLen = 128; +const TInt KBufferMaxSize = 2048; + +//FORWARD DECLARATIONS +class CXdmLogWriter; +class MMsgConnManager; +class CXcapHttpReqGet; +class CXcapHttpReqPut; +class CXcapHttpReqDelete; +class CXcapHttpAuthManager; +class CXcapHttpReqMkcol; +class CXcapHttpReqHead; + +// CLASS DECLARATION +class CXcapHttpTransport : public CBase + + { + public: // Constructors and destructor + + /** + * Symbian OS default constructor. + */ + IMPORT_C static CXcapHttpTransport* NewL( const TDesC& aRootUri, + MMsgConnManager& aConnManager, + const TXdmCredentials& aDigestCredentials ); + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + IMPORT_C TPtrC8 RootUri(); + + /** + * Send one IMPS message. + */ + IMPORT_C CXcapHttpReqGet* GetL( const TDesC& aUri ); + + /** + * Send one IMPS message. + */ + IMPORT_C CXcapHttpReqPut* PutL( const TDesC& aUri ); + + /** + * Send one IMPS message. + */ + IMPORT_C CXcapHttpReqMkcol* MkcolL( const TDesC& aUri ); + + /** + * Send one IMPS message. + */ + IMPORT_C CXcapHttpReqHead* HeadL( const TDesC& aUri ); + + /** + * Send one IMPS message. + */ + IMPORT_C CXcapHttpReqDelete* DeleteL( const TDesC& aUri ); + + /** + * Stores the address of the proxy currently in use + * @param aProxy Address of the HTTP proxy server + */ + IMPORT_C void SetRootUriL( const TDesC& aRootUri ); + + /** + * Destructor. + */ + IMPORT_C virtual ~CXcapHttpTransport(); + + public: //New functions + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + static TXdmCredentials& Credentials(); + + #ifdef _DEBUG + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + void WriteToLog( TRefByValue aFmt,... ) const; + + /** + * A global logging function for 16 bit data. + * @param aCommand command to be handled + */ + void WriteToLog( TRefByValue aFmt,... ) const; + + #endif //_DEBUG + + private: + + /** + * C++ default constructor. + */ + CXcapHttpTransport( MMsgConnManager& aConnManager ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + void ConstructL( const TDesC& aRootUri, const TXdmCredentials& aDigestCredentials ); + + /** + * Symbian OS default constructor. + * @param aMimeType MIME type of the messages + */ + HBufC8* ConstructRequestUriLC( const TDesC& aDocumentSelector ); + + /** + * Initialises an HTTP session + */ + void InitialiseSessionL(); + + private: //Data + + TBool iCredValidity; + TBool iSessionClosed; + HBufC8* iRootUri; + HBufC8* iProxyBuffer; + RHTTPSession iHttpSession; + CXdmLogWriter* iLogWriter; + MMsgConnManager& iConnManager; + CXcapHttpAuthManager* iAuthManager; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpAuthManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpAuthManager.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,578 @@ +/* +* Copyright (c) 2003 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: CXcapHttpAuthManager +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "XcapHttpRequest.h" +#include "XcapHttpTransport.h" +#include "XcapHttpAuthManager.h" + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::CXcapHttpAuthManager +// +// ---------------------------------------------------------- +// +CXcapHttpAuthManager::CXcapHttpAuthManager( RHTTPSession& aHttpSession, + CXcapHttpTransport& aTransportMain ) : + iNonceCount( 1 ), + iAuthorized( EFalse ), + iHttpSession( aHttpSession ), + iTransportMain( aTransportMain ), + iStringPool( aHttpSession.StringPool() ) + { + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::NewL +// +// ---------------------------------------------------------- +// +CXcapHttpAuthManager* CXcapHttpAuthManager::NewL( RHTTPSession& aHttpSession, + CXcapHttpTransport& aTransportMain, + const TXdmCredentials& aDigestCredentials ) + { + CXcapHttpAuthManager* self = new ( ELeave ) CXcapHttpAuthManager( aHttpSession, aTransportMain ); + CleanupStack::PushL( self ); + self->ConstructL( aDigestCredentials ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------- +// CXcapHttpAuthManager::~CXcapHttpAuthManager +// +// ---------------------------------------------------- +// +CXcapHttpAuthManager::~CXcapHttpAuthManager() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpAuthManager::~CXcapHttpAuthManager()" ) ); + #endif + delete iMD5; + delete iRealm; + delete iOpaque; + delete iDomain; + delete iQopString; + delete iAlgorithm; + delete iServerNonce; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::ConstructL( const TXdmCredentials& aDigestCredentials ) + { + iMD5 = CMD5::NewL(); + iUserName.Copy( aDigestCredentials.iUserName ); + iPassword.Copy( aDigestCredentials.iPassword ); + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::SetAuthorized +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::SetAuthorized( TBool aAuthorized ) + { + iAuthorized = aAuthorized; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::IsAuthorized +// +// ---------------------------------------------------------- +// +TBool CXcapHttpAuthManager::IsAuthorized() const + { + return iAuthorized; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::AuthorizationL +// +// ---------------------------------------------------------- +// +HBufC8* CXcapHttpAuthManager::AuthorizationL( CXcapHttpRequest& aHttpRequest ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpAuthManager::AuthorizationL()" ) ); + #endif + if( !iUnauthReceived ) + return NULL; + TInt bufPtr = 0; + HBufC8* ret = NULL; + THTTPHdrVal requestUri; + //All these strings should have been defined - except for + //"opaque", maybe - in the WWW-Authentication header that + //the server sent. In case some of them were not, let's just + //keep going as if they were there, but were empty. The request + //will then fail & be completed in the next MHFRunL() call. + TPtrC8 realm( iRealm ? iRealm->Des() : TPtrC8() ); + TPtrC8 qop( iQopString ? iQopString->Des() : TPtrC8() ); + TPtrC8 opaque( iOpaque ? iOpaque->Des() : TPtrC8() ); + TPtrC8 nonce( iServerNonce ? iServerNonce->Des() : TPtrC8() ); + TPtrC8 uri( aHttpRequest.RelativeUri() ); + TBuf8<8> nonceCount; + nonceCount.AppendFormat( _L8( "%08x" ), iNonceCount ); + CBufFlat* buffer = CBufFlat::NewL( 128 ); + CleanupStack::PushL( buffer ); + buffer->InsertL( bufPtr, KAuthHeaderStart ); + bufPtr = bufPtr + KAuthHeaderStart().Length(); + buffer->InsertL( bufPtr, iUserName ); + bufPtr = bufPtr + iUserName.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamEndQ ); + bufPtr = bufPtr + KAuthHeaderParamEndQ().Length(); + buffer->InsertL( bufPtr, KAuthHeaderRealm ); + bufPtr = bufPtr + KAuthHeaderRealm().Length(); + buffer->InsertL( bufPtr, realm ); + bufPtr = bufPtr + realm.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamEndQ ); + bufPtr = bufPtr + KAuthHeaderParamEndQ().Length(); + buffer->InsertL( bufPtr, KAuthHeaderNonce ); + bufPtr = bufPtr + KAuthHeaderNonce().Length(); + buffer->InsertL( bufPtr, nonce ); + bufPtr = bufPtr + nonce.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamEndQ ); + bufPtr = bufPtr + KAuthHeaderParamEndQ().Length(); + buffer->InsertL( bufPtr, KAuthHeaderUri ); + bufPtr = bufPtr + KAuthHeaderUri().Length(); + buffer->InsertL( bufPtr, uri ); + bufPtr = bufPtr + uri.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamEndQ ); + bufPtr = bufPtr + KAuthHeaderParamEndQ().Length(); + buffer->InsertL( bufPtr, KAuthHeaderQop ); + bufPtr = bufPtr + KAuthHeaderQop().Length(); + buffer->InsertL( bufPtr, qop ); + bufPtr = bufPtr + qop.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamEnd ); + bufPtr = bufPtr + KAuthHeaderParamEnd().Length(); + buffer->InsertL( bufPtr, KAuthHeaderNonceCount ); + bufPtr = bufPtr + KAuthHeaderNonceCount().Length(); + buffer->InsertL( bufPtr, nonceCount ); + bufPtr = bufPtr + nonceCount.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamEnd ); + bufPtr = bufPtr + KAuthHeaderParamEnd().Length(); + buffer->InsertL( bufPtr, KAuthHeaderCNonce ); + bufPtr = bufPtr + KAuthHeaderCNonce().Length(); + buffer->InsertL( bufPtr, iClientNonce ); + bufPtr = bufPtr + iClientNonce.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamEndQ ); + bufPtr = bufPtr + KAuthHeaderParamEndQ().Length(); + buffer->InsertL( bufPtr, KAuthHeaderResponse ); + bufPtr = bufPtr + KAuthHeaderResponse().Length(); + TPtrC8 respDigest( RequestDigestLC( aHttpRequest )->Des() ); + buffer->InsertL( bufPtr, respDigest ); + bufPtr = bufPtr + respDigest.Length(); + CleanupStack::PopAndDestroy(); //RequestDigestLC() + buffer->InsertL( bufPtr, KAuthHeaderParamEndQ ); + bufPtr = bufPtr + KAuthHeaderParamEndQ().Length(); + if( opaque.Length() > 0 ) + { + buffer->InsertL( bufPtr, KAuthHeaderOpaque ); + bufPtr = bufPtr + KAuthHeaderOpaque().Length(); + buffer->InsertL( bufPtr, opaque ); + bufPtr = bufPtr + opaque.Length(); + buffer->InsertL( bufPtr, KAuthHeaderParamQuote ); + } + ret = HBufC8::NewL( buffer->Size() ); + ret->Des().Copy( buffer->Ptr( 0 ) ); + buffer->Reset(); + iNonceCount++; + CleanupStack::PopAndDestroy(); //buffer + return ret; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::ConsumeAuthInfoParamL +// +// ---------------------------------------------------------- +// +TBool CXcapHttpAuthManager::ConsumeAuthInfoParamL( TAuthInfoParam aName, const TDesC8& aValue ) + { + //For the time being, always return ETrue + TBool ret = ETrue; + TInt length = aValue.Length(); + TPtr8 value( CONST_CAST( TUint8*, aValue.Ptr() ), length, length ); + Unquote( value ); + #ifdef _DEBUG + TPtrC8 name( KAuthInfoParamArray[aName] ); + iTransportMain.WriteToLog( _L8( "CXcapHttpAuthManager::ConsumeAuthInfoParamL()" ) ); + iTransportMain.WriteToLog( _L8( " Name: %S" ), &name ); + iTransportMain.WriteToLog( _L8( " Value: %S" ), &value ); + #endif + switch( aName ) + { + case ENfoNextnonce: + { + SetNextNonceL( value ); + #ifdef _DEBUG + TPtrC8 nonce( iServerNonce->Des() ); + iTransportMain.WriteToLog( _L8( " -> Nonce set to %S" ), &nonce ); + #endif + } + break; + case ENfoRspauth: + /* TODO */ + break; + case ENfoCnonce: + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " -> Current cnonce %S" ), &iClientNonce ); + #endif + break; + //ret = value.Compare( iClientNonce ) == 0; + case ENfoNc: + { + TBuf8<8> nonceCount; + nonceCount.AppendFormat( _L8( "%08x" ), iNonceCount ); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " -> Current nonce count %S" ), &nonceCount ); + #endif + //ret = nonceCount.Compare( value ) == 0; + break; + } + case ENfoQop: + ret = ETrue; + break; + default: + ret = ETrue; + break; + } + return ret; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::GenerateClientNonce +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::SetNextNonceL( const TDesC8& aNextnonce ) + { + delete iServerNonce; + iServerNonce = NULL; + iServerNonce = aNextnonce.AllocL(); + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::Unquote +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::Unquote( TPtr8& aParamValue ) + { + TInt index = aParamValue.Locate( '"' ); + while( index >= 0 ) + { + aParamValue.Delete( index, 1 ); + index = aParamValue.Locate( '\"'); + } + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::RequestDigestLC +// +// ---------------------------------------------------------- +// +HBufC8* CXcapHttpAuthManager::RequestDigestLC( CXcapHttpRequest& aHttpRequest ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpAuthManager::RequestDigestLC()" ) ); + #endif + HBufC8* ret = NULL; + if( iQop == EXcapAuth || iQop == EXcapAuthInt ) + { + TBuf8<8> nonceCount; + TBuf8 hashBush; + nonceCount.AppendFormat( _L8( "%08x" ), iNonceCount ); + TPtrC8 nonce( iServerNonce ? iServerNonce->Des() : TPtrC8() ); + TPtrC8 qop( iQop == EXcapAuth ? _L8( "auth" ) : _L8( "auth-int" ) ); + HBufC8* stringToHash = HBufC8::NewLC( nonce.Length() + qop.Length() + + 3 * KXcapHashLength + 8 + 5 ); + TPtr8 desc( stringToHash->Des() ); + ConstructHA1L( desc ); + desc.Append( ':' ); + desc.Append( nonce ); + desc.Append( ':' ); + desc.Append( nonceCount ); + desc.Append( ':' ); + desc.Append( iClientNonce ); + desc.Append(':'); + desc.Append( qop ); + desc.Append(':'); + ConstructHA2L( hashBush, aHttpRequest ); + desc.Append( hashBush ); + hashBush.Zero(); + ret = HBufC8::NewL( KXcapHashLength ); + Hash( *stringToHash, hashBush ); + ret->Des().Copy( hashBush ); + CleanupStack::PopAndDestroy(); //stringToHash + CleanupStack::PushL( ret ); + } + else + { + /* + * This case is for compatibility with RFC 2069: + * request-digest = <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + */ + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Qop not defined, ignore" ) ); + #endif + } + return ret; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::GenerateClientNonce +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::GenerateClientNonce() + { + TTime time; + TBuf8<33> key; + time.UniversalTime(); + TInt64 randomNumber = Math::Rand( iSeed ); + randomNumber <<= 32; + randomNumber += Math::Rand( iSeed ); + key.Zero(); + key.AppendNum( time.Int64(), EHex ); + key.Append( _L8( ":" ) ); + key.AppendNum( randomNumber, EHex ); + Hash( key, iClientNonce ); + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::Hash +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::Hash( const TDesC8& aMessage, TDes8& aHash ) + { + TBuf8<2> buf; + aHash.Zero(); + iMD5->Reset(); + TPtrC8 hash = iMD5->Hash( aMessage ); + _LIT8( formatStr, "%02x" ); + for( TInt i = 0;i < KXcapRawHashLength;i++ ) + { + buf.Zero(); + buf.Format( formatStr, hash[i] ); + aHash.Append( buf ); + } + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::ParseQopL +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::ParseQopL( const TDesC8& aQopString ) + { + _LIT8( KXcapAuthInt, "auth-int" ); + iQop = aQopString.FindF( KXcapAuthInt ) == 0 ? EXcapAuthInt : EXcapAuth; + delete iQopString; + iQopString = NULL; + iQopString = HBufC8::NewL( 8 ); + iQopString->Des().Copy( iQop == EXcapAuth ? _L8( "auth" ) : _L8( "auth-int" ) ); + #ifdef _DEBUG + TPtrC8 qop( iQopString->Des() ); + iTransportMain.WriteToLog( _L8( " Qop: %S" ), &qop ); + #endif + GenerateClientNonce(); + iNonceCount = 1; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::ParseHeaderL +// +// ---------------------------------------------------------- +// +TBool CXcapHttpAuthManager::ParseHeaderL( RHTTPTransaction& aTransaction, TInt aAuthType ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpAuthManager::ParseHeaderL()" ) ); + #endif + TBool ret = EFalse; + THTTPHdrVal fieldVal; + RHTTPHeaders headers = aTransaction.Response().GetHeaderCollection(); + RStringF auth = aAuthType == KAuthTypeNormal ? + iStringPool.StringF( HTTP::EWWWAuthenticate, RHTTPSession::GetTable() ) : + iStringPool.StringF( HTTP::EProxyAuthenticate, RHTTPSession::GetTable() ); + headers.GetField( auth, 0, fieldVal ); + if( fieldVal.StrF() == iStringPool.StringF( HTTP::EDigest, RHTTPSession::GetTable() ) ) + { + ret = ETrue; + TInt error = headers.GetParam( auth, iStringPool.StringF( HTTP::ERealm, RHTTPSession::GetTable() ), fieldVal ); + if( KErrNone == error ) + { + delete iRealm; + iRealm = NULL; + iRealm = fieldVal.Str().DesC().AllocL(); + #ifdef _DEBUG + TPtrC8 realm( fieldVal.Str().DesC() ); + iTransportMain.WriteToLog( _L8( " Realm: %S" ), &realm ); + #endif + } + //In a proper WWW-Authentication request there SHOULD have been + //a qop value. In case there was not, call the whole thing off + error = headers.GetParam( auth, iStringPool.StringF( HTTP::EQop, RHTTPSession::GetTable() ), fieldVal ); + if( KErrNone == error ) + ParseQopL( fieldVal.Str().DesC() ); + else + { + delete iQopString; + iQopString = NULL; + ret = EFalse; + } + error = headers.GetParam( auth, iStringPool.StringF( HTTP::ENonce, RHTTPSession::GetTable() ), fieldVal ); + if( ret && KErrNone == error ) + { + SetNextNonceL( fieldVal.Str().DesC() ); + #ifdef _DEBUG + TPtrC8 nonce( iServerNonce->Des() ); + iTransportMain.WriteToLog( _L8( " Nonce: %S" ), &nonce ); + #endif + } + error = headers.GetParam( auth, iStringPool.StringF( HTTP::EOpaque, RHTTPSession::GetTable() ), fieldVal ); + if( ret && KErrNone == error ) + { + delete iOpaque; + iOpaque = NULL; + iOpaque = fieldVal.Str().DesC().AllocL(); + #ifdef _DEBUG + TPtrC8 opaque( iOpaque->Des() ); + iTransportMain.WriteToLog( _L8( " Opaque: %S" ), &opaque ); + #endif + } + error = headers.GetParam( auth, iStringPool.StringF( HTTP::EStale, RHTTPSession::GetTable() ), fieldVal ); + if( ret && KErrNone == error ) + { + #ifdef _DEBUG + TPtrC8 stale( fieldVal.Str().DesC() ); + iTransportMain.WriteToLog( _L8( " Stale: %S" ), &stale ); + #endif + } + error = headers.GetParam( auth, iStringPool.StringF( HTTP::EDomain, RHTTPSession::GetTable() ), fieldVal ); + if( ret && KErrNone == error ) + { + delete iDomain; + iDomain = NULL; + iDomain = fieldVal.Str().DesC().AllocL(); + #ifdef _DEBUG + TPtrC8 domain( iDomain->Des() ); + iTransportMain.WriteToLog( _L8( " Domain: %S" ), &domain ); + #endif + } + error = headers.GetParam( auth, iStringPool.StringF( HTTP::EAlgorithm, RHTTPSession::GetTable() ), fieldVal ); + if( ret && KErrNone == error ) + { + delete iAlgorithm; + iAlgorithm = NULL; + iAlgorithm = fieldVal.Str().DesC().AllocL(); + #ifdef _DEBUG + TPtrC8 algorithm( iAlgorithm->Des() ); + iTransportMain.WriteToLog( _L8( " Algorithm: %S" ), &algorithm ); + #endif + } + } + iUnauthReceived = ETrue; + return ret; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::ConstructHA1L +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::ConstructHA1L( TDes8& aResult ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpAuthManager::ConstructHA1L()" ) ); + #endif + + TPtrC8 realm( iRealm ? iRealm->Des() : TPtrC8() ); + + HBufC8* buffer = HBufC8::NewLC( iUserName.Length() + + iPassword.Length() + realm.Length() + 2 ); + TPtr8 desc( buffer->Des() ); + desc.Copy( iUserName ); + desc.Append(':'); + desc.Append( realm ); + desc.Append(':'); + desc.Append( iPassword ); + Hash( *buffer, aResult ); + CleanupStack::PopAndDestroy(); //buffer + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::ConstructHA2L +// +// ---------------------------------------------------------- +// +void CXcapHttpAuthManager::ConstructHA2L( TDes8& aResult, CXcapHttpRequest& aHttpRequest ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpAuthManager::ConstructHA2L()" ) ); + #endif + TPtrC8 uri( aHttpRequest.RelativeUri() ); + TPtrC8 method( aHttpRequest.Transaction().Request().Method().DesC() ); + switch( iQop ) + { + case EXcapAuth: + case EXcapAuthNone: + { + HBufC8* buffer = HBufC8::NewLC( uri.Length() + method.Length() + 1 ); + TPtr8 desc( buffer->Des() ); + desc.Copy( method ); + desc.Append( ':' ); + desc.Append( uri ); + Hash( desc, aResult ); + CleanupStack::PopAndDestroy(); //buffer + } + break; + case EXcapAuthInt: + { + TPtrC8 body( _L8( "" ) ); + TBuf8 bodyHash; + if( aHttpRequest.Transaction().Request().HasBody() ) + aHttpRequest.Transaction().Request().Body()->GetNextDataPart( body ); + bodyHash.Zero(); + Hash( body, bodyHash ); + HBufC8* buffer = HBufC8::NewLC( uri.Length() + method.Length() + + KXcapHashLength + 2 ); + TPtr8 desc( buffer->Des() ); + desc.Copy( method ); + desc.Append( ':' ); + desc.Append( uri ); + desc.Append( ':' ); + desc.Append( bodyHash ); + Hash( desc, aResult ); + CleanupStack::PopAndDestroy(); //buffer + } + break; + default: + break; + } + + } + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpContSupplier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpContSupplier.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,139 @@ +/* +* Copyright (c) 2005 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: CXcapHttpContSupplier +* +*/ + + + + +// INCLUDE FILES +#include "XcapHttpTransport.h" +#include "XcapHttpContSupplier.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::CXcapHttpContSupplier +// +// ---------------------------------------------------------- +// +CXcapHttpContSupplier::CXcapHttpContSupplier( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) : + CXcapHttpRequest( aHttpSession, aAuthManager, aTransportMain ) + + { + } + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::~CXcapHttpContSupplier +// +// ---------------------------------------------------------- +// +CXcapHttpContSupplier::~CXcapHttpContSupplier() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpContSupplier::~CXcapHttpContSupplier()" ) ); + #endif + delete iRequestBody; + } + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::SetRequestBodyL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpContSupplier::SetRequestBodyL( const TDesC8& aRequestBody ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpContSupplier::SetRequestBodyL" ) ); + #endif + delete iRequestBody; + iRequestBody = NULL; + iRequestBody = HBufC8::NewL( aRequestBody.Length() ); + iRequestBody->Des().Copy( aRequestBody ); + } + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::RequestBody +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXcapHttpContSupplier::RequestBody() const + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpContSupplier::RequestBody" ) ); + #endif + return iRequestBody != NULL ? iRequestBody->Des() : TPtrC8(); + } + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::GetNextDataPart +// +// ---------------------------------------------------------- +// +TBool CXcapHttpContSupplier::GetNextDataPart( TPtrC8& aDataPart ) + { + aDataPart.Set( iRequestBody->Des() ); + return ETrue; + } + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::ReleaseData +// +// ---------------------------------------------------------- +// +void CXcapHttpContSupplier::ReleaseData() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpContSupplier::ReleaseData()" ) ); + #endif + //Not just yet, lets see if the server accepts the data. + //If it does, the data needs to be cached and this is + //probably - and hopefully - the only copy of the raw + //data still available at that point in time + //delete iRequestBody; + //iRequestBody = NULL; + } + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::Reset +// +// ---------------------------------------------------------- +// +TInt CXcapHttpContSupplier::Reset() + { + //This method is called when client Cancel()s a request. + //There's nothing to reset in our case, because all needed + //resources are destructed in the destructor. + //NOTE: Never EVER set this method to return anything but + //KErrNone, since values < 0 will result in practically + //untraceable errors thanks to Symbian's lack of proper + //documentation on the issue. + return KErrNone; + } + +// ---------------------------------------------------------- +// CXcapHttpContSupplier::GetNextDataPart +// +// ---------------------------------------------------------- +// +TInt CXcapHttpContSupplier::OverallDataSize() + { + return iRequestBody != NULL ? iRequestBody->Length() : 0; + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpHeaderModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpHeaderModel.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,105 @@ +/* +* Copyright (c) 2004 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: CXcapHttpHeaderModel +* +*/ + + + + +// INCLUDE FILES +#include "XcapHttpTransport.h" +#include "XcapHttpHeaderModel.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpHeaderModel::CXcapHttpHeaderModel +// +// ---------------------------------------------------------- +// +CXcapHttpHeaderModel::CXcapHttpHeaderModel( CXcapHttpTransport& aTransportMain ) : + iTransportMain( aTransportMain) + { + } + +// ---------------------------------------------------------- +// CXcapHttpHeaderModel::NewL +// +// ---------------------------------------------------------- +// +CXcapHttpHeaderModel* CXcapHttpHeaderModel::NewL( const TDesC8& aHeaderName, + const TDesC8& aHeaderValue, + CXcapHttpTransport& aTransportMain ) + + { + CXcapHttpHeaderModel* self = new ( ELeave ) CXcapHttpHeaderModel( aTransportMain ); + CleanupStack::PushL( self ); + self->ConstructL( aHeaderName, aHeaderValue ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------------- +// CXcapHttpHeaderModel::HeaderValue +// +// ---------------------------------------------------------- +// +void CXcapHttpHeaderModel::ConstructL( const TDesC8& aHeaderName, + const TDesC8& aHeaderValue ) + { + delete iHeaderName; + iHeaderName = NULL; + iHeaderName = aHeaderName.AllocL(); + delete iHeaderValue; + iHeaderValue = NULL; + iHeaderValue = aHeaderValue.AllocL(); + + } + +// ---------------------------------------------------------- +// CXcapHttpHeaderModel::HeaderValue +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapHttpHeaderModel::HeaderValue() const + { + return iHeaderValue != NULL ? iHeaderValue->Des() : TPtrC8(); + } + +// ---------------------------------------------------------- +// CXcapHttpHeaderModel::HeaderValue +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapHttpHeaderModel::HeaderName() const + { + return iHeaderName != NULL ? iHeaderName->Des() : TPtrC8(); + } + +// ---------------------------------------------------------- +// CXcapHttpHeaderModel::~CXcapHttpHeaderModel +// +// ---------------------------------------------------------- +// +CXcapHttpHeaderModel::~CXcapHttpHeaderModel() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpHeaderModel::~CXcapHttpHeaderModel()" ) ); + #endif + delete iHeaderName; + delete iHeaderValue; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqDelete.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqDelete.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,90 @@ +/* +* Copyright (c) 2004 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: CXcapHttpReqDelete +* +*/ + + + + +// INCLUDE FILES +#include "XcapHttpReqDelete.h" +#include "XcapHttpTransport.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpReqDelete::CXcapHttpReqDelete +// +// ---------------------------------------------------------- +// +CXcapHttpReqDelete::CXcapHttpReqDelete( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) : + CXcapHttpRequest( aHttpSession, aAuthManager, aTransportMain ) + + { + } + +// ---------------------------------------------------------- +// CXcapHttpReqDelete::NewL +// +// ---------------------------------------------------------- +// +CXcapHttpReqDelete* CXcapHttpReqDelete::NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) + + { + CXcapHttpReqDelete* self = new ( ELeave ) CXcapHttpReqDelete( aHttpSession, aAuthManager, aTransportMain ); + CleanupStack::PushL( self ); + self->BaseConstructL( aRequestUri ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------------- +// CXcapHttpReqDelete::~CXcapHttpReqDelete +// +// ---------------------------------------------------------- +// +CXcapHttpReqDelete::~CXcapHttpReqDelete() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpReqDelete::~CXcapHttpReqDelete()" ) ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpReqDelete::ConstructRequestL +// +// ---------------------------------------------------------- +// +void CXcapHttpReqDelete::ConstructRequestL() + { + CXcapHttpRequest::ConstructRequestL(); + } + +// ---------------------------------------------------------- +// CXcapHttpReqDelete::ConstructRequestL +// +// ---------------------------------------------------------- +// +RStringF CXcapHttpReqDelete::ConstructMethodStringL() + { + return iHttpSession.StringPool().OpenFStringL( KXcapRequestDelete ); + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqGet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqGet.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2004 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: CXcapHttpReqGet +* +*/ + + + + +// INCLUDE FILES +#include "XcapHttpReqGet.h" +#include "XcapHttpTransport.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpReqGet::CXcapHttpReqGet +// +// ---------------------------------------------------------- +// +CXcapHttpReqGet::CXcapHttpReqGet( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) : + CXcapHttpRequest( aHttpSession, aAuthManager, aTransportMain ) + + { + } + +// ---------------------------------------------------------- +// CXcapHttpReqGet::NewL +// +// ---------------------------------------------------------- +// +CXcapHttpReqGet* CXcapHttpReqGet::NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) + + { + CXcapHttpReqGet* self = new ( ELeave ) CXcapHttpReqGet( aHttpSession, aAuthManager, aTransportMain ); + CleanupStack::PushL( self ); + self->BaseConstructL( aRequestUri ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------------- +// CXcapHttpReqGet::~CXcapHttpReqGet +// +// ---------------------------------------------------------- +// +CXcapHttpReqGet::~CXcapHttpReqGet() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpReqGet::~CXcapHttpReqGet()" ) ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpReqGet::ConstructRequestL +// +// ---------------------------------------------------------- +// +void CXcapHttpReqGet::ConstructRequestL() + { + CXcapHttpRequest::ConstructRequestL(); + } + +// ---------------------------------------------------------- +// CXcapHttpReqGet::ConstructRequestL +// +// ---------------------------------------------------------- +// +RStringF CXcapHttpReqGet::ConstructMethodStringL() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpReqGet::ConstructMethodStringL()" ) ); + #endif + return iHttpSession.StringPool().OpenFStringL( KXcapRequestGet ); + } diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqHead.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqHead.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,95 @@ +/* +* ============================================================================ +* Name : CXcapHttpReqHead from XcapHttpReqHead.cpp +* Part of : Transport Adapter of the Symbian OS WV Engine +* +* Description: +/* +* Copyright (c) 2004 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: CXcapHttpReqHead +* +*/ + +// INCLUDE FILES +#include "XcapHttpReqHead.h" +#include "XcapHttpTransport.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpReqHead::CXcapHttpReqHead +// +// ---------------------------------------------------------- +// +CXcapHttpReqHead::CXcapHttpReqHead( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) : + CXcapHttpRequest( aHttpSession, aAuthManager, aTransportMain ) + + { + } + +// ---------------------------------------------------------- +// CXcapHttpReqHead::NewL +// +// ---------------------------------------------------------- +// +CXcapHttpReqHead* CXcapHttpReqHead::NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) + + { + CXcapHttpReqHead* self = new ( ELeave ) CXcapHttpReqHead( aHttpSession, aAuthManager, aTransportMain ); + CleanupStack::PushL( self ); + self->BaseConstructL( aRequestUri ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------------- +// CXcapHttpReqHead::~CXcapHttpReqHead +// +// ---------------------------------------------------------- +// +CXcapHttpReqHead::~CXcapHttpReqHead() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpReqHead::~CXcapHttpReqHead()" ) ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpReqHead::ConstructRequestL +// +// ---------------------------------------------------------- +// +void CXcapHttpReqHead::ConstructRequestL() + { + CXcapHttpRequest::ConstructRequestL(); + } + +// ---------------------------------------------------------- +// CXcapHttpReqHead::ConstructRequestL +// +// ---------------------------------------------------------- +// +RStringF CXcapHttpReqHead::ConstructMethodStringL() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpReqHead::ConstructMethodStringL()" ) ); + #endif + return iHttpSession.StringPool().OpenFStringL( KXcapRequestHead ); + } diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqMkcol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqMkcol.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,94 @@ +/* +* ============================================================================ +* Name : CXcapHttpReqHead from XcapHttpReqHead.cpp +* Part of : Transport Adapter of the Symbian OS WV Engine +* +* Description: +/* +* Copyright (c) 2004 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: CXcapHttpReqMkcol +* +*/ + +// INCLUDE FILES +#include "XcapHttpReqMkcol.h" +#include "XcapHttpTransport.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpReqMkcol::CXcapHttpReqMkcol +// +// ---------------------------------------------------------- +// +CXcapHttpReqMkcol::CXcapHttpReqMkcol( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) : + CXcapHttpContSupplier( aHttpSession, aAuthManager, aTransportMain ) + + { + } + +// ---------------------------------------------------------- +// CXcapHttpReqMkcol::NewL +// +// ---------------------------------------------------------- +// +CXcapHttpReqMkcol* CXcapHttpReqMkcol::NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) + + { + CXcapHttpReqMkcol* self = new ( ELeave ) CXcapHttpReqMkcol( aHttpSession, aAuthManager, aTransportMain ); + CleanupStack::PushL( self ); + self->BaseConstructL( aRequestUri ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------------- +// CXcapHttpReqMkcol::~CXcapHttpReqMkcol +// +// ---------------------------------------------------------- +// +CXcapHttpReqMkcol::~CXcapHttpReqMkcol() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpReqMkcol::~CXcapHttpReqMkcol()" ) ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpReqMkcol::ConstructRequestL +// +// ---------------------------------------------------------- +// +void CXcapHttpReqMkcol::ConstructRequestL() + { + CXcapHttpRequest::ConstructRequestL(); + iHttpTransaction.Request().SetBody( *this ); + } + +// ---------------------------------------------------------- +// CXcapHttpReqMkcol::ConstructRequestL +// +// ---------------------------------------------------------- +// +RStringF CXcapHttpReqMkcol::ConstructMethodStringL() + { + return iHttpSession.StringPool().OpenFStringL( KXcapRequestMkcol ); + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqPut.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpReqPut.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,91 @@ +/* +* Copyright (c) 2004 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: CXcapHttpReqPut +* +*/ + + + + +// INCLUDE FILES +#include "XcapHttpReqPut.h" +#include "XcapHttpTransport.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpReqPut::CXcapHttpReqPut +// +// ---------------------------------------------------------- +// +CXcapHttpReqPut::CXcapHttpReqPut( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) : + CXcapHttpContSupplier( aHttpSession, aAuthManager, aTransportMain ) + + { + } + +// ---------------------------------------------------------- +// CXcapHttpReqPut::NewL +// +// ---------------------------------------------------------- +// +CXcapHttpReqPut* CXcapHttpReqPut::NewL( const TDesC& aRequestUri, + RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) + + { + CXcapHttpReqPut* self = new ( ELeave ) CXcapHttpReqPut( aHttpSession, aAuthManager, aTransportMain ); + CleanupStack::PushL( self ); + self->BaseConstructL( aRequestUri ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------------- +// CXcapHttpReqPut::~CXcapHttpReqPut +// +// ---------------------------------------------------------- +// +CXcapHttpReqPut::~CXcapHttpReqPut() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpReqPut::~CXcapHttpReqPut()" ) ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpReqPut::ConstructRequestL +// +// ---------------------------------------------------------- +// +void CXcapHttpReqPut::ConstructRequestL() + { + CXcapHttpRequest::ConstructRequestL(); + iHttpTransaction.Request().SetBody( *this ); + } + +// ---------------------------------------------------------- +// CXcapHttpReqPut::ConstructRequestL +// +// ---------------------------------------------------------- +// +RStringF CXcapHttpReqPut::ConstructMethodStringL() + { + return iHttpSession.StringPool().OpenFStringL( KXcapRequestPut ); + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpRequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpRequest.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,681 @@ +/* +* Copyright (c) 2003 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: CXcapHttpRequest +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "XdmCredentials.h" +#include "XcapHttpRequest.h" +#include "XcapHttpResponse.h" +#include "XcapHttpTransport.h" +#include "XcapHttpHeaderModel.h" +#include "XcapHttpAuthManager.h" +#include "XcapHttpRequestTimer.h" + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CXcapHttpRequest::CXcapHttpRequest +// +// ---------------------------------------------------------- +// +CXcapHttpRequest::CXcapHttpRequest( RHTTPSession& aHttpSession, + CXcapHttpAuthManager& aAuthManager, + CXcapHttpTransport& aTransportMain ) : + iHttpSession( aHttpSession ), + iTransportMain( aTransportMain ), + iSent( EFalse ), + iActive( EFalse ), + iCancelled( EFalse ), + iConstructed( EFalse ), + iAuthManager( aAuthManager ) + + { + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::BaseConstructL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::BaseConstructL( const TDesC& aRequestUri ) + { + SetRequestUriL( aRequestUri ); + iHttpResponse = CXcapHttpResponse::NewL( this, iTransportMain ); + iResponseBuffer = CBufSeg::NewL( 250 ); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::~CXcapHttpRequest +// +// ---------------------------------------------------------- +// +CXcapHttpRequest::~CXcapHttpRequest() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::~CXcapHttpRequest()" ) ); + #endif + delete iExpiryTimer; + delete iHttpResponse; + delete iRequestUriBuf; + ReleaseResponseData(); + delete iResponseBuffer; + delete iWholeUri; + iHeaderCollection.Close(); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::DispatchRequestL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpRequest::DispatchRequestL( TRequestStatus& aClientStatus ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::DispatchMessageL()" ) ); + iSendTime = TimeL(); + #endif + ConstructRequestL(); + DoSetHeadersL(); + iCurrentDataLength = 0; + aClientStatus = KRequestPending; + iClientStatus = &aClientStatus; + iHttpTransaction.SubmitL(); + SetStatus( ETrue ); + iActive = ETrue; + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::ConstructRequest +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::ConstructRequestL() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ConstructRequestL() - Constructed: %d" ), iConstructed ); + #endif + if( !iConstructed ) + { + RStringF method = ConstructMethodStringL(); + CleanupClosePushL( method ); + iHttpTransaction = iHttpSession.OpenTransactionL( iRequestUri, *iHttpResponse, method ); + CleanupStack::PopAndDestroy(); //method + RHTTPHeaders hdrs = iHttpTransaction.Request().GetHeaderCollection(); + iConstructed = ETrue; + } + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::UpdateRequestUriL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpRequest::UpdateRequestUriL( const TDesC8& aUpdatedUri ) + { + HBufC* temp = HBufC::NewLC( aUpdatedUri.Length() ); + temp->Des().Copy( aUpdatedUri ); + SetRequestUriL( temp->Des() ); + CleanupStack::PopAndDestroy(); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::ResetUriL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpRequest::ResetUriL( const TDesC& aNewUri ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ResetUriL()" ) ); + #endif + delete iRequestUriBuf; + iRequestUriBuf = NULL; + delete iWholeUri; + iWholeUri = NULL; + iWholeUri = HBufC8::NewL( aNewUri.Length() ); + iWholeUri->Des().Copy( aNewUri ); + iRequestUri.Parse( iWholeUri->Des() ); + #ifdef _DEBUG + TPtrC8 address( iRequestUri.UriDes() ); + iTransportMain.WriteToLog( _L8( " New URI %S"), &address ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::RequestUriL +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXcapHttpRequest::RequestUriL() const + { + return iRequestUriBuf != NULL ? iRequestUriBuf->Des() : TPtrC8(); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::ResendL +// +// ---------------------------------------------------------- +// +CXcapHttpAuthManager& CXcapHttpRequest::AuthManager() + { + return iAuthManager; + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::ResendWithAuthL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::ResendWithAuthL( TInt aAuthType ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ResendWithAuthL() - Auth type: %d" ), aAuthType ); + #endif + iHttpTransaction.Cancel(); + if( iExpiryTimer != NULL && iExpiryTimer->IsActive() ) + iExpiryTimer->Cancel(); + RHTTPHeaders hdrs = iHttpTransaction.Request().GetHeaderCollection(); + AppendAuthorizationHeaderL( hdrs, aAuthType ); + iHttpTransaction.SubmitL(); + SetStatus( ETrue ); + iActive = ETrue; + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::Transaction +// +// ---------------------------------------------------------- +// +RHTTPTransaction& CXcapHttpRequest::Transaction() + { + return iHttpTransaction; + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::RelativeUri +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapHttpRequest::RelativeUri() const + { + TPtrC8 absolute( iRequestUri.UriDes() ); + TPtrC8 temp( absolute.Mid( absolute.FindF( _L8( "//" ) ) + 2 ) ); + return temp.Mid( temp.LocateF( '/' ) ); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::SetStatus +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::SetRequestUriL( const TDesC& aRequestUri ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetRequestUriL()") ); + #endif + delete iRequestUriBuf; + iRequestUriBuf = NULL; + iRequestUriBuf = HBufC8::NewL( aRequestUri.Length() ); + iRequestUriBuf->Des().Copy( aRequestUri ); + TPtrC8 document = iRequestUriBuf->Des(); + TPtrC8 root = iTransportMain.RootUri(); + delete iWholeUri; + iWholeUri = NULL; + iWholeUri = HBufC8::NewL( root.Length() + document.Length() ); + iWholeUri->Des().Copy( root ); + iWholeUri->Des().Append( document ); + iRequestUri.Parse( iWholeUri->Des() ); + #ifdef _DEBUG + TPtrC8 address( iRequestUri.UriDes() ); + iTransportMain.WriteToLog( _L8( " URI %S"), &address ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::SetStatus +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::SetStatus( const TBool aSent ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetStatus()" ) ); + #endif + iSent = aSent; + if( iSent ) + { + if( iExpiryTimer != NULL && !iExpiryTimer->IsActive() ) + iExpiryTimer->ActivateTimer( iExpiryTime ); + } + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetStatus(): Status %d"), iSent ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::SetHeaderL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpRequest::SetHeaderL( const TDesC8& aHeaderName, + const TDesC8& aHeaderValue ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetHeaderL()" ) ); + iTransportMain.WriteToLog( _L8( " Header name: %S" ), &aHeaderName ); + iTransportMain.WriteToLog( _L8( " Header value: %S" ), &aHeaderValue ); + #endif + CXcapHttpHeaderModel* model = CXcapHttpHeaderModel::NewL( aHeaderName, aHeaderValue, iTransportMain ); + CleanupStack::PushL( model ); + User::LeaveIfError( iHeaderCollection.Append( model ) ); + CleanupStack::Pop(); //model + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::HeaderValue +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXcapHttpRequest::HeaderValue( const HTTP::TStrings aHeaderName ) const + { + THTTPHdrVal value; + RStringPool stringPool = iHttpSession.StringPool(); + RHTTPHeaders headerCollection = iHttpTransaction.Response().GetHeaderCollection(); + RStringF hdrName = stringPool.StringF( aHeaderName, RHTTPSession::GetTable() ); + headerCollection.GetField( hdrName, 0, value ); + hdrName.Close(); + if( value.Type() == THTTPHdrVal::KStrVal ) + return value.Str().DesC(); + else if( value.Type() == THTTPHdrVal::KStrFVal ) + return value.StrF().DesC(); + else return TPtrC8(); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::DoSetHeadersL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::DoSetHeadersL() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::DoSetHeadersL()" ) ); + #endif + TInt count = iHeaderCollection.Count(); + RHTTPHeaders hdrs = iHttpTransaction.Request().GetHeaderCollection(); + if( iAuthManager.IsAuthorized() ) + AppendAuthorizationHeaderL( hdrs, KAuthTypeNormal ); + if( iConstructed && count > 0 ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "--------------------" ) ); + iTransportMain.WriteToLog( _L8( "User-set headers:" ) ); + #endif + for( TInt i = 0;i < count;i++ ) + { + TPtrC8 name = iHeaderCollection[i]->HeaderName(); + TPtrC8 value = iHeaderCollection[i]->HeaderValue(); + RStringF nameString = iHttpSession.StringPool().OpenFStringL( name ); + CleanupClosePushL( nameString ); + RStringF valueString = iHttpSession.StringPool().OpenFStringL( value ); + CleanupClosePushL( valueString ); + hdrs.SetFieldL( nameString, valueString ); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "* %S: %S" ), &name, &value ); + #endif + CleanupStack::PopAndDestroy( 2 ); //valueString, nameString + } + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "--------------------" ) ); + #endif + } + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::AppendAuthorizationHeaderL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::AppendAuthorizationHeaderL( RHTTPHeaders& aHeaderCollection, TInt aAuthType ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::AppendAuthorizationHeaderL()" ) ); + #endif + HBufC8* authorization = iAuthManager.AuthorizationL( *this ); + if( authorization != NULL ) + { + RemoveDuplicateAuth(); + CleanupStack::PushL( authorization ); + RStringF valStr = iHttpSession.StringPool().OpenFStringL( *authorization ); + CleanupClosePushL( valStr ); + switch( aAuthType ) + { + case KAuthTypeNormal: + aHeaderCollection.SetFieldL( iHttpSession.StringPool().StringF( + HTTP::EAuthorization, RHTTPSession::GetTable() ), valStr ); + break; + case KAuthTypeProxy: + aHeaderCollection.SetFieldL( iHttpSession.StringPool().StringF( + HTTP::EProxyAuthorization, RHTTPSession::GetTable() ), valStr ); + break; + default: + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Default case: %d" ), aAuthType ); + #endif + break; + } + CleanupStack::PopAndDestroy( 2 ); //valStr, authorization + } + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::RemoveDuplicateAuth +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::RemoveDuplicateAuth() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::RemoveDuplicateAuth()" ) ); + #endif + RStringPool spool = iHttpSession.StringPool(); + RHTTPHeaders requestHeaders( iHttpTransaction.Request().GetHeaderCollection() ); + //Check for existence of the header is not needed, remove both if they're there + requestHeaders.RemoveField( spool.StringF( HTTP::EAuthorization, RHTTPSession::GetTable() ) ); + requestHeaders.RemoveField( spool.StringF( HTTP::EProxyAuthorization, RHTTPSession::GetTable() ) ); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::AppendDataL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::AppendDataL( const TPtrC8& aBodyPart ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::AppendDataL() - Current: %d" ), + iCurrentDataLength ); + #endif + iResponseBuffer->ResizeL( iCurrentDataLength + aBodyPart.Length() ); + iResponseBuffer->Write( iCurrentDataLength, aBodyPart ); + iCurrentDataLength = iCurrentDataLength + aBodyPart.Length(); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Current: %d" ), iCurrentDataLength ); + iTransportMain.WriteToLog( _L8( " Buffer size: %d" ), iResponseBuffer->Size() ); + #endif + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::SetStatus +// +// ---------------------------------------------------------- +// +RHTTPSession& CXcapHttpRequest::Session() + { + return iHttpSession; + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::SetStatus +// +// ---------------------------------------------------------- +// +EXPORT_C TXdmCompletionData* CXcapHttpRequest::ResponseData() + { + return &iRespData; + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::ReleaseResponseData +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpRequest::ReleaseResponseData() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::ReleaseResponseData()" ) ); + #endif + if( iRespData.iETag != NULL ) + { + delete iRespData.iETag; + iRespData.iETag = NULL; + } + if( iRespData.iStatusText != NULL ) + { + delete iRespData.iStatusText; + iRespData.iStatusText = NULL; + } + if( iRespData.iResponseData != NULL ) + { + delete iRespData.iResponseData; + iRespData.iResponseData = NULL; + } + if( iConstructed ) + { + iConstructed = EFalse; + iHttpTransaction.Close(); + } + iHeaderCollection.ResetAndDestroy(); + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::SetExpiryTimeL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpRequest::SetExpiryTimeL( MXcapHttpRequestTimerCallback* /*aCallback*/, + const TTimeIntervalMicroSeconds32 aExpiryTime ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::SetExpiryTimeL()" ) ); + #endif + if( iExpiryTimer == NULL ) + iExpiryTimer = CXcapHttpRequestTimer::NewL( iTransportMain, this ); + iExpiryTime = aExpiryTime; + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::FinaliseRequestL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::FinaliseRequestL( TInt aErrorCode ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::FinaliseRequestL()" ) ); + iTransportMain.WriteToLog( _L8( " Error: %d" ), aErrorCode ); + iTransportMain.WriteToLog( _L8( " Active: %d" ), iActive ); + #endif + if( iActive ) + { + iActive = EFalse; + if( iExpiryTimer ) + iExpiryTimer->Cancel(); + PrepareResponseBodyL(); + CompileResponseDataL( aErrorCode ); + User::RequestComplete( iClientStatus, aErrorCode ); + delete iWholeUri; + iWholeUri = NULL; + } + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::CancelRequest +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapHttpRequest::CancelRequest() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::CancelRequest()" ) ); + #endif + if( iActive ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Request is active, cancelling..." ) ); + #endif + if( iExpiryTimer ) + iExpiryTimer->Cancel(); + iActive = EFalse; + iConstructed = EFalse; + iHttpTransaction.Close(); + iRespData.iETag = NULL; + iRespData.iStatusText = NULL; + iRespData.iResponseData = NULL; + iRespData.iCompletion = KErrCancel; + iRespData.iHttpStatus = KErrCancel; + User::RequestComplete( iClientStatus, KErrCancel ); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Request completed with KErrCancel" ) ); + #endif + } + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::CompileResponseData +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::CompileResponseDataL( TInt aErrorCode ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L( "CXcapHttpRequest::CompileResponseData()" ) ); + #endif + RHTTPResponse response = iHttpTransaction.Response(); + TInt statusInt = response.StatusCode(); + RStringF statusStr = response.StatusText(); + HBufC8* statusBuf = statusStr.DesC().AllocLC(); + TPtrC8 etagDesc( HeaderValue( HTTP::EETag ) ); + HBufC8* eTag = etagDesc.Length() > 0 ? etagDesc.AllocL() : NULL; + iRespData.iETag = eTag; + iRespData.iHttpStatus = statusInt; + iRespData.iStatusText = statusBuf; + iRespData.iCompletion = aErrorCode; + iRespData.iResponseData = iFlatResponse; + CleanupStack::Pop(); //statusBuf + #ifdef _DEBUG + if( iRespData.iResponseData != NULL ) + { + TBuf<32> response( _L( "response" ) ); + response.AppendNum( iHttpTransaction.Id() ); + response.Append( _L( ".xml" ) ); + DumpResponseL( *iRespData.iResponseData, response ); + } + #endif + } + +#ifdef _DEBUG +// --------------------------------------------------------- +// CXcapHttpRequest::DumpResponseL +// +// --------------------------------------------------------- +// +void CXcapHttpRequest::DumpResponseL( const TDesC8& aRespData, const TDesC& aDumpName ) + { + RFile file; + RFs session; + TBuf<512> path( _L( "C:\\logs\\XDM\\" ) ); + path.Append( aDumpName ); + User::LeaveIfError( session.Connect() ); + TInt error( file.Replace( session, path, EFileWrite ) ); + if( error == KErrNone ) + { + file.Write( aRespData ); + file.Close(); + } + session.Close(); + } +#endif + +// ---------------------------------------------------------- +// CXcapHttpRequest::PrepareResponseBodyL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::PrepareResponseBodyL() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::PrepareResponseBodyL()" ) ); + #endif + iResponseBuffer->Compress(); + TInt dataLength = iResponseBuffer->Size(); + #ifdef _DEBUG + TInt contentLength = iHttpResponse->ContentLengthL(); + if( contentLength >= 0 && contentLength < KMaxTInt ) + { + TPtrC8 result; + contentLength == dataLength ? result.Set( _L8( "Correct" ) ) : + result.Set( _L8( "Values do not match!" ) ); + iTransportMain.WriteToLog( _L8( " Actual length: %d *** Content-Length: %d => %S" ), + dataLength, contentLength, &result ); + } + #endif + if( dataLength > 0 ) + { + iFlatResponse = HBufC8::NewL( dataLength ); + TPtr8 pointer( iFlatResponse->Des() ); + iResponseBuffer->Read( 0, pointer, dataLength ); + //pointer.Copy( iResponseBuffer->Ptr( 0 ) ); + iResponseBuffer->Reset(); + iCurrentDataLength = 0; + } + } + +// ---------------------------------------------------------- +// CXcapHttpRequest::HandleTimerEventL +// +// ---------------------------------------------------------- +// +void CXcapHttpRequest::HandleTimerEventL() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequest::HandleTimerEventL()" ) ); + #endif + iHttpTransaction.Close(); + iActive = EFalse; + iConstructed = EFalse; + iRespData.iETag = NULL; + iRespData.iStatusText = NULL; + iRespData.iResponseData = NULL; + iRespData.iCompletion = KErrTimedOut; + iRespData.iHttpStatus = KErrTimedOut; + User::RequestComplete( iClientStatus, KErrTimedOut ); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Request completed with KErrTimedOut" ) ); + #endif + } + +// --------------------------------------------------------- +// CXcapHttpRequest::TimeL +// +// --------------------------------------------------------- +// +TInt CXcapHttpRequest::TimeL() const + { + TInt period = 0; + User::LeaveIfError( HAL::Get( HALData::ESystemTickPeriod, period ) ); + TInt millisecsPerTick = period / 1000; + return User::TickCount() * millisecsPerTick; + } + +// End of file + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpRequestTimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpRequestTimer.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,125 @@ +/* +* Copyright (c) 2005 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: CXcapHttpRequestTimer +* +*/ + + + + +// INCLUDES +#include "XcapHttpTransport.h" +#include "XcapHttpRequestTimer.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CXcapHttpRequestTimer::CXcapHttpRequestTimer( CXcapHttpTransport& aTransportMain, + MXcapHttpRequestTimerCallback* aCallback ) : + CActive( 0 ), + iTransportMain( aTransportMain ), + iCallback( aCallback ) + + + { + } + +// --------------------------------------------------------- +// CXcapHttpRequestTimer::ConstructL() +// +// --------------------------------------------------------- +// +void CXcapHttpRequestTimer::ConstructL() + { + User::LeaveIfError( iTimer.CreateLocal() ); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------- +// CXcapHttpRequestTimer::NewL +// +// --------------------------------------------------------- +// +CXcapHttpRequestTimer* CXcapHttpRequestTimer::NewL( CXcapHttpTransport& aTransportMain, + MXcapHttpRequestTimerCallback* aCallback ) + { + CXcapHttpRequestTimer* self = new ( ELeave ) CXcapHttpRequestTimer( aTransportMain, aCallback ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapHttpRequestTimer::~CXcapHttpRequestTimer() +// +// --------------------------------------------------------- +// +CXcapHttpRequestTimer::~CXcapHttpRequestTimer() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequestTimer::~CXcapHttpRequestTimer()" ) ); + #endif + Cancel(); + iTimer.Close(); + } + + +// --------------------------------------------------------- +// CXcapHttpRequestTimer::ActivateTimer +// +// --------------------------------------------------------- +// +void CXcapHttpRequestTimer::ActivateTimer( TTimeIntervalMicroSeconds32 aDelay ) + { + __ASSERT_ALWAYS( !IsActive(), User::Panic( _L( "CXcapHttpRequestTimer" ), 1 ) ); + iTimer.After( iStatus, aDelay ); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequestTimer activated." ) ); + #endif + SetActive(); + } + +// --------------------------------------------------------- +// CXcapHttpRequestTimer::RunL +// +// --------------------------------------------------------- +// +void CXcapHttpRequestTimer::RunL() + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequestTimer::RunL()." ) ); + #endif + iCallback->HandleTimerEventL(); + } + +// --------------------------------------------------------- +// CXcapHttpRequestTimer::DoCancel +// +// --------------------------------------------------------- +// +void CXcapHttpRequestTimer::DoCancel() + { + iTimer.Cancel(); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpRequestTimer cancelled." ) ); + #endif + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpResponse.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpResponse.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,442 @@ +/* +* Copyright (c) 2003 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: CXcapHttpResponse +* +*/ + + + + +// INCLUDE FILES +#include +#include "XdmCredentials.h" +#include "XcapHttpRequest.h" +#include "XcapHttpResponse.h" +#include "XcapHttpTransport.h" +#include "XcapHttpAuthManager.h" + +const TUint KMaxRetryCount = 3; + +// ================= MEMBER FUNCTIONS ======================= +// + + +// ---------------------------------------------------------- +// CXcapHttpResponse::CXcapHttpResponse +// +// ---------------------------------------------------------- +// +CXcapHttpResponse::CXcapHttpResponse( CXcapHttpRequest* aHttpRequest, + CXcapHttpTransport& aTransportMain ) : + iAuthPending( EFalse ), + iHttpRequest( aHttpRequest ), + iTransportMain( aTransportMain ), + iAuthManager( iHttpRequest->AuthManager() ) + { + } + +// ---------------------------------------------------- +// CXcapHttpResponse::NewL +// +// ---------------------------------------------------- +// +CXcapHttpResponse* CXcapHttpResponse::NewL( CXcapHttpRequest* aHttpRequest, + CXcapHttpTransport& aTransportMain ) + { + CXcapHttpResponse* self = new ( ELeave ) CXcapHttpResponse( aHttpRequest, aTransportMain ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------- +// CXcapHttpResponse::ConstructL +// +// ---------------------------------------------------- +// +void CXcapHttpResponse::ConstructL() + { + } + +// ---------------------------------------------------- +// CXcapHttpResponse::~CXcapHttpResponse() +// Destructor +// ---------------------------------------------------- +// +CXcapHttpResponse::~CXcapHttpResponse() + { + } + +// ---------------------------------------------------- +// CXcapHttpResponse::MHFRunL +// +// ---------------------------------------------------- +// +void CXcapHttpResponse::MHFRunL( RHTTPTransaction aTransaction, const THTTPEvent& aEvent ) + { + TInt status = aTransaction.Response().StatusCode(); + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpResponse::MHFRunL()" ) ); + iTransportMain.WriteToLog( _L8( " HTTP status: %d" ), status ); + iTransportMain.WriteToLog( _L8( " Event status: %d" ), aEvent.iStatus ); + iTransportMain.WriteToLog( _L8( " TransID: %d " ), aTransaction.Id() ); + #endif + switch( aEvent.iStatus ) + { + case THTTPEvent::EGotResponseHeaders: + #ifdef _DEBUG + DumpHeadersL( aTransaction.Response().GetHeaderCollection(), aTransaction.Id() ); + //DumpHeadersL( aTransaction.Request().GetHeaderCollection(), aTransaction.Id() ); + #endif + TInt authType; + if( IsUnauthRequest( aTransaction, authType ) ) + { + // If server keeps on sending 401 resposenses. Will stop + // sending new requests after 3 trys. + if ( KMaxRetryCount == iUnauthRequestCounter ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( + _L8( " Max retry count. Stop sending auth requests to server." ) ); + #endif + iHttpRequest->FinaliseRequestL( KErrCancel ); + aTransaction.Cancel(); + } + //We only support Digest => If Basic is defined, stop. + else if( iAuthManager.ParseHeaderL( aTransaction, authType ) ) + { + iHttpRequest->ResendWithAuthL( authType ); + iAuthPending = ETrue; + } + else + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Basic authentication not supported" ) ); + #endif + iHttpRequest->FinaliseRequestL( KXcapErrorAuthentication ); + aTransaction.Cancel(); + } + } + else if( iAuthPending && ( status != 401 && status != 403 ) ) + { + iAuthPending = EFalse; + iAuthManager.SetAuthorized( ETrue ); + } + else if( !CheckAuthInfoHeaderL( aTransaction.Response().GetHeaderCollection() ) ) + { + //This means that something was wrong with the Authentication-Info header + //the server returned. Do not take any chances here, but stop. + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " Something's wrong with Authentication-Info => STOP" ) ); + #endif + iHttpRequest->FinaliseRequestL( KXcapErrorAuthentication ); + aTransaction.Cancel(); + } + break; + case THTTPEvent::EGotResponseBodyData: + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "MHFRunL() - A body part received" ) ); + #endif + HandleReceivedBodyDataL( aTransaction ); + break; + case THTTPEvent::EResponseComplete: + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " * Transaction complete") ); + #endif + break; + case THTTPEvent::ESucceeded: + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " * Transaction succeeded") ); + #endif + iHttpRequest->FinaliseRequestL( KErrNone ); + break; + case THTTPEvent::EFailed: + { + TInt completion = aEvent.iStatus < 0 ? aEvent.iStatus : KErrNone; + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " * Transaction failed - Completion: %d"), completion ); + #endif + iHttpRequest->FinaliseRequestL( completion ); + } + break; + case THTTPEvent::ERedirectedPermanently: + break; + case THTTPEvent::ERedirectedTemporarily: + break; + default: + { + if( aEvent.iStatus < KErrNone ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " * Transaction failed, stop" ) ); + #endif + iHttpRequest->FinaliseRequestL( aEvent.iStatus ); + } + else + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( " * Unknown status, stop" ) ); + #endif + iHttpRequest->FinaliseRequestL( KErrUnknown ); + } + } + break; + } + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::CheckAuthInfoHeaderL +// +// ---------------------------------------------------------- +// +TBool CXcapHttpResponse::CheckAuthInfoHeaderL( RHTTPHeaders aHeaders ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpResponse::CheckAuthInfoHeaderL()" ) ); + #endif + THTTPHdrVal fieldVal; + TBool authOk = ETrue; + TPtrC8 rawData( _L8( "" ) ); + RStringPool spool = iHttpRequest->Session().StringPool(); + RStringF authInfo = spool.OpenFStringL( TPtrC8( KAuthInfoParamArray[ENfoAuthInfo] ) ); + CleanupClosePushL( authInfo ); + RStringF prxAuthInfo = spool.OpenFStringL( TPtrC8( KAuthInfoParamArray[ENfoPrxAuthInfo] ) ); + CleanupClosePushL( prxAuthInfo ); + if( aHeaders.GetRawField( authInfo, rawData ) == KErrNone || + aHeaders.GetRawField( prxAuthInfo, rawData ) == KErrNone ) + { + TInt length = 0; + HBufC8* tempCopy = rawData.AllocLC(); + TPtr8 modDesc( tempCopy->Des() ); + while( authOk && modDesc.Length() > 0 ) + { + TPtrC8 value; + TAuthInfoParam name = ( TAuthInfoParam )-1; + if( ParseAuthInfoParam( length, name, value, modDesc ) ) + authOk = iAuthManager.ConsumeAuthInfoParamL( name, value ); + modDesc.Delete( 0, length ); + modDesc.TrimLeft(); + } + CleanupStack::PopAndDestroy(); //tempCopy + } + CleanupStack::PopAndDestroy( 2 ); //prxAuthInfo, authInfo + return authOk; + } + +// ---------------------------------------------------------- +// CXcapHttpAuthManager::ParseAuthInfoParam +// +// ---------------------------------------------------------- +// +TBool CXcapHttpResponse::ParseAuthInfoParam( TInt& aLength, TAuthInfoParam& aName, TPtrC8& aValue, TPtr8& aParam ) + { + TBool found = EFalse; + TInt delim = aParam.Locate( ',' ); + TPtrC8 param( delim > 0 ? aParam.Left( delim ) : aParam ); + TInt index = param.Locate( '=' ); + if( index > 0 ) + { + TPtrC8 name( param.Left( index ) ); + TPtrC8 value( param.Mid( index + 1 ) ); + const TInt count = sizeof( KAuthInfoParamArray ) / sizeof( KAuthInfoParamArray[0] ); + for( TInt i = 0;!found && i < count;i++ ) + { + if( name.CompareF( TPtrC8( KAuthInfoParamArray[i] ) ) == 0 ) + { + aValue.Set( value ); + aName = ( TAuthInfoParam )i; + found = ETrue; + } + } + } + aLength = delim > 0 ? delim + 1 : aParam.Length(); + return found; + } + + +// ---------------------------------------------------------- +// CXcapHttpResponse::IsUnauthRequest +// +// ---------------------------------------------------------- +// +TBool CXcapHttpResponse::IsUnauthRequest( RHTTPTransaction aTransaction, TInt& aAuthType ) + { + iUnauthRequestCounter++; + TInt status = aTransaction.Response().StatusCode(); + switch( status ) + { + case 401: //Normal authentication + aAuthType = 401; + return ETrue; + case 407: //Proxy authentication + aAuthType = 407; + return ETrue; + default: + return EFalse; + } + } + +// ---------------------------------------------------------- +// CXcapHttpResponse::HandleReceivedBodyDataL +// +// ---------------------------------------------------------- +// +TBool CXcapHttpResponse::HandleReceivedBodyDataL( const RHTTPTransaction aTransaction ) + { + #ifdef _DEBUG + iTransportMain.WriteToLog( _L8( "CXcapHttpResponse::HandleReceivedBodyDataL()") ); + #endif + TPtrC8 bodyData; + MHTTPDataSupplier* respBody = aTransaction.Response().Body(); + TBool lastChunk = respBody->GetNextDataPart( bodyData ); + iHttpRequest->AppendDataL( bodyData ); + respBody->ReleaseData(); + return lastChunk; + } + +// ---------------------------------------------------------- +// CImpsHttpTransactionSender::ContentLengthL +// +// ---------------------------------------------------------- +// +TInt CXcapHttpResponse::ContentLengthL() const + { + TInt retVal = KMaxTInt; + THTTPHdrVal fieldValue; + _LIT8( KContentLength, "Content-Length" ); + RHTTPHeaders headers = ResponseHeaderCollection(); + RStringPool stringPool = iHttpRequest->Session().StringPool(); + RStringF lengthString = stringPool.OpenFStringL( KContentLength ); + headers.GetField( lengthString, 0, fieldValue ); + lengthString.Close(); + if( fieldValue.Type() == THTTPHdrVal::KTIntVal ) + retVal = fieldValue.Int(); + return retVal; + } + +// ---------------------------------------------------- +// CXcapHttpResponse::HeaderCollection +// +// ---------------------------------------------------- +// +RHTTPHeaders CXcapHttpResponse::ResponseHeaderCollection() const + { + return iHttpRequest->Transaction().Response().GetHeaderCollection(); + } + +// ---------------------------------------------------- +// CXcapHttpResponse::HeaderCollection +// +// ---------------------------------------------------- +// +RHTTPHeaders CXcapHttpResponse::RequestHeaderCollection() const + { + return iHttpRequest->Transaction().Request().GetHeaderCollection(); + } + +// ---------------------------------------------------- +// CXcapHttpResponse::MHFRunError +// HTTP Stack callback interface +// ---------------------------------------------------- +// +TInt CXcapHttpResponse::MHFRunError( TInt /*aInt*/, RHTTPTransaction /*aTransaction*/, + const THTTPEvent& /*aEvent*/ ) + { + return KErrNone; + } + +#ifdef _DEBUG +// ---------------------------------------------------- +// CXcapHttpResponse::DumpHeadersL +// +// ---------------------------------------------------- +// +void CXcapHttpResponse::DumpHeadersL( RHTTPHeaders aHeaders, TInt aId ) + { + iTransportMain.WriteToLog( _L( "--------------------") ); + iTransportMain.WriteToLog( _L( "Headers of the transaction %d: "), aId ); + RStringPool strP = iHttpRequest->Session().StringPool(); + THTTPHdrFieldIter it = aHeaders.Fields(); + TBuf fieldName16; + TBuf fieldVal16; + + while( it.AtEnd() == EFalse ) + { + RStringTokenF fieldName = it(); + RStringF fieldNameStr = strP.StringF( fieldName ); + THTTPHdrVal fieldVal; + if( aHeaders.GetField( fieldNameStr, 0, fieldVal ) == KErrNone ) + { + const TDesC8& fieldNameDesC = fieldNameStr.DesC(); + fieldName16.Copy( fieldNameDesC.Left( KMaxHeaderNameLen ) ); + switch( fieldVal.Type() ) + { + case THTTPHdrVal::KTIntVal: + iTransportMain.WriteToLog( _L("%S: %d"), &fieldName16, fieldVal.Int() ); + break; + case THTTPHdrVal::KStrFVal: + { + RStringF fieldValStr = strP.StringF( fieldVal.StrF() ); + const TDesC8& fieldValDesC = fieldValStr.DesC(); + fieldVal16.Copy( fieldValDesC.Left( KMaxHeaderValueLen ) ); + iTransportMain.WriteToLog( _L( "%S: %S" ), &fieldName16, &fieldVal16 ); + } + break; + case THTTPHdrVal::KStrVal: + { + RString fieldValStr = strP.String(fieldVal.Str()); + const TDesC8& fieldValDesC = fieldValStr.DesC(); + fieldVal16.Copy( fieldValDesC.Left( KMaxHeaderValueLen ) ); + iTransportMain.WriteToLog( _L( "%S: %S" ), &fieldName16, &fieldVal16 ); + } + break; + case THTTPHdrVal::KDateVal: + { + TDateTime date = fieldVal.DateTime(); + TBuf<40> dateTimeString; + TTime t(date); + t.FormatL( dateTimeString,KTransportDateFormat ); + iTransportMain.WriteToLog( _L( "%S: %S" ), &fieldName16, &dateTimeString ); + } + break; + default: + iTransportMain.WriteToLog( _L( "%S: " ), &fieldName16 ); + break; + } + // Display realm for WWW-Authenticate header + RStringF wwwAuth = strP.StringF( HTTP::EWWWAuthenticate, RHTTPSession::GetTable() ); + if( fieldNameStr == wwwAuth ) + { + // check the auth scheme is 'basic' + RStringF basic = strP.StringF( HTTP::EBasic,RHTTPSession::GetTable() ); + RStringF realm = strP.StringF( HTTP::ERealm,RHTTPSession::GetTable() ); + THTTPHdrVal realmVal; + if ( (fieldVal.StrF() == basic ) && + ( !aHeaders.GetParam(wwwAuth, realm, realmVal) ) ) + { + RStringF realmValStr = strP.StringF( realmVal.StrF() ); + fieldVal16.Copy( realmValStr.DesC() ); + iTransportMain.WriteToLog( _L( "Realm is: %S" ), &fieldVal16 ); + } + } + } + ++it; + } + iTransportMain.WriteToLog( _L( "--------------------") ); + } + #endif + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpTransport.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapHttpTransport/src/XcapHttpTransport.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,287 @@ +/* +* Copyright (c) 2005 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: CXcapHttpTransport +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include "XdmCredentials.h" +#include "XcapHttpReqGet.h" +#include "XcapHttpReqPut.h" +#include "XcapHttpReqMkcol.h" +#include "XcapHttpReqHead.h" +#include "XcapHttpRequest.h" +#include "XcapHttpReqDelete.h" +#include "XcapHttpTransport.h" +#include "XcapHttpAuthManager.h" + +// ================= MEMBER FUNCTIONS ======================= +// + + +// ---------------------------------------------------------- +// CXcapHttpTransport::CXcapHttpTransport +// +// ---------------------------------------------------------- +// +CXcapHttpTransport::CXcapHttpTransport( MMsgConnManager& aConnManager) : + iCredValidity( EFalse ), + iSessionClosed( ETrue ), + iConnManager( aConnManager ) + { + } + +// ---------------------------------------------------------- +// CXcapHttpTransport::NewL +// +// ---------------------------------------------------------- +// +EXPORT_C CXcapHttpTransport* CXcapHttpTransport::NewL( const TDesC& aRootUri, + MMsgConnManager& aConnManager, + const TXdmCredentials& aDigestCredentials ) + { + CXcapHttpTransport* self = new ( ELeave ) CXcapHttpTransport( aConnManager ); + CleanupStack::PushL( self ); + self->ConstructL( aRootUri, aDigestCredentials ); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------- +// CXcapHttpTransport::~CXcapHttpTransport +// +// ---------------------------------------------------- +// +CXcapHttpTransport::~CXcapHttpTransport() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapHttpTransport::~CXcapHttpTransport()" ) ); + #endif + delete iRootUri; + delete iAuthManager; + iHttpSession.Close(); + iSessionClosed = ETrue; + delete iProxyBuffer; + #ifdef _DEBUG + WriteToLog( _L8( " Destructor ends." ) ); + #endif + delete iLogWriter; + } + +// ---------------------------------------------------------- +// CXcapHttpTransport::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapHttpTransport::ConstructL( const TDesC& aRootUri, const TXdmCredentials& aDigestCredentials ) + { + #ifdef _DEBUG + iLogWriter = CXdmLogWriter::NewL( KTransportLogFile ); + WriteToLog( _L8( "CXcapHttpTransport::ConstructL" ) ); + #endif + SetRootUriL( aRootUri ); + InitialiseSessionL(); + iAuthManager = CXcapHttpAuthManager::NewL( iHttpSession, *this, aDigestCredentials ); + } + +// --------------------------------------------------------- +// CXcapHttpTransport::SetRootUriL +// +// --------------------------------------------------------- +// +EXPORT_C void CXcapHttpTransport::SetRootUriL( const TDesC& aRootUri ) + { + delete iRootUri; + iRootUri = NULL; + iRootUri = HBufC8::NewL( aRootUri.Length() ); + iRootUri->Des().Copy( aRootUri ); + } + +// ---------------------------------------------------- +// CXcapHttpTransport::GetL +// +// ---------------------------------------------------- +// +EXPORT_C CXcapHttpReqGet* CXcapHttpTransport::GetL( const TDesC& aRequestUri ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapHttpTransport::GetRequestL()" ) ); + #endif + if( !iSessionClosed ) + return CXcapHttpReqGet::NewL( aRequestUri, iHttpSession, *iAuthManager, *this ); + else + { + User::Leave( KErrNotReady ); + return NULL; + } + } + +// ---------------------------------------------------- +// CXcapHttpTransport::PutL +// +// ---------------------------------------------------- +// +EXPORT_C CXcapHttpReqPut* CXcapHttpTransport::PutL( const TDesC& aRequestUri ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapHttpTransport::PutRequestL()" ) ); + #endif + if( !iSessionClosed ) + return CXcapHttpReqPut::NewL( aRequestUri, iHttpSession, *iAuthManager, *this ); + else + { + User::Leave( KErrNotReady ); + return NULL; + } + } + +// ---------------------------------------------------- +// CXcapHttpTransport::Mkcol +// +// ---------------------------------------------------- +// +EXPORT_C CXcapHttpReqMkcol* CXcapHttpTransport::MkcolL( const TDesC& aRequestUri ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapHttpTransport::MkcolRequestL()" ) ); + #endif + if( !iSessionClosed ) + return CXcapHttpReqMkcol::NewL( aRequestUri, iHttpSession, *iAuthManager, *this ); + else + { + User::Leave( KErrNotReady ); + return NULL; + } + } + +// ---------------------------------------------------- +// CXcapHttpTransport::Head +// +// ---------------------------------------------------- +// +EXPORT_C CXcapHttpReqHead* CXcapHttpTransport::HeadL( const TDesC& aRequestUri ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapHttpTransport::HeadRequestL()" ) ); + #endif + if( !iSessionClosed ) + return CXcapHttpReqHead::NewL( aRequestUri, iHttpSession, *iAuthManager, *this ); + else + { + User::Leave( KErrNotReady ); + return NULL; + } + } + +// ---------------------------------------------------- +// CXcapHttpTransport::DeleteL +// +// ---------------------------------------------------- +// +EXPORT_C CXcapHttpReqDelete* CXcapHttpTransport::DeleteL( const TDesC& aRequestUri ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapHttpTransport::DeleteRequestL()" ) ); + #endif + if( !iSessionClosed ) + return CXcapHttpReqDelete::NewL( aRequestUri, iHttpSession, *iAuthManager, *this ); + else + { + User::Leave( KErrNotReady ); + return NULL; + } + } + +// ---------------------------------------------------------- +// CXcapHttpTransport::RootUri +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXcapHttpTransport::RootUri() + { + return iRootUri != NULL ? iRootUri->Des() : TPtrC8(); + } + +// ---------------------------------------------------- +// CXcapHttpTransport::InitialiseSessionL +// +// ---------------------------------------------------- +// +void CXcapHttpTransport::InitialiseSessionL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapHttpTransport::InitialiseSessionL()" ) ); + #endif + iHttpSession.OpenL(); + RSocketServ& session = iConnManager.SocketSession(); + RConnection& connection = iConnManager.Connection(); + RHTTPConnectionInfo connInfo = iHttpSession.ConnectionInfo(); + RStringPool stringPool = iHttpSession.StringPool(); + TInt conn = reinterpret_cast ( &connection ); + connInfo.SetPropertyL( stringPool.StringF( HTTP::EHttpSocketServ, RHTTPSession::GetTable() ), + THTTPHdrVal( session.Handle() ) ); + connInfo.SetPropertyL( stringPool.StringF( HTTP::EHttpSocketConnection, RHTTPSession::GetTable() ), + THTTPHdrVal( conn ) ); + connInfo.SetPropertyL( stringPool.StringF( HTTP::EHTTPVersion, RHTTPSession::GetTable() ), + THTTPHdrVal( stringPool.StringF( HTTP::EHttp11, RHTTPSession::GetTable() ) ) ); + connInfo.SetPropertyL( stringPool.StringF( HTTP::ESecureDialog, RHTTPSession::GetTable() ), + THTTPHdrVal( stringPool.StringF( HTTP::EDialogPrompt, RHTTPSession::GetTable() ) ) ); + //CHttpDeflateFilter::InstallFilterL( iHttpSession ); + iSessionClosed = EFalse; + #ifdef _DEBUG + WriteToLog( _L8( "InitialiseSessionL() ends." ) ); + #endif + } + +#ifdef _DEBUG +// ---------------------------------------------------- +// CXcapHttpTransport::WriteToLog +// Writes to the log, 8-bit version +// ---------------------------------------------------- +// +void CXcapHttpTransport::WriteToLog( TRefByValue aFmt,... ) const + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + iLogWriter->WriteToLog( buf ); + } + +// ---------------------------------------------------- +// CXcapHttpTransport::WriteToLog +// Writes to the log, 16-bit version +// ---------------------------------------------------- +// +void CXcapHttpTransport::WriteToLog( TRefByValue aFmt,... ) const + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf buf; + buf.FormatList( aFmt, list ); + iLogWriter->WriteToLog( buf ); + } +#endif //_DEBUG + + + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/BWINSCW/XcapOperationsU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/BWINSCW/XcapOperationsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/eabi/XcapOperationsU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/eabi/XcapOperationsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,3 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/group/XcapOperations.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/group/XcapOperations.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2005 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: XcapOperations.dll from XcapOperations.mmp +* +*/ + + + +#include + +TARGET xcapoperations.dll +UID 0x10009D8D 0x10207410 +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT +TARGETTYPE PLUGIN + +SOURCEPATH ../src + +START RESOURCE 10207410.rss + +TARGET xcapoperations.rsc + +END + +SOURCE XcapAddition.cpp +SOURCE XcapDeletion.cpp +SOURCE XcapRetrieval.cpp +SOURCE XcapInsertion.cpp +SOURCE XcapUriParser.cpp +SOURCE XcapReplacement.cpp +SOURCE XcapHttpOperation.cpp +SOURCE XcapOperationFactory.cpp + +//Internal +USERINCLUDE ../inc +USERINCLUDE ../../inc +USERINCLUDE ../../../inc +USERINCLUDE ../../XcapCache/inc +USERINCLUDE ../../XcapUtils/inc +USERINCLUDE ../../XcapAppUsage/inc +USERINCLUDE ../../XcapHttpTransport/inc + +//Common +USERINCLUDE ../../../XdmXmlParser/inc + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/xml +SYSTEMINCLUDE /epoc32/include/ecom +SYSTEMINCLUDE ../../../../inc + +LIBRARY hal.lib +LIBRARY ecom.lib +LIBRARY efsrv.lib +LIBRARY euser.lib + +LIBRARY inetprotutil.lib + +LIBRARY flogger.lib +LIBRARY xdmengine.lib +LIBRARY xdmxmlparser.lib +LIBRARY xcapprotocol.lib +LIBRARY xcapappusage.lib +LIBRARY xcapcacheclient.lib +LIBRARY xcaphttptransport.lib + +#if defined( ARMCC ) +DEFFILE ../eabi/ +#elif defined ( WINSCW ) +deffile ../BWINSCW/ +#elif defined (WINS ) +deffile ../BWINS/ +#endif + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: XcapOperations bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- +XcapOperations.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapAddition.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapAddition.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,118 @@ +/* +* Copyright (c) 2003 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: CXcapAddition +* +*/ + + + + +#ifndef __XCAPADDITION__ +#define __XCAPADDITION__ + +#include +#include "XcapHttpOperation.h" + +//FORWARD DECLARATIONS +class CXcapHttpReqPut; +class CXcapDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapAddition ) : public CXcapHttpOperation + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapAddition* NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& iOperationFactory ); + + /** + * Handle a successful operation + */ + virtual void OperationCompleteL(); + + /** + * Handle a failed operation + */ + virtual void OperationFailedL(); + + /** + * Destructor. + */ + virtual TBool Result() const; + + /** + * Destructor. + */ + virtual ~CXcapAddition(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapAddition( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& iOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ExecuteL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TXdmOperationType DetermineOperationType(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void UpdatePartialToCacheL( RXcapCache* aCache, const TDesC8& aNewData ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + virtual TInt FormatModRequestL( const CXdmDocumentNode* aDocumentNode ); + + private: //Data + + TXdmOperationType iOperationType; + }; + +#endif //__XCAPPARTIALADDITION__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapDeletion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapDeletion.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,110 @@ +/* +* Copyright (c) 2005 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: CXcapDeletion +* +*/ + + + + +#ifndef __XCAPDELETION__ +#define __XCAPDELETION__ + +#include +#include "XcapHttpOperation.h" + +//FORWARD DECLARATIONS +class CXcapDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapDeletion ) : public CXcapHttpOperation + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapDeletion* NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& iOperationFactory ); + + /** + * Handle a successful operation + */ + virtual void OperationCompleteL(); + + /** + * Handle a failed operation + */ + virtual void OperationFailedL(); + + /** + * Destructor. + */ + virtual TBool Result() const; + + /** + * Destructor. + */ + virtual ~CXcapDeletion(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapDeletion( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& iOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ExecuteL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void HandleDocDeletion(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void HandlePartialDeletion(); + + private: //Data + + TXdmOperationType iOperationType; + }; + +#endif //__XCAPDELETION__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapHttpOperation.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapHttpOperation.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,264 @@ +/* +* Copyright (c) 2005 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: CXcapHttpOperation +* +*/ + + + + +#ifndef __XCAPHTTPOPERATION__ +#define __XCAPHTTPOPERATION__ + +#include +#include "XdmOperation.h" +#include "XcapOperationFactory.h" +#include "XcapHttpRequestTimerCallback.h" + +//The default timout for HTTP requests in seconds +const TInt KDefaultHttpRequestTimeout = 30; + +//Set, if document should be fetched from cache when processing a doc subset +const TInt KFetchMasterFromCache = KXdmOption1; + +//Set, if rules concerning document subsets should be applied when processing responses +const TInt KDocumentSubset = KXdmOption2; + +//Set, if the document an operation targets should not be cached (a directory document, for example) +const TInt KNoCache = KXdmOption3; + +//Set, if EARLY-IMS is in use => add the public ID in X-3GPP-Intended-Identity header +const TInt KUseIntendedIdentity = KXdmOption4; + +//FORWARD DECLARATION +class RXcapCache; +class CXdmDocument; +class CXcapDocument; +class CXdmXmlParser; +class CXcapUriParser; +class CXcapHttpRequest; +class CXdmDocumentNode; +class CXcapDocumentNode; +class CXcapHttpTransport; + +//Override application usage validation +//Must ONLY be used for testing, comment out before release +//#define __OVERRIDE_VALIDATION__ + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapHttpOperation ) : public CActive, + public MXdmOperation + + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static void EscapeLC( CXdmDocumentNode& aRootNode ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static HBufC8* EscapeLC( const TDesC8& aDescriptor ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static HBufC8* Escape2LC( const TDesC& aDescriptor ); + + public: + + /** + * Destructor. + */ + void ExecuteL( TRequestStatus& aStatus, TUint aOptions ); + + /** + * Destructor. + */ + TInt Result() const; + + /** + * Destructor. + */ + const TXdmCompletionData& CompletionData() const; + + /** + * Destructor. + */ + TBool IsCompleted() const; + + /** + * Set this operation to completed state. + */ + void Destroy(); + + /** + * Set this operation to completed state. + */ + virtual CXdmDocumentNode* TargetNode() const; + + /** + * Destructor. + */ + CXcapHttpRequest* HttpRequest() const; + + /** + * Destructor. + */ + virtual ~CXcapHttpOperation(); + + protected: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapHttpOperation( const CXdmDocument& aTargetDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void BaseConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TPtrC8 Descriptor( HBufC8* aBuffer ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TInt ReinterpretStatus( const TInt aHttpStatus ) const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapHttpTransport& Transport() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + virtual void OperationCompleteL() = 0; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + virtual void OperationFailedL() = 0; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + virtual void ExecuteL() = 0; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + virtual void ExecuteL( CXcapHttpRequest* aHttpRequest, + CXdmDocumentNode* aDocumentNode ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + virtual TInt FormatModRequestL( const CXdmDocumentNode* aDocumentNode ); + + private: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void RunL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void DoCancel(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TBool StartOperationL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void CancelOperation(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void HandleTimerEventL(); + + protected: + + TInt iResult; + TInt iCurrentIndex; + TBool iCompleted; + TBool iPartial; + TUint iOptionFlags; + CXdmXmlParser* iXmlParser; + TXdmCompletionData iFailureData; + TXdmCompletionData* iRequestData; + TRequestStatus* iClientStatus; + CXcapUriParser* iUriParser; + CXcapHttpRequest* iActiveRequest; + CXcapDocumentNode* iDocumentSubset; + CXcapDocument& iTargetDoc; + CXcapOperationFactory& iOperationFactory; + RPointerArray iRequestQueue; + + private: //Data + }; + +#endif //__XCAPHTTPOPERATION__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapInsertion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapInsertion.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,104 @@ +/* +* Copyright (c) 2005 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: CXcapInsertion +* +*/ + + + + +#ifndef __XCAPINSERTION__ +#define __XCAPINSERTION__ + +#include +#include "XcapHttpOperation.h" + +//FORWARD DECLARATIONS +class CXcapHttpReqPut; +class CXcapDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapInsertion ) : public CXcapHttpOperation + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapInsertion* NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentExtents, + CXcapOperationFactory& iOperationFactory ); + + /** + * Handle a successful operation + */ + virtual void OperationCompleteL(); + + /** + * Handle a failed operation + */ + virtual void OperationFailedL(); + + /** + * Destructor. + */ + virtual TBool Result() const; + + /** + * Destructor. + */ + virtual ~CXcapInsertion(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapInsertion( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& iOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ExecuteL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + virtual TInt FormatModRequestL( const CXdmDocumentNode* aDocumentNode ); + + private: //Data + + TXdmOperationType iOperationType; + }; + +#endif //__XCAPINSERTION__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapOperationFactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapOperationFactory.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,122 @@ +/* +* Copyright (c) 2005 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: CXcapOperationFactory +* +*/ + + + + +#ifndef __XCAPOPERATIONFACTORY__ +#define __XCAPOPERATIONFACTORY__ + +#include +#include "XdmOperationFactory.h" + +_LIT( KOperationsLogFile, "XcapOperations" ); +const TInt KOpLogBufferMaxSize = 2000; + +//FORWARD DECLARATION +class CXdmDocument; +class CXdmDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapOperationFactory ) : public CXdmOperationFactory + { + public: + + /** + * Two-phased constructor. + * @param CXdmProtocolInfo Protocol info + * @return CXdmProtocol + */ + static CXcapOperationFactory* NewL(); + + /** + * Destructor. A simple wrapper to the C++ destructor. + * + */ + virtual ~CXcapOperationFactory(); + + public: + + /** + * Return an operation object that knows how to manipulate + * whole documents + */ + MXdmOperation* FetchL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode = NULL ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* InsertL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* ReplaceL( CXdmDocument& aOldDocument, + CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aOldNode ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* AppendL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + MXdmOperation* DeletionL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const; + + public: + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + void WriteToLog( TRefByValue aFmt,... ) const; + + private: + + /** + * C++ constructor + * @return CImpsTcpCirWatcher + */ + void ConstructL(); + + /** + * Write here something meaningful + */ + void WriteTraceLog( const TDesC8& aLogDescriptor ); + + /** + * C++ constructor + * @return CImpsTcpCirWatcher + */ + CXcapOperationFactory(); + + private: //Data + + CXdmLogWriter* iLogWriter; + }; + +#endif diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapReplacement.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapReplacement.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2005 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: CXcapReplacement +* +*/ + + + + +#ifndef __XCAPREPLACEMENT__ +#define __XCAPREPLACEMENT__ + +#include +#include "XcapHttpOperation.h" + +//FORWARD DECLARATIONS + +class CXcapHttpReqPut; +class CXcapDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapReplacement ) : public CXcapHttpOperation + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapReplacement* NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aOldNode, + CXcapDocumentNode* aNewNode, + CXcapOperationFactory& iOperationFactory ); + + /** + * Handle a successful operation + */ + virtual void OperationCompleteL(); + + /** + * Handle a failed operation + */ + virtual void OperationFailedL(); + + /** + * Destructor. + */ + virtual TBool Result() const; + + /** + * Destructor. + */ + virtual ~CXcapReplacement(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapReplacement( CXcapDocument& aParentDoc, + CXcapDocumentNode* aOldNode, + CXcapDocumentNode* aNewNode, + CXcapOperationFactory& iOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Destructor. + */ + void ExecuteL(); + + /** + * Destructor. + */ + virtual TInt FormatModRequestL( const CXcapDocumentNode* aDocumentNode ); + + private: //Data + + enum TXcapReplacementState + { + EHttpIdle = 0, + EHttpDeleting, + EHttpPutting + }; + + CXcapDocumentNode* iNewNode; + TXdmOperationType iOperationType; + TXcapReplacementState iOperationPhase; + + }; + +#endif //__XCAPREPLACEMENT__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapRetrieval.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapRetrieval.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,112 @@ +/* +* Copyright (c) 2005 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: CXcapRetrieval +* +*/ + + + + +#ifndef __XCAPRETRIEVAL__ +#define __XCAPRETRIEVAL__ + +#include +#include "CommonDefines.h" +#include "XcapHttpOperation.h" + +class CXcapDocumentNode; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapRetrieval ) : public CXcapHttpOperation + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapRetrieval* NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aTargetNode, + CXcapOperationFactory& iOperationFactory ); + + /** + * Handle a successful operation + */ + virtual void OperationCompleteL(); + + /** + * Handle a failed operation + */ + virtual void OperationFailedL(); + + /** + * Destructor. + */ + virtual TInt Result() const; + + /** + * Destructor. + */ + virtual ~CXcapRetrieval(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapRetrieval( CXcapDocument& aParentDoc, + CXcapDocumentNode* aTargetNode, + CXcapOperationFactory& iOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ExecuteL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void HandleCacheOperationL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void HandleNetworkOperationL(); + + private: //Data + + TBool iCacheOperation; + TCacheEntryInfo iCacheEntryInfo; + TXdmOperationType iOperationType; + }; + +#endif //__XCAPRETRIEVAL__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/inc/XcapUriParser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/inc/XcapUriParser.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,187 @@ +/* +* Copyright (c) 2005 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: CXcapUriParser +* +*/ + + + + +#ifndef __XCAPURIPARSER__ +#define __XCAPURIPARSER__ + +#include +#include "XcapDocumentNode.h" +#include "XcapUriInterface.h" + +//Constants +_LIT8( KXcapUriColon, ":" ); +_LIT8( KXcapUriQMark, "?" ); +_LIT8( KXcapUriXmlns, "xmlns(" ); +_LIT8( KXcapUriEquals, "=\"" ); +_LIT8( KXcapUriQuote, "\"" ); +_LIT8( KXcapParenthClose, ")" ); + +class CXdmDocument; +class CXdmDocumentNode; +class CXcapOperationFactory; + +//CLASS DECLARATION +NONSHARABLE_CLASS ( CXcapUriParser ) : public CBase, public MXcapUriInterface + { + public: + + /** + * Destructor. + */ + static CXcapUriParser* NewL( CXdmDocument& aTargetDoc, + CXcapOperationFactory& aOperationFactory ); + + /** + * Destructor. + */ + void SetDocumentSubset( const CXdmDocumentNode* aDocumentSubset ); + + /** + * Destructor. + */ + void ParseL( const TPtrC8& aHttpUri ); + + /** + * Destructor. + */ + TPtrC8 DesC8() const; + + /** + * Destructor. + */ + TXdmElementType NodeType() const; + + /** + * Destructor. + */ + virtual ~CXcapUriParser(); + + private: //From MXcapUriInterface + + /** + * Add new namespace mapping + * @param TDesC8& Namespace URI + * @param TDesC8& Namespace prefix + * @return void + */ + void AddNamespaceMappingL( const TDesC8& aUri, const TDesC8& aPrefix ); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapUriParser( CXdmDocument& aTargetDoc, + CXcapOperationFactory& aOperationFactory ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + TInt CreateBasicNodeUriL( HBufC8* aNodePath ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + HBufC8* DocSubsetPathL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + void AppendPredicatesL( TInt& aPosition, + CBufBase* aBuffer, + const CXdmDocumentNode* aPathElement ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + HBufC8* FormatOnePathElementLC( const CXdmDocumentNode* aPathElement ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + void FormatAttributeUriL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + void FormatNodeUriL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + void AppendNamespaceMappingsL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + void FinaliseL(); + + #ifdef _DEBUG + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXcapDocOperation* + */ + void DumpUriL( HBufC8* aNodePath ); + + #endif + + private: //Data + + TInt iBufferPosition; + TPtrC8* iHttpUri; + HBufC8* iCompleteUri; + CBufFlat* iUriBuffer; + CXdmDocument& iTargetDoc; + TXdmElementType iNodeType; + CXdmDocumentNode* iDocumentSubset; + CXcapOperationFactory& iOperationFactory; + RPointerArray iNamespaceMappings; + }; + +#endif //__XCAPURIPARSER__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/10207410.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/10207410.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 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: XdmProtocolInfo +* +*/ + + +// 10207410.RSS +// +#include "registryinfo.rh" + +//Declares the interface implementations provided +RESOURCE REGISTRY_INFO XdmProtocolInfo + { + dll_uid = 0x10207410; + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10207425; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x10207426; + version_no = 1; + display_name = "XCAP Operation API||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + } + }; + } + }; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapAddition.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapAddition.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,286 @@ +/* +* Copyright (c) 2005 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: CXcapAddition +* +*/ + + + + +// INCLUDES +#include "XcapCache.h" +#include "XcapAppUsage.h" +#include "XcapProtocol.h" +#include "XcapDocument.h" +#include "XcapAddition.h" +#include "XdmXmlParser.h" +#include "XcapUriParser.h" +#include "CommonDefines.h" +#include "XcapHttpReqPut.h" +#include "XcapHttpOperation.h" +#include "XcapHttpTransport.h" +#include "XcapOperationFactory.h" + +// --------------------------------------------------------- +// CXcapAddition::CXcapAddition +// +// --------------------------------------------------------- +// +CXcapAddition::CXcapAddition( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) : + CXcapHttpOperation( aParentDoc, aDocumentSubset, aOperationFactory ), + iOperationType( aDocumentSubset == NULL ? + EXdmDocument : EXdmPartialDocument ) + + { + } + +// --------------------------------------------------------- +// CXcapAddition::NewL +// +// --------------------------------------------------------- +// +CXcapAddition* CXcapAddition::NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) + { + CXcapAddition* self = new ( ELeave ) CXcapAddition( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapAddition::ConstructL +// +// --------------------------------------------------------- +// +void CXcapAddition::ConstructL() + { + CXcapHttpReqPut* request = Transport().PutL( iTargetDoc.Name() ); + CleanupStack::PushL( request ); + User::LeaveIfError( iRequestQueue.Append( request ) ); + request->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 ); + CleanupStack::Pop(); //request + //If they point to the same node, we're dealing with a complete document + if( iDocumentSubset != NULL && iTargetDoc.DocumentRoot() != iDocumentSubset ) + iUriParser->SetDocumentSubset( iDocumentSubset ); + } + +// --------------------------------------------------------- +// CXcapAddition::FormatModRequestL +// +// --------------------------------------------------------- +// +TInt CXcapAddition::FormatModRequestL( const CXdmDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapAddition::FormatModRequestL()" ) ); + iOperationFactory.WriteToLog( _L8( " Operation type: %d" ), iOperationType ); + iOperationFactory.WriteToLog( _L8( " Document subset: %x" ), iDocumentSubset ); + #endif + TInt validation = CXcapHttpOperation::FormatModRequestL( aDocumentNode ); + if( validation == KErrNone ) + { + //Then set the properties particular to this type of request + iOperationType = DetermineOperationType(); + if( iOperationType == EXdmDocument ) + iActiveRequest->SetHeaderL( KHttpHeaderContentType, iTargetDoc.ApplicationUsage().ContentType() ); + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " AppUsage reported the following error: %d" ), validation ); + #endif + } + return validation; + } + +// --------------------------------------------------------- +// CXcapAddition::DetermineOperationType +// +// --------------------------------------------------------- +// +TXdmOperationType CXcapAddition::DetermineOperationType() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapAddition::DetermineDocType()" ) ); + iOperationFactory.WriteToLog( _L8( " Operation type: %d" ), iOperationType ); + iOperationFactory.WriteToLog( _L8( " Document subset: %x" ), iDocumentSubset ); + iOperationFactory.WriteToLog( _L8( " Document root: %x" ), iTargetDoc.DocumentRoot() ); + #endif + return iOperationType == EXdmDocument || ( EXdmPartialDocument && + iDocumentSubset == iTargetDoc.DocumentRoot() ) ? + EXdmDocument : EXdmPartialDocument; + } + +// --------------------------------------------------------- +// CXcapAddition::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapAddition::ExecuteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapAddition::ExecuteL()" ) ); + #endif + CXcapHttpOperation::ExecuteL( iActiveRequest, iDocumentSubset ); + } + +// --------------------------------------------------------- +// CXcapAddition::OperationCompleteL +// +// --------------------------------------------------------- +// +void CXcapAddition::OperationCompleteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapAddition::OperationCompleteL()" ) ); + #endif + TPtrC8 root = Transport().RootUri(); + iRequestData = iActiveRequest->ResponseData(); + TPtrC name = iTargetDoc.Name(); + switch( iRequestData->iHttpStatus ) + { + case 200: //Replaced, the document was already there + case 201: //"Created" -> Put operation was successful + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status %d" ), iRequestData->iHttpStatus ); + #endif + iResult = KErrNone; + TPtrC8 eTag = Descriptor( iRequestData->iETag ); + iTargetDoc.SetETag( eTag ); + RXcapCache* cache = iTargetDoc.Protocol().Cache(); + if( cache != NULL ) + { + CXcapHttpContSupplier* request = ( CXcapHttpContSupplier* )iActiveRequest; + TPtrC8 payload = request->RequestBody(); + iOperationType == EXdmDocument ? cache->Store( eTag, name, root, payload ) : + UpdatePartialToCacheL( cache, payload ); + } + iCompleted = ETrue; + } + break; + default: + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Default case - Status: %d" ), + iRequestData->iHttpStatus ); + #endif + TInt status = iRequestData->iHttpStatus; + iResult = ReinterpretStatus( status ); + iCompleted = ETrue; + break; + } + } + +// --------------------------------------------------------- +// CXcapAddition::UpdatePartialToCacheL +// +// --------------------------------------------------------- +// +void CXcapAddition::UpdatePartialToCacheL( RXcapCache* aCache, const TDesC8& aNewData ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapAddition::UpdatePartialToCacheL()" ) ); + #endif + HBufC8* newData = NULL; + TPtrC name = iTargetDoc.Name(); + TPtrC8 root = Transport().RootUri(); + if( iOptionFlags & KFetchMasterFromCache ) + { + TInt length = iTargetDoc.DataLength(); + //Do nothing, if the document is not in cache + if( length > 0 ) + { + HBufC8* data = HBufC8::NewLC( length ); + TPtr8 desc( data->Des() ); + aCache->FetchDocumentContent( desc, name, root ); + CXcapDocument* copy = iTargetDoc.TempCopyL(); + CleanupStack::PushL( copy ); + iXmlParser->ParseDocumentL( copy, desc ); + RPointerArray array; + CleanupClosePushL( array ); + copy->Find( *iDocumentSubset, array ); + //If the element the subset points to is not present + //in the original document, the new data must be + //appended to the the subset element parent, instead. + CXdmDocumentNode* node = array.Count() > 0 ? + iDocumentSubset : iDocumentSubset->Parent(); + newData = iXmlParser->FormatToXmlLC( aNewData, copy, node ); + CleanupStack::Pop(); //newData + CleanupStack::PopAndDestroy( 3 ); //array, tempCopy, data + CleanupStack::PushL( newData ); + } + } + else + { + CXdmDocumentNode* root = iTargetDoc.DocumentRoot(); + newData = iXmlParser->FormatToXmlLC( ETrue, &iTargetDoc, root ); + } + if( newData ) + { + aCache->Store( iTargetDoc.ETag(), name, root, newData->Des() ); + CleanupStack::PopAndDestroy(); //newData + } + } + +// --------------------------------------------------------- +// CXcapAddition::OperationFailedL +// +// --------------------------------------------------------- +// +void CXcapAddition::OperationFailedL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapRetrieval::OperationFailedL() - Error: %d" ), + iStatus.Int() ); + #endif + if( iStatus.Int() >= KErrNone ) + { + TInt status = iActiveRequest->ResponseData()->iHttpStatus; + TInt completion = iActiveRequest->ResponseData()->iCompletion; + iResult = status < KErrNone || completion < KErrNone ? status : ReinterpretStatus( status ); + } + else iResult = iStatus.Int(); + iCompleted = ETrue; + } + +// --------------------------------------------------------- +// CXcapAddition::Result +// +// --------------------------------------------------------- +// +TBool CXcapAddition::Result() const + { + return ETrue; + } + +// --------------------------------------------------------- +// CXcapAddition::~CXcapAddition +// +// --------------------------------------------------------- +// +CXcapAddition::~CXcapAddition() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapAddition::~CXcapAddition()" ) ); + #endif + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapDeletion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapDeletion.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,248 @@ +/* +* Copyright (c) 2005 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: CXcapDeletion +* +*/ + + + + +// INCLUDES +#include "XcapCache.h" +#include "XcapProtocol.h" +#include "XcapDeletion.h" +#include "XcapAppUsage.h" +#include "XcapDocument.h" +#include "XcapUriParser.h" +#include "XdmXmlParser.h" +#include "XcapDocumentNode.h" +#include "XcapHttpTransport.h" +#include "XcapHttpOperation.h" +#include "XcapHttpReqDelete.h" +#include "XcapOperationFactory.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CXcapDeletion::CXcapDeletion +// +// --------------------------------------------------------- +// +CXcapDeletion::CXcapDeletion( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) : + CXcapHttpOperation( aParentDoc, aDocumentSubset, aOperationFactory ), + iOperationType( iDocumentSubset == NULL ? + EXdmDocument : EXdmPartialDocument ) + { + } + +// --------------------------------------------------------- +// CXcapDeletion::NewL +// +// --------------------------------------------------------- +// +CXcapDeletion* CXcapDeletion::NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) + { + CXcapDeletion* self = new ( ELeave ) CXcapDeletion( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapDeletion::ConstructL +// +// --------------------------------------------------------- +// +void CXcapDeletion::ConstructL() + { + CXcapHttpReqDelete* request = Transport().DeleteL( iTargetDoc.Name() ); + CleanupStack::PushL( request ); + User::LeaveIfError( iRequestQueue.Append( request ) ); + request->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 ); + CleanupStack::Pop(); //request + if( iOperationType != EXdmDocument && iDocumentSubset != NULL ) + { + iUriParser->SetDocumentSubset( iDocumentSubset ); + //Add namespace mappings + User::LeaveIfError( iTargetDoc.ApplicationUsage().Validate( + *iDocumentSubset, iUriParser, ETrue ) ); + } + } + +// --------------------------------------------------------- +// CXcapDeletion::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapDeletion::ExecuteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapDeletion::ExecuteL()" ) ); + #endif + TPtrC8 eTag = iTargetDoc.ETag(); + if( eTag.Length() > 0 ) + iActiveRequest->SetHeaderL( KHttpHeaderIfMatch, eTag ); + TRAPD( error, iUriParser->ParseL( iActiveRequest->RequestUriL() ) ); + if( error == KErrNone ) + { + TPtrC8 uri = iUriParser->DesC8(); + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " New URI: %S" ), &uri ); + #endif + HBufC8* escape = CXcapHttpOperation::EscapeLC( uri ); + iActiveRequest->UpdateRequestUriL( escape->Des() ); + CleanupStack::PopAndDestroy(); //escape + } + } + +// --------------------------------------------------------- +// CXcapDeletion::OperationCompleteL +// +// --------------------------------------------------------- +// +void CXcapDeletion::OperationCompleteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapDeletion::OperationCompleteL()" ) ); + #endif + switch( iRequestData->iHttpStatus ) + { + case 200: //Document was deleted + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status 200 - Document deleted" ) ); + #endif + iOperationType == EXdmDocument ? + HandleDocDeletion() : + HandlePartialDeletion(); + iCompleted = ETrue; + } + break; + case 404: //Document was not found + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status 404 - Document not found" ) ); + #endif + iCompleted = ETrue; + iResult = KErrNotFound; + } + break; + default: + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Default case - Status: %d" ), + iRequestData->iHttpStatus ); + #endif + iCompleted = ETrue; + break; + } + iResult = ReinterpretStatus( iRequestData->iHttpStatus ); + } + +// --------------------------------------------------------- +// CXcapDeletion::HandleDocDeletion +// +// --------------------------------------------------------- +// +void CXcapDeletion::HandleDocDeletion() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapDeletion::HandleDocDeletion()" ) ); + #endif + TPtrC name = iTargetDoc.Name(); + TPtrC8 root = Transport().RootUri(); + RXcapCache* cache = iTargetDoc.Protocol().Cache(); + if( cache != NULL ) + { + TInt error = cache->Delete( name, root ); + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Document deleted from the cache" ) ); + #endif + } + } + +// --------------------------------------------------------- +// CXcapDeletion::HandlePartialDeletion +// +// --------------------------------------------------------- +// +void CXcapDeletion::HandlePartialDeletion() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapDeletion::HandlePartialDeletion()" ) ); + #endif + TPtrC name = iTargetDoc.Name(); + TPtrC8 root = Transport().RootUri(); + iTargetDoc.RemoveFromModelL( iDocumentSubset ); + TPtrC8 eTag = Descriptor( iRequestData->iETag ); + RXcapCache* cache = iTargetDoc.Protocol().Cache(); + if( cache != NULL ) + { + HBufC8* newDoc = iXmlParser->FormatToXmlLC( ETrue, &iTargetDoc, iTargetDoc.DocumentRoot() ); + cache->Store( eTag, name, root, newDoc->Des() ); + CleanupStack::PopAndDestroy(); //newDoc + } + iTargetDoc.SetETag( eTag ); + } + +// --------------------------------------------------------- +// CXcapDeletion::OperationFailedL +// +// --------------------------------------------------------- +// +void CXcapDeletion::OperationFailedL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapDeletion::OperationFailedL() - Error: %d" ), + iStatus.Int() ); + #endif + if( iStatus.Int() >= KErrNone ) + { + TInt status = iActiveRequest->ResponseData()->iHttpStatus; + TInt completion = iActiveRequest->ResponseData()->iCompletion; + iResult = status < KErrNone || completion < KErrNone ? status : ReinterpretStatus( status ); + } + else iResult = iStatus.Int(); + iCompleted = ETrue; + } + +// --------------------------------------------------------- +// CXcapDeletion::Result +// +// --------------------------------------------------------- +// +TBool CXcapDeletion::Result() const + { + return ETrue; + } + +// --------------------------------------------------------- +// CXcapDeletion::~CXcapDeletion +// +// --------------------------------------------------------- +// +CXcapDeletion::~CXcapDeletion() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapDeletion::~CXcapDeletion()" ) ); + #endif + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapHttpOperation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapHttpOperation.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,547 @@ +/* +* Copyright (c) 2005 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: CXcapHttpOperation +* +*/ + + + +#include +#include +#include "XcapDocument.h" +#include "XcapProtocol.h" +#include "XcapAppUsage.h" +#include "XcapUriParser.h" +#include "XdmXmlParser.h" +#include "XcapHttpRequest.h" +#include "XdmNodeAttribute.h" +#include "XcapEngineDefines.h" +#include "XcapHttpOperation.h" +#include "XcapHttpContSupplier.h" +#include "XcapOperationFactory.h" + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CXcapHttpOperation::CXcapHttpOperation( const CXdmDocument& aTargetDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) : + CActive( EPriorityStandard ), + iDocumentSubset( aDocumentSubset ), + iTargetDoc( ( CXcapDocument& )aTargetDoc ), + iOperationFactory( aOperationFactory ) + + { + } + +// --------------------------------------------------------- +// CXcapHttpOperation::BaseConstructL +// +// --------------------------------------------------------- +// +void CXcapHttpOperation::BaseConstructL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "-> CXcapHttpOperation::BaseConstructL" ) ); + #endif + iXmlParser = &iTargetDoc.Protocol().Parser(); + iUriParser = CXcapUriParser::NewL( iTargetDoc, iOperationFactory ); + #ifdef _DEBUG + TPtrC8 contType( iTargetDoc.ApplicationUsage().ContentType() ); + iOperationFactory.WriteToLog( _L8( " Content-Type: %S" ), &contType ); + #endif + CActiveScheduler::Add( this ); + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "<- CXcapHttpOperation::BaseConstructL" ) ); + #endif + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CXcapHttpOperation::~CXcapHttpOperation() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::~CXcapHttpOperation()" ) ); + #endif + delete iUriParser; + iRequestQueue.ResetAndDestroy(); + } + +// --------------------------------------------------------- +// CXcapOperationBase::IsCompleted +// +// --------------------------------------------------------- +// +TBool CXcapHttpOperation::IsCompleted() const + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapOperationBase::IsCompleted()" ) ); + #endif + return iCompleted; + } + +// --------------------------------------------------------- +// CXcapOperationBase::CompletionData +// +// --------------------------------------------------------- +// +const TXdmCompletionData& CXcapHttpOperation::CompletionData() const + { + return *iRequestData; + } + +// --------------------------------------------------------- +// CXcapOperationBase::CompletionData +// +// --------------------------------------------------------- +// +CXdmDocumentNode* CXcapHttpOperation::TargetNode() const + { + return iDocumentSubset; + } + +// --------------------------------------------------------- +// CXcapOperationBase::CompletionData +// +// --------------------------------------------------------- +// +void CXcapHttpOperation::Destroy() + { + delete this; + } + +// --------------------------------------------------------- +// CXcapHttpOperation::Result +// +// --------------------------------------------------------- +// +TInt CXcapHttpOperation::Result() const + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::Result()" ) ); + #endif + return iRequestData != NULL ? iRequestData->iHttpStatus : KErrUnknown; + } + +// --------------------------------------------------------- +// CXcapHttpOperation::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapHttpOperation::ExecuteL( TRequestStatus& aStatus, TUint aOptions ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::ExecuteL( &status )" ) ); + #endif + iOptionFlags = aOptions; + iClientStatus = &aStatus; + aStatus = KRequestPending; + if( !IsActive() ) + { + iActiveRequest = iRequestQueue[iCurrentIndex]; + TRAPD( error, ExecuteL() ); + if( error == KErrNone ) + { + if( StartOperationL() ) + SetActive(); + else + { + iFailureData.iCompletion = KXcapErrorNetworkNotAvailabe; + User::RequestComplete( iClientStatus, KXcapErrorNetworkNotAvailabe ); + iRequestData = &iFailureData; + } + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Execution failed with %d" ), error ); + #endif + iFailureData.iCompletion = error; + User::RequestComplete( iClientStatus, error ); + iRequestData = &iFailureData; + } + } + else //This is a re-run of a previously failed request + { + if( !StartOperationL() ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Execution succeeded, network not ready" ) ); + #endif + User::RequestComplete( iClientStatus, KXcapErrorNetworkNotAvailabe ); + } + } + } + +// --------------------------------------------------------- +// CXcapHttpOperation::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapHttpOperation::ExecuteL( CXcapHttpRequest* aHttpRequest, + CXdmDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapAddition::ExecuteL()" ) ); + #endif + CXdmDocumentNode* node = aDocumentNode == NULL ? + iTargetDoc.DocumentRoot() : aDocumentNode; + __ASSERT_ALWAYS( node != NULL, User::Panic( _L( "CXcapAddition" ), 1 ) ); + User::LeaveIfError( FormatModRequestL( node ) ); + TRAPD( error, iUriParser->ParseL( aHttpRequest->RequestUriL() ) ); + if( error == KErrNone ) + { + TPtrC8 uri = iUriParser->DesC8(); + HBufC8* escape = CXcapHttpOperation::EscapeLC( uri ); + aHttpRequest->UpdateRequestUriL( escape->Des() ); + CleanupStack::PopAndDestroy(); //escape + } + } + +// --------------------------------------------------------- +// CXcapHttpOperation::StartOperationL +// +// --------------------------------------------------------- +// +TBool CXcapHttpOperation::StartOperationL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::StartOperationL()" ) ); + #endif + if( iTargetDoc.Protocol().IsNetworkAvailable() ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " All set, dispatch request to transport" ) ); + #endif + if( iOptionFlags & KUseIntendedIdentity ) + { + TPtrC8 identity( iTargetDoc.Protocol().PublicID() ); + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Early-IMS set, add X-3GPP-Intended-Identity header" ) ); + iOperationFactory.WriteToLog( _L8( " Public ID: %S" ), &identity ); + #endif + iActiveRequest->SetHeaderL( KHttpHeaderIntIdentity, identity ); + } + iActiveRequest->DispatchRequestL( iStatus ); + return ETrue; + } + else return EFalse; + } + +// --------------------------------------------------------- +// CXcapHttpOperation::RunL +// +// --------------------------------------------------------- +// +void CXcapHttpOperation::RunL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( + "CXcapHttpOperation::RunL() - Status: %d" ), iStatus.Int() ); + #endif + TInt count = iRequestQueue.Count(); + iRequestData = iActiveRequest->ResponseData(); + __ASSERT_DEBUG( iRequestData != NULL, User::Panic( _L( "CXcapHttpOperation" ), 1 ) ); + TRAPD( error, iStatus != KErrNone ? OperationFailedL() : OperationCompleteL() ); + if( error == KErrNone && !iCompleted ) + SetActive(); + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( + " ** Operation completed - Result: %d Error: %d **" ), iResult, error ); + #endif + iCurrentIndex = 0; + iResult = error < KErrNone ? error : iResult; + iRequestData->iCompletion = iResult; + User::RequestComplete( iClientStatus, iResult ); + } + } + +// --------------------------------------------------------- +// CXcapRetrieval::CancelOperation +// +// --------------------------------------------------------- +// +void CXcapHttpOperation::CancelOperation() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::CancelOperation()" ) ); + #endif + if( IsActive() ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "Active, cancel HTTP request" ) ); + #endif + Cancel(); + iRequestData = &iFailureData; + iFailureData.iCompletion = KErrCancel; + User::RequestComplete( iClientStatus, KErrCancel ); + } + } + +// --------------------------------------------------------- +// CXcapHttpOperation::CancelOperation +// +// --------------------------------------------------------- +// +void CXcapHttpOperation::DoCancel() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::DoCancel()" ) ); + #endif + iRequestQueue[iCurrentIndex]->CancelRequest(); + } + +// --------------------------------------------------------- +// CXcapHttpOperation::Descriptor +// +// --------------------------------------------------------- +// +TPtrC8 CXcapHttpOperation::Descriptor( HBufC8* aBuffer ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::Descriptor()" ) ); + #endif + if( aBuffer != NULL ) + { + TPtrC8 descriptor( aBuffer->Des() ); + return descriptor.Length() > 0 ? descriptor : TPtrC8(); + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Buffer is NULL, return empty descriptor" ) ); + #endif + return TPtrC8(); + } + } + +// --------------------------------------------------------- +// CXcapHttpOperation::Transport +// +// --------------------------------------------------------- +// +CXcapHttpTransport& CXcapHttpOperation::Transport() const + { + return iTargetDoc.Protocol().Transport(); + } + +// --------------------------------------------------------- +// CXcapHttpOperation::FormatModRequestL +// +// --------------------------------------------------------- +// +TInt CXcapHttpOperation::FormatModRequestL( const CXdmDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::FormatModRequestL()" ) ); + #endif + HBufC8* body = NULL; + TInt error = KErrNone; + CXcapAppUsage& usage = iTargetDoc.ApplicationUsage(); + CXcapHttpContSupplier* request = ( CXcapHttpContSupplier* )iActiveRequest; + switch( iUriParser->NodeType() ) + { + case EXdmElementAttribute: + { + CXdmNodeAttribute* attribute = ( CXdmNodeAttribute* )aDocumentNode; + body = attribute->EightBitValueLC(); + request->SetRequestBodyL( body->Des() ); + CleanupStack::PopAndDestroy(); //body + request->SetHeaderL( KHttpHeaderAccept, _L8( "application/xcap-diff+xml" ) ); + request->SetHeaderL( KHttpHeaderContentType, _L8( "application/xcap-att+xml" ) ); + } + break; + case EXdmElementNode: + { + #ifndef __OVERRIDE_VALIDATION__ + error = usage.Validate( CONST_CAST( CXdmDocumentNode&, *aDocumentNode ), iUriParser, EFalse ); + #endif + if( error == KErrNone ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Validation of a partial document OK" ) ); + #endif + body = iXmlParser->FormatToXmlLC( EFalse, &iTargetDoc, aDocumentNode ); + request->SetRequestBodyL( body->Des() ); + CleanupStack::PopAndDestroy(); //body + request->SetHeaderL( KHttpHeaderAccept, _L8( "application/xcap-diff+xml" ) ); + request->SetHeaderL( KHttpHeaderContentType, _L8( "application/xcap-el+xml" ) ); + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Validation failed: %d" ), error ); + #endif + } + } + break; + default: + #ifndef __OVERRIDE_VALIDATION__ + error = usage.Validate( iTargetDoc, ETrue ); + #endif + if( error == KErrNone ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Validation OK" ) ); + #endif + body = iXmlParser->FormatToXmlLC( ETrue, &iTargetDoc, aDocumentNode ); + request->SetRequestBodyL( body->Des() ); + CleanupStack::PopAndDestroy(); //body + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Validation failed: %d" ), error ); + #endif + } + break; + } + return error; + } + +// ---------------------------------------------------------- +// CXcapHttpOperation::ReinterpretStatus +// +// ---------------------------------------------------------- +// +TInt CXcapHttpOperation::ReinterpretStatus( const TInt aHttpStatus ) const + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::ReinterpretStatus()" ) ); + #endif + switch( aHttpStatus ) + { + case 500: //Internal Server Error + case 501: //Not Implemented + case 502: //Bad Gateway + case 503: //Service Unavailable + case 504: //Gateway Timeout + case 505: //HTTP Version Not Supported + case 405: //Method Not Allowed + case 408: //Request Timeout + case 410: //Gone + case 411: //Length Required + case 413: //Request Entity Too Large + case 414: //Request-URI Too Long + case 415: //Unsupported Media Type + case 416: //Requested Range Not Satisfiable + case 417: //Expectation Failed + return KXcapErrorHttpServer; + case 400: + return KXcapErrorHttpBadRequest; + case 401: + return KXcapErrorHttpUnauthorised; + case 403: + return KXcapErrorHttpForbidden; + case 404: + return KXcapErrorHttpNotFound; + case 409: + return KXcapErrorHttpConflict; + case 412: + return KXcapErrorHttpPrecondFailed; + default: + return KErrNone; + } + } + +// --------------------------------------------------------- +// CXcapHttpOperation::Escape2LC +// +// --------------------------------------------------------- +// +HBufC8* CXcapHttpOperation::Escape2LC( const TDesC& aDescriptor ) + { + HBufC8* eight = EscapeUtils::ConvertFromUnicodeToUtf8L( aDescriptor ); + CleanupStack::PushL( eight ); + HBufC8* buf = EscapeUtils::EscapeEncodeL( eight->Des(), EscapeUtils::EEscapeNormal ); + CleanupStack::PopAndDestroy(); //eight + CleanupStack::PushL( buf ); + return buf; + } + +// --------------------------------------------------------- +// CXcapHttpOperation::EscapeLC +// +// --------------------------------------------------------- +// +HBufC8* CXcapHttpOperation::EscapeLC( const TDesC8& aDescriptor ) + { + CBufFlat* buffer = CBufFlat::NewL( 50 ); + CleanupStack::PushL( buffer ); + TInt bufPos = 0; + TBuf8<10> format; + for( TInt i = 0;i < aDescriptor.Length();i++ ) + { + TUint8 byte = aDescriptor[i]; + if( byte < 0x7F ) //US-ASCII + { + switch( byte ) + { + case 0x20: // ' ' + case 0x22: // '"' + case 0x3B: // ';' + case 0x26: // '&' + case 0x3C: // '<' + case 0x3E: // '>' + case 0x5B: // '[' + case 0x5D: // ']' + format.Append( _L8( "%" ) ); + format.AppendFormat( _L8( "%x" ), byte ); + break; + default: + format.Append( byte ); + break; + } + } + else + { + format.Append( _L8( "%" ) ); //UNICODE + format.AppendFormat( _L8( "%x" ), byte ); + } + buffer->InsertL( bufPos, format ); + bufPos = bufPos + format.Length(); + format.Zero(); + } + HBufC8* ret = HBufC8::NewL( buffer->Size() ); + TPtr8 pointer( ret->Des() ); + buffer->Read( 0, pointer, buffer->Size() ); + CleanupStack::PopAndDestroy(); //buffer + CleanupStack::PushL( ret ); + return ret; + } + +// --------------------------------------------------------- +// CXcapHttpOperation::HttpRequest +// +// --------------------------------------------------------- +// +CXcapHttpRequest* CXcapHttpOperation::HttpRequest() const + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapHttpOperation::HttpRequest()" ) ); + #endif + return iActiveRequest; + } + + + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapInsertion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapInsertion.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2005 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: CXcapInsertion +* +*/ + + + + +// INCLUDES +//This is only for logging +#include +#include "XcapProtocol.h" +#include "XcapDocument.h" +#include "XcapUriParser.h" +#include "XcapInsertion.h" +#include "XdmXmlParser.h" +#include "XcapHttpReqPut.h" +#include "XdmNodeAttribute.h" +#include "XcapHttpTransport.h" +#include "XcapEngineDefines.h" +#include "XcapOperationFactory.h" + + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CXcapInsertion::CXcapInsertion( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) : + CXcapHttpOperation( aParentDoc, aDocumentSubset, aOperationFactory ), + iOperationType( EXdmPartialDocument ) + + { + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CXcapInsertion* CXcapInsertion::NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aDocumentSubset, + CXcapOperationFactory& aOperationFactory ) + { + CXcapInsertion* self = new ( ELeave ) CXcapInsertion( aParentDoc, aDocumentSubset, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapInsertion::ConstructL +// +// --------------------------------------------------------- +// +void CXcapInsertion::ConstructL() + { + CXcapHttpReqPut* request = Transport().PutL( iTargetDoc.Name() ); + CleanupStack::PushL( request ); + User::LeaveIfError( iRequestQueue.Append( request ) ); + request->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 ); + CleanupStack::Pop(); //request + iUriParser->SetDocumentSubset( iDocumentSubset ); + } + +// --------------------------------------------------------- +// CXcapAddition::FormatModRequestL +// +// --------------------------------------------------------- +// +TInt CXcapInsertion::FormatModRequestL( const CXdmDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::FormatModRequestL()" ) ); + iOperationFactory.WriteToLog( _L8( " Operation type: %d" ), iOperationType ); + iOperationFactory.WriteToLog( _L8( " Document subset: %x" ), iDocumentSubset ); + #endif + return CXcapHttpOperation::FormatModRequestL( aDocumentNode ); + } + +// --------------------------------------------------------- +// CXcapInsertion::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapInsertion::ExecuteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::ExecuteL()" ) ); + #endif + CXcapHttpOperation::ExecuteL( iActiveRequest, iDocumentSubset ); + iActiveRequest->SetHeaderL( KHttpHeaderIfMatch, _L8( "*" ) ); + } + +// --------------------------------------------------------- +// CXcapInsertion::OperationCompleteL +// +// --------------------------------------------------------- +// +void CXcapInsertion::OperationCompleteL() + { + + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::OperationCompleteL()" ) ); + #endif + TPtrC8 root = Transport().RootUri(); + iRequestData = iActiveRequest->ResponseData(); + TPtrC name = iTargetDoc.Name(); + TPtrC8 eTag = Descriptor( iRequestData->iETag ); + switch( iRequestData->iHttpStatus ) + { + case 201: //"Created" -> Put operation was succesful + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status 201 - Created" ) ); + #endif + iResult = KErrNone; + iTargetDoc.SetETag( eTag ); + CXcapHttpContSupplier* request = ( CXcapHttpContSupplier* )iActiveRequest; + RXcapCache* cache = iTargetDoc.Protocol().Cache(); + if( cache != NULL && iOperationType == EXdmDocument ) + { + TPtrC8 payload = request->RequestBody(); + cache->Store( eTag, name, root, payload ); + } + iCompleted = ETrue; + } + break; + case 412: //"Precondition failed" -> Cache out of date + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status 412 - Precondition failed" ) ); + #endif + iResult = KXcapErrorHttpPrecondFailed; + //RXcapCache* cache = CXcapProtocol::Cache(); + //if( cache != NULL && iOperationType == EXcapDocument ) + // cache->Delete( name, root ); + iCompleted = ETrue; + iActiveRequest->ResetUriL( _L( "" ) ); + iActiveRequest->ReleaseResponseData(); + iRequestData->iCompletion = KInsertConflict; + } + break; + default: + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Default case - Status: %d" ), + iRequestData->iHttpStatus ); + #endif + TInt status = iRequestData->iHttpStatus; + iResult = ReinterpretStatus( status ); + iCompleted = ETrue; + break; + } + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +void CXcapInsertion::OperationFailedL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::OperationFailedL() - Error: %d" ), + iStatus.Int() ); + #endif + if( iStatus.Int() >= KErrNone ) + { + TInt status = iActiveRequest->ResponseData()->iHttpStatus; + TInt completion = iActiveRequest->ResponseData()->iCompletion; + iResult = status < KErrNone || completion < KErrNone ? status : ReinterpretStatus( status ); + } + else iResult = iStatus.Int(); + iCompleted = ETrue; + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +TBool CXcapInsertion::Result() const + { + return ETrue; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CXcapInsertion::~CXcapInsertion() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapInsertion::~CXcapInsertion()" ) ); + #endif + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapOperationFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapOperationFactory.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,190 @@ +/* +* Copyright (c) 2005 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: CXcapOperationFactory +* +*/ + + + +#include +#include +#include +#include "XcapAddition.h" +#include "XcapDeletion.h" +#include "XdmOperation.h" +#include "XcapRetrieval.h" +#include "XcapInsertion.h" +#include "XcapReplacement.h" +#include "xdmlogwriter.h" +#include "XcapOperationFactory.h" + +// --------------------------------------------------------- +// CXcapOperationFactory::CXcapOperationFactory +// +// --------------------------------------------------------- +// +CXcapOperationFactory::CXcapOperationFactory() + { + } + +// --------------------------------------------------------- +// CXcapOperationFactory::NewL +// +// --------------------------------------------------------- +// +CXcapOperationFactory* CXcapOperationFactory::NewL() + { + CXcapOperationFactory* self = new ( ELeave ) CXcapOperationFactory(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapOperationFactory::ConstructL +// +// --------------------------------------------------------- +// +void CXcapOperationFactory::ConstructL() + { + #ifdef _DEBUG + iLogWriter = CXdmLogWriter::NewL( KOperationsLogFile ); + WriteToLog( _L8( "-> CXcapOperationFactory::ConstructL" ) ); + WriteToLog( _L8( "<- CXcapOperationFactory::ConstructL" ) ); + #endif + } + +// --------------------------------------------------------- +// CXcapOperationFactory::~CXcapOperationFactory +// +// --------------------------------------------------------- +// +CXcapOperationFactory::~CXcapOperationFactory() + { + #ifdef _DEBUG + WriteToLog( _L8( "-> CXcapOperationFactory::~CXcapOperationFactory()" ) ); + #endif + #ifdef _DEBUG + WriteToLog( _L8( "<- CXcapOperationFactory::~CXcapOperationFactory()" ) ); + #endif + delete iLogWriter; + } + +// --------------------------------------------------------- +// CXcapOperationFactory::FetchL +// +// --------------------------------------------------------- +// +MXdmOperation* CXcapOperationFactory::FetchL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CXcapRetrieval::NewL( ( CXcapDocument& )aTargetDocument, + ( CXcapDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CXcapOperationFactory::InsertL +// +// --------------------------------------------------------- +// +MXdmOperation* CXcapOperationFactory::InsertL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CXcapInsertion::NewL( ( CXcapDocument& )aTargetDocument, + ( CXcapDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CXcapOperationFactory::ReplaceL +// +// --------------------------------------------------------- +// +MXdmOperation* CXcapOperationFactory::ReplaceL( CXdmDocument& aOldDocument, + CXdmDocumentNode* aNewNode, + CXdmDocumentNode* aOldNode ) const + { + return CXcapReplacement::NewL( ( CXcapDocument& )aOldDocument, + ( CXcapDocumentNode* )aNewNode, + ( CXcapDocumentNode* )aOldNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CXcapOperationFactory::AppendL +// +// --------------------------------------------------------- +// +MXdmOperation* CXcapOperationFactory::AppendL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CXcapAddition::NewL( ( CXcapDocument& )aTargetDocument, + ( CXcapDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// --------------------------------------------------------- +// CXcapOperationFactory::PartialDeletionL +// +// --------------------------------------------------------- +// +MXdmOperation* CXcapOperationFactory::DeletionL( CXdmDocument& aTargetDocument, + CXdmDocumentNode* aTargetNode ) const + { + return CXcapDeletion::NewL( ( CXcapDocument& )aTargetDocument, + ( CXcapDocumentNode* )aTargetNode, + const_cast( *this ) ); + } + +// ---------------------------------------------------- +// CXcapOperationFactory::WriteToLog +// +// ---------------------------------------------------- +// +void CXcapOperationFactory::WriteToLog( TRefByValue aFmt,... ) const + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + iLogWriter->WriteToLog( buf ); + } + +// --------------------------------------------------------- +// Map the interface UIDs to implementation factory functions +// +// --------------------------------------------------------- +// +const TImplementationProxy ImplementationTable[] = + { +#ifdef __EABI__ + IMPLEMENTATION_PROXY_ENTRY( KXcapOperationFactory, CXcapOperationFactory::NewL ) +#else + { { KXcapOperationFactory }, CXcapOperationFactory::NewL } +#endif + }; + +// --------------------------------------------------------- +// Return the implementation table & number of implementations +// +// --------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapReplacement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapReplacement.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,231 @@ +/* +* Copyright (c) 2005 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: CXcapReplacement +* +*/ + + + + +// INCLUDES +#include "XcapAppUsage.h" +#include "XcapDocument.h" +#include "XcapUriParser.h" +#include "XdmXmlParser.h" +#include "XcapHttpReqPut.h" +#include "XcapReplacement.h" +#include "XcapHttpReqDelete.h" +#include "XcapHttpTransport.h" +#include "XcapHttpOperation.h" +#include "XdmNodeAttribute.h" +#include "XcapEngineDefines.h" + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that might leave. +// +// --------------------------------------------------------- +// +CXcapReplacement::CXcapReplacement( CXcapDocument& aParentDoc, + CXcapDocumentNode* aOldNode, + CXcapDocumentNode* aNewNode, + CXcapOperationFactory& aOperationFactory ) : + CXcapHttpOperation( aParentDoc, aOldNode, aOperationFactory ), + iNewNode( ( CXcapDocumentNode* )aNewNode ), + iOperationType( aOldNode == NULL ? + EXdmDocument : EXdmPartialDocument ) + + { + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CXcapReplacement* CXcapReplacement::NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aOldNode, + CXcapDocumentNode* aNewNode, + CXcapOperationFactory& aOperationFactory ) + { + CXcapReplacement* self = new ( ELeave ) CXcapReplacement( aParentDoc, aOldNode, aNewNode, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapReplacement::ConstructL +// +// --------------------------------------------------------- +// +void CXcapReplacement::ConstructL() + { + CXcapHttpReqPut* request = Transport().PutL( iTargetDoc.Name() ); + CleanupStack::PushL( request ); + User::LeaveIfError( iRequestQueue.Append( request ) ); + request->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 ); + CleanupStack::Pop(); //request + //If they point to the same node, we're dealing with a complete document + if( iDocumentSubset != NULL && iTargetDoc.DocumentRoot() != iDocumentSubset ) + iUriParser->SetDocumentSubset( iDocumentSubset ); + } + +// --------------------------------------------------------- +// CXcapReplacement::FormatModRequestL +// +// --------------------------------------------------------- +// +TInt CXcapReplacement::FormatModRequestL( const CXcapDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapReplacement::FormatModRequestL()" ) ); + iOperationFactory.WriteToLog( _L8( " Operation type: %d" ), iOperationType ); + iOperationFactory.WriteToLog( _L8( " Document subset: %x" ), iDocumentSubset ); + #endif + return CXcapHttpOperation::FormatModRequestL( aDocumentNode ); + } + +// --------------------------------------------------------- +// CXcapReplacement::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapReplacement::ExecuteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapReplacement::ExecuteL()" ) ); + #endif + User::LeaveIfError( FormatModRequestL( iNewNode ) ); + if( iOperationType == EXdmPartialDocument ) + { + TPtrC8 eTag = iTargetDoc.ETag(); + if( eTag.Length() > 0 ) + iActiveRequest->SetHeaderL( KHttpHeaderIfMatch, eTag ); + //If they match semantically, there's no need for DELETE operation + if( iDocumentSubset->Match( *iNewNode ) ) + iOperationPhase = EHttpPutting; + else + { + CXcapHttpReqDelete* request = Transport().DeleteL( iTargetDoc.Name() ); + CleanupStack::PushL( request ); + User::LeaveIfError( iRequestQueue.Insert( request, 0 ) ); + CleanupStack::Pop(); //request + if( eTag.Length() > 0 ) + request->SetHeaderL( KHttpHeaderIfMatch, eTag ); + request->SetHeaderL( KHttpHeaderAccept, _L8( "application/xcap-diff+xml" ) ); + iActiveRequest = request; + iOperationPhase = EHttpDeleting; + } + TRAPD( error, iUriParser->ParseL( iActiveRequest->RequestUriL() ) ); + if( error == KErrNone ) + { + TPtrC8 uri = iUriParser->DesC8(); + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " New URI: %S" ), &uri ); + #endif + HBufC8* escape = CXcapHttpOperation::EscapeLC( uri ); + iActiveRequest->UpdateRequestUriL( escape->Des() ); + CleanupStack::PopAndDestroy(); //escape + } + } + else + { + + } + } + +// --------------------------------------------------------- +// CXcapReplacement::OperationCompleteL +// +// --------------------------------------------------------- +// +void CXcapReplacement::OperationCompleteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( + _L8( "CXcapReplacement::OperationCompleteL() - Phase: %d" ), iOperationPhase ); + #endif + switch( iOperationPhase ) + { + case EHttpDeleting: + break; + case EHttpPutting: + break; + default: + iCompleted = ETrue; + break; + } + } + +// --------------------------------------------------------- +// CXcapReplacement::OperationFailedL +// +// --------------------------------------------------------- +// +void CXcapReplacement::OperationFailedL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapReplacement::OperationFailedL() - Error: %d" ), + iStatus.Int() ); + TInt httpStatus = iRequestData == NULL ? KErrUnknown : + iRequestData->iHttpStatus; + #endif + + switch( iOperationPhase ) + { + case EHttpDeleting: + #ifdef _DEBUG + iOperationFactory.WriteToLog( + _L8( "DELETE failed - Error: %d Status: %d" ), iStatus.Int(), httpStatus ); + #endif + break; + case EHttpPutting: + #ifdef _DEBUG + iOperationFactory.WriteToLog( + _L8( "PUT failed - Error: %d Status: %d" ), iStatus.Int(), httpStatus ); + #endif + break; + default: + break; + } + iResult = iStatus.Int(); + iCompleted = ETrue; + } + +// --------------------------------------------------------- +// CXcapReplacement::Result +// +// --------------------------------------------------------- +// +TBool CXcapReplacement::Result() const + { + return ETrue; + } + +// --------------------------------------------------------- +// CXcapReplacement::~CXcapReplacement +// +// --------------------------------------------------------- +// +CXcapReplacement::~CXcapReplacement() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapReplacement::~CXcapReplacement()" ) ); + #endif + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapRetrieval.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapRetrieval.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,320 @@ +/* +* Copyright (c) 2005 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: CXcapRetrieval +* +*/ + + + + +// INCLUDES +#include "XcapCache.h" +#include "XcapAppUsage.h" +#include "XcapDocument.h" +#include "XcapProtocol.h" +#include "XcapRetrieval.h" +#include "XcapUriParser.h" +#include "XdmXmlParser.h" +#include "XcapHttpReqGet.h" +#include "XcapHttpTransport.h" +#include "XcapOperationFactory.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CXcapRetrieval::CXcapRetrieval( CXcapDocument& aParentDoc, + CXcapDocumentNode* aTargetNode, + CXcapOperationFactory& aOperationFactory ) : + CXcapHttpOperation( aParentDoc, aTargetNode, aOperationFactory ), + iCacheOperation( EFalse ), + iOperationType( aTargetNode == NULL ? + EXdmDocument : EXdmPartialDocument ) + { + } + +// --------------------------------------------------------- +// CXcapRetrieval::NewL +// +// --------------------------------------------------------- +// +CXcapRetrieval* CXcapRetrieval::NewL( CXcapDocument& aParentDoc, + CXcapDocumentNode* aTargetNode, + CXcapOperationFactory& aOperationFactory ) + { + CXcapRetrieval* self = new ( ELeave ) CXcapRetrieval( aParentDoc, aTargetNode, aOperationFactory ); + CleanupStack::PushL( self ); + self->BaseConstructL(); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXcapRetrieval::ConstructL +// +// --------------------------------------------------------- +// +void CXcapRetrieval::ConstructL() + { +#ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "-> CXcapRetrieval::ConstructL" ) ); +#endif + CXcapHttpReqGet* request = Transport().GetL( iTargetDoc.Name() ); + CleanupStack::PushL( request ); + User::LeaveIfError( iRequestQueue.Append( request ) ); + request->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 ); + CleanupStack::Pop(); //request + if( iOperationType != EXdmDocument && iDocumentSubset != NULL ) + { + iUriParser->SetDocumentSubset( iDocumentSubset ); + //Add namespace mappings + User::LeaveIfError( iTargetDoc.ApplicationUsage().Validate( + *iDocumentSubset, iUriParser, ETrue ) ); + } +#ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "<- CXcapRetrieval::ConstructL" ) ); +#endif + } + +// --------------------------------------------------------- +// CXcapRetrieval::ExecuteL +// +// --------------------------------------------------------- +// +void CXcapRetrieval::ExecuteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapRetrieval::ExecuteL()" ) ); + #endif + TPtrC8 eTag = iTargetDoc.ETag(); + if( eTag.Length() > 0 ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Using ETag \"%S\" - Length: %d" ), + &eTag, eTag.Length() ); + #endif + //iActiveRequest->SetHeaderL( KHttpHeaderIfNoneMatch, eTag ); + } + TRAPD( error, iUriParser->ParseL( iActiveRequest->RequestUriL() ) ); + if( error == KErrNone ) + { + TPtrC8 uri = iUriParser->DesC8(); + HBufC8* escape = CXcapHttpOperation::EscapeLC( uri ); + iActiveRequest->UpdateRequestUriL( escape->Des() ); + CleanupStack::PopAndDestroy(); //escape + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " New URI: %S" ), &uri ); + #endif + } + } + +// --------------------------------------------------------- +// CXcapRetrieval::OperationCompleteL +// +/* const TDesC8& aETag, + const TDesC& aDocumentName, + const TDesC8& aRootLocation, + const TDesC8& aResponseData*/ +// --------------------------------------------------------- +// +void CXcapRetrieval::OperationCompleteL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapRetrieval::OperationCompleteL()" ) ); + #endif + TInt generalErr = ReinterpretStatus( iRequestData->iHttpStatus ); + if( generalErr == KErrNone ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " No general errors found" ) ); + #endif + iCacheOperation ? HandleCacheOperationL() : HandleNetworkOperationL(); + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " General errors found - Status: %d Error: %d" ), + iRequestData->iHttpStatus, generalErr ); + #endif + iCompleted = ETrue; + iResult = generalErr; + } + } + +// --------------------------------------------------------- +// CXcapRetrieval::HandleCacheOperationL +// +// --------------------------------------------------------- +// +void CXcapRetrieval::HandleCacheOperationL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapRetrieval::HandleCacheOperationL() - Operation type: %d Target node: %x" ), + iOperationType, iDocumentSubset ); + #endif + TPtrC8 responseData = Descriptor( iRequestData->iResponseData ); + iOperationType == EXdmDocument && iDocumentSubset == NULL ? + iXmlParser->ParseDocumentL( &iTargetDoc, responseData ) : + iXmlParser->ParseDocumentL( &iTargetDoc, responseData, iDocumentSubset ); + iCompleted = ETrue; + } + +// --------------------------------------------------------- +// CXcapRetrieval::HandleNetworkOperationL +// +// --------------------------------------------------------- +// +void CXcapRetrieval::HandleNetworkOperationL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapRetrieval::HandleNetworkOperationL()" ) ); + #endif + TPtrC name = iTargetDoc.Name(); + TPtrC8 root = Transport().RootUri(); + switch( iRequestData->iHttpStatus ) + { + case 200: //ETag was stale + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Status 200 - ETag was stale" ) ); + #endif + TPtrC8 responseData = Descriptor( iRequestData->iResponseData ); + if( responseData.Length() <= 0 ) + break; + if( iOperationType == EXdmDocument ) + { + TPtrC8 eTag = Descriptor( iRequestData->iETag ); + //If the ETag has not changed, server should return + //304 (Not modified), but just in case, let's check the + //ETag value, anyway. + if( eTag.Length() > 0 && eTag.Compare( iTargetDoc.ETag() ) != 0 ) + { + iTargetDoc.SetETag( eTag ); + RXcapCache* cache = iTargetDoc.Protocol().Cache(); + if( cache && !( iOptionFlags & KNoCache ) ) + cache->Store( iTargetDoc.ETag(), name, root, responseData ); + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " ETag values match, do not update cache" ) ); + #endif + } + iXmlParser->ParseDocumentL( &iTargetDoc, responseData ); + } + else if( iOperationType == EXdmPartialDocument ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Parse a partial document" ) ); + #endif + //The target node must be emptied before inserting new content + iDocumentSubset->SetEmptyNode( ETrue ); + iDocumentSubset->SetEmptyNode( EFalse ); + iXmlParser->ParseDocumentL( responseData, iDocumentSubset ); + } + iCompleted = ETrue; + } + break; + case 304: + { + RXcapCache* cache = iTargetDoc.Protocol().Cache(); + if( cache ) + { + #ifdef _DEBUG //ETag is up to date - cache still valid + iOperationFactory.WriteToLog( _L8( " Status 304 - Cached version is valid" ) ); + #endif + TInt length = iTargetDoc.DataLength(); + __ASSERT_DEBUG( length > 0, User::Panic( _L( "CXcapRetrieval" ), 1 ) ); + delete iRequestData->iResponseData; + iRequestData->iResponseData = NULL; + iRequestData->iResponseData = HBufC8::NewL( length ); + TPtr8 desc( iRequestData->iResponseData->Des() ); + cache->FetchDocumentContent( desc, name, root ); + if( iOperationType == EXdmDocument && !iTargetDoc.DocumentRoot() ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " No content => parse cached document" ) ); + #endif + iXmlParser->ParseDocumentL( &iTargetDoc, desc ); + } + else if( iOperationType == EXdmPartialDocument ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Parse a partial document" ) ); + #endif + iXmlParser->ParseDocumentL( &iTargetDoc, desc, iDocumentSubset ); + } + } + iCompleted = ETrue; + } + break; + default: + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Default case - Status: %d" ), + iRequestData->iHttpStatus ); + #endif + iCompleted = ETrue; + break; + } + } + +// --------------------------------------------------------- +// CXcapRetrieval::OperationFailedL +// +// --------------------------------------------------------- +// +void CXcapRetrieval::OperationFailedL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapRetrieval::OperationFailedL() - Error: %d" ), + iStatus.Int() ); + #endif + if( iStatus.Int() >= KErrNone ) + { + TInt status = iActiveRequest->ResponseData()->iHttpStatus; + TInt completion = iActiveRequest->ResponseData()->iCompletion; + iResult = status < KErrNone || completion < KErrNone ? status : ReinterpretStatus( status ); + } + else iResult = iStatus.Int(); + iCompleted = ETrue; + } + +// --------------------------------------------------------- +// CXcapRetrieval::Result +// +// --------------------------------------------------------- +// +TInt CXcapRetrieval::Result() const + { + return iRequestData->iCompletion; + } + +// --------------------------------------------------------- +// CXcapRetrieval::~CXcapRetrieval +// +// --------------------------------------------------------- +// +CXcapRetrieval::~CXcapRetrieval() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapRetrieval::~CXcapRetrieval()" ) ); + #endif + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapOperations/src/XcapUriParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapOperations/src/XcapUriParser.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,448 @@ +/* +* Copyright (c) 2005 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: CXcapUriParser +* +*/ + + + + +// INCLUDES +#include +#include "XdmNamespace.h" +#include "XcapUriParser.h" +#include "XcapHttpOperation.h" +#include "XcapEngineDefines.h" +#include "XdmNodeAttribute.h" +#include "XcapOperationFactory.h" + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CXcapUriParser::CXcapUriParser( CXdmDocument& aTargetDoc, + CXcapOperationFactory& aOperationFactory ) : + iTargetDoc( aTargetDoc ), + iNodeType( EXdmElementUnspecified ), + iOperationFactory( aOperationFactory ) + { + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CXcapUriParser* CXcapUriParser::NewL( CXdmDocument& aTargetDoc, + CXcapOperationFactory& aOperationFactory ) + { + CXcapUriParser* self = new ( ELeave ) CXcapUriParser( aTargetDoc, aOperationFactory ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CXcapUriParser::~CXcapUriParser() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapUriParser::~CXcapUriParser()" ) ); + #endif + delete iUriBuffer; + delete iCompleteUri; + iNamespaceMappings.ResetAndDestroy(); + iNamespaceMappings.Close(); + } + +// --------------------------------------------------------- +// CXcapUriParser::ConstructL +// +// --------------------------------------------------------- +// +void CXcapUriParser::ConstructL() + { + } + +// --------------------------------------------------------- +// CXcapUriParser::AddNamespaceMappingL +// +// --------------------------------------------------------- +// +void CXcapUriParser::AddNamespaceMappingL( const TDesC8& aUri, const TDesC8& aPrefix ) + { + CXdmNamespace* ns = CXdmNamespace::NewL( aUri, aPrefix ); + CleanupStack::PushL( ns ); + User::LeaveIfError( iNamespaceMappings.Append( ns ) ); + CleanupStack::Pop(); //ns + } + +// --------------------------------------------------------- +// CXcapUriParser::AppendNamespaceMappingsL +// +// --------------------------------------------------------- +// +void CXcapUriParser::AppendNamespaceMappingsL() + { + CXdmNamespace* ns = NULL; + const TInt count = iNamespaceMappings.Count(); + iUriBuffer->InsertL( iBufferPosition, KXcapUriQMark ); + iBufferPosition = iBufferPosition + KXcapUriQMark().Length(); + for( TInt i = 0;i < count;i++ ) + { + ns = iNamespaceMappings[i]; + iUriBuffer->InsertL( iBufferPosition, KXcapUriXmlns ); + iBufferPosition = iBufferPosition + KXcapUriXmlns().Length(); + TPtrC8 prefix( ns->Prefix() ); + iUriBuffer->InsertL( iBufferPosition, prefix ); + iBufferPosition = iBufferPosition + prefix.Length(); + iUriBuffer->InsertL( iBufferPosition, KXcapUriEquals ); + iBufferPosition = iBufferPosition + KXcapUriEquals().Length(); + TPtrC8 uri( ns->Uri() ); + iUriBuffer->InsertL( iBufferPosition, uri ); + iBufferPosition = iBufferPosition + uri.Length(); + iUriBuffer->InsertL( iBufferPosition, KXcapUriQuote ); + iBufferPosition = iBufferPosition + KXcapUriQuote().Length(); + iUriBuffer->InsertL( iBufferPosition, KXcapParenthClose ); + iBufferPosition = iBufferPosition + KXcapParenthClose().Length(); + } + } + +// --------------------------------------------------------- +// CXcapUriParser::FinaliseL +// +// --------------------------------------------------------- +// +void CXcapUriParser::FinaliseL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapUriParser::FinaliseL()" ) ); + #endif + delete iCompleteUri; + iCompleteUri = NULL; + iCompleteUri = HBufC8::NewL( iUriBuffer->Size() ); + TPtr8 pointer( iCompleteUri->Des() ); + iUriBuffer->Read( 0, pointer, iUriBuffer->Size() ); + iUriBuffer->Reset(); + delete iUriBuffer; + iUriBuffer = NULL; + } + +// --------------------------------------------------------- +// CXcapUriParser::ParseL +// +// --------------------------------------------------------- +// +void CXcapUriParser::ParseL( const TPtrC8& aHttpUri ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapUriParser::ParseL()" ) ); + #endif + iHttpUri = CONST_CAST( TPtrC8*, &aHttpUri ); + if( iNodeType != EXdmElementUnspecified ) + { + HBufC8* path = DocSubsetPathL(); + CleanupStack::PushL( path ); + iBufferPosition = CreateBasicNodeUriL( path ); + CleanupStack::PopAndDestroy(); //path + iNodeType == EXdmElementAttribute ? FormatAttributeUriL() : FormatNodeUriL(); + if( iNamespaceMappings.Count() > 0 ) + AppendNamespaceMappingsL(); + FinaliseL(); + #ifdef _DEBUG + TPtr8 desc( iCompleteUri->Des() ); + iOperationFactory.WriteToLog( _L8( " Context: %S" ), &desc ); + #endif + } + else + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " Context is a whole document" ) ); + #endif + iCompleteUri = HBufC8::NewL( iHttpUri->Length() ); + iCompleteUri->Des().Copy( *iHttpUri ); + } + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::DocSubsetPathL +// +// ---------------------------------------------------------- +// +HBufC8* CXcapUriParser::DocSubsetPathL() + { + HBufC8* ret = NULL; + CXdmDocumentNode* current = iDocumentSubset->Parent(); + CBufFlat* buffer = CBufFlat::NewL( 256 ); + CleanupStack::PushL( buffer ); + while( current != NULL ) + { + buffer->InsertL( 0, FormatOnePathElementLC( current )->Des() ); + CleanupStack::PopAndDestroy(); //FormatOnePathElementLC + current = current->Parent(); + } + TInt length = buffer->Size(); + ret = HBufC8::NewL( length ); + TPtr8 pointer( ret->Des() ); + buffer->Read( 0, pointer, length ); + CleanupStack::PopAndDestroy(); //buffer + return ret; + } + +// --------------------------------------------------------- +// CXcapUriParser::FormatAttributeUriL +// +// --------------------------------------------------------- +// +HBufC8* CXcapUriParser::FormatOnePathElementLC( const CXdmDocumentNode* aPathElement ) + { + #ifdef _DEBUG + HBufC8* name8 = aPathElement->EightBitNodeNameLC(); + TPtrC8 elemName( name8->Des() ); + TPtrC8 elemPref( aPathElement->Prefix() ); + iOperationFactory.WriteToLog( _L8( "CXcapUriParser::FormatOnePathElementL()" ) ); + if( elemPref.Length() > 0 ) + iOperationFactory.WriteToLog( _L8( " Prefix: %S" ), &elemName ); + iOperationFactory.WriteToLog( _L8( " Name: %S" ), &elemName ); + CleanupStack::PopAndDestroy(); //name8 + #endif + TInt position = 0; + CBufFlat* buffer = CBufFlat::NewL( 50 ); + CleanupStack::PushL( buffer ); + buffer->InsertL( position, KXCAPPathSeparator ); + position = position + KXCAPPathSeparator().Length(); + TPtrC8 prefix = aPathElement->Prefix(); + if( prefix.Length() > 0 ) + { + buffer->InsertL( position, prefix ); + position = position + prefix.Length(); + buffer->InsertL( position, KXcapUriColon ); + position = position + KXcapUriColon().Length(); + } + TPtrC8 name = aPathElement->EightBitNodeNameLC()->Des(); + buffer->InsertL( position, name ); + position = position + name.Length(); + CleanupStack::PopAndDestroy(); //EightBitNodeNameLC + if( aPathElement->AttributeCount() > 0 && + !( iNodeType == EXdmElementAttribute && aPathElement == iDocumentSubset->Parent() ) ) + AppendPredicatesL( position, buffer, aPathElement ); + HBufC8* retBuf = HBufC8::NewL( buffer->Size() ); + TPtr8 pointer( retBuf->Des() ); + buffer->Read( 0, pointer, buffer->Size() ); + CleanupStack::PopAndDestroy(); //buffer + CleanupStack::PushL( retBuf ); + return retBuf; + } + +// --------------------------------------------------------- +// CXcapUriParser::FormatAttributeUriL +// +// --------------------------------------------------------- +// +void CXcapUriParser::FormatAttributeUriL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " CXcapUriParser::FormatAttributeUriL()" ) ); + #endif + iUriBuffer->InsertL( iBufferPosition, KXCAPAttributeIdentifier ); + iBufferPosition = iBufferPosition + KXCAPAttributeIdentifier().Length(); + iUriBuffer->InsertL( iBufferPosition, iDocumentSubset->EightBitNodeNameLC()->Des() ); + CleanupStack::PopAndDestroy(); //EightBitNodeNameLC + HBufC8* newUri = HBufC8::NewLC( iUriBuffer->Size() ); + TPtr8 pointer( newUri->Des() ); + iUriBuffer->Read( 0, pointer, iUriBuffer->Size() ); + #ifdef _DEBUG + DumpUriL( newUri ); + #endif + CleanupStack::PopAndDestroy(); //newUri + } + +// --------------------------------------------------------- +// CXcapUriParser::FormatNodeUriL +// +// --------------------------------------------------------- +// +void CXcapUriParser::FormatNodeUriL() + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " CXcapUriParser::FormatNodeUriL()" ) ); + #endif + iNodeType = EXdmElementNode; + TPtrC8 prefix = iDocumentSubset->Prefix(); + if( prefix.Length() > 0 ) + { + iUriBuffer->InsertL( iBufferPosition, prefix ); + iBufferPosition = iBufferPosition + prefix.Length(); + iUriBuffer->InsertL( iBufferPosition, KXcapUriColon ); + iBufferPosition = iBufferPosition + KXcapUriColon().Length(); + } + TPtrC8 name = iDocumentSubset->EightBitNodeNameLC()->Des(); + iUriBuffer->InsertL( iBufferPosition, name ); + iBufferPosition = iBufferPosition + name.Length(); + CleanupStack::PopAndDestroy(); //EightBitNodeNameLC + if( iDocumentSubset->AttributeCount() > 0 ) + AppendPredicatesL( iBufferPosition, iUriBuffer, iDocumentSubset ); + //For now, do not put a trailing '/' to the node path. This may have to be changed, though. + //iUriBuffer->InsertL( iBufferPosition, KXCAPPathSeparator ); + //iBufferPosition = iBufferPosition + TPtrC8( KXCAPPathSeparator ).Length(); + HBufC8* newUri = HBufC8::NewLC( iUriBuffer->Size() ); + TPtr8 pointer2( newUri->Des() ); + iUriBuffer->Read( 0, pointer2, iUriBuffer->Size() ); + #ifdef _DEBUG + DumpUriL( newUri ); + #endif + CleanupStack::PopAndDestroy(); //newUri + } + +// --------------------------------------------------------- +// CXcapUriParser::AppendPredicatesL +// +// --------------------------------------------------------- +// +void CXcapUriParser::AppendPredicatesL( TInt& aPosition, + CBufBase* aBuffer, + const CXdmDocumentNode* aPathElement ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " CXcapUriParser::AppendPredicatesL()" ) ); + #endif + TInt count = aPathElement->AttributeCount(); + for( TInt i = 0;i < count;i++ ) + { + CXdmNodeAttribute* attribute = aPathElement->Attribute( i ); + //Namespaces cannot be used as attributes + if( attribute->NodeName().Find( _L( "xmlns" ) ) < 0 ) + { + aBuffer->InsertL( aPosition, KHTTPBracketOpen ); + aPosition = aPosition + KHTTPBracketOpen().Length(); + aBuffer->InsertL( aPosition, KXCAPAttributeIdentifier ); + aPosition = aPosition + KXCAPAttributeIdentifier().Length(); + TPtrC8 name = attribute->EightBitNodeNameLC()->Des(); + aBuffer->InsertL( aPosition, name ); + aPosition = aPosition + name.Length(); + CleanupStack::PopAndDestroy(); //EightBitNodeNameLC + aBuffer->InsertL( aPosition, KXCAPEquality ); + aPosition = aPosition + KXCAPEquality().Length(); + aBuffer->InsertL( aPosition, KHTTPQuotationMark ); + aPosition = aPosition + KHTTPQuotationMark().Length(); + TPtrC8 value = attribute->EightBitValueLC()->Des(); + aBuffer->InsertL( aPosition, value ); + aPosition = aPosition + value.Length(); + CleanupStack::PopAndDestroy(); //EightBitValueLC + aBuffer->InsertL( aPosition, KHTTPQuotationMark ); + aPosition = aPosition + KHTTPQuotationMark().Length(); + aBuffer->InsertL( aPosition, KHTTPBracketClose ); + aPosition = aPosition + KHTTPBracketClose().Length(); + } + } + } + +// --------------------------------------------------------- +// CXcapUriParser::CreateBasicNodeUriL +// +// --------------------------------------------------------- +// +TInt CXcapUriParser::CreateBasicNodeUriL( HBufC8* aNodePath ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( " CXcapUriParser::CreateBasicNodeUriL()" ) ); + #endif + TInt position = 0; + TPtr8 pointer( aNodePath->Des() ); + iUriBuffer = CBufFlat::NewL( 256 ); + iUriBuffer->InsertL( position, *iHttpUri ); + position = iHttpUri->Length(); + if( iHttpUri->LocateReverseF( KXcapPathSeparatorChar ) != iHttpUri->Length() - 1 ) + { + iUriBuffer->InsertL( position, KXCAPPathSeparator ); + position = position + KXCAPPathSeparator().Length(); + } + iUriBuffer->InsertL( position, KXCAPNodeSeparator ); //"~~" + position = position + KXCAPNodeSeparator().Length(); + iUriBuffer->InsertL( position, pointer ); + position = position + pointer.Length(); + iUriBuffer->InsertL( position, KXCAPPathSeparator ); + position = position + KXCAPPathSeparator().Length(); + return position; + } + + + +// --------------------------------------------------------- +// CXcapUriParser::SetDocumentSubset +// +// --------------------------------------------------------- +// +void CXcapUriParser::SetDocumentSubset( const CXdmDocumentNode* aDocumentSubset ) + { + #ifdef _DEBUG + iOperationFactory.WriteToLog( _L8( "CXcapUriParser::SetDocumentSubset() - Type: %d" ), + aDocumentSubset->ElementType() ); + #endif + __ASSERT_DEBUG( aDocumentSubset != NULL, User::Panic( _L( "CXcapUriParser" ), 1 ) ); + iDocumentSubset = CONST_CAST( CXdmDocumentNode*, aDocumentSubset ); + iNodeType = iDocumentSubset->ElementType(); + } + +// --------------------------------------------------------- +// CXcapUriParser::DesC8 +// +// --------------------------------------------------------- +// +TPtrC8 CXcapUriParser::DesC8() const + { + return iCompleteUri != NULL ? iCompleteUri->Des() : TPtrC8(); + } + +// --------------------------------------------------------- +// CXcapUriParser::NodeType +// +// --------------------------------------------------------- +// +TXdmElementType CXcapUriParser::NodeType() const + { + return iNodeType; + } + +#ifdef _DEBUG +// --------------------------------------------------------- +// CXcapUriParser::DumpUriL +// +// --------------------------------------------------------- +// +void CXcapUriParser::DumpUriL( HBufC8* aNodePath ) + { + RFile file; + RFs session; + TPtr8 pointer( aNodePath->Des() ); + _LIT( KFilePath, "C:\\logs\\XDM\\Dump.txt" ); + User::LeaveIfError( session.Connect() ); + TInt error = file.Replace( session, KFilePath, EFileWrite ); + if( error == KErrNone ) + { + file.Write( pointer ); + file.Close(); + } + session.Close(); + } +#endif +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/bwinscw/XcapUtilsU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/bwinscw/XcapUtilsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,8 @@ +EXPORTS + ??1CXcapEarlyIms@@UAE@XZ @ 1 NONAME ; CXcapEarlyIms::~CXcapEarlyIms(void) + ?CheckFileExistsL@XcapStaticUtils@@SAHAAVRFs@@ABVTDesC16@@@Z @ 2 NONAME ; int XcapStaticUtils::CheckFileExistsL(class RFs &, class TDesC16 const &) + ?GenerateFileNameLC@XcapStaticUtils@@SAPAVHBufC16@@AAVRFs@@ABVTDesC16@@1@Z @ 3 NONAME ; class HBufC16 * XcapStaticUtils::GenerateFileNameLC(class RFs &, class TDesC16 const &, class TDesC16 const &) + ?NewL@CXcapEarlyIms@@SAPAV1@XZ @ 4 NONAME ; class CXcapEarlyIms * CXcapEarlyIms::NewL(void) + ?PublicIDL@CXcapEarlyIms@@QAE?AVTPtrC8@@XZ @ 5 NONAME ; class TPtrC8 CXcapEarlyIms::PublicIDL(void) + ?RequestSimDataL@CXcapEarlyIms@@QAEXPAVMXcapEarlyImsObs@@@Z @ 6 NONAME ; void CXcapEarlyIms::RequestSimDataL(class MXcapEarlyImsObs *) + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/eabi/XcapUtilsU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/eabi/XcapUtilsU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,9 @@ +EXPORTS + _ZN13CXcapEarlyIms15RequestSimDataLEP16MXcapEarlyImsObs @ 1 NONAME + _ZN13CXcapEarlyIms4NewLEv @ 2 NONAME + _ZN13CXcapEarlyIms9PublicIDLEv @ 3 NONAME + _ZN15XcapStaticUtils16CheckFileExistsLER3RFsRK7TDesC16 @ 4 NONAME + _ZN15XcapStaticUtils18GenerateFileNameLCER3RFsRK7TDesC16S4_ @ 5 NONAME + _ZTI13CXcapEarlyIms @ 6 NONAME ; ## + _ZTV13CXcapEarlyIms @ 7 NONAME ; ## + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/group/XcapUtils.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/group/XcapUtils.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2007 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: XcapUtils.dll from XcapUtils.mmp +* +*/ + + + +#include + +TARGET xcaputils.dll +TARGETTYPE dll +UID 0x1000008d 0x10207453 +CAPABILITY CAP_GENERAL_DLL +VENDORID VID_DEFAULT + +SOURCEPATH ../src + +SOURCE XcapEarlyIms.cpp +SOURCE XcapStaticUtils.cpp + +//Internal +USERINCLUDE ../inc + +MW_LAYER_SYSTEMINCLUDE + +LIBRARY etel.lib +LIBRARY bafl.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +LIBRARY etelmm.lib +LIBRARY commsdat.lib +DEBUGLIBRARY flogger.lib + +#if defined( ARMCC ) + deffile ../eabi/ +#elif defined ( WINSCW ) + deffile ../bwinscw/ +#elif defined ( WINS ) + deffile ../bwins/ +#endif + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2007 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: XcapUtils bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- + +XcapUtils.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/inc/XcapEarlyIms.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/inc/XcapEarlyIms.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2005 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: CXcapEarlyIms +* +*/ + + + + +#ifndef __XCAPEARLYIMS__ +#define __XCAPEARLYIMS__ + +#include + +//COMMON CONSTANTS +_LIT( KUtilsLogDir, "XDM" ); +_LIT( KUtilsLogFile, "XcapUtils.txt" ); +_LIT8( KXcapFakeImpu, "IMSI@FakeImpu.ims.3gpp.invalid" ); +const TInt KUtilsLogBufMaxSize = 2000; + + +//For testing of EarlyIms in WINSCW +//#define __FAKE_IMPU__ + +//FORWARD DECLARATIONS +class MXcapEarlyImsObs; +class CAsyncRetrieveAuthorizationInfo; + +// CLASS DECLARATION +class CXcapEarlyIms : public CActive + + { + public: // Constructors and destructor + + /** + * Symbian OS default constructor. + * @return CXcapEarlyIms New instance + */ + IMPORT_C static CXcapEarlyIms* NewL(); + + /** + * Symbian OS default constructor. + * @return CXcapEarlyIms New instance + */ + IMPORT_C void RequestSimDataL( MXcapEarlyImsObs* aObserver ); + + /** + * Symbian OS default constructor. + * @return CXcapEarlyIms New instance + */ + IMPORT_C TPtrC8 PublicIDL(); + + /** + * Destructor. + */ + IMPORT_C virtual ~CXcapEarlyIms(); + + #ifdef _DEBUG + + /** + * Clean the log file + * @return void + */ + void CXcapEarlyIms::DeleteLogFileL(); + + /** + * A global logging function for 8 bit data. + * @param aCommand command to be handled + */ + static void WriteToLog( TRefByValue aFmt,... ); + + #endif //_DEBUG + + private: + + /** + * C++ default constructor is private. + */ + CXcapEarlyIms(); + + /** + * Symbian OS second-phase constructor. + * @return void + */ + void ConstructL(); + + /** + * From CActive + * A request has completed + * @return void + */ + void RunL(); + + /** + * From CActive + * Cancel an outstanding request. + * @return void + */ + void DoCancel(); + + /** + * Get the module name + * @param TDes& Module name on return + * @return void + */ + void ModuleNameL( TDes& aModuleName ) const; + + /** + * Find out the type of the SIM card + * and its application + * @return void + */ + void SelectSimTypeL(); + + /** + * Derive IMPU and IMPI from the values + * retrieved from the SIM card + * @return TPtrC8 User's Public ID + */ + TPtrC8 DeriveL(); + + private: //Data + + + enum TRequestPhase + { + TRequestIdle = 0, + TRequestAuth, + TRequestNetwork, + TRequestUsimAuth + }; + + enum TXcapSimType + { + ESimTypeGsm = 0, + ESimTypeCdma, + ESimTypeWcdma, + ESimTypeUnknown + }; + + TBool iRequestComplete; + HBufC8* iImpu; + HBufC8* iImpi; + RTelServer iServer; + RMobilePhone iPhone; + TXcapSimType iSimType; + TRequestPhase iRequestPhase; + MXcapEarlyImsObs* iObserver; + CAsyncRetrieveAuthorizationInfo* iRetriever; + RMobilePhone::CImsAuthorizationInfoV5* iAuthData; + RMobilePhone::TMobilePhoneSubscriberId iImsi; + RMobilePhone::TMobilePhoneNetworkCountryCode iCountryCode; + RMobilePhone::TMobilePhoneNetworkIdentity iNetworkCode; + TPckgBuf iNetworkInfoPckg; + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/inc/XcapStaticUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/inc/XcapStaticUtils.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2007 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: XcapStaticUtils +* +*/ + + + + +#ifndef __XCAPSTATICUTILS__ +#define __XCAPSTATICUTILS__ + +#include + +class RFs; + +// CLASS DECLARATION +class XcapStaticUtils + + { + public: + + /** + * Check whether a file already exists. + * + * @param TDesC& The file name to check + * @return TBool Is the file already there + */ + IMPORT_C static TBool CheckFileExistsL( RFs& aFileSession, const TDesC& aFileName ); + + /** + * Generate a new file name unique in the context + * of the folder in which it resides + * + * @param TDesC& The file name to check + * @return TBool Is the file already there + */ + IMPORT_C static HBufC* GenerateFileNameLC( RFs& aFileSession, const TDesC& aFileName, + const TDesC& aExtension ); + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/inc/XcapUtilsInterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/inc/XcapUtilsInterface.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,41 @@ +/* +* Copyright (c) 2007 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: MXcapEarlyImsObs +* +*/ + + + + +#ifndef __XCAPUTILSINTERFACE__ +#define __XCAPUTILSINTERFACE__ + +#include + +// CLASS DECLARATION +class MXcapEarlyImsObs + { + public: // Constructors and destructor + + /** + * IMS parameters have been resolved. + * @return void + */ + virtual void RequestComplete( TInt aError ) = 0; + + }; + +#endif + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/src/XcapEarlyIms.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/src/XcapEarlyIms.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,444 @@ +/* +* Copyright (c) 2005 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: CXcapEarlyIms +* +*/ + + + + +// INCLUDE FILES +#ifdef _DEBUG + #include + #include + #include +#endif +#include +#include +#include +#include +#include +#include "XcapEarlyIms.h" +#include "XcapUtilsInterface.h" + +// ---------------------------------------------------------- +// CXcapEarlyIms::CXcapEarlyIms +// +// ---------------------------------------------------------- +// +CXcapEarlyIms::CXcapEarlyIms() : CActive( EPriorityNormal ), + iRequestComplete( EFalse ), + iSimType( ESimTypeUnknown ) + + { + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::NewL +// +// ---------------------------------------------------------- +// +EXPORT_C CXcapEarlyIms* CXcapEarlyIms::NewL() + { + CXcapEarlyIms* self = new ( ELeave ) CXcapEarlyIms(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +// ---------------------------------------------------- +// CXcapEarlyIms::~CXcapEarlyIms +// +// ---------------------------------------------------- +// +CXcapEarlyIms::~CXcapEarlyIms() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::~CXcapEarlyIms()" ) ); + #endif + delete iImpu; + delete iImpi; + delete iAuthData; + delete iRetriever; + iPhone.Close(); + iServer.Close(); + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::ConstructL() + { + #ifdef _DEBUG + DeleteLogFileL(); + WriteToLog( _L8( "CXcapEarlyIms::ConstructL()" ) ); + #endif + #ifndef __FAKE_IMPU__ + TName tsyName; + TInt numPhone = 0; + TBool found = EFalse; + RTelServer::TPhoneInfo phoneInfo; + User::LeaveIfError( iServer.Connect() ); + TBuf tsyModuleName; + ModuleNameL( tsyModuleName ); + User::LeaveIfError( iServer.LoadPhoneModule( tsyModuleName ) ); + User::LeaveIfError( iServer.EnumeratePhones( numPhone ) ); + for( TInt i = 0;!found && i < numPhone;i++ ) + { + User::LeaveIfError( iServer.GetTsyName( i, tsyName ) ); + User::LeaveIfError( iServer.GetPhoneInfo( i, phoneInfo ) ); + if( tsyName.CompareF( tsyModuleName ) == 0 ) + found = ETrue; + } + __ASSERT_ALWAYS( found, User::Leave( KErrNotFound ) ); + User::LeaveIfError( iPhone.Open( iServer, phoneInfo.iName ) ); + SelectSimTypeL(); + #endif + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::RequestSimDataL +// +// ---------------------------------------------------------- +// +EXPORT_C void CXcapEarlyIms::RequestSimDataL( MXcapEarlyImsObs* aObserver ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::RequestSimDataL()" ) ); + #endif + #ifdef __FAKE_IMPU__ + iStatus = KRequestPending; + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + #else + if( !IsActive() ) + { + TUint32 caps( 0 ); + User::LeaveIfError( iPhone.GetIdentityCaps( caps ) ); + if( !( caps & RMobilePhone::KCapsGetSubscriberId ) ) + User::Leave( KErrNotSupported ); + iPhone.GetSubscriberId( iStatus, iImsi ); + iRequestPhase = TRequestAuth; + iRequestComplete = EFalse; + SetActive(); + } + #endif + iObserver = aObserver; + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::PublicIDL +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXcapEarlyIms::PublicIDL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::PublicIDL()" ) ); + #endif + #ifdef __FAKE_IMPU__ + return KXcapFakeImpu(); + #else + if( iRequestComplete && iRequestPhase == TRequestIdle ) + { + switch( iSimType ) + { + case ESimTypeWcdma: + return iAuthData->iIMPUArray[0]; + case ESimTypeGsm: + return DeriveL(); + default: + return TPtrC8(); + } + } + else return TPtrC8(); + #endif + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::DeriveL +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapEarlyIms::DeriveL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::DeriveL()" ) ); + #endif + _LIT8( KImsMnc, "ims.mnc" ); + _LIT8( KMcc, ".mcc" ); + _LIT8( K3gppnetwork, ".3gppnetwork.org"); + _LIT8( KAt, "@"); + _LIT8( KSip, "sip:"); + _LIT8( KZero, "0"); + TPtrC networkDesc( iNetworkInfoPckg().iNetworkId ); + TPtrC countryDesc( iNetworkInfoPckg().iCountryCode ); + TInt nwlength = networkDesc.Length() + countryDesc.Length(); + if( networkDesc.Length() == 2 ) + nwlength = nwlength + 1; + //private user identity + TInt impiLength = iImsi.Length() + KAt().Length() + KImsMnc().Length() + + nwlength + KMcc().Length() + K3gppnetwork().Length(); + iImpi = HBufC8::NewL( impiLength ); + TPtr8 impiDesc( iImpi->Des() ); + impiDesc.Append( iImsi ); + impiDesc.Append( KAt ); + impiDesc.Append( KImsMnc ); + if( networkDesc.Length() == 2 ) + impiDesc.Append( KZero ); + impiDesc.Append( networkDesc ); + impiDesc.Append( KMcc ); + impiDesc.Append( countryDesc ); + impiDesc.Append( K3gppnetwork ); + //public user identity + TInt impuLength = KSip().Length() + impiDesc.Length(); + iImpu = HBufC8::NewL( impuLength ); + TPtr8 impuDesc( iImpu->Des() ); + impuDesc.Append( KSip ); + impuDesc.Append( impiDesc ); + #ifdef _DEBUG + WriteToLog( _L8( " IMPI: %S" ), &impiDesc ); + WriteToLog( _L8( " IMPU: %S" ), &impuDesc ); + #endif + return impuDesc; + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::SelectSimTypeL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::SelectSimTypeL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::SelectSimTypeL()" ) ); + #endif + TUint32 caps; + User::LeaveIfError( iPhone.GetIccAccessCaps( caps ) ); + if( caps & RMobilePhone::KCapsSimAccessSupported ) + { + if( caps & RMobilePhone::KCapsUSimAccessSupported ) + { + #ifdef _DEBUG + WriteToLog( _L8( " USIM Card" ) ); + #endif + iSimType = ESimTypeWcdma; + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " 2G SIM Card" ) ); + #endif + iSimType = ESimTypeGsm; + } + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " No SIM Card" ) ); + #endif + iSimType = ESimTypeUnknown; + } + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::RunL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::RunL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::RunL()" ) ); + WriteToLog( _L8( " Status: %d" ), iStatus.Int() ); + WriteToLog( _L8( " Request phase: %d" ), iRequestPhase ); + #endif + #ifdef __FAKE_IMPU__ + iObserver->RequestComplete( KErrNone ); + #else + if( iStatus.Int() == KErrNone ) + { + switch( iRequestPhase ) + { + case TRequestIdle: + break; + case TRequestAuth: + { + #ifdef _DEBUG + HBufC8* buf = HBufC8::NewLC( iImsi.Length() ); + TPtr8 desc( buf->Des() ); + desc.Copy( iImsi ); + WriteToLog( _L8( " IMSI retrieved: %S" ), &desc ); + CleanupStack::PopAndDestroy(); //buf + #endif + iPhone.GetHomeNetwork( iStatus, iNetworkInfoPckg ); + iRequestPhase = TRequestNetwork; + SetActive(); + } + break; + case TRequestNetwork: + { + #ifdef _DEBUG + HBufC8* nwid = HBufC8::NewLC( iNetworkInfoPckg().iNetworkId.Length() ); + HBufC8* country = HBufC8::NewLC( iNetworkInfoPckg().iCountryCode.Length() ); + TPtr8 desc1( nwid->Des() ); + TPtr8 desc2( country->Des() ); + desc1.Copy( iNetworkInfoPckg().iNetworkId ); + desc2.Copy( iNetworkInfoPckg().iCountryCode ); + WriteToLog( _L8( " Home network info retrieved" ) ); + WriteToLog( _L8( " Network ID: %S" ), &desc1 ); + WriteToLog( _L8( " Country code: %S" ), &desc2 ); + CleanupStack::PopAndDestroy( 2 ); //country, nwid + #endif + if( iSimType == ESimTypeWcdma ) + { + iAuthData = RMobilePhone::CImsAuthorizationInfoV5::NewL(); + iRetriever = CAsyncRetrieveAuthorizationInfo::NewL( iPhone, *iAuthData ); + iRequestPhase = TRequestUsimAuth; + iRetriever->Start( iStatus ); + SetActive(); + } + else + { + #ifdef _DEBUG + WriteToLog( _L8( " Request complete" ) ); + #endif + iObserver->RequestComplete( KErrNone ); + iRequestPhase = TRequestIdle; + iRequestComplete = ETrue; + } + } + break; + case TRequestUsimAuth: + { + #ifdef _DEBUG + RMobilePhone::TAuthorizationDataSource source( + iAuthData->iAuthenticationDataSource ); + TBuf8<4> sourceDesc( source == RMobilePhone::EFromUSIM + ? _L8( "USIM" ) : _L8( "ISIM" ) ); + WriteToLog( _L8( " USIM auth retrieved" ) ); + WriteToLog( _L8( " IMPI: %S" ), &iAuthData->iIMPI ); + WriteToLog( _L8( " IMPU: %S" ), &iAuthData->iIMPUArray[0] ); + WriteToLog( _L8( " Domain: %S" ), &iAuthData->iHomeNetworkDomainName ); + WriteToLog( _L8( " AuthDataSource: %S" ), &sourceDesc ); + #endif + iObserver->RequestComplete( KErrNone ); + iRequestPhase = TRequestIdle; + iRequestComplete = ETrue; + } + break; + default: + break; + } + } + else iObserver->RequestComplete( iStatus.Int() ); + #endif + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::DoCancel +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::DoCancel() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapEarlyIms::DoCancel() - State: %d" ), iRequestPhase ); + #endif + switch( iRequestPhase ) + { + case TRequestIdle: + break; + case TRequestAuth: + iPhone.CancelAsyncRequest( EMobilePhoneGetSubscriberId ); + break; + case TRequestNetwork: + iPhone.CancelAsyncRequest( EMobilePhoneGetHomeNetwork ); + break; + case TRequestUsimAuth: + delete iRetriever; + iRetriever = NULL; + break; + default: + break; + } + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::ModuleNameL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::ModuleNameL( TDes& aModuleName ) const + { + __ASSERT_ALWAYS( aModuleName.MaxSize() >= KCommsDbSvrMaxFieldLength, User::Leave( KErrArgument ) ); + using namespace CommsDat; + CMDBSession* db = CMDBSession::NewLC( KCDLatestVersion ); + CMDBField* field = new ( ELeave ) CMDBField( KCDTIdModemPhoneServicesSMS ); + CleanupStack::PushL( field ); + field->SetRecordId( 1 ); + field->LoadL( *db ); + TUint32 modemId = *field; + CMDBField* tsyField = new ( ELeave ) CMDBField( KCDTIdTsyName ); + CleanupStack::PushL( tsyField ); + tsyField->SetRecordId( modemId ); + tsyField->LoadL( *db ); + aModuleName = *tsyField; + CleanupStack::PopAndDestroy( 3 ); //tsyField, field, db + } + +#ifdef _DEBUG +// ---------------------------------------------------- +// CXcapEarlyIms::WriteToLog +// +// ---------------------------------------------------- +// +void CXcapEarlyIms::WriteToLog( TRefByValue aFmt,... ) + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + RFileLogger::Write( KUtilsLogDir, KUtilsLogFile, EFileLoggingModeAppend, buf ); + } + +// ---------------------------------------------------------- +// CXcapEarlyIms::DeleteLogFileL +// +// ---------------------------------------------------------- +// +void CXcapEarlyIms::DeleteLogFileL() + { + RFs session; + TBuf<32> log( _L( "C:\\logs\\XDM\\" ) ); + User::LeaveIfError( session.Connect() ); + CFileMan* manager = CFileMan::NewL( session ); + log.Append( KUtilsLogFile ); + manager->Delete( log ); + session.Close(); + delete manager; + manager = NULL; + } +#endif //_DEBUG + + + + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/XcapUtils/src/XcapStaticUtils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/XcapUtils/src/XcapStaticUtils.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2007 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: XcapStaticUtils +* +*/ + + + + +#include +#include "XcapStaticUtils.h" + +// ---------------------------------------------------------- +// XcapStaticUtils::CheckFileExistsL +// +// ---------------------------------------------------------- +// +EXPORT_C TBool XcapStaticUtils::CheckFileExistsL( RFs& aFileSession, const TDesC& aFileName ) + { + TBool found = EFalse; + CDir* directory = NULL; + const TInt KBackSlash = 92; + TInt index = aFileName.LocateReverse( KBackSlash ); + TPtrC dir( aFileName.Left( index + 1 ) ); + TPtrC name( aFileName.Right( aFileName.Length() - index - 1 ) ); + User::LeaveIfError( aFileSession.GetDir( dir, KEntryAttNormal, ESortNone, directory ) ); + CleanupStack::PushL( directory ); + const TInt count = directory->Count(); + for( TInt i = 0;!found && i < count;i++ ) + { + if( name.CompareF( ( *directory )[i].iName ) == 0 ) + found = ETrue; + } + CleanupStack::PopAndDestroy(); //directory + return found; + } + +// ---------------------------------------------------------- +// XcapStaticUtils::GenerateFileNameLC +// +// ---------------------------------------------------------- +// +EXPORT_C HBufC* XcapStaticUtils::GenerateFileNameLC( RFs& aFileSession, const TDesC& aFileName, + const TDesC& aExtension ) + { + TBuf name; + name.Copy( aFileName ); + name.Append( aExtension ); + TBool exists = XcapStaticUtils::CheckFileExistsL( aFileSession, name ); + for( TInt i = 1;exists;i++ ) + { + name.Zero(); + name.Copy( aFileName ); + name.AppendNum( i ); + name.Append( aExtension ); + exists = XcapStaticUtils::CheckFileExistsL( aFileSession, name ); + } + return name.AllocLC(); + } + + + + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/bwinscw/XcapProtocolU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/bwinscw/XcapProtocolU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,22 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + ??1CXcapDocumentNode@@UAE@XZ @ 2 NONAME ; CXcapDocumentNode::~CXcapDocumentNode(void) + ??1CXdmNamespace@@UAE@XZ @ 3 NONAME ; CXdmNamespace::~CXdmNamespace(void) + ?ApplicationUsage@CXcapDocument@@QBEAAVCXcapAppUsage@@XZ @ 4 NONAME ; class CXcapAppUsage & CXcapDocument::ApplicationUsage(void) const + ?Cache@CXcapProtocol@@QAEPAVRXcapCache@@XZ @ 5 NONAME ; class RXcapCache * CXcapProtocol::Cache(void) + ?DataLength@CXcapDocument@@QBEHXZ @ 6 NONAME ; int CXcapDocument::DataLength(void) const + ?ETag@CXcapDocument@@QAEAAVTDesC8@@XZ @ 7 NONAME ; class TDesC8 & CXcapDocument::ETag(void) + ?IsNetworkAvailable@CXcapProtocol@@QAEHXZ @ 8 NONAME ; int CXcapProtocol::IsNetworkAvailable(void) + ?NewL@CXdmNamespace@@SAPAV1@ABVTDesC8@@0@Z @ 9 NONAME ; class CXdmNamespace * CXdmNamespace::NewL(class TDesC8 const &, class TDesC8 const &) + ?Parser@CXcapProtocol@@QAEAAVCXdmXmlParser@@XZ @ 10 NONAME ; class CXdmXmlParser & CXcapProtocol::Parser(void) + ?Prefix@CXdmNamespace@@QBE?AVTPtrC8@@XZ @ 11 NONAME ; class TPtrC8 CXdmNamespace::Prefix(void) const + ?Protocol@CXcapDocument@@QBEAAVCXcapProtocol@@XZ @ 12 NONAME ; class CXcapProtocol & CXcapDocument::Protocol(void) const + ?PublicID@CXcapProtocol@@QAE?AVTPtrC8@@XZ @ 13 NONAME ; class TPtrC8 CXcapProtocol::PublicID(void) + ?RemoveData@CXcapDocument@@QAEXPAVCXcapDocumentNode@@@Z @ 14 NONAME ; void CXcapDocument::RemoveData(class CXcapDocumentNode *) + ?ResetSubset@CXcapDocument@@UAEXXZ @ 15 NONAME ; void CXcapDocument::ResetSubset(void) + ?SetETag@CXcapDocument@@QAEXABVTDesC8@@@Z @ 16 NONAME ; void CXcapDocument::SetETag(class TDesC8 const &) + ?TempCopyL@CXcapDocument@@QAEPAV1@XZ @ 17 NONAME ; class CXcapDocument * CXcapDocument::TempCopyL(void) + ?Transport@CXcapProtocol@@QAEAAVCXcapHttpTransport@@XZ @ 18 NONAME ; class CXcapHttpTransport & CXcapProtocol::Transport(void) + ?Uri@CXdmNamespace@@QBE?AVTPtrC8@@XZ @ 19 NONAME ; class TPtrC8 CXdmNamespace::Uri(void) const + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/eabi/XcapProtocolU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/eabi/XcapProtocolU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,30 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + _ZN13CXcapDocument10RemoveDataEP17CXcapDocumentNode @ 2 NONAME + _ZN13CXcapDocument11ResetSubsetEv @ 3 NONAME + _ZN13CXcapDocument4ETagEv @ 4 NONAME + _ZN13CXcapDocument7SetETagERK6TDesC8 @ 5 NONAME + _ZN13CXcapDocument9TempCopyLEv @ 6 NONAME + _ZN13CXcapProtocol18IsNetworkAvailableEv @ 7 NONAME + _ZN13CXcapProtocol5CacheEv @ 8 NONAME + _ZN13CXcapProtocol6ParserEv @ 9 NONAME + _ZN13CXcapProtocol8PublicIDEv @ 10 NONAME + _ZN13CXcapProtocol9TransportEv @ 11 NONAME + _ZN13CXdmNamespace4NewLERK6TDesC8S2_ @ 12 NONAME + _ZN13CXdmNamespaceD0Ev @ 13 NONAME + _ZN13CXdmNamespaceD1Ev @ 14 NONAME + _ZN13CXdmNamespaceD2Ev @ 15 NONAME + _ZN17CXcapDocumentNodeD0Ev @ 16 NONAME + _ZN17CXcapDocumentNodeD1Ev @ 17 NONAME + _ZN17CXcapDocumentNodeD2Ev @ 18 NONAME + _ZNK13CXcapDocument10DataLengthEv @ 19 NONAME + _ZNK13CXcapDocument16ApplicationUsageEv @ 20 NONAME + _ZNK13CXcapDocument8ProtocolEv @ 21 NONAME + _ZNK13CXdmNamespace3UriEv @ 22 NONAME + _ZNK13CXdmNamespace6PrefixEv @ 23 NONAME + _ZTI13CXcapDocument @ 24 NONAME ; ## + _ZTI13CXcapProtocol @ 25 NONAME ; ## + _ZTV13CXcapDocument @ 26 NONAME ; ## + _ZTV13CXcapProtocol @ 27 NONAME ; ## + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/group/XcapProtocol.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/group/XcapProtocol.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,87 @@ +/* +* Copyright (c) 2005 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: XdmProtocol.dll from XdmProtocol.mmp +* +*/ + + + +#include + +TARGET xcapprotocol.dll +UID 0x10009D8D 0x1020740F +CAPABILITY CAP_ECOM_PLUGIN +VENDORID VID_DEFAULT +TARGETTYPE PLUGIN + +SOURCEPATH ../src + +START RESOURCE 1020740F.rss + +TARGET xcapprotocol.rsc + +END + +SOURCE XcapProtocol.cpp +SOURCE XcapDocument.cpp +SOURCE XcapDirectory.cpp +SOURCE XcapDocumentNode.cpp +SOURCE XcapNodeAttribute.cpp + +//Sources common to all protocols +SOURCEPATH ../../src +SOURCE XdmNamespace.cpp +SOURCE XdmShutdownTimer.cpp + +//Internal XCAP includes +USERINCLUDE ../XcapUtils/inc +USERINCLUDE ../XcapCache/inc +USERINCLUDE ../XcapAppUsage/inc +USERINCLUDE ../XcapOperations/inc +USERINCLUDE ../XcapHttpTransport/inc + +//Common XDM includes +USERINCLUDE ../inc +USERINCLUDE ../../inc +USERINCLUDE ../../XdmXmlParser/inc + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/xml +SYSTEMINCLUDE /epoc32/include/ecom +SYSTEMINCLUDE ../../../inc + +LIBRARY hal.lib +LIBRARY ecom.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +LIBRARY charconv.lib +LIBRARY xdmengine.lib +LIBRARY xdmxmlparser.lib +LIBRARY xdmsettingsapi.lib +LIBRARY msgconnmanager.lib +LIBRARY xcapcacheclient.lib +LIBRARY xcaphttptransport.lib +LIBRARY xcaputils.lib +DEBUGLIBRARY flogger.lib + + +#if defined( ARMCC ) +DEFFILE ../eabi/ +#elif defined ( WINSCW ) +deffile ../bwinscw/ +#elif defined (WINS ) +deffile ../bwins/ +#endif + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: XcapProtocol bld.inf +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- +XcapProtocol.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/inc/XcapDirectory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/inc/XcapDirectory.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,202 @@ +/* +* Copyright (c) 2005 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: CXcapDirectory +* +*/ + + + + +#ifndef __XCAPDIRECTORY__ +#define __XCAPDIRECTORY__ + +#include +#include "XdmDirectory.h" +#include "XdmDocument.h" + +//CONSTANTS +_LIT( KDirectoryEntry, "entry" ); +_LIT( KAuidAttribute, "auid" ); +_LIT( KDocumentUri, "uri" ); +_LIT( KDocumentETag, "etag" ); + +//AUIDs +_LIT( KCapabilities, "/services/org.openmobilealliance.xcap-caps/" ); +_LIT( KPocRules, "/services/org.openmobilealliance.poc-rules" ); +_LIT( KPocGroup, "/services/org.openmobilealliance.poc-groups" ); +_LIT( KResourceLists, "/services/org.openmobilealliance.resource-lists/" ); +_LIT( KPresenceRules, "/services/org.openmobilealliance.pres-rules/" ); +_LIT( KDirectoryUsage, "/services/org.openmobilealliance.xcap-directory/" ); +_LIT( KSharedXDMS, "/services/org.openmobilealliance.resource-lists/" ); +_LIT( KRlsServices, "/services/org.openmobilealliance.rls-services/" ); + +//FORWARD DECLARATIONS +class CXdmDocument; +class CXcapProtocol; +class CXcapRetrieval; +class CXcapHttpReqGet; +class CXcapOperationFactory; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapDirectory ) : public CXdmDirectory + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapDirectory* NewL( const TDesC& aAUID, + CXdmEngine& aXdmEngine, + CXdmDocument*& aDirectoryDoc, + CXcapProtocol& aXcapProtocol ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void CancelUpdate(); + + /** + * Destructor. + */ + virtual ~CXcapDirectory(); + + private: //From CXdmDirectory + + /** + * Destructor. + */ + TInt DocumentCount(); + + /** + * Return the root element of this document + */ + TPtrC Document( TInt aIndex ) const; + + /** + * Returns the path to this directory + * + * @return TPtrC8 The path to the directory this object models + */ + TPtrC DirectoryPath() const; + + /** + * Returns the path to this directory + * + * @return TPtrC8 The path to the directory this object models + */ + TXdmDocType DocumentTypeL( TInt aIndex ) const; + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapDirectory( CXdmDocument*& aDirectoryDoc, + CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL( const TDesC& aAUID ); + + /** + * From CActive. + * @return void + */ + void RunL(); + + /** + * From CActive. + * @return void + */ + void DoCancel(); + + /** + * From CXdmDirectory. + * @return void + */ + void StartUpdateL(); + + /** + * Save the client's request status and update status + * @param TDirUpdatePhase The update phase + * @param TRequestStatus The client's request status + * @return void + */ + void SaveRequestData( TDirUpdatePhase aUpdatePhase, + TRequestStatus& aClientStatus ); + + /** + * From CXdmDirectory. + * @return void + */ + void HandleDocumentListRequestL(); + + /** + * From CXdmDirectory. + * @return void + */ + void HandleRefreshRequestL(); + + /** + * From CXdmDirectory. + * @return void + */ + void UpdateNextDocumentL(); + + /** + * From CXdmDirectory. + * @return void + */ + TBool CheckLocalCopyL( const CXdmDocumentNode* aDocumentNode ); + + /** + * From CXdmDirectory. + * @return void + */ + TPtrC ExtractDocumentUriL( const TDesC8& aRootUri, + const CXdmDocumentNode* aDocumentNode ); + + /** + * From CXdmDirectory. + * @return void + */ + TXdmDocType FindAUID( const CXdmDocumentNode& aEntryNode ) const; + + private: //Data + + TInt iUpdateIndex; + TInt iDocumentCount; + HBufC* iAUID; + CXcapDocument* iDirectoryDoc; + TRequestStatus* iClientStatus; + TDirUpdatePhase iUpdatePhase; + CXcapHttpReqGet* iHttpRetrieval; + CXcapProtocol& iXcapProtocol; + RPointerArray iUpdateList; + RPointerArray iDocumentList; + }; + +#endif //__XCAPDIRECTORY__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/inc/XcapDocument.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/inc/XcapDocument.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,440 @@ +/* +* Copyright (c) 2005 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: CXcapDocument +* +*/ + + + + +#ifndef __XCAPDOCUMENT__ +#define __XCAPDOCUMENT__ + +#include +#include + +//CONSTANTS +const TUint KETagBufferMaxLength = 64; +_LIT8( KSlash, "/" ); +_LIT8( KUserDirName, "users/" ); +_LIT8( KGlobalDirName, "global/" ); +_LIT8( KXcapGlobalDocName, "index" ); + +//FORWARD DECLARATIONS +class RXcapCache; +class CXdmEngine; +class CXdmNamespace; +class CXcapProtocol; +class CXcapAppUsage; +class MXdmOperation; +class CXcapDocumentNode; +class CXdmOperationFactory; + +//CLASS DECLARATION +class CXcapDocument : public CXdmDocument + { + public: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapDocument* NewL( TXdmDocType aDocumentType, + const TDesC& aDocumentName, + const CXdmEngine& aXdmEngine, + const CXcapProtocol& aXcapProtocol ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapDocument* NewL( TXdmDocType aDocumentType, + const TDesC8& aDocumentName, + const CXdmEngine& aXdmEngine, + const CXcapProtocol& aXcapProtocol ); + + /** + * Set one option + * @return void + * @param The completed update operation + */ + void SetOption( TInt aOption ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TXdmDocType DocumentType() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void NotifyResolverCompleteL( TInt aError ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void StartInternalL( TRequestStatus& aStatus ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void CancelUpdate(); + + /** + * Destructor. + */ + virtual ~CXcapDocument(); + + public: //Exported methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C TDesC8& ETag(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C void SetETag( const TDesC8& aETagDesc ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C TInt DataLength() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C CXcapAppUsage& ApplicationUsage() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C CXcapDocument* TempCopyL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C void RemoveData( CXcapDocumentNode* aDocumentNode ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + IMPORT_C CXcapProtocol& Protocol() const; + + /** + * Reset the document subset + */ + IMPORT_C virtual void ResetSubset(); + + private: //From CXdmDocument + + /** + * Construct an "anonymous" entry point for this document. + * This node effectively becomes the root of this document. + * + */ + CXdmDocumentNode* CreateRootL(); + + /** + * Return the time stamp for this document + * + * @return TTime + */ + TTime TimeStamp() const; + + /** + * Return an error document for a failed update + * + * NOTE: The returning object will be NULL in case + * the used protocol does not support this feature. + * + * @return CXdmDocument* The error document + */ + CXdmDocumentNode* ErrorRoot(); + + /* + * Reset the contents of this document model. + */ + void ResetContents(); + + public: //From CXdmDocument + + /** + * Return the root element of this document + * + * @return CXdmDocumentNode The root element of the document + * + * NOTE: The returning node may or may not contain any data, + * since, in the case that this document model does not + * have content yet, the element is a simple "entry point" + * to the whole document. Thus, for instance, if the client + * application requests the Xdm Engine to fetch a particular + * document, the root element points to nothing until the + * request has been completed. + * + */ + CXdmDocumentNode* DocumentRoot() const; + + private: //From MXdmNamespaceContainer + + /** + * Return the number of namespace declarations + * @return TInt Namespace declaration count + */ + TInt Count() const; + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void AppendNamespaceL( const TDesC8& aUri, const TDesC8& aPrefix ); + + /** + * Remove a namespace from the document + * @param TDesC8& URI of the namespace + * @param TDesC8& Prefix of the namespace + */ + void RemoveNamespace( const TDesC8& aUri ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + TPtrC8 Uri( const TDesC8& aPrefix ) const; + + /** + * Fetch the aIndex-th URI + * @param TInt The index of the desired URI string + * @return TPtrC URI string + */ + TPtrC8 Uri( TInt aIndex ) const; + + /** + * Fetch the aIndex-th prefix + * @param TDesC8 The index of the desired prefix string + * @return TPtrC Prefix string + */ + TPtrC8 Prefix( TInt aIndex ) const; + + /** + * Resets namespaces from the document + * + * @return void + */ + void ResetNamespaces(); + + private: + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapDocument( TXdmDocType aDocumentType, + const CXdmEngine& aXdmEngine, + const CXcapProtocol& aXcapProtocol ); + + /** + * From CActive. + * @return void + */ + void RunL(); + + /** + * From CActive. + * @return void + */ + void DoCancel(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void InstallAppUsageL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void UpdateDocumentInfoL( RXcapCache* aCacheClient ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void StartUpdateL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void SaveClientStatus( TRequestStatus& aClientStatus ); + + /** + * Handle a failed update operation + * @return void + * @param CXdmDocOperation* The failed operation + */ + void HandleErrorL(); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + void HandleRequestCompletionL(); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + void ResolveAsyncConflictL(); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + void CreateTempCopyL(); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + void ActivateOperationL(); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + void CheckOperationQueueL(); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + void DequeueOperation( MXdmOperation* aOperation ); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + void DequeueAll(); + + /** + * Append an element to the path identifying the + * the current document subset + * @return void + */ + void AppendPathPartL( const TDesC& aString ); + + /** + * Return the current document subset (including descendants) + * @return void + */ + CXdmDocumentNode* CurrentExtent() const; + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + HBufC8* EightBitNameLC(); + + /** + * Handle a successful update operation + * @return void + * @param The completed update operation + */ + TBool IsGlobalTree( const TDesC8& aAuid ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL( const TDesC8& aDocumentName ); + + private: //Data + + enum TXcapDocumentState + { + EXdmDocIdle = 0, + EXdmDocUpdating, + EResolvingAsyncConflict, + ERetryingFailedOperation + }; + + TInt iDataLength; + TInt iUpdateIndex; + TInt iOperationCount; + TUint iOptions; + TTime iLastAccess; + TTime iLastModification; + HBufC8* iEightBitName; + TXdmDocType iDocumentType; + CXcapDocument* iTempCopy; + CXcapAppUsage* iAppUsage; + CXcapDocumentNode* iDocumentRoot; + CXdmDocumentNode* iErrorRoot; + TXcapDocumentState iDocumentState; + CXcapProtocol& iXcapProtocol; + TBuf8 iETagBuffer; + RPointerArray iNamespaces; + }; + +#endif //__XCAPDOCUMENT__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/inc/XcapDocumentNode.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/inc/XcapDocumentNode.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,219 @@ +/* +* Copyright (c) 2005 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: CXcapDocumentNode +* +*/ + + + + +#ifndef __XCAPDOCUMENTNODE__ +#define __XCAPDOCUMENTNODE__ + +#include "XdmNodeFactory.h" +#include "XdmDocumentNode.h" + +class CXdmEngine; +class CXcapProtocol; +class CXcapProtocol; +class CXdmNodeAttribute; + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapDocumentNode ) : public CXdmDocumentNode, public MXdmNodeFactory + { + public: // Constructors and destructor + + /** + * Destructor. + */ + virtual ~CXcapDocumentNode(); + + public: // New functions + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + static CXcapDocumentNode* NewL( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol ); + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + static CXcapDocumentNode* NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXcapProtocol& aXcapProtocol ); + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + static CXcapDocumentNode* NewL( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol, + const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ); + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of the new element + * @param CXdmDocumentNode* The parent of the new node + * @return CXdmDocumentNode* + */ + static CXcapDocumentNode* NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ); + + /** + * Two-phased constructor. + * + * @param TBool Leaf node indicator + * @param TDesC8& Name of the new element + * @param CXdmDocumentNode* The parent of the new node + * @return CXdmDocumentNode* + */ + static CXcapDocumentNode* NewL( CXdmEngine& aXdmEngine, TBool aLeafNode, + const TDesC& aNodeName, CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ); + + /** + * Two-phased constructor. + * + * @param TBool Leaf node indicator + * @param TDesC8& Name of the new element + * @param CXdmDocumentNode* The parent of the new node + * @return CXdmDocumentNode* + */ + static CXcapDocumentNode* NewL( CXdmEngine& aXdmEngine, + const TBool aLeafNode, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ); + + /** + * Set the next node in the list + * @param The next node in the list + * @return void + */ + void RemoveNode( CXcapDocumentNode* aChileNode ); + + private: + + /** + * C++ constructor, private version. + */ + CXcapDocumentNode( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol ); + + /** + * C++ constructor, protected version. + * + * @param CXdmDocumentNode* The parent node of this element + */ + CXcapDocumentNode( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ); + + /** + * C++ constructor, another private version. + */ + CXcapDocumentNode( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ); + + /** + * By default Symbian OS constructor is private. + * + * @param TDesC8& Name of this node + * @return void + */ + void CopyConstructL( const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ); + + private: //From MXdmNodeFactory + + /** + * Create a new child element + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + CXdmDocumentNode* ChileNodeL(); + + /** + * Create a new child element + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + CXdmDocumentNode* ChileNodeL( const TDesC& aChildName ); + + /** + * Create a new child element + * + * @param TDesC8& Name of the new element + * @return CXdmDocumentNode* + */ + CXdmDocumentNode* ChileNodeL( const CXdmDocumentNode* aAnotherNode ); + + /** + * Create a new attribute + * + * @param TDesC8& Name of the new attribute + * @return CXdmNodeAttribute* + */ + CXdmNodeAttribute* AttributeL(); + + /** + * Create a new attribute + * + * @param TDesC8& Name of the new attribute + * @return CXdmNodeAttribute* + */ + CXdmNodeAttribute* AttributeL( const TDesC& aAttributeName ); + + private: //From MXdmNodeInterface + + /** + * Two-phased constructor. + * + * @param TDesC& Namespace prefix string + * @return void + */ + void SetPrefixL( const TDesC8& aNamespace ); + + /** + * Returns the namespace string for this element + * + * @return TPtrC Namespace string of this element + */ + TPtrC8 Prefix() const; + + private: + + HBufC8* iPrefix; + CXcapProtocol& iXcapProtocol; + }; + +#endif //__XCAPDOCUMENTNODE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/inc/XcapEngineDefines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/inc/XcapEngineDefines.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2005 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: XcapEngine literals +* +*/ + + + + +#ifndef __XCAPENGINEDEFINES__ +#define __XCAPENGINEDEFINES__ + +#include + +//Xdm specific defines +const TInt KXcapPathSeparatorChar = 47; + +//XCAP specific defines +_LIT8( KXCAPEquality, "=" ); +_LIT8( KXCAPNodeSeparator, "~~" ); +_LIT8( KXCAPPathSeparator, "/" ); +_LIT8( KXCAPAttributeIdentifier, "@" ); +_LIT8( KHTTPBracketOpen, "["); +_LIT8( KHTTPBracketClose, "]"); +_LIT8( KHTTPQuotationMark, "\""); + +//Escape coded HTTP specific defines +_LIT8( KHTTPBracketOpenEsc, "%5b"); +_LIT8( KHTTPBracketCloseEsc, "%5d"); +_LIT8( KHTTPQuotationMarkEsc, "%22"); + +//XML specific defines +_LIT8( KXmlSpace, " "); +#endif //__XCAPENGINEDEFINES__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/inc/XcapNodeAttribute.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/inc/XcapNodeAttribute.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,123 @@ +/* +* Copyright (c) 2005 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: CXcapNodeAttribute +* +*/ + + + + +#ifndef __XCAPNODEATTRIBUTE__ +#define __XCAPNODEATTRIBUTE__ + +#include "XdmNodeAttribute.h" + +//CLASS DECLARATION +NONSHARABLE_CLASS( CXcapNodeAttribute ) : public CXdmNodeAttribute + { + public: // Constructors and destructor + + /** + * Two-phased constructor. + * + * @param TDesC8& Name of this attribute + * @param CXdmDocumentNode* Parent of this attribute + * + * NOTE! "Parent", in this case, denotes the + * element this attribute attributes. + * + * @return CXdmNodeAttribute* + */ + static CXcapNodeAttribute* NewL( CXdmEngine& aXdmEngine, + const TDesC& aAttributeName, + CXdmDocumentNode* aParentNode ); + + /** + * Two-phased constructor. + * + * @param CXdmDocumentNode* Parent of this attribute + * + * NOTE! "Parent", in this case, denotes the + * element this attribute attributes. + * + * @return CXdmNodeAttribute* + */ + static CXcapNodeAttribute* NewL( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode ); + + /** + * Destructor. + */ + virtual ~CXcapNodeAttribute(); + + public: // New functions + + + + private: + + /** + * C++ constructor, private version. + */ + CXcapNodeAttribute( CXdmEngine& aXdmEngine ); + + /** + * C++ constructor, protected version. + * + * @param CXdmDocumentNode* The parent node of this element + */ + CXcapNodeAttribute( CXdmEngine& aXdmEngine, CXdmDocumentNode* aParentNode ); + + /** + * By default Symbian OS constructor is private. + * + * @param TDesC8& Name of this node + * @return void + */ + void ConstructL( const TDesC& aNodeName ); + + /** + * C++ constructor, another private version. + */ + CXcapNodeAttribute( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode ); + + private: //From MXdmNodeInterface + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + TPtrC8 Prefix() const; + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void SetPrefixL( const TDesC& aNamespacePrefix ); + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + void SetPrefixL( const TDesC8& aNamespacePrefix ); + + + private: + }; + +#endif //__XCAPNODEATTRIBUTE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/inc/XcapProtocol.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/inc/XcapProtocol.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,337 @@ +/* +* Copyright (c) 2005 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: CXcapProtocol +* +*/ + + + + +#ifndef __XCAPPROTOCOL__ +#define __XCAPPROTOCOL__ + +#include +#include +#include +#include "XcapCache.h" +#include "XdmProtocol.h" +#include "XdmShutdownSwitch.h" +#include "XcapUtilsInterface.h" + +enum TXcapAuthType + { + EXcapAuthGaa = 0, + EXcapAuthEarlyIms, + EXcapAuthHttpDigest + }; + +//CONSTANTS +_LIT( KHttp, "http://" ); +_LIT( KHttps, "https://" ); +_LIT( KHostSeparator, "/" ); +_LIT( KXcapEngLogDir, "XDM" ); +_LIT( KXcapEngLogFile, "XcapProtocol" ); +const TInt KXcapEngLogBufferMaxSize = 2000; + +//FORWARD DECLARATIONS +class CXdmLogWriter; +class CXcapDocument; +class CXdmXmlParser; +class CXcapEarlyIms; +class MMsgConnManager; +class CXdmShutdownTimer; +class CXcapHttpTransport; +class CXdmOperationFactory; +class CXdmSettingsCollection; + +//CLASS DECLARATION +class CXcapProtocol : public CXdmProtocol, + public MXcapEarlyImsObs, + public MXdmShutdownSwitch, + public MMsgBearerObsCallback + { + + public: + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + IMPORT_C TPtrC8 PublicID(); + + /** + * Return a pointer to the cache client interface + * @return RXcapCache* Pointer to the cache interface + */ + IMPORT_C RXcapCache* Cache(); + + /** + * Return a reference to the XML Parser + * @return CXdmXmlParser& Reference to XML Parser + */ + IMPORT_C CXdmXmlParser& Parser(); + + /** + * Return a reference to the XML Parser + * @return CXdmXmlParser& Reference to XML Parser + */ + IMPORT_C CXcapHttpTransport& Transport(); + + /** + * Check whether network is available + * @return TBool Is network available + */ + IMPORT_C TBool IsNetworkAvailable(); + + public: //Not exported + + /** + * Check whether there are requests being carried out + * and start the idle timer if appropriate + * + * @return void + */ + void CheckActivity(); + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + TPtrC8 UserName() const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + TXcapAuthType AuthType() const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + TBool IsSimRequestPending( TInt& aError ) const; + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + void AppendNotifyeeL( CXcapDocument* aPendingDoc ); + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + void CancelImsResolver(); + + /** + * Logging function + * @param TRefByValue aFmt,... + * @return void + */ + void WriteToLog( TRefByValue aFmt,... ) const; + + private: //From CXdmProtocol + + /** + * Initialise the media used to transfer Xdm data + */ + void InitTransferMedium( TInt aIdleTimeout, TRequestStatus& aStatus ); + + /** + * Cancel initialisation of the transfer media. + */ + void CancelTransferMediumInit(); + + /** + * Cancel initialisation of the transfer media. + */ + TBool IsTransferAvailable() const; + + /** + * Create a new document node. + */ + CXdmDocumentNode* CreateDocumentNodeL(); + + /** + * Create a new protocol dependent document model + */ + CXdmDocument* CreateDocumentL( const TDesC& aDocumentName, + const TXdmDocType aDocumentType ); + + /** + * Create a new protocol dependent document model + */ + CXdmDirectory* CreateDirectoryL( const TDesC& aDirectoryPath ); + + /** + * Destructor. + */ + virtual ~CXcapProtocol(); + + private: + + /** + * From MXdmShutdownSwitch + * @return void + */ + void SwitchOff(); + + /** + * From MXcapEarlyImsObs. + * @param TInt Error + * @return void + */ + void RequestComplete( TInt aError ); + + public: //Static + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + static CXcapProtocol* NewL( const TXdmProtocolParams& aProtocolInfo ); + + /** + * A Global logging function + * @param TRefByValue aFmt,... + * @return void + */ + static TInt GenerateUniqueIdL(); + + private: //Methods + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + CXcapProtocol(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void ConstructL( const TXdmProtocolParams& aProtocolParams ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + void DeleteLogFileL(); + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + TInt SaveSettingsL(); + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + void SaveFromCollectionL( const CXdmSettingsCollection& aSettings ); + + /** + * Return an operation object that knows how to manipulate + * partial document + */ + void ResolveIdentityL(); + + /** + * Select the type of the authentication + */ + void SelectAuthTypeL( const CXdmSettingsCollection& aSettings ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + RXcapCache* CacheHandle(); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + TPtrC8 Impu() const; + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + HBufC* ParseRootLocationLC( const TBool aSecurity, + const TDesC& aRootLocation ); + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + HBufC* CheckProtocolPrefixL( const TDesC& aRootLocation ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + HBufC* ConstructSecureUriL( const TDesC& aBasicUri ); + + /** + * Symbian OS default constructor. + * @param TInt Default Access Point ID + * @return CXdmDocOperation* + */ + HBufC* ConstructStandardUriL( const TDesC& aBasicUri ); + + /** + * Handle a bearer event + * @param TMsgBearerEvent The type of the event + */ + void HandleBearerEventL( TBool aAuthoritativeClose, + TMsgBearerEvent aBearerEvent ); + + private: //Data + + TInt iIdleTimeout; + TInt iAccessPoint; + TInt iImsResolverError; + TBool iSuspend; + TBool iCacheUsage; + TBool iTransferMediaOpen; + TBool iSimRequestPending; + HBufC* iRootUri; + HBufC8* iPublicId; + RXcapCache iCacheClient; + CXdmEngine* iXdmEngine; + CXdmDocument* iCapabilities; + CXdmLogWriter* iLogWriter; + TXcapAuthType iAuthType; + CXdmXmlParser* iXmlParser; + CXcapEarlyIms* iImsResolver; + TXdmCredentials iCredentials; + MMsgConnManager* iConnectionManager; + CXdmShutdownTimer* iIdleTimer; + CXcapHttpTransport* iHttpTransport; + const CXdmProtocolInfo* iProtocolInfo; + TBuf8 iUserName; + RPointerArray iNotifyeeQueue; + }; + +#endif //__XCAPPROTOCOL__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/inc/XcapUriInterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/inc/XcapUriInterface.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2005 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: MXcapUriInterface +* +*/ + + + + +#ifndef __XCAPURIINTERFACE__ +#define __XCAPURIINTERFACE__ + +#include + +//CLASS DECLARATION +NONSHARABLE_CLASS( MXcapUriInterface ) + { + public: + + /** + * Add new namespace mapping + * @param TDesC8& Namespace URI + * @param TDesC8& Namespace prefix + * @return void + */ + virtual void AddNamespaceMappingL( const TDesC8& aUri, const TDesC8& aPrefix ) = 0; + }; + + + +#endif //__XCAPURIINTERFACE__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/src/1020740F.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/src/1020740F.rss Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 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: XdmProtocolInfo +* +*/ + + +// 1020740F.RSS +// +#include "registryinfo.rh" + +//Declares the interface implementations provided +RESOURCE REGISTRY_INFO XdmProtocolInfo + { + dll_uid = 0x1020740F; + interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10207422; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x10207423; + version_no = 1; + display_name = "XDM Engine XCAP Protocol||Copyright © 2005 Nokia Ltd. All rights reserved."; + default_data = ""; + opaque_data = ""; + } + }; + } + }; + } + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/src/XcapDirectory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/src/XcapDirectory.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,501 @@ +/* +* Copyright (c) 2005 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: CXcapDirectory +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "XcapAppUsageDef.h" +#include "XdmProtocol.h" +#include "XcapDocument.h" +#include "XcapProtocol.h" +#include "XcapAppUsage.h" +#include "XcapRetrieval.h" +#include "XcapDirectory.h" +#include "XdmXmlParser.h" +#include "XcapHttpReqGet.h" +#include "XdmDocumentNode.h" +#include "XdmNodeAttribute.h" +#include "XcapHttpTransport.h" +#include "XdmOperationFactory.h" + +// ---------------------------------------------------------- +// CXcapDirectory::CXcapDirectory +// +// ---------------------------------------------------------- +// +CXcapDirectory::CXcapDirectory( CXdmDocument*& aDirectoryDoc, + CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol ) : + CXdmDirectory( aXdmEngine ), + iDirectoryDoc( ( CXcapDocument* )aDirectoryDoc ), + iXcapProtocol( aXcapProtocol ) + { + } + +// ---------------------------------------------------------- +// CXcapDirectory::NewL +// +// ---------------------------------------------------------- +// +CXcapDirectory* CXcapDirectory::NewL( const TDesC& aAUID, + CXdmEngine& aXdmEngine, + CXdmDocument*& aDirectoryDoc, + CXcapProtocol& aXcapProtocol ) + { + CXcapDirectory* self = new ( ELeave ) CXcapDirectory( aDirectoryDoc, aXdmEngine, aXcapProtocol ); + CleanupStack::PushL( self ); + self->ConstructL( aAUID ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------- +// CXcapDirectory::~CXcapDirectory +// +// ---------------------------------------------------- +// +CXcapDirectory::~CXcapDirectory() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::~CXcapDirectory()" ) ); + #endif + Cancel(); + delete iAUID; + delete iDirectoryDoc; + delete iHttpRetrieval; + iUpdateList.Close(); + iDocumentList.Close(); + } + +// ---------------------------------------------------------- +// CXcapDirectory::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapDirectory::ConstructL( const TDesC& aAUID ) + { + if( aAUID.Length() > 0 ) + { + _LIT( KNodePath, "xcap-directory/folder" ); + iAUID = HBufC::NewL( aAUID.Length() ); + iAUID->Des().Copy( aAUID ); + CXdmDocumentNode* node = iDirectoryDoc->DocumentSubsetL( KNodePath ); + CleanupStack::PushL( node ); + CXdmNodeAttribute* auid = node->CreateAttributeL( KAuidAttribute ); + CleanupStack::PushL( auid ); + auid->SetAttributeValueL( aAUID ); + iDirectoryDoc->FetchDataL( node ); + //Set the option that prohibits caching + iDirectoryDoc->SetOption( KXdmOption3 ); + CleanupStack::Pop( 2 ); //auid, node + } + else iDirectoryDoc->FetchDataL(); + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------------- +// CXcapDirectory::StartUpdateL +// +// ---------------------------------------------------------- +// +void CXcapDirectory::StartUpdateL() + + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::StartUpdateL()" ) ); + #endif + switch( iUpdatePhase ) + { + case EDirPhaseIdle: + User::RequestComplete( iClientStatus, KErrArgument ); + break; + case EUpdateDocumentList: + HandleDocumentListRequestL(); + break; + case ERefreshDocuments: + HandleRefreshRequestL(); + break; + default: + break; + } + } + +// ---------------------------------------------------------- +// CXcapDirectory::SaveRequestData +// +// ---------------------------------------------------------- +// +void CXcapDirectory::SaveRequestData( TDirUpdatePhase aUpdatePhase, + TRequestStatus& aClientStatus ) + { + iUpdatePhase = aUpdatePhase; + iClientStatus = &aClientStatus; + } + +// ---------------------------------------------------- +// CXcapDirectory::HandleDocumentListRequestL +// +// ---------------------------------------------------- +// +void CXcapDirectory::HandleDocumentListRequestL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::HandleDocumentListRequestL()" ) ); + #endif + if( !IsActive() ) + { + CXcapDocument* doc = ( CXcapDocument* )iDirectoryDoc; + doc->StartInternalL( iStatus ); + iUpdatePhase = EUpdateDocumentList; + SetActive(); + } + } + +// ---------------------------------------------------- +// CXcapDirectory::HandleRefreshRequestL +// +// ---------------------------------------------------- +// +void CXcapDirectory::HandleRefreshRequestL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::HandleRefreshRequestL()" ) ); + #endif + if( iUpdatePhase == EUpdateDocumentList ) + { + if( iUpdateList.Count() > 0 ) + { + iUpdateIndex = -1; + iHttpRetrieval = iXcapProtocol.Transport().GetL( TPtrC() ); + UpdateNextDocumentL(); + iUpdatePhase = ERefreshDocuments; + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " All documents are up to date" ) ); + #endif + User::RequestComplete( iClientStatus, KErrNone ); + } + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Wrong state [%d]" ), iUpdatePhase ); + #endif + User::RequestComplete( iClientStatus, KErrNotReady ); + } + } + +// ---------------------------------------------------- +// CXcapDirectory::UpdateNextDocumentL +// +// ---------------------------------------------------- +// +void CXcapDirectory::UpdateNextDocumentL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::UpdateNextDocumentL()" ) ); + #endif + iUpdateIndex++; + if( iUpdateIndex < iUpdateList.Count() ) + { + CXdmDocumentNode* node = iUpdateList[iUpdateIndex]; + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Index: %d Document: %x" ), iUpdateIndex, node ); + #endif + TPtrC8 root = iXcapProtocol.Transport().RootUri(); + TPtrC docUri( ExtractDocumentUriL( root, node ) ); + HBufC* uri = HBufC::NewLC( root.Length() + docUri.Length() ); + uri->Des().Copy( root ); + uri->Des().Append( docUri ); + iHttpRetrieval->ResetUriL( uri->Des() ); + iHttpRetrieval->SetExpiryTimeL( NULL, KDefaultHttpRequestTimeout * 1000000 ); + iHttpRetrieval->DispatchRequestL( iStatus ); + CleanupStack::PopAndDestroy(); //uri + SetActive(); + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Directory sync complete" ) ); + #endif + User::RequestComplete( iClientStatus, KErrNone ); + } + } + +// --------------------------------------------------------- +// CXcapDirectory::RunL() +// +// --------------------------------------------------------- +// +void CXcapDirectory::RunL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::RunL() - Request: %d" ), iStatus.Int() ); + #endif + if( iStatus == KErrNone ) + { + switch( iUpdatePhase ) + { + case EUpdateDocumentList: + { + iDocumentCount = iDirectoryDoc->Find( KDirectoryEntry, iDocumentList ); + if( iDocumentCount > 0 ) + { + TInt index = 0; + while( index < iDocumentCount ) + { + TBool uptodate = CheckLocalCopyL( iDocumentList[index] ); + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Cache: %d" ), uptodate ); + #endif + if( !uptodate ) + User::LeaveIfError( iUpdateList.Append( iDocumentList[index] ) ); + index++; + } + } + User::RequestComplete( iClientStatus, iStatus.Int() ); + } + break; + case ERefreshDocuments: + { + CXdmDocumentNode* node = iUpdateList[iUpdateIndex]; + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Index: %d" ), iUpdateIndex ); + iXcapProtocol.WriteToLog( _L8( " Document: %x" ), node ); + iXcapProtocol.WriteToLog( _L8( " Error: %d" ), iStatus.Int() ); + #endif + TPtrC8 root = iXcapProtocol.Transport().RootUri(); + TPtrC docName = ExtractDocumentUriL( root, node ); + TXdmCompletionData* data = iHttpRetrieval->ResponseData(); + TPtrC8 responseData( data->iResponseData->Des() ); + TPtrC8 eTag( data->iETag->Des() ); + RXcapCache* cache = iXcapProtocol.Cache(); + cache->Store( eTag, docName, root, responseData ); + iHttpRetrieval->ReleaseResponseData(); + UpdateNextDocumentL(); + } + break; + default: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Default case, unknown state %d - Status: %d" ), + iUpdatePhase, iStatus.Int() ); + #endif + if( iClientStatus != NULL ) + User::RequestComplete( iClientStatus, KErrUnknown ); + break; + } + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Operation failed with %d" ), iStatus.Int() ); + #endif + User::RequestComplete( iClientStatus, iStatus.Int() ); + } + } + +// --------------------------------------------------------- +// CXcapDirectory::CheckLocalCopyL +// +// --------------------------------------------------------- +// +TBool CXcapDirectory::CheckLocalCopyL( const CXdmDocumentNode* aDocumentNode ) + { + /*#ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::CheckLocalCopyL()" ) ); + #endif*/ + TBool ret = EFalse; + TPtrC8 root = iXcapProtocol.Transport().RootUri(); + TPtrC docName = ExtractDocumentUriL( root, aDocumentNode ); + TPtrC etag( aDocumentNode->Attribute( KDocumentETag )->AttributeValue() ); + HBufC8* etag8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( etag ); + CleanupStack::PushL( etag8 ); + RXcapCache* cache = iXcapProtocol.Cache(); + ret = cache != NULL ? cache->IsCurrent( etag8->Des(), docName, root ) == KErrNone : ETrue; + CleanupStack::PopAndDestroy(); //etag8 + return ret; + } + +// --------------------------------------------------------- +// CXcapDirectory::ExtractDocumentUriL +// +// --------------------------------------------------------- +// +TPtrC CXcapDirectory::ExtractDocumentUriL( const TDesC8& aRootUri, + const CXdmDocumentNode* aDocumentNode ) + { + /*#ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::ExtractDocumentUri()" ) ); + #endif*/ + const TUint8 KHttpHostSeparator = 47; + _LIT8( KHttpDoubleHostSeparator, "//" ); + TPtrC uri( aDocumentNode->Attribute( KDocumentUri )->AttributeValue() ); + if( uri[0] == KHttpHostSeparator ) //Relative URI + return uri; + else + { + TInt index = aRootUri.Find( KHttpDoubleHostSeparator ); + TPtrC8 root( aRootUri.Right( aRootUri.Length() - index - 2 ) ); + HBufC8* uri8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( uri ); + CleanupStack::PushL( uri8 ); + TPtr8 desc( uri8->Des() ); + index = desc.Find( root ); + CleanupStack::PopAndDestroy(); //uri8 + return index >= 0 ? uri.Right( uri.Length() - root.Length() - index ) : TPtrC(); + } + } + +// ---------------------------------------------------- +// CXcapDirectory::DocumentCount +// +// ---------------------------------------------------- +// +TInt CXcapDirectory::DocumentCount() + { + return iDocumentCount; + } + +// ---------------------------------------------------- +// CXcapDirectory::DocumentType +// +// ---------------------------------------------------- +// +TXdmDocType CXcapDirectory::DocumentTypeL( TInt aIndex ) const + { + TXdmDocType type = EXdmDocGeneral; + if( iUpdatePhase <= EDirPhaseIdle ) + User::Leave( KErrNotReady ); + else if( iDocumentCount > 0 && ( aIndex >= 0 && aIndex < iDocumentCount ) ) + type = FindAUID( *iDocumentList[aIndex] ); + return type; + } + +// ---------------------------------------------------- +// CXcapDirectory::FindAUID +// +// ---------------------------------------------------- +// +TXdmDocType CXcapDirectory::FindAUID( const CXdmDocumentNode& aEntryNode ) const + { + TXdmDocType documentType = EXdmDocGeneral; + HBufC8* buf = aEntryNode.Attribute( KDocumentUri )->EightBitValueLC(); + if( buf ) + { + TPtrC8 uri( buf->Des() ); + if( uri.Find( KXdmCapabilityUsageAUID ) >= 0 ) + documentType = EXdmCapabilities; + else if( uri.Find( KXdmPocUserAccessUsageAUID ) >= 0 ) + documentType = EXdmPoCUserAccessPolicy; + else if( uri.Find( KXdmPocGroupUsageAUID ) >= 0 ) + documentType = EXdmPoCGroup; + else if( uri.Find( KXdmResourceListsUsageAUID ) >= 0 ) + documentType = EXdmResourceLists; + else if( uri.Find( KXdmOmaPresRulesUsageAUID ) >= 0 ) + documentType = EXdmIetfPresenceRules; + else if( uri.Find( KXdmDirectoryUsageAUID ) >= 0 ) + documentType = EXdmDirectory; + else if( uri.Find( KXdmSharedXDMUsageAUID ) >= 0 ) + documentType = EXdmSharedXdm; + else if( uri.Find( KXdmRlsServicesUsageAUID ) >= 0 ) + documentType = EXdmRlsServices; + CleanupStack::PopAndDestroy(); //EightBitValueLC() + } + return documentType; + } + +// ---------------------------------------------------- +// CXcapDirectory::Document +// +// ---------------------------------------------------- +// +TPtrC CXcapDirectory::Document( TInt aIndex ) const + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::Document() - Index: %d" ), aIndex ); + #endif + TChar slash = 47; + if( aIndex >= 0 && aIndex < iDocumentList.Count() ) + { + TPtrC ret; + TPtrC uri = iDocumentList[aIndex]->Attribute( KDocumentUri )->AttributeValue(); + TInt index = uri.LocateReverse( slash ); + index > 0 ? ret.Set( uri.Right( uri.Length() - index - 1 ) ) : ret.Set( uri ); + return ret; + } + else return TPtrC(); + } + +// ---------------------------------------------------- +// CXcapDirectory::DirectoryPath +// +// ---------------------------------------------------- +// +TPtrC CXcapDirectory::DirectoryPath() const + { + return iAUID != NULL ? iAUID->Des() : TPtrC(); + } + +// ---------------------------------------------------- +// CXcapDirectory::CancelUpdate +// +// ---------------------------------------------------- +// +void CXcapDirectory::CancelUpdate() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::CancelUpdate()" ) ); + #endif + Cancel(); + } + +// --------------------------------------------------------- +// CXcapDirectory::DoCancel +// +// --------------------------------------------------------- +// +void CXcapDirectory::DoCancel() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDirectory::DoCancel()" ) ); + #endif + switch( iUpdatePhase ) + { + case EDirPhaseIdle: + break; + case EUpdateDocumentList: + { + CXcapDocument* doc = ( CXcapDocument* )iDirectoryDoc; + doc->CancelUpdate(); + } + break; + case ERefreshDocuments: + iHttpRetrieval->CancelRequest(); + break; + default: + break; + } + User::RequestComplete( iClientStatus, KErrCancel ); + } + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/src/XcapDocument.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/src/XcapDocument.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,1097 @@ +/* +* Copyright (c) 2005 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: CXcapDocument +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "XdmOperationFactory.h" +#include "XcapProtocol.h" +#include "XcapDocument.h" +#include "XcapAppUsage.h" +#include "XdmXmlParser.h" +#include "XdmNamespace.h" +#include "CommonDefines.h" +#include "XcapDocumentNode.h" +#include "XcapHttpRequest.h" +#include "XcapHttpOperation.h" +#include "XcapHttpTransport.h" + +// ================= MEMBER FUNCTIONS ======================= +// + + +// ---------------------------------------------------------- +// CXcapDocument::CXcapDocument +// +// ---------------------------------------------------------- +// +CXcapDocument::CXcapDocument( TXdmDocType aDocumentType, + const CXdmEngine& aXdmEngine, + const CXcapProtocol& aXcapProtocol ) : + CXdmDocument( CONST_CAST( CXdmEngine&, aXdmEngine ) ), + iDocumentType( aDocumentType ), + iXcapProtocol( CONST_CAST( CXcapProtocol&, aXcapProtocol ) ) + + { + } + +// ---------------------------------------------------------- +// CXcapDocument::NewL +// +// ---------------------------------------------------------- +// +CXcapDocument* CXcapDocument::NewL( TXdmDocType aDocumentType, + const TDesC& aDocumentName, + const CXdmEngine& aXdmEngine, + const CXcapProtocol& aXcapProtocol ) + { + CXcapDocument* self = new ( ELeave ) CXcapDocument( aDocumentType, aXdmEngine, aXcapProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( KXcapOperationFactory, aDocumentName ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapDocument::NewL +// +// ---------------------------------------------------------- +// +CXcapDocument* CXcapDocument::NewL( TXdmDocType aDocumentType, + const TDesC8& aDocumentName, + const CXdmEngine& aXdmEngine, + const CXcapProtocol& aXcapProtocol ) + { + CXcapDocument* self = new ( ELeave ) CXcapDocument( aDocumentType, aXdmEngine, aXcapProtocol ); + CleanupStack::PushL( self ); + self->ConstructL( aDocumentName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapDocument::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapDocument::ConstructL( const TDesC8& aDocumentName ) + { + BaseConstructL( KXcapOperationFactory, aDocumentName ); + ConstructL(); + } + +// ---------------------------------------------------------- +// CXcapDocument::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapDocument::ConstructL() + { + InstallAppUsageL(); + iErrorRoot = CXcapDocumentNode::NewL( iXdmEngine, iXcapProtocol ); + TPtrC8 root( iXcapProtocol.Transport().RootUri() ); + #ifdef _DEBUG + HBufC8* buf = HBufC8::NewLC( iDocumentName->Des().Length() ); + buf->Des().Copy( iDocumentName->Des() ); + TPtr8 nameDesc( buf->Des() ); + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::ConstructL()" ) ); + iXcapProtocol.WriteToLog( _L8( " Root URI: %S" ), &root ); + iXcapProtocol.WriteToLog( _L8( " Document: %S" ), &nameDesc ); + CleanupStack::PopAndDestroy(); //buf + #endif + RXcapCache* cache = iXcapProtocol.Cache(); + if( cache ) + UpdateDocumentInfoL( cache ); + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Cache disabled, no info for the document" ) ); + #endif + } + CActiveScheduler::Add( this ); + } + +// ---------------------------------------------------- +// CXcapDocument::~CXcapDocument +// +// ---------------------------------------------------- +// +CXcapDocument::~CXcapDocument() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::~CXcapDocument()" ) ); + #endif + Cancel(); + delete iTempCopy; + delete iEightBitName; + delete iDocumentRoot; + delete iErrorRoot; + delete iAppUsage; + iNamespaces.ResetAndDestroy(); + iNamespaces.Close(); + } + +// ---------------------------------------------------------- +// CXcapDocument::ResetContents +// +// ---------------------------------------------------------- +// +void CXcapDocument::ResetContents() + { + iOptions = 0; + delete iDocumentRoot; + iDocumentRoot = NULL; + delete iErrorRoot; + iErrorRoot = NULL; + delete iTempCopy; + iTempCopy = NULL; + iNamespaces.ResetAndDestroy(); + } + +// ---------------------------------------------------------- +// CXcapDocument::UpdateDocumentInfoL +// +// ---------------------------------------------------------- +// +void CXcapDocument::UpdateDocumentInfoL( RXcapCache* aCacheClient ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::UpdateDocumentInfo()" ) ); + #endif + iETagBuffer.Zero(); + TCacheEntryInfo cacheEntryInfo; + TPtrC8 root( iXcapProtocol.Transport().RootUri() ); + TInt error = aCacheClient->FetchDocumentInfo( + iETagBuffer, iDocumentName->Des(), root, cacheEntryInfo ); + if( error == KErrNone ) + { + iLastAccess = cacheEntryInfo.iLastAccess; + iLastModification = cacheEntryInfo.iLastUpdate; + iDataLength = cacheEntryInfo.iDataLength; + #ifdef _DEBUG + const TInt KDateTimeMaxSize = 100; + TBuf8 printBuffer; + TBuf dateTimeBuffer; + _LIT( KDateTimeFormat, "%D%M%Y%/0%1%/1%2%/2%3%/3 %:0%H%:1%T%:2%S"); + iLastModification.FormatL( dateTimeBuffer, KDateTimeFormat ); + printBuffer.Copy( dateTimeBuffer ); + iXcapProtocol.WriteToLog( _L8( " ETag: %S" ), &iETagBuffer ); + iXcapProtocol.WriteToLog( _L8( " Size: %d bytes" ), iDataLength ); + iXcapProtocol.WriteToLog( _L8( " Time stamp: %S" ), &printBuffer ); + #endif + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Cache read complete - Error: %d" ), error ); + #endif + } + } + +// ---------------------------------------------------- +// CXcapDocument::InstallAppUsageL +// +// ---------------------------------------------------- +// +void CXcapDocument::InstallAppUsageL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::InstallAppUsageL()" ) ); + #endif + HBufC8* docName = NULL; + iAppUsage = CXcapAppUsage::NewL( iXdmEngine, iDocumentType ); + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::InstallAppUsageL() type = %d" ), iDocumentType ); + #endif + TPtrC8 auid = iAppUsage->AUID(); + if( IsGlobalTree( auid ) ) + { + docName = HBufC8::NewLC( auid.Length() + KGlobalDirName().Length() + + KXcapGlobalDocName().Length() ); + docName->Des().Copy( auid ); + docName->Des().Append( KGlobalDirName ); + docName->Des().Append( KXcapGlobalDocName ); + delete iDocumentName; + iDocumentName = NULL; + iDocumentName = HBufC::NewL( docName->Des().Length() ); + iDocumentName->Des().Copy( docName->Des() ); + CleanupStack::PopAndDestroy(); //docName + } + else + { + TPtrC8 user = iXcapProtocol.UserName(); + docName = HBufC8::NewLC( auid.Length() + user.Length() + + KUserDirName().Length() + 1 /*'/'*/ + + iDocumentName->Des().Length() ); + docName->Des().Copy( auid ); + docName->Des().Append( KUserDirName ); + docName->Des().Append( user ); + docName->Des().Append( KSlash ); + docName->Des().Append( iDocumentName->Des() ); + delete iDocumentName; + iDocumentName = NULL; + iDocumentName = HBufC::NewL( docName->Des().Length() ); + iDocumentName->Des().Copy( docName->Des() ); + CleanupStack::PopAndDestroy(); //docName + } + + } + +// ---------------------------------------------------- +// CXcapDocument::IsGlobalTree +// +// ---------------------------------------------------- +// +TBool CXcapDocument::IsGlobalTree( const TDesC8& aAuid ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::IsGlobalTree()" ) ); + #endif + TBool found = EFalse; + //Update this array when necessary + const TPtrC8 KGlobalTreeAuids[] = { TPtrC8( KXdmCapabilityUsageAUID ) }; + const TInt count = sizeof( KGlobalTreeAuids ) / sizeof( KGlobalTreeAuids[0] ); + for( TInt i = 0;!found && i < count;i++ ) + found = aAuid.Compare( KGlobalTreeAuids[i] ) == 0; + return found; + } + +// ---------------------------------------------------- +// CXcapDocument::CreateTempCopyL +// +// ---------------------------------------------------- +// +void CXcapDocument::CreateTempCopyL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::CreateTempCopyL()" ) ); + #endif + CXdmDocument* copy = iXdmEngine.CreateDocumentModelL( Name(), iDocumentType ); + iTempCopy = ( CXcapDocument* )copy; + } + +// ---------------------------------------------------- +// CXcapDocument::TempCopyL +// +// ---------------------------------------------------- +// +EXPORT_C CXcapDocument* CXcapDocument::TempCopyL() + { + return CXcapDocument::NewL( iDocumentType, Name(), iXdmEngine, iXcapProtocol ); + } + +// ---------------------------------------------------- +// CXcapDocument::CreateRootL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapDocument::CreateRootL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXdmDocument::CreateRootL()" ) ); + #endif + delete iDocumentRoot; + iDocumentRoot = NULL; + iDocumentRoot = CXcapDocumentNode::NewL( iXdmEngine, iXcapProtocol ); + return iDocumentRoot; + } + +// ---------------------------------------------------- +// CXcapDocument::AppendPathPartL +// +// ---------------------------------------------------- +// +void CXcapDocument::AppendPathPartL( const TDesC& aString ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::PathPartL()" ) ); + #endif + if( iDocumentRoot != NULL ) + { + CXdmDocumentNode* node = NULL; + CXdmDocumentNode* parent = iDocumentRoot; + while( parent->NextNode() != NULL ) + parent = parent->NextNode(); + node = CXcapDocumentNode::NewL( iXdmEngine, aString, iXcapProtocol, parent ); + parent->SetNextNode( node ); + } + else iDocumentRoot = CXcapDocumentNode::NewL( iXdmEngine, aString, iXcapProtocol ); + } + +// ---------------------------------------------------- +// CXcapDocument::CurrentExtent +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapDocument::CurrentExtent() const + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXdmDocument::CurrentExtent()" ) ); + #endif + CXdmDocumentNode* ret = NULL; + if( iDocumentRoot != NULL ) + { + CXdmDocumentNode* node = iDocumentRoot; + while( node->NextNode() != NULL ) + node = node->NextNode(); + ret = node; + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " This document does not yet have a root, leave with KErrGeneral" ) ); + #endif + User::Leave( KErrGeneral ); + } + return ret; + } + +// ---------------------------------------------------- +// CXcapDocument::DocumentRoot +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapDocument::DocumentRoot() const + { + return iDocumentRoot; + } + +// ---------------------------------------------------- +// CXcapDocument::ErrorRoot +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapDocument::ErrorRoot() + { + if( !iErrorRoot ) + { + iErrorRoot = CXcapDocumentNode::NewL( iXdmEngine, iXcapProtocol ); + } + return iErrorRoot; + } + +// ---------------------------------------------------- +// CXcapDocument::ResetSubset +// +// ---------------------------------------------------- +// +EXPORT_C void CXcapDocument::ResetSubset() + { + CXdmDocument::ResetSubset(); + delete iDocumentRoot; + iDocumentRoot = NULL; + iOptions = 0; + } + +// ---------------------------------------------------- +// CXcapDocument::ETag +// +// ---------------------------------------------------- +// +EXPORT_C TDesC8& CXcapDocument::ETag() + { + return iETagBuffer; + } + +// ---------------------------------------------------- +// CXcapDocument::SetETag +// +// ---------------------------------------------------- +// +EXPORT_C void CXcapDocument::SetETag( const TDesC8& aETagDesc ) + { + iETagBuffer.Zero(); + iETagBuffer.Copy( aETagDesc ); + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::SetETag()" ) ); + iXcapProtocol.WriteToLog( _L8( " New ETag: %S" ), &iETagBuffer ); + #endif + } + +// ---------------------------------------------------- +// CXcapDocument::DataLength +// +// ---------------------------------------------------- +// +EXPORT_C TInt CXcapDocument::DataLength() const + { + return iDataLength; + } + +// ---------------------------------------------------- +// CXcapDocument::ApplicationUsage +// +// ---------------------------------------------------- +// +EXPORT_C CXcapAppUsage& CXcapDocument::ApplicationUsage() const + { + return *iAppUsage; + } + +// ---------------------------------------------------- +// CXcapDocument::Protocol +// +// ---------------------------------------------------- +// +EXPORT_C CXcapProtocol& CXcapDocument::Protocol() const + { + return iXcapProtocol; + } + +// ---------------------------------------------------- +// CXcapDocument::RemoveData +// +// ---------------------------------------------------- +// +EXPORT_C void CXcapDocument::RemoveData( CXcapDocumentNode* aDocumentNode ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::RemoveData()" ) ); + #endif + CXcapDocumentNode* parent = ( CXcapDocumentNode* )aDocumentNode->Parent(); + if( parent != NULL ) + parent->RemoveNode( aDocumentNode ); + } + +// ---------------------------------------------------- +// CXcapDocument::StartUpdateL +// +// ---------------------------------------------------- +// +void CXcapDocument::StartUpdateL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::StartUpdateL()" ) ); + #endif + TInt resolverError = 0; + if( iXcapProtocol.IsSimRequestPending( resolverError ) ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " IMS Resolver pending => add to queue" ) ); + #endif + iXcapProtocol.AppendNotifyeeL( this ); + } + else + { + if( resolverError == KErrNone && !IsActive() && iChangeRequests.Count() > 0 ) + { + iUpdateIndex = 0; + iDocumentState = EXdmDocUpdating; + iOperationCount = iChangeRequests.Count(); + ActivateOperationL(); + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( + " Already active, no operations or IMS resolver failed => complete with error" ) ); + #endif + TInt error = resolverError == KErrNone ? KErrNotReady : resolverError; + User::RequestComplete( iClientStatus, error ); + } + } + } + +// ---------------------------------------------------- +// CXcapDocument::StartInternalL +// +// ---------------------------------------------------- +// +void CXcapDocument::StartInternalL( TRequestStatus& aStatus ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::StartInternalL()" ) ); + #endif + aStatus = KRequestPending; + iClientStatus = &aStatus; + StartUpdateL(); + } + +// ---------------------------------------------------- +// CXcapDocument::NotifyResolverCompleteL +// +// ---------------------------------------------------- +// +void CXcapDocument::NotifyResolverCompleteL( TInt aError ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::NotifyResolverCompleteL()" ) ); + #endif + if( aError == KErrNone ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " IMS Resolver ready" ) ); + #endif + StartUpdateL(); + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " IMS Resolver failed => complete with %d" ), aError ); + #endif + DequeueAll(); + User::RequestComplete( iClientStatus, aError ); + } + } + +// ---------------------------------------------------- +// CXcapDocument::ActivateOperationL +// +// ---------------------------------------------------- +// +void CXcapDocument::ActivateOperationL() + { + MXdmOperation* request = iChangeRequests[iUpdateIndex]; + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::ActivateOperation() - Operation: %x" ), request ); + #endif + if( iDocSubset ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Document subset => set KXdmOption1 and KXdmOption2" ) ); + #endif + SetOption( KXdmOption1 ); + SetOption( KXdmOption2 ); + } + if( iXcapProtocol.AuthType() == EXcapAuthEarlyIms ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " EarlyIMS is in use => set KXdmOption4" ) ); + #endif + SetOption( KXdmOption4 ); + } + request->ExecuteL( iStatus, iOptions ); + SetActive(); + } + +// ---------------------------------------------------- +// CXcapDocument::SetOption +// +// ---------------------------------------------------- +// +void CXcapDocument::SetOption( TInt aOption ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::SetOption()" ) ); + #endif + iOptions |= aOption; + } + +// ---------------------------------------------------- +// CXcapDocument::CancelUpdate +// +// ---------------------------------------------------- +// +void CXcapDocument::CancelUpdate() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::CancelUpdate()" ) ); + #endif + TInt resolverError = 0; + if( iXcapProtocol.IsSimRequestPending( resolverError ) ) + { + iXcapProtocol.CancelImsResolver(); + } + else + { + switch( iDocumentState ) + { + case EResolvingAsyncConflict: + iTempCopy->CancelUpdate(); + break; + default: + { + TInt count = iChangeRequests.Count(); + if( count > 0 ) + { + MXdmOperation* request = iChangeRequests[iUpdateIndex]; + request->CancelOperation(); + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Operation %x cancelled" ), request ); + #endif + } + } + } + } + User::RequestComplete( iClientStatus, KErrCancel ); + } + +// --------------------------------------------------------- +// CXcapDocument::RunL() +// +// --------------------------------------------------------- +// +void CXcapDocument::RunL() + { + #ifdef _DEBUG + HBufC8* buf = HBufC8::NewLC( iDocumentName->Des().Length() ); + buf->Des().Copy( iDocumentName->Des() ); + TPtr8 nameDesc( buf->Des() ); + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::RunL()" ) ); + iXcapProtocol.WriteToLog( _L8( " Name: %S" ), &nameDesc ); + iXcapProtocol.WriteToLog( _L8( " Error: %d" ), iStatus.Int() ); + iXcapProtocol.WriteToLog( _L8( " Update index: %d" ), iUpdateIndex ); + CleanupStack::PopAndDestroy(); //buf + #endif + if( iStatus == KErrNone ) + { + switch( iDocumentState ) + { + case EXdmDocUpdating: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Document state: EXdmDocUpdating" ) ); + #endif + HandleRequestCompletionL(); + break; + case EResolvingAsyncConflict: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Document state: EResolvingAsyncConflict" ) ); + #endif + ResolveAsyncConflictL(); + break; + case ERetryingFailedOperation: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Document state: ERetryingFailedOperation" ) ); + #endif + ResolveAsyncConflictL(); + break; + default: + break; + } + } + else HandleErrorL(); + #ifdef _DEBUG + TInt biggestBlock( 0 ); + TInt memory( User::Available( biggestBlock ) ); + iXcapProtocol.WriteToLog( _L8( "** RunL() completes - Available memory: %d" ), memory ); + #endif + } + +// --------------------------------------------------------- +// CXcapDocument::HandleRequestCompletionL +// +// --------------------------------------------------------- +// +void CXcapDocument::HandleRequestCompletionL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::HandleRequestCompletionL()" ) ); + #endif + MXdmOperation* request = iChangeRequests[iUpdateIndex]; + const TXdmCompletionData& data = request->CompletionData(); + switch( data.iCompletion ) + { + case KInsertConflict: + ResolveAsyncConflictL(); + break; + default: + { + RXcapCache* cache = iXcapProtocol.Cache(); + if( cache ) + UpdateDocumentInfoL( cache ); + DequeueOperation( request ); + CheckOperationQueueL(); + break; + } + } + } + +// --------------------------------------------------------- +// CXcapDocument::ResolveAsyncConflictL +// +// --------------------------------------------------------- +// +void CXcapDocument::ResolveAsyncConflictL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::ResolveAsyncConflictL()" ) ); + #endif + switch( iDocumentState ) + { + //This means the cached version of this document + //is out-of-date and that it needs to be updated. + case EXdmDocUpdating: + { + CreateTempCopyL(); + iTempCopy->SetETag( iETagBuffer ); + iTempCopy->FetchDataL(); + iTempCopy->SaveClientStatus( iStatus ); + iTempCopy->StartUpdateL(); + iDocumentState = EResolvingAsyncConflict; + SetActive(); + } + break; + case EResolvingAsyncConflict: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Async conflict resolved, retry insert" ) ); + #endif + //CheckOperationQueueL() will increment the index + iUpdateIndex--; + SetETag( iTempCopy->ETag() ); + iDocumentState = ERetryingFailedOperation; + CheckOperationQueueL(); + break; + case ERetryingFailedOperation: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Operation retry ready" ) ); + #endif + //Nothing can be done now but instruct the + //client to re-fetch the whole document and + //retry the failed operation. + User::RequestComplete( iClientStatus, KErrPathNotFound ); + break; + default: + break; + } + } + +// --------------------------------------------------------- +// CXcapDocument::HandleErrorL +// +// --------------------------------------------------------- +// +void CXcapDocument::HandleErrorL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::HandleErrorL()" ) ); + #endif + TInt clientCode = KErrGeneral; + MXdmOperation* request = request = iChangeRequests[iUpdateIndex]; + //The TXdmCompletionData is guaranteed to point at something + const TXdmCompletionData& data = request->CompletionData(); + switch( data.iCompletion ) + { + case KErrCancel: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Update cancelled" ) ); + #endif + clientCode = KErrCancel; + break; + case ERetryingFailedOperation: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Operation retry failed" ) ); + #endif + //Nothing can be done now but instruct the + //client to re-fetch the whole document and + //retry the failed operation. + User::RequestComplete( iClientStatus, KXcapErrorUnrecoverableConflict ); + break; + case KXcapErrorHttpConflict: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Conflict, parse error document if available" ) ); + #endif + if( data.iResponseData != NULL ) + { + TInt error = KErrNone; + TPtrC8 errorData( data.iResponseData->Des() ); + TRAP( error, iXcapProtocol.Parser().ParseDocumentL( errorData, ErrorRoot() ) ); + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Parsing completed: %d" ), error ); + ErrorRoot()->Print(); + #endif + //Suppress build warning + error = KErrNone; + } + User::RequestComplete( iClientStatus, KXcapErrorHttpConflict ); + break; + case KXcapErrorNetworkNotAvailabe: + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Network not available, check cache" ) ); + #endif + if( iDataLength > 0 ) + { + RXcapCache* cache = iXcapProtocol.Cache(); + if( cache != NULL ) + { + TPtrC name( Name() ); + TInt error = KErrNone; + TPtrC8 root = iXcapProtocol.Transport().RootUri(); + HBufC8* data = HBufC8::NewLC( iDataLength ); + TPtr8 dataPtr( data->Des() ); + cache->FetchDocumentContent( dataPtr, name, root ); + TRAP( error, iXcapProtocol.Parser().ParseDocumentL( this, dataPtr ) ); + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Parsing completed: %d" ), error ); + #endif + //Suppress build warning + error = KErrNone; + CleanupStack::PopAndDestroy(); //data + } + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " No data in cache, nothing to do" ) ); + #endif + } + User::RequestComplete( iClientStatus, KXcapErrorNetworkNotAvailabe ); + } + break; + default: + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Default case - Result: %d" ), data.iCompletion ); + #endif + clientCode = iStatus.Int(); + User::RequestComplete( iClientStatus, clientCode ); + } + DequeueOperation( request ); + } + +// --------------------------------------------------------- +// CXcapDocument::CheckOperationQueueL +// +// --------------------------------------------------------- +// +void CXcapDocument::CheckOperationQueueL() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::CheckOperationQueueL()" ) ); + #endif + iUpdateIndex++; + if( iUpdateIndex < iOperationCount ) + ActivateOperationL(); + else + { + DequeueAll(); + iUpdateIndex = 0; + iXcapProtocol.CheckActivity(); + User::RequestComplete( iClientStatus, KErrNone ); + } + } + +// --------------------------------------------------------- +// CXcapDocument::DequeueOperation +// +// --------------------------------------------------------- +// +void CXcapDocument::DequeueOperation( MXdmOperation* aOperation ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::DequeueOperation()" ) ); + #endif + TInt index = iChangeRequests.Find( aOperation ); + if( index >= 0 ) + { + iChangeRequests.Remove( index ); + aOperation->Destroy(); + aOperation = NULL; + } + iOperationCount = iChangeRequests.Count(); + } + +// --------------------------------------------------------- +// CXcapDocument::DequeueAll +// +// --------------------------------------------------------- +// +void CXcapDocument::DequeueAll() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::DequeueAll()" ) ); + #endif + + while (iChangeRequests.Count() ) + { + MXdmOperation* request = iChangeRequests[0]; + iChangeRequests.Remove( 0 ); + request->Destroy(); + request = NULL; + } + } + +// --------------------------------------------------------- +// CXcapDocument::EightBitNameLC +// +// --------------------------------------------------------- +// +HBufC8* CXcapDocument::EightBitNameLC() + { + /*#ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::EightBitNameLC()" ) ); + #endif*/ + __ASSERT_DEBUG( Name().Length() > 0, User::Panic( _L( "CXcapDocument" ), 1 ) ); + HBufC8* buf = HBufC8::NewLC( Name().Length() ); + buf->Des().Copy( Name() ); + return buf; + } + +// --------------------------------------------------------- +// CXcapDocument::DocumentType +// +// --------------------------------------------------------- +// +TXdmDocType CXcapDocument::DocumentType() const + { + return iDocumentType; + } + +// --------------------------------------------------------- +// CXcapDocument::AppendNamespaceL +// +// --------------------------------------------------------- +// +void CXcapDocument::AppendNamespaceL( const TDesC8& aUri, const TDesC8& aPrefix ) + { + CXdmNamespace* ns = CXdmNamespace::NewL( aUri, aPrefix ); + CleanupStack::PushL( ns ); + User::LeaveIfError( iNamespaces.Append( ns ) ); + CleanupStack::Pop(); //ns + } + +// --------------------------------------------------------- +// CXcapDocument::RemoveNamespace +// +// --------------------------------------------------------- +// +void CXcapDocument::RemoveNamespace( const TDesC8& aUri ) + { + TBool found = EFalse; + CXdmNamespace* ns = NULL; + TInt count = iNamespaces.Count(); + for( TInt i = 0;!found && i < count;i++ ) + { + ns = iNamespaces[i]; + if( ns->Uri().Compare( aUri ) == 0 ) + { + found = ETrue; + iNamespaces.Remove( i ); + delete ns; + ns = NULL; + } + } + } + +// --------------------------------------------------------- +// CXcapDocument::Uri +// +// --------------------------------------------------------- +// +TPtrC8 CXcapDocument::Uri( const TDesC8& aPrefix ) const + { + TPtrC8 uri( _L8( "" ) ); + TBool found = EFalse; + TInt count = iNamespaces.Count(); + for( TInt i = 0;!found && i < count ;i++ ) + { + if( iNamespaces[i]->Prefix().Compare( aPrefix ) == 0 ) + { + uri.Set( iNamespaces[i]->Uri() ); + found = ETrue; + } + } + return uri; + } + +// --------------------------------------------------------- +// CXcapDocument::Count +// +// --------------------------------------------------------- +// +TInt CXcapDocument::Count() const + { + return iNamespaces.Count(); + } + +// --------------------------------------------------------- +// CXcapDocument::Prefix +// +// --------------------------------------------------------- +// +TPtrC8 CXcapDocument::Prefix( TInt aIndex ) const + { + TInt count = iNamespaces.Count(); + if( count > 0 && ( aIndex >= 0 && aIndex < count ) ) + return iNamespaces[aIndex]->Prefix(); + else return TPtrC8(); + } + +// --------------------------------------------------------- +// CXcapDocument::Uri +// +// --------------------------------------------------------- +// +TPtrC8 CXcapDocument::Uri( TInt aIndex ) const + { + TInt count = iNamespaces.Count(); + if( count > 0 && ( aIndex >= 0 && aIndex < count ) ) + return iNamespaces[aIndex]->Uri(); + else return TPtrC8(); + } + +// --------------------------------------------------------- +// CXcapDocument::ResetNamespaces +// +// --------------------------------------------------------- +// +void CXcapDocument::ResetNamespaces( ) + { + iNamespaces.ResetAndDestroy(); + } + +// --------------------------------------------------------- +// CXcapDocument::TimeStamp +// +// --------------------------------------------------------- +// +TTime CXcapDocument::TimeStamp() const + { + return iLastModification; + } + +// ---------------------------------------------------- +// CXdmDocument::SaveClientStatus +// +// ---------------------------------------------------- +// +void CXcapDocument::SaveClientStatus( TRequestStatus& aClientStatus ) + { + iClientStatus = &aClientStatus; + } + +// --------------------------------------------------------- +// CXcapDocument::DoCancel +// +// --------------------------------------------------------- +// +void CXcapDocument::DoCancel() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocument::DoCancel()" ) ); + #endif + if( iClientStatus ) + { + User::RequestComplete( iClientStatus, KErrCancel ); + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " Request completed" ) ); + #endif + } + else + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( " iClientStatus == NULL => do nothing" ) ); + #endif + } + } + + + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/src/XcapDocumentNode.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/src/XcapDocumentNode.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,281 @@ +/* +* Copyright (c) 2005 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: CXcapDocumentNode +* +*/ + + + + +// INCLUDE FILES +#include "XdmDocument.h" +#include "XcapProtocol.h" +#include "XcapDocumentNode.h" +#include "XcapNodeAttribute.h" + +// ---------------------------------------------------------- +// CXcapDocumentNode::CXcapDocumentNode +// +// ---------------------------------------------------------- +// +CXcapDocumentNode::CXcapDocumentNode( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol ) : + CXdmDocumentNode( aXdmEngine, ( MXdmNodeFactory& )*this ), + iXcapProtocol( aXcapProtocol ) + + { + } + + +// ---------------------------------------------------------- +// CXcapDocumentNode::CXcapDocumentNode +// +// ---------------------------------------------------------- +// +CXcapDocumentNode::CXcapDocumentNode( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ) : + CXdmDocumentNode( aXdmEngine, + ( MXdmNodeFactory& )*this, aParentNode ), + iXcapProtocol( aXcapProtocol ) + + { + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::CXcapDocumentNode +// +// ---------------------------------------------------------- +// +CXcapDocumentNode::CXcapDocumentNode( const TBool aLeafNode, + CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ) : + CXdmDocumentNode( aLeafNode, aXdmEngine, + ( MXdmNodeFactory& )*this, aParentNode ), + iXcapProtocol( aXcapProtocol ) + { + + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CXcapDocumentNode* CXcapDocumentNode::NewL( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol ) + { + return new ( ELeave ) CXcapDocumentNode( aXdmEngine, aXcapProtocol ); + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CXcapDocumentNode* CXcapDocumentNode::NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXcapProtocol& aXcapProtocol ) + { + CXcapDocumentNode* self = new ( ELeave ) CXcapDocumentNode( aXdmEngine, aXcapProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( aNodeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CXcapDocumentNode* CXcapDocumentNode::NewL( CXdmEngine& aXdmEngine, + CXcapProtocol& aXcapProtocol, + const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ) + { + CXcapDocumentNode* self = new ( ELeave ) CXcapDocumentNode( aXdmEngine, aXcapProtocol ); + CleanupStack::PushL( self ); + self->BaseConstructL( aAnotherNode.NodeName() ); + self->CopyConstructL( aAnotherNode, aParentNode ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CXcapDocumentNode* CXcapDocumentNode::NewL( CXdmEngine& aXdmEngine, + const TDesC& aNodeName, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ) + { + CXcapDocumentNode* self = new ( ELeave ) CXcapDocumentNode( aXdmEngine, aXcapProtocol, aParentNode ); + CleanupStack::PushL( self ); + self->BaseConstructL( aNodeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CXcapDocumentNode* CXcapDocumentNode::NewL( CXdmEngine& aXdmEngine, + const TBool aLeafNode, + const TDesC& aNodeName, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ) + { + CXcapDocumentNode* self = new ( ELeave ) CXcapDocumentNode( aLeafNode, aXdmEngine, aXcapProtocol, aParentNode ); + CleanupStack::PushL( self ); + self->BaseConstructL( aNodeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXdmDocumentNode::NewL +// +// ---------------------------------------------------------- +// +CXcapDocumentNode* CXcapDocumentNode::NewL( CXdmEngine& aXdmEngine, + const TBool aLeafNode, + CXcapProtocol& aXcapProtocol, + CXdmDocumentNode* aParentNode ) + { + return new ( ELeave ) CXcapDocumentNode( aLeafNode, aXdmEngine, aXcapProtocol, aParentNode ); + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::CopyConstructL +// +// ---------------------------------------------------------- +// +void CXcapDocumentNode::CopyConstructL( const CXdmDocumentNode& aAnotherNode, + const CXdmDocumentNode& aParentNode ) + { + CXdmDocumentNode::CopyConstructL( aAnotherNode, aParentNode ); + } + +// ---------------------------------------------------- +// CXcapDocumentNode::~CXcapDocumentNode +// +// ---------------------------------------------------- +// +EXPORT_C CXcapDocumentNode::~CXcapDocumentNode() + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocumentNode::~CXcapDocumentNode()" ) ); + #endif + delete iPrefix; + iPrefix = NULL; + } + +// ---------------------------------------------------- +// CXcapDocumentNode::ChileNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapDocumentNode::ChileNodeL() + { + return CXcapDocumentNode::NewL( iXdmEngine, EFalse, iXcapProtocol, this ); + } + +// ---------------------------------------------------- +// CXcapDocumentNode::ChileNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapDocumentNode::ChileNodeL( const TDesC& aChildName ) + { + return CXcapDocumentNode::NewL( iXdmEngine, EFalse, aChildName, iXcapProtocol, this ); + } + +// ---------------------------------------------------- +// CXcapDocumentNode::ChileNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapDocumentNode::ChileNodeL( const CXdmDocumentNode* aAnotherNode ) + { + return CXcapDocumentNode::NewL( iXdmEngine, iXcapProtocol, *aAnotherNode, *this ); + } + +// ---------------------------------------------------- +// CXcapDocumentNode::CreateAttributeL +// +// ---------------------------------------------------- +// +CXdmNodeAttribute* CXcapDocumentNode::AttributeL() + { + return CXcapNodeAttribute::NewL( iXdmEngine, this ); + } + +// ---------------------------------------------------- +// CXcapDocumentNode::CreateAttributeL +// +// ---------------------------------------------------- +// +CXdmNodeAttribute* CXcapDocumentNode::AttributeL( const TDesC& aAttributeName ) + { + return CXcapNodeAttribute::NewL( iXdmEngine, aAttributeName, this ); + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::RemoveNode +// +// ---------------------------------------------------------- +// +void CXcapDocumentNode::RemoveNode( CXcapDocumentNode* aChileNode ) + { + #ifdef _DEBUG + iXcapProtocol.WriteToLog( _L8( "CXcapDocumentNode::RemoveNode()" ) ); + #endif + CXdmDocumentNode* remove = NULL; + TInt index = iChildren.Find( aChileNode ); + __ASSERT_DEBUG( index >= 0, User::Panic( _L( "CXcapDocumentNode" ), 0 ) ); + remove = iChildren[index]; + iChildren.Remove( index ); + delete remove; + remove = NULL; + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::SetPrefix +// +// ---------------------------------------------------------- +// +void CXcapDocumentNode::SetPrefixL( const TDesC8& aPrefix ) + { + delete iPrefix; + iPrefix = NULL; + iPrefix = aPrefix.AllocL(); + } + +// ---------------------------------------------------------- +// CXcapDocumentNode::NamespacePrefix +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapDocumentNode::Prefix() const + { + return iPrefix != NULL ? iPrefix->Des() : TPtrC8(); + } + + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/src/XcapNodeAttribute.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/src/XcapNodeAttribute.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,112 @@ +/* +* Copyright (c) 2005 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: CXcapNodeAttribute +* +*/ + + + + +// INCLUDE FILES +#include "XcapProtocol.h" +#include "XcapNodeAttribute.h" + +// ---------------------------------------------------------- +// CXcapNodeAttribute::CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +CXcapNodeAttribute::CXcapNodeAttribute( CXdmEngine& aXdmEngine ) : + CXdmNodeAttribute( aXdmEngine, ( MXdmNodeFactory& )*this ) + + { + } + +// ---------------------------------------------------------- +// CXcapNodeAttribute::CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +CXcapNodeAttribute::CXcapNodeAttribute( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode ) : + CXdmNodeAttribute( aXdmEngine, + ( MXdmNodeFactory& )*this, aParentNode ) + + { + } + +// ---------------------------------------------------------- +// CXcapNodeAttribute::CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +CXcapNodeAttribute* CXcapNodeAttribute::NewL( CXdmEngine& aXdmEngine, + const TDesC& aAttributeName, + CXdmDocumentNode* aParentNode ) + { + CXcapNodeAttribute* self = new ( ELeave ) CXcapNodeAttribute( aXdmEngine, aParentNode ); + CleanupStack::PushL( self ); + self->CXdmNodeAttribute::BaseConstructL( aAttributeName ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapNodeAttribute::CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +CXcapNodeAttribute* CXcapNodeAttribute::NewL( CXdmEngine& aXdmEngine, + CXdmDocumentNode* aParentNode ) + { + CXcapNodeAttribute* self = new ( ELeave ) CXcapNodeAttribute( aXdmEngine, aParentNode ); + return self; + } + +// ---------------------------------------------------------- +// CXcapNodeAttribute::~CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +CXcapNodeAttribute::~CXcapNodeAttribute() + { + } + +// ---------------------------------------------------------- +// CXcapNodeAttribute::~CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapNodeAttribute::Prefix() const + { + return TPtrC8(); + } + +// ---------------------------------------------------------- +// CXcapNodeAttribute::~CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +void CXcapNodeAttribute::SetPrefixL( const TDesC& /*aNamespacePrefix*/ ) + { + } + +// ---------------------------------------------------------- +// CXcapNodeAttribute::~CXcapNodeAttribute +// +// ---------------------------------------------------------- +// +void CXcapNodeAttribute::SetPrefixL( const TDesC8& /*aNamespacePrefix*/ ) + { + } diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/src/XcapNodeSelector.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/src/XcapNodeSelector.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2005 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: CXcapNodeSelector +* +*/ + + + + +// INCLUDES +//This is only for logging +#include "XcapProtocol.h" +#include "XcapNodeSelector.h" + +// --------------------------------------------------------- +// C++ constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------- +// +CXcapNodeSelector::CXcapNodeSelector() + { + } + +// --------------------------------------------------------- +// Two-phased constructor. +// +// --------------------------------------------------------- +// +CXcapNodeSelector* CXcapNodeSelector::NewL() + { + CXcapNodeSelector* self = new ( ELeave ) CXcapNodeSelector(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// Symbian OS default constructor may leave. +// +// --------------------------------------------------------- +// +void CXcapNodeSelector::ConstructL() + { + + } + +// --------------------------------------------------------- +// Destructor +// +// --------------------------------------------------------- +// +CXcapNodeSelector::~CXcapNodeSelector() + { + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( "CXcapNodeSelector::~CXcapNodeSelector()" ) ); + #endif + delete iSelectorString; + } + +// End of File + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XcapProtocol/src/XcapProtocol.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XcapProtocol/src/XcapProtocol.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,765 @@ +/* +* Copyright (c) 2005 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: CXcapProtocol +* +*/ + + + +#include +#include +#include +#include +#include +#include +#include +#include +#include "XcapAppUsage.h" +#include "XcapEarlyIms.h" +#include "XcapProtocol.h" +#include "XcapDocument.h" +#include "xdmlogwriter.h" +#include "XcapDocumentNode.h" +#include "XcapDirectory.h" +#include "XdmXmlParser.h" +#include "XdmCredentials.h" +#include "XcapHttpReqGet.h" +#include "XdmProtocolInfo.h" +#include "XdmShutdownTimer.h" +#include "XcapHttpTransport.h" +#include "XdmOperationFactory.h" + +// ---------------------------------------------------------- +// CXcapProtocol::CXcapProtocol +// +// ---------------------------------------------------------- +// +CXcapProtocol::CXcapProtocol() : iSuspend( EFalse ), + iCacheUsage( EFalse ), + iTransferMediaOpen( EFalse ), + iSimRequestPending( EFalse ), + iAuthType( EXcapAuthHttpDigest ) + { + } + +// ---------------------------------------------------------- +// CXcapProtocol::DeleteLogFileL +// +// ---------------------------------------------------------- +// +CXcapProtocol* CXcapProtocol::NewL( const TXdmProtocolParams& aProtocolParams ) + { + CXcapProtocol* self = new ( ELeave ) CXcapProtocol(); + CleanupStack::PushL( self ); + self->ConstructL( aProtocolParams ); + CleanupStack::Pop(); + return self; + } + +// ---------------------------------------------------------- +// CXcapProtocol::DeleteLogFileL +// +// ---------------------------------------------------------- +// +CXcapProtocol::~CXcapProtocol() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::~CXcapProtocol()" ) ); + #endif + delete iRootUri; + delete iPublicId; + delete iXmlParser; + delete iCapabilities; + delete iImsResolver; + delete iHttpTransport; + delete iIdleTimer; + if( iCacheUsage ) + { + iCacheClient.Flush(); + #ifdef _DEBUG + WriteToLog( _L8( " Cache flushed" ) ); + #endif + iCacheClient.Close(); + #ifdef _DEBUG + WriteToLog( _L8( " Cache closed" ) ); + #endif + } + if( iConnectionManager != NULL ) + iConnectionManager->Destroy(); + #ifdef _DEBUG + WriteToLog( _L8( " ConnMan destroyed" ) ); + #endif + #ifdef _DEBUG + WriteToLog( _L8( " All finished, about to delete file logger" ) ); + #endif + delete iLogWriter; + iNotifyeeQueue.Close(); + } + +// ---------------------------------------------------------- +// CXcapProtocol::ConstructL +// +// ---------------------------------------------------------- +// +void CXcapProtocol::ConstructL( const TXdmProtocolParams& aProtocolParams ) + { + #ifdef _DEBUG + iLogWriter = CXdmLogWriter::NewL( KXcapEngLogFile ); + WriteToLog( _L8( "CXcapProtocol::ConstructL()" ) ); + #endif + iXdmEngine = CONST_CAST( CXdmEngine*, &aProtocolParams.iXdmEngine ); + iProtocolInfo = &aProtocolParams.iProtocolInfo; + TInt error = SaveSettingsL(); + if( error == KErrNone ) + { + iXmlParser = CXdmXmlParser::NewL(); + iIdleTimer = new ( ELeave ) CXdmShutdownTimer( *this, this ); + iIdleTimer->ConstructL(); + if( iProtocolInfo->IsCacheEnabled() ) + { + iCacheUsage = ETrue; + TInt error = iCacheClient.Connect(); + #ifdef _DEBUG + WriteToLog( _L8( " Cache start: %d" ), error ); + #endif + __ASSERT_DEBUG( ( error == KErrNone || error == KErrAlreadyExists ), + User::Panic( _L( "CXcapProtocol" ), 1 ) ); + } + iUserName.Copy( iCredentials.iUserName ); + iConnectionManager = NewMsgConnManagerL( iAccessPoint ); + __ASSERT_DEBUG( iRootUri->Des().Length() > 0, User::Panic( _L( "CXcapProtocol" ), 1 ) ); + TBool secure = iProtocolInfo->IsSecure() || iRootUri->Des().FindF( KHttps ) == 0; + HBufC* root = ParseRootLocationLC( secure, iRootUri->Des() ); + __ASSERT_ALWAYS( root != NULL, User::Panic( _L( "CXcapProtocol" ), 1 ) ); + iHttpTransport = CXcapHttpTransport::NewL( root->Des(), *iConnectionManager, iCredentials ); + CleanupStack::PopAndDestroy(); //root + } + else User::Leave( error ); + } + +// ---------------------------------------------------------- +// CXcapProtocol::PublicID +// +// ---------------------------------------------------------- +// +EXPORT_C TPtrC8 CXcapProtocol::PublicID() + { + return iPublicId != NULL ? iPublicId->Des() : TPtrC8(); + } + +// ---------------------------------------------------------- +// CXcapProtocol::Cache +// +// ---------------------------------------------------------- +// +EXPORT_C RXcapCache* CXcapProtocol::Cache() + { + return iCacheUsage ? &iCacheClient : NULL; + } + +// --------------------------------------------------------- +// CXcapProtocol::Parser +// +// --------------------------------------------------------- +// +EXPORT_C CXdmXmlParser& CXcapProtocol::Parser() + { + return *iXmlParser; + } + +// --------------------------------------------------------- +// CXcapProtocol::Transport +// +// --------------------------------------------------------- +// +EXPORT_C CXcapHttpTransport& CXcapProtocol::Transport() + { + return *iHttpTransport; + } + +// ---------------------------------------------------------- +// CXcapProtocol::IsNetworkAvailable +// +// ---------------------------------------------------------- +// +EXPORT_C TBool CXcapProtocol::IsNetworkAvailable() + { + return iConnectionManager->Status(); + } + +// ---------------------------------------------------------- +// CXcapProtocol::SaveSettingsL +// +// ---------------------------------------------------------- +// +TInt CXcapProtocol::SaveSettingsL() + { + TInt settingsId = iProtocolInfo->SettingsID(); + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::SaveSettingsL() - ID: %d" ), settingsId ); + #endif + CXdmSettingsCollection* settings = NULL; + TRAPD( error, settings = TXdmSettingsApi::SettingsCollectionL( settingsId ) ); + if( error == KErrNone && settings != NULL ) + { + CleanupStack::PushL( settings ); + SaveFromCollectionL( *settings ); + CleanupStack::PopAndDestroy(); //settings + } + else //Default to HTTP-DIGEST + { + iAuthType = EXcapAuthHttpDigest; + iAccessPoint = iProtocolInfo->AccessPoint(); + iCredentials = iProtocolInfo->Credentials(); + iRootUri = iProtocolInfo->Root().AllocL(); + error = iRootUri->Des().Length() > 0 && + iCredentials.iUserName.Length() > 0 && + iCredentials.iPassword.Length() > 0 ? + KErrNone : KErrArgument; + } + return error; + } + +// ---------------------------------------------------------- +// CXcapProtocol::SelectAuthType +// +// ---------------------------------------------------------- +// +void CXcapProtocol::SelectAuthTypeL( const CXdmSettingsCollection& aSettings ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::SelectAuthTypeL()" ) ); + #endif + TPtrC authType( aSettings.Property( EXdmPropAuthType ) ); + if( authType.Compare( KXdmAuthGaa ) == 0 ) + { + iAuthType = EXcapAuthGaa; + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( " GAA" ) ); + #endif + } + else if( authType.Compare( KXdmAuthEarlyIms ) == 0 ) + { + #ifndef __WINSCW__ + iAuthType = EXcapAuthEarlyIms; + ResolveIdentityL(); + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( " EARLY-IMS" ) ); + #endif + #endif + #ifdef __FAKE_IMPU__ + iAuthType = EXcapAuthEarlyIms; + ResolveIdentityL(); + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( " EARLY-IMS" ) ); + #endif + #else + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( " WINS, cannot authenticate without SIM card => ignore" ) ); + #endif + iAuthType = EXcapAuthHttpDigest; + #endif + } + else + { + iAuthType = EXcapAuthHttpDigest; + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( " HTTP-DIGEST" ) ); + #endif + } + //Fallback position: in case the server challenges us even though EXcapAuthEarlyIms + //has been defined, use the credentials the client supplied regardless of what they are. + TPtrC authName( aSettings.Property( EXdmPropAuthName ) ); + TPtrC authSecret( aSettings.Property( EXdmPropAuthSecret ) ); + //But they must not exceed the stipulated length + __ASSERT_ALWAYS( authName.Length() <= KXdmMaxUserNameLength, User::Leave( KErrCorrupt ) ); + __ASSERT_ALWAYS( authSecret.Length() <= KXdmMaxPasswordLength, User::Leave( KErrCorrupt ) ); + iCredentials = TXdmCredentials( authName, authSecret ); + } + +// ---------------------------------------------------------- +// CXcapProtocol::SaveFromCollectionL +// +// ---------------------------------------------------------- +// +void CXcapProtocol::SaveFromCollectionL( const CXdmSettingsCollection& aSettings ) + { + #ifdef _DEBUG + for( TInt i = 0;i < aSettings.Count();i++ ) + { + const CXdmSettingsProperty& prop = aSettings.Property( i ); + HBufC8* value = HBufC8::NewLC( prop.PropertyValue().Length() ); + value->Des().Copy( prop.PropertyValue() ); + TPtrC8 valueDes( value->Des() ); + WriteToLog( _L8( " Property %d - Name: %d Value: %S" ), i, prop.PropertyName(), &valueDes ); + CleanupStack::PopAndDestroy(); //value + } + #endif + SelectAuthTypeL( aSettings ); + __ASSERT_DEBUG( aSettings.Property( EXdmPropToNapId ).Length() > 0, User::Leave( KErrCorrupt ) ); + __ASSERT_DEBUG( aSettings.Property( EXdmPropUri ).Length() > 0, User::Leave( KErrCorrupt ) ); + TLex accessPoint( aSettings.Property( EXdmPropToNapId ) ); + TInt error = accessPoint.Val( iAccessPoint ); + __ASSERT_DEBUG( error == KErrNone, User::Leave( KErrCorrupt ) ); + iRootUri = aSettings.Property( EXdmPropUri ).AllocL(); + #ifdef _DEBUG + TBuf8 name( iCredentials.iUserName ); + TBuf8 password( iCredentials.iPassword ); + HBufC8* rootUri = HBufC8::NewLC( iRootUri->Des().Length() ); + rootUri->Des().Copy( iRootUri->Des() ); + TPtrC8 uriDes( rootUri->Des() ); + WriteToLog( _L8( " Finished - Error: %d" ), error ); + WriteToLog( _L8( " Access point: %d" ), iAccessPoint ); + WriteToLog( _L8( " URI: %S" ), &uriDes ); + WriteToLog( _L8( " User name: %S" ), &name ); + WriteToLog( _L8( " Password: %S" ), &password ); + CleanupStack::PopAndDestroy(); //rootUri + #endif + iUserName.Copy( iCredentials.iUserName ); + } + +// ---------------------------------------------------------- +// CXcapProtocol::ParseRootLocationLC +// +// ---------------------------------------------------------- +// +HBufC* CXcapProtocol::ParseRootLocationLC( const TBool aSecurity, + const TDesC& aRootLocation ) + { + #ifdef _DEBUG + TBuf8<1024> root; + root.Copy( aRootLocation ); + WriteToLog( _L8( "CXcapProtocol::ParseRootLocationLC()" ) ); + WriteToLog( _L8( " Security: %d" ), aSecurity ); + WriteToLog( _L8( " Provided URI: %S" ), &root ); + #endif + HBufC* ret = NULL; + HBufC* temp = CheckProtocolPrefixL( aRootLocation ); + if( temp != NULL ) + { + CleanupStack::PushL( temp ); + ret = aSecurity ? ConstructSecureUriL( temp->Des() ) : + ConstructStandardUriL( temp->Des() ); + CleanupStack::PopAndDestroy(); //temp + } + else + ret = aSecurity ? ConstructSecureUriL( aRootLocation ) : + ConstructStandardUriL( aRootLocation ); + TPtr desc( ret->Des() ); + if( desc[desc.Length() - 1] == '/' ) + desc.Delete( desc.Length() - 1, 1 ); + CleanupStack::PushL( ret ); + return ret; + } + +// ---------------------------------------------------------- +// CXcapProtocol::CheckProtocolPrefixLC +// +// ---------------------------------------------------------- +// +HBufC* CXcapProtocol::CheckProtocolPrefixL( const TDesC& aRootLocation ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::CheckProtocolPrefixL()" ) ); + #endif + HBufC* buffer = NULL; + if( aRootLocation.FindF( KHttp ) == 0 || aRootLocation.FindF( KHttps ) == 0 ) + { + TInt length = aRootLocation.FindF( KHttp ) == 0 ? + KHttp().Length() : KHttps().Length(); + buffer = HBufC::NewL( aRootLocation.Length() - length ); + TPtrC desc( aRootLocation ); + TPtrC temp = desc.Right( aRootLocation.Length() - length ); + buffer->Des().Copy( temp ); + } + return buffer; + } + +// ---------------------------------------------------------- +// CXcapProtocol::ConstructStandardUriL +// +// ---------------------------------------------------------- +// +HBufC* CXcapProtocol::ConstructStandardUriL( const TDesC& aBasicUri ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::ConstructStandardUriLC()" ) ); + #endif + HBufC* ret = HBufC::NewL( aBasicUri.Length() + + TPtrC( KHttp ).Length() ); + TPtr desc( ret->Des() ); + desc.Copy( KHttp ); + desc.Append( aBasicUri ); + return ret; + } + +// ---------------------------------------------------------- +// CXcapProtocol::ConstructSecureUriL +// +// ---------------------------------------------------------- +// +HBufC* CXcapProtocol::ConstructSecureUriL( const TDesC& aBasicUri ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::ConstructSecureUriLC()" ) ); + #endif + TInt index = aBasicUri.FindF( KHostSeparator ); + HBufC* ret = HBufC::NewL( aBasicUri.Length() + + TPtrC( KHttps ).Length() ); + TPtr uriDesc( ret->Des() ); + if( index > 0 ) + { + TPtrC basic( aBasicUri.Left( index ) ); + TPtrC theRest( aBasicUri.Mid( index ) ); + uriDesc.Copy( KHttps ); + uriDesc.Append( basic ); + uriDesc.Append( theRest ); + } + else + { + uriDesc.Copy( KHttps ); + uriDesc.Append( aBasicUri ); + } + return ret; + } + +// ---------------------------------------------------------- +// CXcapProtocol::ResolveIdentityL +// +// ---------------------------------------------------------- +// +void CXcapProtocol::ResolveIdentityL() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::ResolveIdentityL()" ) ); + #endif + iImsResolver = CXcapEarlyIms::NewL(); + iImsResolver->RequestSimDataL( this ); + iSimRequestPending = ETrue; + } + +// --------------------------------------------------------- +// CXcapProtocol::CheckActivity +// +// --------------------------------------------------------- +// +void CXcapProtocol::CheckActivity() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::CheckActivity()" ) ); + #endif + TBool activity = EFalse; + const RPointerArray& documents = iXdmEngine->DocumentCollection(); + const RPointerArray& directories = iXdmEngine->DirectoryCollection(); + TInt docCount = documents.Count(); + TInt dirCount = directories.Count(); + if( docCount > 0 || dirCount > 0 ) + { + TInt i = 0; + for( ;!activity && i < docCount;i++ ) + activity = documents[i]->IsActive(); + for( i = 0 && !activity;!activity && i < dirCount;i++ ) + activity = directories[i]->IsActive(); + } + if( !activity ) + { + //Just in case... + iIdleTimer->Cancel(); + iIdleTimer->Start( iIdleTimeout * 1000000 ); + } + } + +// --------------------------------------------------------- +// CXcapProtocol::SimRequestPending +// +// --------------------------------------------------------- +// +TBool CXcapProtocol::IsSimRequestPending( TInt& aError ) const + { + aError = iSimRequestPending ? KErrNotReady : iImsResolverError; + return iSimRequestPending; + } + +// --------------------------------------------------------- +// CXcapProtocol::AppendNotifyeeL +// +// --------------------------------------------------------- +// +void CXcapProtocol::AppendNotifyeeL( CXcapDocument* aPendingDoc ) + { + User::LeaveIfError( iNotifyeeQueue.Append( aPendingDoc ) ); + } + +// --------------------------------------------------------- +// CXcapProtocol::CancelImsResolver +// +// --------------------------------------------------------- +// +void CXcapProtocol::CancelImsResolver() + { + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( "CXcapDocument::CancelImsResolver()" ) ); + #endif + if( iImsResolver ) + iImsResolver->Cancel(); + } + +// --------------------------------------------------------- +// CXcapDocument::RequestComplete +// +// --------------------------------------------------------- +// +void CXcapProtocol::RequestComplete( TInt aError ) + { + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( "CXcapDocument::RequestComplete()" ) ); + #endif + if( aError == KErrNone ) + { + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( " Public ID retrieved successfully" ) ); + #endif + iPublicId = iImsResolver->PublicIDL().AllocL(); + delete iImsResolver; + iImsResolver = NULL; + } + else + { + #ifdef _DEBUG + CXcapProtocol::WriteToLog( _L8( " Public ID retrieval failed - Status: %d" ), aError ); + #endif + iImsResolverError = aError; + } + for( TInt i = 0;i < iNotifyeeQueue.Count();i++ ) + { + CXcapDocument* document = iNotifyeeQueue[i]; + if( document ) + document->NotifyResolverCompleteL( aError ); + } + iSimRequestPending = EFalse; + iNotifyeeQueue.Reset(); + } + +// ---------------------------------------------------------- +// CXcapProtocol::WriteToLog +// +// ---------------------------------------------------------- +// +void CXcapProtocol::WriteToLog( TRefByValue aFmt,... ) const + { + VA_LIST list; + VA_START( list, aFmt ); + TBuf8 buf; + buf.FormatList( aFmt, list ); + iLogWriter->WriteToLog( buf ); + } + +// ---------------------------------------------------- +// CXcapProtocol::InitTransferMedium +// +// ---------------------------------------------------- +// +void CXcapProtocol::InitTransferMedium( TInt aIdleTimeout, TRequestStatus& aStatus ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::InitTransferMedium()" ) ); + #endif + iIdleTimer->Cancel(); + iIdleTimeout = aIdleTimeout; + if( !IsNetworkAvailable() ) + iConnectionManager->StartConnection( aStatus ); + else //Already open + { + TRequestStatus* status = &aStatus; + User::RequestComplete( status, KErrNone ); + } + } + +// ---------------------------------------------------- +// CXcapProtocol::CancelTransferMediumInit +// +// ---------------------------------------------------- +// +void CXcapProtocol::CancelTransferMediumInit() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::CancelTransferMediumInit()" ) ); + #endif + TInt error = KErrNone; + TRAP( error, iConnectionManager->CancelStartL() ); + #ifdef _DEBUG + WriteToLog( _L8( " Transfer media cancel completed - Error: %d" ), error ); + #endif + //Suppress build warning + error = KErrNone; + } + +// --------------------------------------------------------- +// CXcapProtocol::IsTransferAvailable +// +// --------------------------------------------------------- +// +TBool CXcapProtocol::IsTransferAvailable() const + { + return iConnectionManager->Status(); + } + +// --------------------------------------------------------- +// CXcapProtocol::AuthType +// +// --------------------------------------------------------- +// +TXcapAuthType CXcapProtocol::AuthType() const + { + return iAuthType; + } + +// --------------------------------------------------------- +// CXdmEngine::XdmProtocol +// +// --------------------------------------------------------- +// +void CXcapProtocol::SwitchOff() + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::SwitchOff()" ) ); + #endif + iConnectionManager->StopConnection(); + } + +// ---------------------------------------------------- +// CXcapProtocol::CreateDocumentL +// +// ---------------------------------------------------- +// +CXdmDocument* CXcapProtocol::CreateDocumentL( const TDesC& aDocumentName, + const TXdmDocType aDocumentType ) + { + return CXcapDocument::NewL( aDocumentType, aDocumentName, *iXdmEngine, *this ); + } + +// ---------------------------------------------------- +// CXcapProtocol::CreateDirectoryL +// +// ---------------------------------------------------- +// +CXdmDirectory* CXcapProtocol::CreateDirectoryL( const TDesC& aDirectoryPath ) + { + _LIT( KDirectoryDocName, "directory.xml" ); + CXdmDocument* document = iXdmEngine->CreateDocumentModelL( KDirectoryDocName, EXdmDirectory ); + CleanupStack::PushL( document ); + CXdmDirectory* directory = CXcapDirectory::NewL( aDirectoryPath, *iXdmEngine, document, *this ); + CleanupStack::Pop(); //document + return directory; + } + +// ---------------------------------------------------- +// CXcapProtocol::CreateDocumentNodeL +// +// ---------------------------------------------------- +// +CXdmDocumentNode* CXcapProtocol::CreateDocumentNodeL() + { + return CXcapDocumentNode::NewL( *iXdmEngine, *this ); + } + +// --------------------------------------------------------- +// CXcapProtocol::GenerateUniqueIdL +// +// --------------------------------------------------------- +// +TInt CXcapProtocol::GenerateUniqueIdL() + { + TInt period = 0; + User::LeaveIfError( HAL::Get( HALData::ESystemTickPeriod, period ) ); + TInt millisecsPerTick = period / 1000; + return User::TickCount() * millisecsPerTick; + } + +// ---------------------------------------------------------- +// CXdmProtocol::UserName +// +// ---------------------------------------------------------- +// +TPtrC8 CXcapProtocol::UserName() const + { + return iUserName; + } + +// ---------------------------------------------------------- +// CXdmProtocol::HandleBearerEventL +// +// ---------------------------------------------------------- +// +void CXcapProtocol::HandleBearerEventL( TBool aAuthoritativeClose, + TMsgBearerEvent aBearerEvent ) + { + #ifdef _DEBUG + WriteToLog( _L8( "CXcapProtocol::HandleBearerEventL(): %d" ), aBearerEvent ); + #endif + switch( aBearerEvent ) + { + case EMsgBearerSuspended: + #ifdef _DEBUG + WriteToLog( _L8( " Bearer suspended" ) ); + #endif + iSuspend = ETrue; + break; + case EMsgBearerActive: + #ifdef _DEBUG + WriteToLog( _L8( " Bearer active" ) ); + #endif + iSuspend = EFalse; + break; + case EMsgBearerLost: + #ifdef _DEBUG + WriteToLog( _L8( " Bearer lost - Authoritative: %d" ), + aAuthoritativeClose ); + #endif + break; + default: + //Suppress build warning + aAuthoritativeClose = EFalse; + break; + } + } + +// --------------------------------------------------------- +// Map the interface UIDs to implementation factory functions +// +// --------------------------------------------------------- +// +const TImplementationProxy ImplementationTable[] = + { +#ifdef __EABI__ + IMPLEMENTATION_PROXY_ENTRY( 0x10207423, CXcapProtocol::NewL ) +#else + { { 0x10207423 }, CXcapProtocol::NewL } +#endif + }; + +// --------------------------------------------------------- +// Return the implementation table & number of implementations +// +// --------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) + { + aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy ); + return ImplementationTable; + } + + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/bwinscw/XdmXmlParserU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/bwinscw/XdmXmlParserU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,9 @@ +EXPORTS + ??1CXdmXmlParser@@UAE@XZ @ 1 NONAME ; CXdmXmlParser::~CXdmXmlParser(void) + ?FormatToXmlLC@CXdmXmlParser@@QAEPAVHBufC8@@ABVTDesC8@@PBVCXdmDocument@@PBVCXdmDocumentNode@@@Z @ 2 NONAME ; class HBufC8 * CXdmXmlParser::FormatToXmlLC(class TDesC8 const &, class CXdmDocument const *, class CXdmDocumentNode const *) + ?FormatToXmlLC@CXdmXmlParser@@QAEPAVHBufC8@@HPBVCXdmDocument@@PBVCXdmDocumentNode@@@Z @ 3 NONAME ; class HBufC8 * CXdmXmlParser::FormatToXmlLC(int, class CXdmDocument const *, class CXdmDocumentNode const *) + ?NewL@CXdmXmlParser@@SAPAV1@XZ @ 4 NONAME ; class CXdmXmlParser * CXdmXmlParser::NewL(void) + ?ParseDocumentL@CXdmXmlParser@@QAEXABVTDesC8@@PAVCXdmDocumentNode@@@Z @ 5 NONAME ; void CXdmXmlParser::ParseDocumentL(class TDesC8 const &, class CXdmDocumentNode *) + ?ParseDocumentL@CXdmXmlParser@@QAEXPAVCXdmDocument@@ABVTDesC8@@@Z @ 6 NONAME ; void CXdmXmlParser::ParseDocumentL(class CXdmDocument *, class TDesC8 const &) + ?ParseDocumentL@CXdmXmlParser@@QAEXPAVCXdmDocument@@ABVTDesC8@@PAVCXdmDocumentNode@@@Z @ 7 NONAME ; void CXdmXmlParser::ParseDocumentL(class CXdmDocument *, class TDesC8 const &, class CXdmDocumentNode *) + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/eabi/XdmXmlParserU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/eabi/XdmXmlParserU.DEF Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,12 @@ +EXPORTS + _ZN13CXdmXmlParser13FormatToXmlLCERK6TDesC8PK12CXdmDocumentPK16CXdmDocumentNode @ 1 NONAME + _ZN13CXdmXmlParser13FormatToXmlLCEiPK12CXdmDocumentPK16CXdmDocumentNode @ 2 NONAME + _ZN13CXdmXmlParser14ParseDocumentLEP12CXdmDocumentRK6TDesC8 @ 3 NONAME + _ZN13CXdmXmlParser14ParseDocumentLEP12CXdmDocumentRK6TDesC8P16CXdmDocumentNode @ 4 NONAME + _ZN13CXdmXmlParser14ParseDocumentLERK6TDesC8P16CXdmDocumentNode @ 5 NONAME + _ZN13CXdmXmlParser4NewLEv @ 6 NONAME + _ZTI13CXdmXmlParser @ 7 NONAME ; ## + _ZTI21CXdmXmlContentHandler @ 8 NONAME ; ## + _ZTV13CXdmXmlParser @ 9 NONAME ; ## + _ZTV21CXdmXmlContentHandler @ 10 NONAME ; ## + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/group/XdmXmlParser.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/group/XdmXmlParser.mmp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2005 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: XdmXmlParser +* +*/ + + + +#include + +TARGET xdmxmlparser.dll +TARGETTYPE dll +UID 0x1000008d 0x10207412 +CAPABILITY CAP_GENERAL_DLL +VENDORID VID_DEFAULT + +SOURCEPATH ../src + +USERINCLUDE ../inc +USERINCLUDE ../../inc + +//Application classes +SOURCE XdmXmlParser.cpp +SOURCE XmlFormatter.cpp +SOURCE XmlParserNodePath.cpp +SOURCE XdmXmlContentHandler.cpp + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include/xml +SYSTEMINCLUDE ../../../inc + + +LIBRARY hal.lib +LIBRARY bafl.lib +LIBRARY efsrv.lib +LIBRARY euser.lib +//For debug libraries +DEBUGLIBRARY flogger.lib +LIBRARY xdmengine.lib +LIBRARY xmlframework.lib + +#if defined( ARMCC ) + DEFFILE ../eabi/ +#elif defined ( WINSCW ) + deffile ../bwinscw/ +#elif defined (WINS ) + deffile ../BWINS/ +#endif diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/group/bld.inf Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2005 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: XdmXmlParser +* +*/ + + + +PRJ_PLATFORMS +//-------------------- +DEFAULT + +//-------------------- +PRJ_MMPFILES +//-------------------- +XdmXmlParser.mmp + diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/inc/XdmXmlContentHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/inc/XdmXmlContentHandler.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,278 @@ +/* +* Copyright (c) 2005 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: CXdmXmlContentHandler +* +*/ + + + + +#ifndef __XDMXMLCONTENTHANDLER__ +#define __XDMXMLCONTENTHANDLER__ + +//INCLUDES +#include +#include "XmlNodePathInterface.h" + +using namespace Xml; + +class CXdmDocument; +class CXdmXmlParser; +class MXdmNodeInterface; +class CXmlParserNodePath; + +//CLASS DECLARATION +class CXdmXmlContentHandler : public CBase, + public MContentHandler, + public MXmlNodePathInterface + { + public: // Constructors and destructor + + /** + * Symbian OS Constructor + * @param CXdmXmlParser Reference to the main parser class + * @return CXdmXmlContentHandler A new content handler + */ + static CXdmXmlContentHandler* NewL( CXdmXmlParser& aParserMain ); + + /** + * Destructor. + */ + virtual ~CXdmXmlContentHandler(); + + public: // New functions + + /** + * Reset content handler + * @return void + */ + void Reset(); + + /** + * Set the target document + * @param CXdmDocument& Reference to a document model + * @return void + */ + void SetTarget( const CXdmDocument& aTargetDocument ); + + /** + * Set the target element + * @param CXdmDocumentNode Referene to document/fragment root + * @return void + */ + void SetTarget( const CXdmDocumentNode& aDocumentRoot ); + + /** + * Set the target document and element + * @param CXdmDocument Reference to a document model + * @param CXdmDocumentNode Referene to document/fragment root + * @return void + */ + void SetTargetL( const CXdmDocument& aTargetDocument, + const CXdmDocumentNode& aTargetNode ); + + public: //From MXmlNodePathInterface + + /** + * Return the target attribute + * @return CXdmNodeAttribute* Target attribute + */ + CXdmNodeAttribute* TargetAttribute() const; + + private: + + /** + * C++ Constructor + * @param CXdmXmlParser Reference to the main parser class + * @return CXdmXmlContentHandler + */ + CXdmXmlContentHandler( CXdmXmlParser& aParserMain ); + + /** + * Symbian OS second-phase constructor + */ + void ConstructL(); + + private: //From Xml::MContentHandler + + /** + * Get extended interface + * @param TInt32 UID of the interface + * @return TAny* a general pointer to the interface + */ + TAny* GetExtendedInterface( const TInt32 aUid ); + + /** + * Called on content: content + * @param TDesC& Content bytes + * @param TInt Error code + * @return void + */ + void OnContentL( const TDesC8 &aBytes, + TInt aErrorCode ); + + /** + * Called on document end + * @param TInt Error code + * @return void + */ + void OnEndDocumentL( TInt aErrorCode ); + + /** + * Called on element end + * @param RTagInfo& Tag info + * @param TInt Error code + * @return void + */ + void OnEndElementL( const RTagInfo& aElement, + TInt aErrorCode ); + + /** + * Called on prefix mapping end + * @param RString& Prefix + * @param TInt Error code + * @return void + */ + void OnEndPrefixMappingL( const RString &aPrefix, + TInt aErrorCode ); + + /** + * Called on error + * @param TInt Error code + * @return void + */ + void OnError( TInt aErrorCode ); + + /** + * Called on ingnorable whitespace + * @param TDesC8& Whitespace bytes + * @param TInt Error code + * @return void + */ + void OnIgnorableWhiteSpaceL( const TDesC8& aBytes, + TInt aErrorCode ); + + /** + * Called on processing instructions + * @param TDesC8& Target + * @param TDesC8& Data + * @param TInt Error code + * @return void + */ + void OnProcessingInstructionL( const TDesC8& aTarget, + const TDesC8& aData, + TInt aErrorCode ); + + /** + * Called on skipped entity + * @param RString& Name of the entity + * @param TInt Error code + * @return void + */ + void OnSkippedEntityL( const RString &aName, + TInt aErrorCode ); + + /** + * Called on document start + * @param RDocumentParameters& Parameters + * @param TInt Error code + * @return void + */ + void OnStartDocumentL( const RDocumentParameters& aDocParam, + TInt aErrorCode ); + + /** + * Called on element start + * @param RTagInfo& The starting element + * @param Xml::RAttributeArray Attributes + * @param TInt Error code + * @return void + */ + void OnStartElementL( const RTagInfo& aElement, + const Xml::RAttributeArray &aAttributes, + TInt aErrorCode ); + + /** + * Called on prefix mapping start + * @param RString& Prefix + * @param RString& URI + * @param TInt Error code + * @return void + */ + void OnStartPrefixMappingL( const RString& aPrefix, + const RString& aUri, + TInt aErrorCode ); + + private: + + /** + * Append attributes from the parameter array + * @param Xml::RAttributeArray& Attributes + * @return void + */ + void AppendAttributeValueL( const Xml::RAttributeArray& aAttributes ); + + /** + * Handle next element + * @param RTagInfo& The new element + * @param Xml::RAttributeArray& Attributes + * @return void + */ + void HandleNextElementL( const Xml::RTagInfo& aElement, + const Xml::RAttributeArray& aAttributes ); + /** + * Is the parameter descriptor a whitespace + * @param TDesC8& Bytes to check + * @return TBool + */ + TBool IsWhiteSpace( const TDesC8& aBytes ) const; + + /** + * Append a new namespace + * @param TDesC8& Prefix + * @param TDesC8& URI + * @return void + */ + void AppendNameSpaceL( const TDesC8& aPrefix, const TDesC8& aUri ); + + /** + * Set the namespace information to the current node + * @param RTagInfo& Element + * @param MXdmNodeInterface* Node interface + * @return void + */ + void SetNamespaceInformationL( const RTagInfo& aElement, + MXdmNodeInterface* aXcapNode ); + + private: // Data + + TInt iContentIndex; + TBool iFinished; + TBool iIsRootNode; + TBool iTargetFound; + TXdmElementType iElementType; + TBool iPartialDocument; + CBufFlat* iContentBuffer; + CXdmDocument* iTargetDocument; + CXdmDocumentNode* iRootNode; + CXdmDocumentNode* iDocumentSubset; + CXdmDocumentNode* iCurrentNode; + CXdmNodeAttribute* iTargetAttribute; + CXmlParserNodePath* iNodePath; + CXdmXmlParser& iParserMain; + }; + +#endif // __XDMXMLCONTENTHANDLER__ + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/inc/XdmXmlParser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/inc/XdmXmlParser.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,175 @@ +/* +* Copyright (c) 2005 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: CXdmXmlParser +* +*/ + + + + +#ifndef __XDMXMLPARSER__ +#define __XDMXMLPARSER__ + +#include + +//CONSTANTS +_LIT( KParserLogFile, "XcapXml" ); +_LIT8( KDefaultMimeType, "text/xml" ); + +using namespace Xml; + +//FORWARD DECLARATION +class CXdmDocument; +class CXdmLogWriter; +class CXmlFormatter; +class CXdmDocumentNode; +class MXdmNodeInterface; +class CXdmXmlContentHandler; +class MXdmNamespaceContainer; + +// CLASS DECLARATION +class CXdmXmlParser: public CBase + { + public: // Constructors and destructor + + /** + * Symbian OS Constructor + * @return CXdmXmlParser New parser intance + */ + IMPORT_C static CXdmXmlParser* NewL(); + + /** + * Parse an XML document + * @param CXdmDocument Document instance + * @param TDesC8& The raw XML data + * @return void + */ + IMPORT_C void ParseDocumentL( CXdmDocument* aDocument, + const TDesC8& aXmlDocument ); + + /** + * Parse an XML document + * @param CXdmDocument Document instance + * @param TDesC8& The raw XML data + * @param Pointer to the document/fragment root + * @return void + */ + IMPORT_C void ParseDocumentL( CXdmDocument* aDocument, + const TDesC8& aXmlDocument, + CXdmDocumentNode* aDocumentSubset ); + + /** + * Parse an XML document + * @param TDesC8& The raw XML data + * @param Pointer to the document/fragment root + * @return void + */ + IMPORT_C void ParseDocumentL( const TDesC8& aXmlDocument, + CXdmDocumentNode* aDocumentRoot ); + + /** + * Format a document model into textual form + * @param TBool Indicates whether the document is whole + * @param CXdmDocument The document instance + * @param CXdmDocumentNode Pointer to the document/fragment root + * @return HBufC8* The document in textual form + */ + IMPORT_C HBufC8* FormatToXmlLC( TBool aIsWholeDocument, + const CXdmDocument* aDocument, + const CXdmDocumentNode* aRootNode ); + + /** + * Format a document model into textual form and append the fragment + * in the first parameter to the correct place inside the document. + * @param TDesC8& The fragment to append + * @param CXdmDocument The document instance + * @param CXdmDocumentNode Pointer to the fragment + * @return HBufC8* The document in textual form + */ + IMPORT_C HBufC8* FormatToXmlLC( const TDesC8& aXmlFragment, + const CXdmDocument* aDocument, + const CXdmDocumentNode* aTargetNode ); + + /** + * Destructor. + */ + IMPORT_C virtual ~CXdmXmlParser(); + + public: + + #ifdef _DEBUG + + /** + * Write to log file + * @param TRefByValue The log line + * @return void + */ + void WriteToLog( TRefByValue aFmt,... ) const; + + #endif + + public: + + /** + * Stop the parser + * @return void + */ + void FinishParsingL(); + + private: + + /** + * C++ constructor is private + * @return CXdmXmlParser + */ + CXdmXmlParser(); + + /** + * Second-phase constructor + * @return void + */ + void ConstructL(); + + #ifdef _DEBUG + + /** + * Return the current system time + * @return TInt Current system time in integer format + */ + static TInt TimeL(); + + /** + * Write the formatted document to the log folder + * @param HBufC8* Pointer to the data segment + * @return void + */ + void DumpDocumentL( HBufC8* aDocData ); + + #endif + + private: //Data + + TInt iDumpIndex; + TPtr8 iXmlDocument; + CParser* iXmlParser; + CXdmLogWriter* iLogWriter; + CXmlFormatter* iXmlFormatter; + TRequestStatus* iClientStatus; + CXdmXmlContentHandler* iContentHandler; + }; + +#endif //__XDMXMLPARSER__ + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/inc/XmlFormatter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/inc/XmlFormatter.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,212 @@ +/* +* Copyright (c) 2005 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: CXmlFormatter +* +*/ + + + + +#ifndef __XMLFORMATTER__ +#define __XMLFORMATTER__ + +// INCLUDES +#include +#include "XmlParserNodePath.h" +#include "XmlNodePathInterface.h" + +//Konsts +_LIT8( KXmldocumentStart, "\n" ); + +//Forwar declarations +class CXdmDocument; +class CXdmXmlParser; +class CXdmDocumentNode; +class MXdmNodeInterface; +class CXmlParserNodePath; + +// CLASS DECLARATION +NONSHARABLE_CLASS( CXmlFormatter ) : public CBase, + public MXmlNodePathInterface + { + public: // Constructors and destructor + + /** + * Symbian OS Constructor + * @return CXmlFormatter* New XML formatter + */ + static CXmlFormatter* NewL( CXdmXmlParser& aParserMain ); + + /** + * Format a document + * @param TBool Indicates whether parameter is a whole document + * @param CXdmDocument* The target document + * @param CXdmDocumentNode* The target element + * @return HBufC8* The document in textual form + */ + HBufC8* FormatLC( TBool aIsWholeDocument, + const CXdmDocument* aDocument, + const CXdmDocumentNode* aRootNode ); + + /** + * Format a document + * @param TDesC8& An XML fragment to append + * @param CXdmDocument* The target document + * @param CXdmDocumentNode* The target element + * @return HBufC8* The document in textual form + */ + HBufC8* FormatLC( const TDesC8& aXmlFragment, + const CXdmDocument* aDocument, + const CXdmDocumentNode* aTargetNode ); + + /** + * Destructor + */ + virtual ~CXmlFormatter(); + + private: //From MXmlParserNodePathInterface + + /** + * Return the target attribute + * @return CXdmNodeAttribute* target attribute + */ + CXdmNodeAttribute* TargetAttribute() const; + + private: + + /** + * C++ constructor + * @return CXmlFormatter + */ + CXmlFormatter( CXdmXmlParser& aParserMain ); + + /** + * Symbian OS second-phase constructor + * @return void + */ + void ConstructL(); + + /** + * Read data from the format buffer into a contiguous segment + * @return HBufC8* An XML document in textual form + */ + HBufC8* BufferToStringLC(); + + /** + * Check the next element in a document + * @param CXdmDocumentNode& An XML element + * @return void + */ + void CheckSubsetPath( const CXdmDocumentNode& aNode ); + + /** + * Reset the internal format buffer + * @return void + */ + void ResetFormatBuffer(); + + /** + * Find the (local) name of an element + * @param TDesC8& The whole element string + * @return TPtrC8 Name part of the element string + */ + TPtrC8 FindElementName( const TDesC8& aElementString ); + + /** + * Format namespace declarations + * @param CXdmDocumentNode& An XML element + * @return MXdmNamespaceContainer& Namespace container + */ + void FormatNamespaceDeclarationsL( const CXdmDocumentNode& aRootNode, + const MXdmNamespaceContainer& aContainer ); + + /** + * Format the parameter element and its descendants + * @param CXdmDocumentNode The element to format + * @return void + */ + void FormatElementsL( CXdmDocumentNode* aCurrentNode ); + + /** + * Format a leaf element + * @param CXdmDocumentNode The element to format + * @return void + */ + void FormatLeafElementL( CXdmDocumentNode* aCurrentNode ); + + /** + * Format the start of the parameter element + * @param TDesC8& Element prefix + * @param TDesC8& Element URI + * @return void + */ + void FormatElementStartL( const TDesC8& aPrefix, + const TDesC8& aElementData ); + + /** + * Format the end of the parameter element + * @param TDesC8& Element prefix + * @param TDesC8& Element URI + * @return void + */ + void FormatElementEndL( const TDesC8& aPrefix, + const TDesC8& aElementData ); + + /** + * Format an empty element + * @param CXdmDocumentNode The element to format + * @return void + */ + void FormatEmptyElementL( CXdmDocumentNode* aEmptyNode ); + + + /** + * Append a namespace mapping + * @param TDesC8& Element URI + * @param TDesC8& Element prefix + * @return void + */ + void AppendNamespaceL( const TDesC8& aUri, const TDesC8& aPrefix ); + + /** + * Append XML fragment into the format buffer + * @return void + */ + void AppendXmlFragmentL(); + + /** + * Return the prefix of the parameter element + * @param MXdmNodeInterface& An XML element + * @return TPtrC8 Prefix + */ + TPtrC8 Prefix( const MXdmNodeInterface& aInterface ); + + private: //Data + + TInt iFormBufferPos; + TBool iTargetFound; + TBool iIsAppended; + CBufSeg* iFormatBuffer; + TPtrC8 iDocumentFragment; + CXdmXmlParser& iParserMain; + CXdmNodeAttribute* iTargetAttribute; + CXmlParserNodePath* iNodePath; + TXdmElementType iElementType; + + }; + +#endif //__XMLPARSERNODEPATH__ + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/inc/XmlNodePathInterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/inc/XmlNodePathInterface.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2005 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: MXmlNodePathInterface +* +*/ + + + + +#ifndef __XMLNODEPATHINTERFACE__ +#define __XMLNODEPATHINTERFACE__ + +// INCLUDES +#include + +class CXdmNodeAttribute; + +// CLASS DECLARATION +NONSHARABLE_CLASS( MXmlNodePathInterface ) + { + public: + + /** + * Copies the request data + * @param aRequestData Data to be sent + */ + virtual CXdmNodeAttribute* TargetAttribute() const = 0; + }; + +#endif //__XMLPARSERNODEPATH__ + + +// End of File diff -r 2669f8761a99 -r fbd2e7cec7ef xdmprotocols/XdmXmlParser/inc/XmlParserDefines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/inc/XmlParserDefines.h Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2005 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: XmlParserDefines +* +*/ + + + + +#ifndef __XMLPARSERDEFINES__ +#define __XMLPARSERDEFINES__ + +// INCLUDES +#include + +_LIT8( KEquelsSignString, "=" ); +_LIT8( KQuotationSignString, "\"" ); +_LIT8( KSlashString, "/" ); +_LIT8( KCommentString, "