# HG changeset patch # User guru.kini@nokia.com # Date 1277386787 -19800 # Node ID da856f45b798f1c768abf7562994db8dfe6d145f # Parent 78fbd574edf49bde6d9abb7e4fc0e6b724d86921 Committing ZeroConf for 10.1 to the FCL. diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/bwins/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/bwins/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/bwins/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/bwins/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/bwins/mdnscachemanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/bwins/mdnscachemanageru.def Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,29 @@ +EXPORTS + ?SetPtrRecord@CCacheEntry@@QAEXPAVCRdTypePtr@@@Z @ 1 NONAME ; void CCacheEntry::SetPtrRecord(class CRdTypePtr *) + ?NumberOfEntries@CMDNSCacheManager@@UAEIXZ @ 2 NONAME ; unsigned int CMDNSCacheManager::NumberOfEntries(void) + ?DeleteEntryL@CMDNSCacheManager@@UAEHABVTDesC8@@@Z @ 3 NONAME ; int CMDNSCacheManager::DeleteEntryL(class TDesC8 const &) + ?AuthoritativeEntriesL@CMDNSCacheManager@@UAEXAAV?$RPointerArray@VCCacheEntry@@@@@Z @ 4 NONAME ; void CMDNSCacheManager::AuthoritativeEntriesL(class RPointerArray &) + ?DumpCacheL@CMDNSCacheManager@@UAEXXZ @ 5 NONAME ; void CMDNSCacheManager::DumpCacheL(void) + ?CacheEntryCount@CMDNSCacheManager@@QAEKXZ @ 6 NONAME ; unsigned long CMDNSCacheManager::CacheEntryCount(void) + ?SetAddressRecord@CCacheEntry@@QAEXPAVCRdTypeA@@@Z @ 7 NONAME ; void CCacheEntry::SetAddressRecord(class CRdTypeA *) + ?NewL@CMDNSCacheManager@@SAPAV1@I@Z @ 8 NONAME ; class CMDNSCacheManager * CMDNSCacheManager::NewL(unsigned int) + ?IsAuthoritative@CCacheEntry@@QBEHXZ @ 9 NONAME ; int CCacheEntry::IsAuthoritative(void) const + ?NextStaleEntry@CMDNSCacheManager@@UAEPAVCCacheEntry@@HH@Z @ 10 NONAME ; class CCacheEntry * CMDNSCacheManager::NextStaleEntry(int, int) + ?SetTxtRecord@CCacheEntry@@QAEXPAVCRdTypeTxt@@@Z @ 11 NONAME ; void CCacheEntry::SetTxtRecord(class CRdTypeTxt *) + ?FlushCache@CMDNSCacheManager@@UAEXXZ @ 12 NONAME ; void CMDNSCacheManager::FlushCache(void) + ?PtrRecord@CCacheEntry@@QBEPAVCRdTypePtr@@XZ @ 13 NONAME ; class CRdTypePtr * CCacheEntry::PtrRecord(void) const + ?NewLC@CCacheEntry@@SAPAV1@XZ @ 14 NONAME ; class CCacheEntry * CCacheEntry::NewLC(void) + ?NewL@CCacheEntry@@SAPAV1@XZ @ 15 NONAME ; class CCacheEntry * CCacheEntry::NewL(void) + ?SetAuthoritative@CCacheEntry@@QAEXH@Z @ 16 NONAME ; void CCacheEntry::SetAuthoritative(int) + ?TxtRecord@CCacheEntry@@QBEPAVCRdTypeTxt@@XZ @ 17 NONAME ; class CRdTypeTxt * CCacheEntry::TxtRecord(void) const + ?SessionId@CCacheEntry@@QBEKXZ @ 18 NONAME ; unsigned long CCacheEntry::SessionId(void) const + ?SetSessionId@CCacheEntry@@QAEXK@Z @ 19 NONAME ; void CCacheEntry::SetSessionId(unsigned long) + ?SetServiceRecord@CCacheEntry@@QAEXPAVCRdTypeSrv@@@Z @ 20 NONAME ; void CCacheEntry::SetServiceRecord(class CRdTypeSrv *) + ?FindServiceL@CMDNSCacheManager@@UBEHAAV?$RPointerArray@VCCacheEntry@@@@ABVTDesC8@@W4TDnsType@@@Z @ 21 NONAME ; int CMDNSCacheManager::FindServiceL(class RPointerArray &, class TDesC8 const &, enum TDnsType) const + ?EntryExpired@CCacheEntry@@QBEHXZ @ 22 NONAME ; int CCacheEntry::EntryExpired(void) const + ?UpdateCacheL@CMDNSCacheManager@@UAEXAAVCDnsResourceData@@HK@Z @ 23 NONAME ; void CMDNSCacheManager::UpdateCacheL(class CDnsResourceData &, int, unsigned long) + ?AddressRecord@CCacheEntry@@QBEPAVCRdTypeA@@XZ @ 24 NONAME ; class CRdTypeA * CCacheEntry::AddressRecord(void) const + ?ServiceRecord@CCacheEntry@@QBEPAVCRdTypeSrv@@XZ @ 25 NONAME ; class CRdTypeSrv * CCacheEntry::ServiceRecord(void) const + ?NewLC@CMDNSCacheManager@@SAPAV1@I@Z @ 26 NONAME ; class CMDNSCacheManager * CMDNSCacheManager::NewLC(unsigned int) + ?NewL@CMDNSCacheManager@@SAPAV1@XZ @ 27 NONAME ; class CMDNSCacheManager * CMDNSCacheManager::NewL(void) + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/eabi/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/eabi/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/eabi/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/eabi/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/eabi/mdnscachemanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/eabi/mdnscachemanageru.def Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,41 @@ +EXPORTS + _ZN11CCacheEntry12SetPtrRecordEP10CRdTypePtr @ 1 NONAME + _ZN11CCacheEntry12SetSessionIdEm @ 2 NONAME + _ZN11CCacheEntry12SetTxtRecordEP10CRdTypeTxt @ 3 NONAME + _ZN11CCacheEntry16SetAddressRecordEP8CRdTypeA @ 4 NONAME + _ZN11CCacheEntry16SetAuthoritativeEi @ 5 NONAME + _ZN11CCacheEntry16SetServiceRecordEP10CRdTypeSrv @ 6 NONAME + _ZN11CCacheEntry4NewLEv @ 7 NONAME + _ZN11CCacheEntry5NewLCEv @ 8 NONAME + _ZN17CMDNSCacheManager10DumpCacheLEv @ 9 NONAME + _ZN17CMDNSCacheManager10FlushCacheEv @ 10 NONAME + _ZN17CMDNSCacheManager12DeleteEntryLERK6TDesC8 @ 11 NONAME + _ZN17CMDNSCacheManager12UpdateCacheLER16CDnsResourceDataim @ 12 NONAME + _ZN17CMDNSCacheManager14NextStaleEntryEii @ 13 NONAME + _ZN17CMDNSCacheManager15CacheEntryCountEv @ 14 NONAME + _ZN17CMDNSCacheManager4NewLEj @ 15 NONAME + _ZN17CMDNSCacheManager5NewLCEj @ 16 NONAME + _ZNK11CCacheEntry12EntryExpiredEv @ 17 NONAME + _ZNK11CCacheEntry13AddressRecordEv @ 18 NONAME + _ZNK11CCacheEntry13ServiceRecordEv @ 19 NONAME + _ZNK11CCacheEntry15IsAuthoritativeEv @ 20 NONAME + _ZNK11CCacheEntry9PtrRecordEv @ 21 NONAME + _ZNK11CCacheEntry9SessionIdEv @ 22 NONAME + _ZNK11CCacheEntry9TxtRecordEv @ 23 NONAME + _ZNK17CMDNSCacheManager12FindServiceLER13RPointerArrayI11CCacheEntryERK6TDesC88TDnsType @ 24 NONAME + _ZTI11CCacheEntry @ 25 NONAME + _ZTI12CServiceInfo @ 26 NONAME + _ZTI13CMDNSCacheMap @ 27 NONAME + _ZTI17CMDNSCacheManager @ 28 NONAME + _ZTV11CCacheEntry @ 29 NONAME + _ZTV12CServiceInfo @ 30 NONAME + _ZTV13CMDNSCacheMap @ 31 NONAME + _ZTV17CMDNSCacheManager @ 32 NONAME + _ZThn4_N17CMDNSCacheManager10DumpCacheLEv @ 33 NONAME + _ZThn4_N17CMDNSCacheManager10FlushCacheEv @ 34 NONAME + _ZThn4_N17CMDNSCacheManager12DeleteEntryLERK6TDesC8 @ 35 NONAME + _ZThn4_N17CMDNSCacheManager12UpdateCacheLER16CDnsResourceDataim @ 36 NONAME + _ZThn4_N17CMDNSCacheManager14NextStaleEntryEii @ 37 NONAME + _ZThn4_NK17CMDNSCacheManager12FindServiceLER13RPointerArrayI11CCacheEntryERK6TDesC88TDnsType @ 38 NONAME + _ZN17CMDNSCacheManager4NewLEv @ 39 NONAME + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/group/bld.inf Thu Jun 24 19:09:47 2010 +0530 @@ -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: This file provides the information required for building the + mDNS Cache Manager. +*/ + +PRJ_PLATFORMS +DEFAULT + +PRJ_MMPFILES +mdnscachemanager.mmp + +PRJ_EXPORTS +../inc/mdnscachemgr.h /epoc32/include/mdns/mdnscachemgr.h +../inc/ccacheentry.h /epoc32/include/mdns/ccacheentry.h + + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/group/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/group/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/group/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/group/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/group/mdnscachemanager.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/group/mdnscachemanager.mmp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,44 @@ +/* + 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: Project file for mDNS Cache Manager + +*/ +#include + +TARGET mdnscachemanager.dll +TARGETTYPE DLL +UID 0x1000008d +USERINCLUDE ..\inc +USERINCLUDE ..\..\DnsParser\inc +SYSTEMINCLUDE \epoc32\include +USERINCLUDE ..\..\server\inc + + +#ifdef ENABLE_ABIV2_MODE +DEBUGGABLE +#endif +SOURCEPATH ..\src +SOURCE cmdnscachemap.cpp +SOURCE cmdnscachemanager.cpp +SOURCE cserviceinfo.cpp + + +LIBRARY euser.lib +LIBRARY dnsparser.lib insock.lib commdb.lib +CAPABILITY All -TCB + +SOURCEPATH ..\src +SOURCE ccacheentry.cpp + +MW_LAYER_SYSTEMINCLUDE diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/ccacheentry.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/ccacheentry.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,74 @@ +/* +* 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: +* +*/ + +#ifndef CCACHEENTRY_H_ +#define CCACHEENTRY_H_ + +#include +#include +#include +#include + + +class CCacheEntry : public CBase + { + public: + + IMPORT_C static CCacheEntry* NewL(); + IMPORT_C static CCacheEntry* NewLC(); + + IMPORT_C void SetAddressRecord(CRdTypeA* aAddRecord); + IMPORT_C void SetServiceRecord(CRdTypeSrv* aSrvRecord); + IMPORT_C void SetPtrRecord(CRdTypePtr* aPtrRecord); + IMPORT_C void SetTxtRecord(CRdTypeTxt* aTxtRecord); + + IMPORT_C CRdTypeA* AddressRecord()const; + IMPORT_C CRdTypeSrv* ServiceRecord()const; + IMPORT_C CRdTypePtr* PtrRecord()const; + IMPORT_C CRdTypeTxt* TxtRecord()const; + + IMPORT_C void SetAuthoritative(TBool aAuthoritative); + IMPORT_C TBool IsAuthoritative()const; + + IMPORT_C void SetSessionId(TUint32 aSessionId); + IMPORT_C TUint32 SessionId()const; + + void SetEntryExpired(TBool aExpired); + IMPORT_C TBool EntryExpired()const; + + ~CCacheEntry(); + + private: + + void ConstructL(); + CCacheEntry(); + + private: + + CRdTypeA* iAddressRecord; + CRdTypeSrv* iServiceRecord; + CRdTypePtr* iPtrRecord; + CRdTypeTxt* iTxtRecord; + + TBool iAuthoritative; + TUint32 iSessionId; + + TBool iEntryExpired; + + }; + +#endif /*CCACHEENTRY_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/cmdnscacheconsistencymgr_old.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/cmdnscacheconsistencymgr_old.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,60 @@ +/* +* 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: +* +*/ + +#ifndef CMDNSCACHECONSISTENCYMGR_H_ +#define CMDNSCACHECONSISTENCYMGR_H_ + +#include +#include + + +class CMDNSCacheConsistencyMgr : public CActive + { + public: + + IMPORT_C static CMDNSCacheConsistencyMgr* NewL(TBool aActiveCacheMgmtEnabled,MDNSCacheMgr& aCache); + static CMDNSCacheConsistencyMgr* NewLC(TBool aActiveCacheMgmtEnabled,MDNSCacheMgr& aCache); + + IMPORT_C void Start(); + + ~CMDNSCacheConsistencyMgr(); + void DoCancel(); + + private: + + void RunL(); + TInt RunError(TInt aError); + + + private: + + CMDNSCacheConsistencyMgr(TBool aActiveCacheMgmtEnabled,MDNSCacheMgr& aCache); + void ConstructL(); + + private: + + MDNSCacheMgr& iCache; + + TBool iActiveCacheMgmtEnabled; + + TUint iWalkInterval; + + RTimer iTimer; + }; + + +#endif /*CMDNSCACHECONSISTENCYMGR_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/cmdnscachemanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/cmdnscachemanager.h Thu Jun 24 19:09:47 2010 +0530 @@ -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: +* +*/ +#ifndef CMDNSCACHEMANAGER_H_ +#define CMDNSCACHEMANAGER_H_ + +#include + +#include "cmdnscachemap.h" +#include "mdnscachemgr.h" + +class CMDNSCacheManager : public CBase,public MDNSCacheMgr + { + public: + + IMPORT_C static CMDNSCacheManager* NewL(TUint aMaxCacheEntries); + IMPORT_C static CMDNSCacheManager* NewLC(TUint aMaxCacheEntries); + IMPORT_C static CMDNSCacheManager* NewL(); + + //From MDNSCacheMgr + IMPORT_C void UpdateCacheL(CDnsResourceData& aEntry,TBool aAuthoritative,TUint32 aSessionId); + IMPORT_C TInt FindServiceL(RPointerArray & aEntries,const TDesC8& aName,TDnsType aType)const; + IMPORT_C TInt DeleteEntryL(const TDesC8& aServiceInstanceName); + IMPORT_C void FlushCache(); + IMPORT_C CCacheEntry* NextStaleEntry(TBool aActiveCacheMgmtEnabled,TBool aIteratorReset); + IMPORT_C void AuthoritativeEntriesL(RPointerArray & aEntries); + IMPORT_C TUint NumberOfEntries(); + IMPORT_C void DumpCacheL(); + + + IMPORT_C TUint32 CacheEntryCount(); + + ~CMDNSCacheManager(); + + private: + + void CacheEntryL(CCacheEntry* aTargetEntry,const CServiceInfo* aSourceEntry)const; + void UpdateCacheEntry(CServiceInfo* aEntry,CDnsResourceData* aRecordInfo); + CMDNSCacheManager(); + void ConstructL(TUint aMaxCacheEntries); + + private: + + CMDNSCacheMap* iHashMap; + + RPointerArray iAuthoritativeEntries; + + }; + +#endif /*CMDNSCACHEMANAGER_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/cmdnscachemap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/cmdnscachemap.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,79 @@ +/* +* 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: +* +*/ +#ifndef CMDNSCACHEMAP_H_ +#define CMDNSCACHEMAP_H_ + +#include +#include "cserviceinfo.h" + + +class CMDNSCacheMap : public CBase + { + public: + + static CMDNSCacheMap* NewL(TUint aMaxCacheEntries); + static CMDNSCacheMap* NewLC(TUint aMaxCacheEntries); + + + void UpdateL(const TDesC8& aName, CServiceInfo* aEntry); + CServiceInfo* Find(const TDesC8& aServiceInstanceName); + void FindEntries(const TDesC8& aName,RPointerArray & aEntries); + /*?? Do I require this method??*/void AuthoritativeRecordsL(RPointerArray & aEntries); + TInt DeleteL(const TDesC8& aServiceInstanceName); + void DeleteAllEntries(); + + TUint32 NumberOfEntries(); + + void DumpCacheL(); + + //Used to trace the entire Cache, return number of cache activities + CServiceInfo* NextStaleEntry(TBool aActiveCacheMgmtEnabled,TBool aIteratorReset); + + ~CMDNSCacheMap(); + + + private: + + /*What to do if the number of entries in Hash Table exceed 200?? + * Delete a entries, based on Least Recently Used + * Need to keep track of unused entries/ least recently used + * in the cache ; to delete them and make room for new entries*/ + + //Algorithm to keep track of the Least Recently Used Records + TBool DeleteLeastRecentlyUsed(); + + + void ConstructL(); + CMDNSCacheMap(TUint aMaxCacheEntries); + + private: + + RHashMap iCacheEntries; + + THashMapIter iterate; + + TUint iMaxCacheEntries; + + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER; + + }; + + +#endif /*CMDNSCACHEMAP_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/cmdnsprobemanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/cmdnsprobemanager.h Thu Jun 24 19:09:47 2010 +0530 @@ -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: +* +*/ +#ifndef CMDNSPROBEMANAGER_H_ +#define CMDNSPROBEMANAGER_H_ + +#include +#include + +class CMDNSProbeManager : public CTimer + { + public: + + /*Conflict can happen in 2 cases , + * Case 1: When the Address Record (Type A) is inconsistent, i.e., same + * host name for different Ip addresses + * Case 2: When the Service Record (Type SRV), is conflicting, two hosts try to + * acquire the same service name with the same service type., and same + + /*Case 1:To get Unique Host Name ; to handle Host name conflict, + * we need the acquired host name & IPAddress*/ + static CMDNSProbeManager* NewL(RBuf& aHostName, TInetAddr aAddr); + static CMDNSProbeManager* NewLC(RBuf& aHostName, TInetAddr aAddr); + + /*To get Unique Service Name; to handle service name conflict, + * we need acquired service name & host name*/ + static CMDNSProbeManager* NewL(RBuf& aServiceName,RBuf& aHostName); + static CMDNSProbeManager* NewLC(RBuf& aServiceName,RBuf& aHostName); + + ~CMDNSProbeManager(); + + private: + + void RunL(); + TInt RunError(TInt aError); + + private: + + TBool CheckForUniqueness(); + + void DefensiveResponseReceived();//Get a unique name (DNS Label) + + void SendProbeL(); //Probe for Unique name , Create Probe and Send + void SendAnnouncementL();//Send out Gratitous mDNS Announcement , Create Announcement and Send + void Schedule(); //Self-Complete, To be called when moved to Probe State. + + void Delay(TUint32 aDelayTime/*In Milliseconds*/); //To introduce Delay between Probes. + + CMDNSProbeManager (RBuf& aHostName, TInetAddr aAddr); + CMDNSProbeManager (RBuf& aServiceName,RBuf& aHostName); + void ConstructL(); + + private: + + enum TProbeStates + { + EIdle, + EProbeBegin, + EProbeFirstUnicast, + EProbeSecondUnicast, + EProbeMulticast, + EProbeComplete, + EFirstAnnouncement,//First gratuitous mDNS announcement + ESecondAnnouncement//Second gratuitous mDNS announcement + }; + + + TInetAddr iAddr; + + TProbeStates iCurrentProbeState; + + //MDNSCacheInterface* iCache; + + }; + +#endif /*CMDNSPROBEMANAGER_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/cserviceinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/cserviceinfo.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,106 @@ +/* +* 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: +* +*/ +#ifndef CSERVICEINFO_H_ +#define CSERVICEINFO_H_ + + +#include "mdnsrecordinfo.h" +#include "mdnsdebug.h" +#include +#include +#include +#include + +using namespace HashInfo; + + +class CServiceInfo : public CBase + { + public: + + static CServiceInfo* NewL(); + static CServiceInfo* NewLC(); + + TBool IsAuthoritative()const; + void SetAuthoritative(TBool aAuthoritative); + + const TTime& LastAccessTime()const; + void SetAccessTime(TTime aTime); + + TUint32 SessionId()const; + void SetSessionId(TUint32 aSessionId); + + void SetAddressRecord(CRdTypeA* aAddressRecord); + void SetServiceRecord(CRdTypeSrv* aServiceRecord); + void SetPtrRecord(CRdTypePtr* aPtrRecord); + void SetTxtRecord(CRdTypeTxt* aTxtRecord); + + const TTime& EntryTime(TCacheEntryType aType)const; + const TTime& ExpiryTime(TCacheEntryType aType)const; + + void SetEntryTime(TCacheEntryType aType); + void SetExpiryTime(TCacheEntryType aType); + + void SetKeyL(const TDesC8& aKey); + const TDesC8& Key()const; + + CRdTypeA* AddressRecord()const; + CRdTypeSrv* ServiceRecord()const; + CRdTypePtr* PtrRecord()const; + CRdTypeTxt* TxtRecord()const; + + TBool EntryExpired(); + + TBool EntryToBeQueried(); + + CServiceInfo* CloneL()const; + + //Mark the entry as expired if ttl has become zero + TBool StaleEntry(); + + ~CServiceInfo(); + + private: + + void ConstructL(); + CServiceInfo(); + + private: + + CRdTypeA* iAddressRecord; + CRdTypeSrv* iServiceRecord; + CRdTypePtr* iPtrRecord; + CRdTypeTxt* iTxtRecord; + + TTime iLastAccessTime; + TBool iAuthoritative; + TUint32 iSessionId; + + RBuf8 iKey; + + //Entries are Indexed by TCacheEntryType + RArray iEntryTime; + + //Entries are Indexed by TCacheEntryType + RArray iExpiryTime; + + TBool iEntryExpired; + + }; + + +#endif /*CSERVICEINFO_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/mdnscachemgr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/mdnscachemgr.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,88 @@ +/* +* 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: +* +*/ + +#ifndef MDNSCACHEMGR_H_ +#define MDNSCACHEMGR_H_ + + +#include +#include + + +class CDnsResourceData; +class CCacheEntry; + + +class MDNSCacheMgr + { + public: + + /*Inserts a new entry into the Cache + @param CDnsResourceData, Resource Record + @param aAuthoritative indicates whether the record being inserted is authoritative + @param aSessionId, to indicate to which Session does the entry belong to + @leave KErrNoMemory if memory could not be allocated to store the copies of Key and Value*/ + virtual void UpdateCacheL(CDnsResourceData& aEntry,TBool aAuthoritative,TUint32 aSessionId)=0; + + /*Caters to finding varying types of records, for e.g:- find all the entries + that correspond to a particular service type or find the host name through the address record + @param aEntries List of entries that match the search constraint + @param aInfo could represent any serach constraint Service Instance Type or the Host Name + @param aType the desired record type + */ + virtual TInt FindServiceL(RPointerArray & aEntries,const TDesC8& aName,TDnsType aType)const=0; + + /*Deletes the specified entry from the Cache + @param aServiceInstanceName Instance Name , whose entry needs to be deleted + @leave KErrNotFound if specified entry is not found + */ + virtual TInt DeleteEntryL(const TDesC8& aServiceInstanceName)=0; + + + /*Flush all the entries in the cache + * 1. On start up + * 2. On Failure + * 3. On Topology change + */ + virtual void FlushCache()=0; + + /*During Iteration, fetches the next stale entry ( entry whose ttl has expired - to be deleted + or whose 80% ttl has expired - to be queried on the network) + @param aActiveCacheMgmtEnabled flag to indicate if Pro-active Cache Mgmt is to be enabled + */ + virtual CCacheEntry* NextStaleEntry(TBool aActiveCacheMgmtEnabled,TBool aIteratorReset)=0; + + /*Returns all the Authoritative Cache En tries for Announcement + @param aEntries Output param ,containing all authoritative entries + */ + virtual void AuthoritativeEntriesL(RPointerArray & aEntries)=0; + + /*Returns the current number of entries in Cache*/ + virtual TUint NumberOfEntries()=0; + + /*Dump all the entries in Cache- Debug Purposes*/ + virtual void DumpCacheL()=0; + + /*Virtual destructor so that the delete gets called for all the + Cache Implementation Interfaces*/ + virtual ~MDNSCacheMgr(){} + + }; + + + +#endif /*MDNSCACHEMGR_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/mdnsdebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/mdnsdebug.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,37 @@ +/* +* 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: +* +*/ +#ifndef MDNSDEBUG_H_ +#define MDNSDEBUG_H_ + +#include + +__FLOG_STMT(_LIT8(KMDNSSubsystem, "MDNS");) + +#ifdef __FLOG_ACTIVE +#define __MDNS_HEAP_FLOG \ + { \ + TInt allocated; \ + TInt largest; \ + TInt available(User::Heap().Available(largest)); \ + TInt size(User::Heap().Size()); \ + User::Heap().AllocSize(allocated); \ + __FLOG_STATIC_VA((KMDNSSubsystem, KComponent, _L8("Heap: Size = %d, Allocated = %d, Available = %d, Largest block = %d"), size, allocated, available, largest)); \ + } +#else +#define __MDNS_HEAP_FLOG +#endif // __FLOG_ACTIVE +#endif /*MDNSDEBUG_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/inc/mdnsrecordinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/inc/mdnsrecordinfo.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,39 @@ +/* +* 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: +* +*/ + +#ifndef MDNSRECORDINFO_H_ +#define MDNSRECORDINFO_H_ + +#include + +namespace HashInfo + { + TUint32 TPtrC8Hash(const TPtrC8& aPtr); + + TBool TPtrC8Ident(const TPtrC8& aL, const TPtrC8& aR); + + enum TCacheEntryType + { + ECacheEntryAddr, + ECacheEntryPtr, + ECacheEntrySrv, + ECacheEntryTxt + }; + + } + +#endif /*MDNSRECORDINFO_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/src/ccacheentry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/src/ccacheentry.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,125 @@ +/* +* 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: +* +*/ + + + +#include "ccacheentry.h" + +EXPORT_C CCacheEntry* CCacheEntry::NewL() + { + CCacheEntry* self = CCacheEntry::NewLC(); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CCacheEntry* CCacheEntry::NewLC() + { + CCacheEntry* self = new (ELeave)CCacheEntry(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +void CCacheEntry::ConstructL() + { + + } + +CCacheEntry::CCacheEntry() + { + + } + +CCacheEntry::~CCacheEntry() + { + delete iAddressRecord; + delete iServiceRecord; + delete iPtrRecord; + delete iTxtRecord; + } + +EXPORT_C void CCacheEntry::SetAddressRecord(CRdTypeA* aAddRecord) + { + iAddressRecord = aAddRecord; + } + +EXPORT_C void CCacheEntry::SetServiceRecord(CRdTypeSrv* aSrvRecord) + { + iServiceRecord = aSrvRecord; + } + +EXPORT_C void CCacheEntry::SetPtrRecord(CRdTypePtr* aPtrRecord) + { + iPtrRecord = aPtrRecord; + } + +EXPORT_C void CCacheEntry::SetTxtRecord(CRdTypeTxt* aTxtRecord) + { + iTxtRecord = aTxtRecord; + } + +EXPORT_C CRdTypeA* CCacheEntry::AddressRecord()const + { + return iAddressRecord; + } + +EXPORT_C CRdTypeSrv* CCacheEntry::ServiceRecord()const + { + return iServiceRecord; + } + +EXPORT_C CRdTypePtr* CCacheEntry::PtrRecord()const + { + return iPtrRecord; + } + +EXPORT_C CRdTypeTxt* CCacheEntry::TxtRecord()const + { + return iTxtRecord; + } + +EXPORT_C TBool CCacheEntry::IsAuthoritative()const + { + return iAuthoritative; + } + +EXPORT_C void CCacheEntry::SetAuthoritative(TBool aAuthoritative) + { + iAuthoritative = aAuthoritative; + } + +EXPORT_C void CCacheEntry::SetSessionId(TUint32 aSessionId) + { + iSessionId = aSessionId; + } + +EXPORT_C TUint32 CCacheEntry::SessionId()const + { + return iSessionId; + } + +void CCacheEntry::SetEntryExpired(TBool aEntryExpired) + { + iEntryExpired = aEntryExpired; + } + +EXPORT_C TBool CCacheEntry::EntryExpired()const + { + return iEntryExpired; + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/src/cmdnscachemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/src/cmdnscachemanager.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,413 @@ +/* +* 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: +* +*/ + + +#include "cmdnscachemanager.h" +#include "cserviceinfo.h" +#include "ccacheentry.h" +#include "dnsconstants.h" + +using namespace HashInfo; + +EXPORT_C CMDNSCacheManager* CMDNSCacheManager::NewL(TUint aMaxCacheEntries) + { + CMDNSCacheManager* self = CMDNSCacheManager::NewLC(aMaxCacheEntries); + CleanupStack::Pop(self); + return self; + } + +EXPORT_C CMDNSCacheManager* CMDNSCacheManager::NewLC(TUint aMaxCacheEntries) + { + CMDNSCacheManager* self = new (ELeave)CMDNSCacheManager(); + CleanupStack::PushL(self); + self->ConstructL(aMaxCacheEntries); + return self; + } + +EXPORT_C CMDNSCacheManager* CMDNSCacheManager::NewL() + { + CMDNSCacheManager* self = new (ELeave)CMDNSCacheManager(); + return self; + } + +void CMDNSCacheManager::ConstructL(TUint aMaxCacheEntries) + { + iHashMap=CMDNSCacheMap::NewL(aMaxCacheEntries); + } + +CMDNSCacheManager::CMDNSCacheManager() + { + + } + +CMDNSCacheManager::~CMDNSCacheManager() + { + delete iHashMap; + iAuthoritativeEntries.ResetAndDestroy(); + iAuthoritativeEntries.Close(); + } + +/*Method to Insert / Update entries into Cache + * @param aEntry Record Entry to Insert + * @param aAuthoritative Flag to indicate whether the entry is Authoritative + * @param aSessionId To Store the Session Id for each entry + * @leave KErrNoMemory If Insert into Cache Failed because memory unavailability + * @leave KErrNotSupported if any record other than SRV, PTR, TXT ot A come + */ +EXPORT_C void CMDNSCacheManager::UpdateCacheL(CDnsResourceData& aEntry,TBool aAuthoritative,TUint32 aSessionId) + { + CDnsResourceData* resourceRecord = NULL; + CServiceInfo* foundEntry = NULL; + TBuf8<255> name; + _LIT8(KDot,"."); + //Clone the entry to Insert in Cache + resourceRecord = aEntry.CloneL(); + + TUint16 recType(resourceRecord->Type()); + + if(recType == EDnsType_SRV || recType == EDnsType_TXT || recType == EDnsType_A || recType == EDnsType_PTR) + { + if(recType == EDnsType_PTR) + { + //Extract the Key- Service Instance Name + CRdTypePtr* ptrRecord = static_cast (resourceRecord); + // before that insert the dot. + name.Copy(ptrRecord->DomainName()); + if(name[name.Size()-1]!='.') + name.Append(KDot); + ptrRecord->SetDomainNameL(name); + foundEntry = iHashMap->Find(ptrRecord->DomainName()); + } + else + { + //Extract the Key- Service Instance Name or Host Name + foundEntry = iHashMap->Find(resourceRecord->Name()); + } + + if(foundEntry) + { + //Update if the entry is already present in the Cache. + UpdateCacheEntry(foundEntry,resourceRecord); + } + else + { + //Entry not found in Cache,Insert it fresh + CServiceInfo* recordInfo = NULL; + recordInfo = CServiceInfo::NewL(); + switch(recType) + { + case EDnsType_SRV: + CRdTypeSrv* srvRecord = static_cast (resourceRecord); + recordInfo->SetServiceRecord(srvRecord); + break; + + case EDnsType_TXT: + CRdTypeTxt* txtRecord = static_cast (resourceRecord); + recordInfo->SetTxtRecord(txtRecord); + break; + + case EDnsType_PTR: + CRdTypePtr* ptrRecord = static_cast (resourceRecord); + recordInfo->SetPtrRecord(ptrRecord); + break; + + case EDnsType_A: + CRdTypeA* addressRecord = static_cast (resourceRecord); + recordInfo->SetAddressRecord(addressRecord); + break; + + + default: + User::Leave(KErrNotSupported); + break; + } + + recordInfo->SetAuthoritative(aAuthoritative); + recordInfo->SetSessionId(aSessionId); + + + // insert the entry + if(recType == EDnsType_PTR ) + { + CRdTypePtr* ptrRecord = static_cast (resourceRecord); + iHashMap->UpdateL(ptrRecord->DomainName(),recordInfo); + } + else + { + iHashMap->UpdateL(resourceRecord->Name(),recordInfo); + } + + /*Maintain a list of all Services Published by us + (Authoritative records)*/ + if(recordInfo->IsAuthoritative()) + { + iAuthoritativeEntries.Append(recordInfo->CloneL()); + } + } + + } + else + { + User::Leave(KErrNotSupported); + } + + } + + + + +/*Caters to finding varying types of records, for e.g:- find all the entries + that correspond to a particular service type or find the host name through the address record + @param aEntries List of entries that match the search constraint + @param aName could represent any search constraint Service Instance Type/ Name or the HostName + @param aType the desired record type + */ +EXPORT_C TInt CMDNSCacheManager::FindServiceL(RPointerArray & aEntries,const TDesC8& aName,TDnsType aType)const + { + TInt error(KErrNotFound); + TPtrC8 keyToFind(aName); + TInt count; + switch(aType) + { + case EDnsType_A: + case EDnsType_SRV: + case EDnsType_TXT: + { + //Search for a specific CacheEntry + CServiceInfo* cacheEntry = iHashMap->Find(aName); + if(cacheEntry) + { + CCacheEntry* entry = CCacheEntry::NewL(); + CacheEntryL(entry,cacheEntry); + aEntries.Append(entry); + error = KErrNone; + } + } + break; + + + case EDnsType_PTR: + //Match for all Cache Entries of the given Service Type + RPointerArray entries; + CleanupClosePushL(entries); + iHashMap->FindEntries(aName,entries); + + for(count =0; count< entries.Count();count++) + { + if((*entries[count]).PtrRecord()) + { + //The entries are considered only if they have PTR records + CCacheEntry* entry = CCacheEntry::NewL(); + CacheEntryL(entry,entries[count]); + aEntries.Append(entry); + error = KErrNone; + } + } + + CleanupStack::PopAndDestroy(&entries); + break; + + + case EDnsQType_Any: + { + //Search for a specific CacheEntry + CServiceInfo* cacheEntry = iHashMap->Find(aName); + if(cacheEntry) + { + CCacheEntry* entry = CCacheEntry::NewL(); + CacheEntryL(entry,cacheEntry); + aEntries.Append(entry); + error = KErrNone; + } + else // may be its a PTR record + { + RPointerArray entries; + CleanupClosePushL(entries); + iHashMap->FindEntries(aName,entries); + + for(count =0; count< entries.Count();count++) + { + if((*entries[count]).PtrRecord()) + { + //The entries are considered only if they have PTR records + CCacheEntry* entry = CCacheEntry::NewL(); + CacheEntryL(entry,entries[count]); + aEntries.Append(entry); + error = KErrNone; + } + } + + CleanupStack::PopAndDestroy(&entries); + } + } + + break; + + default: + User::Leave(KErrNotSupported); + break; + } + return error; + } + +/*Deletes the specified entry from the Cache + @param aServiceInstanceName Instance Name , whose entry needs to be deleted + @leave KErrNotFound if specified entry is not found + */ +EXPORT_C TInt CMDNSCacheManager::DeleteEntryL(const TDesC8& aServiceInstanceName) + { + TInt err = iHashMap->DeleteL(aServiceInstanceName); + + // check if it also on the authoritative list, if so delete it + + for(TInt i=0; iKey().Compare(aServiceInstanceName)==0) + { + // found the entry, now delete it; + CServiceInfo* info = iAuthoritativeEntries[i]; + iAuthoritativeEntries.Remove(i); + delete info; + } + } + return err; + } + + +EXPORT_C void CMDNSCacheManager::FlushCache() + { + iHashMap->DeleteAllEntries(); + } + +EXPORT_C CCacheEntry* CMDNSCacheManager::NextStaleEntry(TBool aActiveCacheMgmtEnabled,TBool aIteratorReset) + { + CServiceInfo* nextEntry = iHashMap->NextStaleEntry(aActiveCacheMgmtEnabled,aIteratorReset); + CCacheEntry* nextCacheEntry = NULL; + + if(nextEntry) + { + + nextCacheEntry = CCacheEntry::NewL(); + //Construct CCacheEntry object + CacheEntryL(nextCacheEntry,nextEntry); + + //Mark whether the entry has to be deleted or to be queried for (i.e., has exceeded 80%) + nextCacheEntry->SetEntryExpired(nextEntry->StaleEntry()); + } + + return nextCacheEntry; + } + +void CMDNSCacheManager::UpdateCacheEntry(CServiceInfo* aEntry,CDnsResourceData* aRecordInfo) + { + TUint16 recType(aRecordInfo->Type()); + switch(recType) + { + case EDnsType_SRV: + CRdTypeSrv* srvRecord = static_cast (aRecordInfo); + //Delete the previous Service Record and Insert the fresh one + delete aEntry->ServiceRecord(); + aEntry->SetServiceRecord(srvRecord); + break; + + case EDnsType_TXT: + CRdTypeTxt* txtRecord = static_cast (aRecordInfo); + //Delete the previous Text Record and Insert the fresh one + delete aEntry->TxtRecord(); + aEntry->SetTxtRecord(txtRecord); + break; + + case EDnsType_PTR: + CRdTypePtr* ptrRecord = static_cast (aRecordInfo); + //Delete the previous Ptr Record and Insert the fresh one + delete aEntry->PtrRecord(); + aEntry->SetPtrRecord(ptrRecord); + break; + + case EDnsType_A: + CRdTypeA* addressRecord = static_cast (aRecordInfo); + //Delete the previous Address Record and Insert the fresh one + delete aEntry->AddressRecord(); + aEntry->SetAddressRecord(addressRecord); + break; + + default: + //Do nothing + break; + } + } + +EXPORT_C void CMDNSCacheManager::DumpCacheL() + { + iHashMap->DumpCacheL(); + } + +EXPORT_C TUint32 CMDNSCacheManager::CacheEntryCount() + { + return iHashMap->NumberOfEntries(); + } + + +void CMDNSCacheManager::CacheEntryL(CCacheEntry* aTargetEntry,const CServiceInfo* aSourceEntry)const + { + //Check whether the specific records existed before making a copy + if(aSourceEntry->PtrRecord()) + { + aTargetEntry->SetPtrRecord(static_cast ( aSourceEntry->PtrRecord()->CloneL())); + } + + if(aSourceEntry->AddressRecord()) + { + //This case occurs only for an idividual Address Record + aTargetEntry->SetAddressRecord(static_cast (aSourceEntry->AddressRecord()->CloneL())); + } + + if(aSourceEntry->ServiceRecord()) + { + aTargetEntry->SetServiceRecord(static_cast (aSourceEntry->ServiceRecord()->CloneL())); + //Set Address Record ; if it exists + CServiceInfo* entry = iHashMap->Find(aTargetEntry->ServiceRecord()->Target()); + if(entry) + { + aTargetEntry->SetAddressRecord(static_cast (entry->AddressRecord()->CloneL())); + } + } + + if(aSourceEntry->TxtRecord()) + { + aTargetEntry->SetTxtRecord(static_cast (aSourceEntry->TxtRecord()->CloneL())); + } + + aTargetEntry->SetAuthoritative(aSourceEntry->IsAuthoritative()); + aTargetEntry->SetSessionId(aSourceEntry->SessionId()); + } + + +void CMDNSCacheManager::AuthoritativeEntriesL(RPointerArray & aCacheEntries) + { + for(TInt index =0; index < iAuthoritativeEntries.Count();index++) + { + CCacheEntry* entry = CCacheEntry::NewL(); + CacheEntryL(entry,iAuthoritativeEntries[index]); + aCacheEntries.Append(entry); + } + } + +TUint CMDNSCacheManager::NumberOfEntries() + { + return iHashMap->NumberOfEntries(); + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/src/cmdnscachemap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/src/cmdnscachemap.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,445 @@ +/* +* 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: +* +*/ + +#include "cmdnscachemap.h" +#include "mdnsrecordinfo.h" +#include +#include +#include +#include + + +__FLOG_STMT(_LIT8(KComponent,"MDNSCache");) + +CMDNSCacheMap* CMDNSCacheMap::NewL(TUint aMaxCacheEntries) + { + CMDNSCacheMap* self = CMDNSCacheMap::NewLC(aMaxCacheEntries); + CleanupStack::Pop(self); + return self; + } + +CMDNSCacheMap* CMDNSCacheMap::NewLC(TUint aMaxCacheEntries) + { + CMDNSCacheMap* self = new (ELeave)CMDNSCacheMap(aMaxCacheEntries); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +void CMDNSCacheMap::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("ConstructL - Entry")); + + __FLOG(_L8("ConstructL - Exit")); + } + +CMDNSCacheMap::CMDNSCacheMap(TUint aMaxCacheEntries):iCacheEntries(HashInfo::TPtrC8Hash,HashInfo::TPtrC8Ident),iterate(iCacheEntries) + { + iMaxCacheEntries = aMaxCacheEntries; + } + + +CMDNSCacheMap::~CMDNSCacheMap() + { + __FLOG(_L8("Destructor - Entry")); + RHashMap::TIter iter(iCacheEntries); + TInt count(0); + TInt entriesToDelete(iCacheEntries.Count()); + for(count=0; countSetAccessTime(currentTime); + TBool authoritative = aEntry->IsAuthoritative(); + + //Save the key + aEntry->SetKeyL(aName); + + if(NumberOfEntries()<=iMaxCacheEntries) + { + iCacheEntries.InsertL(aEntry->Key(),aEntry); + } + else + { + if(aEntry->IsAuthoritative() && DeleteLeastRecentlyUsed()) + { + iCacheEntries.InsertL(aEntry->Key(),aEntry); + } + else + { + delete aEntry; + __FLOG_VA((_L8("--------User::Leave on Insert = %d--------"),KErrNoMemory)); + User::Leave(KErrNoMemory); + } + } + + __FLOG(_L8("Insert - Exit")); + + } + +CServiceInfo* CMDNSCacheMap::Find(const TDesC8& aName) + { + TTime currentTime; + RBuf8 key; + key.CreateL(aName); + + //All keys are in LowerCase + key.LowerCase(); + + CServiceInfo** foundEntry = NULL; + foundEntry = iCacheEntries.Find(key); + key.Close(); + currentTime.UniversalTime(); + if(foundEntry) + { + (*foundEntry)->SetAccessTime(currentTime); + return *foundEntry; + } + return NULL; + } + +void CMDNSCacheMap::FindEntries(const TDesC8& aName,RPointerArray & aEntries) + { + _LIT8(KRegExp,"*"); + TInt error; + TBuf8 <256> serviceType(KRegExp); + TTime currentTime; + serviceType.Append(aName); + THashMapIter iter(iCacheEntries); + TInt count; + for(count=0; countSetAccessTime(currentTime); + } + } + } + +/*Not Used : Currently*/ +void CMDNSCacheMap::AuthoritativeRecordsL(RPointerArray & aEntries) + { + THashMapIter iter(iCacheEntries); + TInt count; + TTime currentTime; + for(count=0; countIsAuthoritative()) + { + aEntries.AppendL(entry); + currentTime.UniversalTime(); + entry->SetAccessTime(currentTime); + } + } + } + +TInt CMDNSCacheMap::DeleteL(const TDesC8& aName) + { + __FLOG(_L8("CMDNSCacheMap::DeleteL - Entry")); + TInt error = KErrNone; + TBuf8 <256> key(aName); + + //All keys are in LowerCase + key.LowerCase(); + + #ifdef __FLOG_ACTIVE + + HBufC8* buf(HBufC8::NewLC(aName.Length())); + buf->Des().Copy(aName); + __FLOG_VA((_L8("Deleted Entry = %S "),buf)); + CleanupStack::PopAndDestroy(buf); + + #endif + + CServiceInfo* entryToDelete = NULL; + TRAPD(err,entryToDelete=iCacheEntries.FindL(key)); + if(err!=KErrNotFound) + { + error = iCacheEntries.Remove(key); + delete entryToDelete; + __FLOG(_L8("CMDNSCacheMap::DeleteL - Delete Cache Entry Successful")); + __FLOG(_L8("CMDNSCacheMap::DeleteL - Exit")); + } + else + { + __FLOG(_L8("CMDNSCacheMap::DeleteL - Entry not found in Cache")); + } + return error; + } + +void CMDNSCacheMap::DeleteAllEntries() + { + THashMapIter iter(iCacheEntries); + TInt count; + for(count=0; count iter(iCacheEntries); + TInt count; + TTime accessTime,timeOfLRUEntry; + CServiceInfo* entryToDelete = NULL; + TBuf8<255> keyToDelete; + TBool cacheFull = ETrue; + + for(count=0; countLastAccessTime(); + + if(count==0) + { + timeOfLRUEntry = accessTime; + if(!nextEntry->IsAuthoritative()) + { + keyToDelete = *iter.CurrentKey(); + entryToDelete = nextEntry; + } + } + + else + { + if((accessTime < timeOfLRUEntry) && !nextEntry->IsAuthoritative() ) + { + timeOfLRUEntry = accessTime; + keyToDelete = *iter.CurrentKey(); + entryToDelete = nextEntry; + } + } + + } + + TInt error = iCacheEntries.Remove(keyToDelete); + + if(error != KErrNone) + { + cacheFull = EFalse; + } + else + { + #ifdef __FLOG_ACTIVE + + __FLOG_VA((_L8("Deleting Least Recently Used = %S "),&keyToDelete)); + + #endif + } + + + delete entryToDelete; + + return cacheFull; + } + +TUint32 CMDNSCacheMap::NumberOfEntries() + { + return iCacheEntries.Count(); + } + + +CServiceInfo* CMDNSCacheMap::NextStaleEntry(TBool aActiveCacheMgmtEnabled,TBool aIteratorReset) + { +/* + if(aIteratorReset) + { + iterate.Reset(); + } + + CServiceInfo* nextEntry=*iterate.NextValue(); + + if(nextEntry->EntryExpired() || nextEntry->EntryToBeQueried()) + { + __FLOG(_L8("Stale Entry Found")); + return nextEntry; + } + + return NULL; + +*/ + THashMapIter itr(iCacheEntries); + CServiceInfo*const* nextEntry=itr.NextValue(); + + while(nextEntry!=NULL) + { + if((*nextEntry)->EntryExpired()) + { + __FLOG(_L8("Stale Entry Found")); + return (*nextEntry); + } + nextEntry=itr.NextValue(); + } + + return NULL; + } + +void CMDNSCacheMap::DumpCacheL() + { + RHashMap::TIter iter(iCacheEntries); + + __FLOG(_L8("!!!!!!!!!!!!!!!!!! BEGIN CACHE DUMP !!!!!!!!!!!!!!!!!!!!!")); + for(TInt count=0; countServiceRecord()) + { + __FLOG(_L8("--------Service-Record Data-----")); + HBufC8* buf(HBufC8::NewLC(entry->ServiceRecord()->Name().Length())); + buf->Des().Copy(entry->ServiceRecord()->Name()); + __FLOG_VA((_L8("Service Name = %S "),buf)); + + HBufC8* target(HBufC8::NewLC(entry->ServiceRecord()->Target().Length())); + target->Des().Copy(entry->ServiceRecord()->Target()); + __FLOG_VA((_L8("Target Machine = %S "),target)); + + __FLOG_VA((_L8("Priority = %d "),entry->ServiceRecord()->Priority())); + __FLOG_VA((_L8("Port = %d "),entry->ServiceRecord()->Port())); + __FLOG_VA((_L8("TTL = %d "),entry->ServiceRecord()->Ttl())); + + CleanupStack::PopAndDestroy(target); + CleanupStack::PopAndDestroy(buf); + } + + if(entry->AddressRecord()) + { + __FLOG(_L8("-------Address-Record Data--------")); + HBufC8* buf(HBufC8::NewLC(entry->AddressRecord()->Name().Length())); + buf->Des().Copy(entry->AddressRecord()->Name()); + __FLOG_VA((_L8("Host Name = %S "),buf)); + const TInetAddr addr(entry->AddressRecord()->Address()); + TBuf <255> ipaddr; + addr.Output(ipaddr); + + __FLOG_VA((_L("Inet Address = %S "),&ipaddr)); + + __FLOG_VA((_L8("TTL = %d "),entry->AddressRecord()->Ttl())); + CleanupStack::PopAndDestroy(buf); + } + + if(entry->PtrRecord()) + { + __FLOG(_L8("-------Ptr-Record Data-----------")); + HBufC8* buf(HBufC8::NewLC(entry->PtrRecord()->Name().Length())); + buf->Des().Copy(entry->PtrRecord()->Name()); + __FLOG_VA((_L8("PTR Name= %S "),buf)); + + HBufC8* domainName(HBufC8::NewLC(entry->PtrRecord()->DomainName().Length())); + domainName->Des().Copy(entry->PtrRecord()->DomainName()); + __FLOG_VA((_L8("PTR Domain Name = %S "),domainName)); + + __FLOG_VA((_L8("Type = %d "),entry->PtrRecord()->Type())); + __FLOG_VA((_L8("TTL = %d "),entry->PtrRecord()->Ttl())); + + CleanupStack::PopAndDestroy(domainName); + CleanupStack::PopAndDestroy(buf); + } + + if(entry->TxtRecord()) + { + __FLOG(_L8("--------Txt-Record Data---------")); + const RArray & array = entry->TxtRecord()->Text(); + + HBufC8* name(HBufC8::NewLC(entry->TxtRecord()->Name().Length())); + name->Des().Copy(entry->TxtRecord()->Name()); + __FLOG_VA((_L8("Text Name= %S "),name)); + CleanupStack::PopAndDestroy(name); + + + for (TInt count=0;countDes().Copy(array[count]); + __FLOG_VA((_L8("Text Info = %S "),text)); + CleanupStack::PopAndDestroy(text); + } + __FLOG_VA((_L8("TTL = %d "),entry->TxtRecord()->Ttl())); + } + + __FLOG_VA((_L8("--------Entry is Authoritative?? = %d--------"),entry->IsAuthoritative())); + + __FLOG_VA((_L8("--------Last Access Time = %ld--------"),entry->LastAccessTime())); + + } + __FLOG_VA((_L8("--------Total number of entries = %d--------"),iCacheEntries.Count())); + } + + + + + + + + + + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/src/cmdnsprobemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/src/cmdnsprobemanager.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,106 @@ +/* +* 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: +* +*/ + + + +#include "cmdnsprobemanager.h" + +CMDNSProbeManager* CMDNSProbeManager::NewL(RBuf& aHostName, TInetAddr aAddr) + { + CMDNSProbeManager* self = CMDNSProbeManager::NewLC(aHostName,aAddr); + CleanupStack::Pop(self); + return self; + } + +CMDNSProbeManager* CMDNSProbeManager::NewLC(RBuf& aHostName, TInetAddr aAddr) + { + CMDNSProbeManager* self = new (ELeave)CMDNSProbeManager(aHostName,aAddr); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CMDNSProbeManager::CMDNSProbeManager(RBuf& aHostName, TInetAddr aAddr):CTimer(CActive::EPriorityStandard) + { + + } + + +CMDNSProbeManager* CMDNSProbeManager::NewL(RBuf& aServiceName,RBuf& aHostName) + { + CMDNSProbeManager* self = CMDNSProbeManager::NewLC(aServiceName,aHostName); + CleanupStack::Pop(self); + return self; + } + +CMDNSProbeManager* CMDNSProbeManager::NewLC(RBuf& aServiceName,RBuf& aHostName) + { + CMDNSProbeManager* self = new (ELeave)CMDNSProbeManager(aServiceName,aHostName); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CMDNSProbeManager::CMDNSProbeManager(RBuf& aServiceName,RBuf& aHostName):CTimer(CActive::EPriorityStandard) + { + + } +void CMDNSProbeManager::ConstructL() + { + + } + +CMDNSProbeManager::~CMDNSProbeManager() + { + + } + +void CMDNSProbeManager::RunL() + { + switch(iCurrentProbeState) + { + case EIdle: + break; + + case EProbeBegin: + break; + + case EProbeFirstUnicast: + break; + + case EProbeSecondUnicast: + break; + + case EProbeMulticast: + break; + + case EProbeComplete: + break; + + case EFirstAnnouncement: + break; + + case ESecondAnnouncement: + break; + + } + } + +TInt CMDNSProbeManager::RunError(TInt aError) + { + return KErrNone; + } \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/src/cserviceinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/src/cserviceinfo.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,397 @@ +/* +* 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: +* +*/ + + +#include "cserviceinfo.h" + +const TUint KCacheRecords = 4; +const TUint KGranularity = 2; +const TUint KDefaultTtl = 4500; +const TUint KQueryFactor = 0.2; + + + +CServiceInfo* CServiceInfo::NewL() + { + CServiceInfo* self = CServiceInfo::NewLC(); + CleanupStack::Pop(self); + return self; + } + +CServiceInfo* CServiceInfo::NewLC() + { + CServiceInfo* self = new (ELeave)CServiceInfo(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CServiceInfo::CServiceInfo():iEntryTime(KCacheRecords),iExpiryTime(KCacheRecords),iAddressRecord(NULL),iServiceRecord(NULL),iPtrRecord(NULL),iTxtRecord(NULL) + { + iEntryExpired = EFalse; + } + +CServiceInfo::~CServiceInfo() + { + delete iAddressRecord; + delete iServiceRecord; + delete iPtrRecord; + delete iTxtRecord; + iEntryTime.Close(); + iExpiryTime.Close(); + iKey.Close(); + + } + +void CServiceInfo::ConstructL() + { + TTime currentTime; + currentTime.UniversalTime(); + TTimeIntervalSeconds ttl = KDefaultTtl; + + //Set default Entry time + for(TInt count=0;countTtl(); + break; + + + case ECacheEntryPtr: + ttl = PtrRecord()->Ttl(); + break; + + + case ECacheEntrySrv: + ttl = ServiceRecord()->Ttl(); + break; + + case ECacheEntryTxt: + ttl = TxtRecord()->Ttl(); + break; + } + + //Set the Expiry Time + TTime expiryTime = iEntryTime[aType] + ttl; + iExpiryTime.Insert(expiryTime,aType); + } + + +TBool CServiceInfo::EntryExpired() + { + TTime currentTime; + currentTime.UniversalTime(); + + if(AddressRecord()) + { + if(iExpiryTime[ECacheEntryAddr] <= currentTime) + { + iEntryExpired = ETrue; + return iEntryExpired; + } + } + + if(PtrRecord()) + { + if(iExpiryTime[ECacheEntryPtr] <= currentTime) + { + iEntryExpired = ETrue; + return iEntryExpired; + } + } + + + if(ServiceRecord()) + { + if(iExpiryTime[ECacheEntrySrv] <= currentTime) + { + iEntryExpired = ETrue; + return iEntryExpired; + } + } + + + if(TxtRecord()) + { + if(iExpiryTime[ECacheEntryTxt] <= currentTime) + { + iEntryExpired = ETrue; + return iEntryExpired; + } + } + + return EFalse; + } + + +// This Clone funtion returns back what is necessary. + +CServiceInfo* CServiceInfo::CloneL()const + { + CServiceInfo* serviceInfo = CServiceInfo::NewL(); + + if(iAddressRecord) + { + serviceInfo->SetAddressRecord(static_cast(iAddressRecord->CloneL())); + } + if(iServiceRecord) + { + serviceInfo->SetServiceRecord(static_cast(iServiceRecord->CloneL())); + } + if(iPtrRecord) + { + serviceInfo->SetPtrRecord(static_cast(iPtrRecord->CloneL())); + } + if(iTxtRecord) + { + serviceInfo->SetTxtRecord(static_cast(iTxtRecord->CloneL())); + } + + serviceInfo->SetKeyL(iKey); + serviceInfo->SetSessionId(iSessionId); + + return serviceInfo; + } + +TBool CServiceInfo::EntryToBeQueried() + { + //Check if any record in the entry has exceeded 80% ttl, if yes, Query! + + TTime currentTime; + currentTime.UniversalTime(); + + + if(AddressRecord()) + { + TInt64 addExpiryTime = iExpiryTime[ECacheEntryAddr].Int64(); + TInt64 current = currentTime.Int64(); + //Converted to seconds + TUint64 addExpiryFactor = (addExpiryTime - current) / 1000000; + if( addExpiryFactor < (0.2)*(AddressRecord()->Ttl())) + { + return ETrue; + } + } + + if(PtrRecord()) + { + TInt64 ptrExpiryTime = iExpiryTime[ECacheEntryPtr].Int64(); + TInt64 current = currentTime.Int64(); + //Converted to seconds + TUint64 ptrExpiryFactor = (ptrExpiryTime - current) / 1000000; + if( ptrExpiryFactor < (0.2)*(PtrRecord()->Ttl())) + { + return ETrue; + } + } + + + if(ServiceRecord()) + { + TInt64 srvExpiryTime = iExpiryTime[ECacheEntrySrv].Int64(); + TInt64 current = currentTime.Int64(); + //Converted to seconds + TUint64 srvExpiryFactor = (srvExpiryTime - current) / 1000000; + if( srvExpiryFactor < (0.2)*(ServiceRecord()->Ttl())) + { + return ETrue; + } + } + + + if(TxtRecord()) + { + TInt64 txtExpiryTime = iExpiryTime[ECacheEntryTxt].Int64(); + TInt64 current = currentTime.Int64(); + //Converted to seconds + TUint64 txtExpiryFactor = (txtExpiryTime - current) / 1000000; + if( txtExpiryFactor < (0.2)*(TxtRecord()->Ttl())) + { + return ETrue; + } + } + + return EFalse; + } + + +TBool CServiceInfo::StaleEntry() + { + return iEntryExpired; + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/src/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/src/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/cachemanager/src/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/cachemanager/src/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/bwins/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/bwins/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/bwins/mdnsclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/bwins/mdnsclientu.def Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,11 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + ?WaitForNotificationL@RMdns@@QAEXABVRPnPParameterBundle@@@Z @ 2 NONAME ; void RMdns::WaitForNotificationL(class RPnPParameterBundle const &) + ?Cancel@RMdns@@QAEHABVRPnPParameterBundle@@@Z @ 3 NONAME ; int RMdns::Cancel(class RPnPParameterBundle const &) + ?RegisterServiceL@RMdns@@QAEXABVRPnPParameterBundle@@H@Z @ 4 NONAME ; void RMdns::RegisterServiceL(class RPnPParameterBundle const &, int) + ?Open@RMdns@@QAEHH@Z @ 5 NONAME ; int RMdns::Open(int) + ?Close@RMdns@@QAEHXZ @ 6 NONAME ; int RMdns::Close(void) + ?QueryL@RMdns@@QAEXABVRPnPParameterBundle@@@Z @ 7 NONAME ; void RMdns::QueryL(class RPnPParameterBundle const &) + ?ResolveL@RMdns@@QAEXABVRPnPParameterBundle@@@Z @ 8 NONAME ; void RMdns::ResolveL(class RPnPParameterBundle const &) + ??0RMdns@@QAE@XZ @ 9 NONAME ; RMdns::RMdns(void) + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/eabi/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/eabi/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/eabi/mdnsclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/eabi/mdnsclientu.def Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,24 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + _ZN5RMdns16RegisterServiceLERK19RPnPParameterBundlei @ 2 NONAME + _ZN5RMdns20WaitForNotificationLERK19RPnPParameterBundle @ 3 NONAME + _ZN5RMdns4OpenEi @ 4 NONAME + _ZN5RMdns5CloseEv @ 5 NONAME + _ZN5RMdns6CancelERK19RPnPParameterBundle @ 6 NONAME + _ZN5RMdns6QueryLERK19RPnPParameterBundle @ 7 NONAME + _ZN5RMdns8ResolveLERK19RPnPParameterBundle @ 8 NONAME + _ZN5RMdnsC1Ev @ 9 NONAME + _ZN5RMdnsC2Ev @ 10 NONAME + _ZTI21CMdnsRegisterNotifier @ 11 NONAME + _ZTI25CMDnsServiceDiscoveryImpl @ 12 NONAME + _ZTI25CMDnsServicePublisherImpl @ 13 NONAME + _ZTI25CMdnsQueryPublishNotifier @ 14 NONAME + _ZTIN4Meta5TMetaI9TInetAddrEE @ 15 NONAME + _ZTIN4Meta5TMetaIiEE @ 16 NONAME + _ZTV21CMdnsRegisterNotifier @ 17 NONAME + _ZTV25CMDnsServiceDiscoveryImpl @ 18 NONAME + _ZTV25CMDnsServicePublisherImpl @ 19 NONAME + _ZTV25CMdnsQueryPublishNotifier @ 20 NONAME + _ZTVN4Meta5TMetaI9TInetAddrEE @ 21 NONAME + _ZTVN4Meta5TMetaIiEE @ 22 NONAME + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/group/bld.inf Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,29 @@ +/* +* 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: +* +*/ + + +PRJ_EXPORTS +../inc/mdnsparamset.h /epoc32/include/mdns/mdnsparamset.h +../inc/mdnsparamset.inl /epoc32/include/mdns/mdnsparamset.inl +..\inc\cmdnsclient.h mdns\cmdnsclient.h +..\inc\cmdnsquerypublishnotifier.h mdns\cmdnsquerypublishnotifier.h +..\inc\cmdnsserverconstants.h mdns\cmdnsserverconstants.h +..\inc\cmdnsregisternotifier.h mdns\cmdnsregisternotifier.h + + +PRJ_MMPFILES +mdnsclient.mmp diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/group/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/group/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/group/mdnsclient.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/group/mdnsclient.mmp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,77 @@ +/* +* 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: +* +*/ + + +/** +MDns specific dll that provides support for applications to create parameter bundles of +desired type for carrying out various MDns operations like discovery,describe etc. +*/ + +#include + +TARGET mdnsclient.dll +TARGETTYPE PLUGIN +CAPABILITY ALL -TCB + +UID 0x10009D8D 0x2000D066 //0x2000D05D +VENDORID 0x70000001 + + + +SOURCEPATH ../src +SOURCE ecom_impl.cpp +SOURCE mdnsparamsextfactory.cpp +SOURCE cmdnsquerypublishnotifier.cpp +SOURCE cmdnsclient.cpp +SOURCE cmdnsregisternotifier.cpp +SOURCE cmdnspnpservicepublisher.cpp +SOURCE cpnpservicediscovery.cpp +DEFFILE mdnsclient.def + +START RESOURCE 2000D066.rss +TARGET mdnsclient.rsc +END + +MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include +SYSTEMINCLUDE /epoc32/include/mdns + +USERINCLUDE ../inc +USERINCLUDE ../../common/inc + + +LIBRARY esock.lib +LIBRARY netmeta.lib +LIBRARY euser.lib +LIBRARY commsdataobjects.lib +LIBRARY efsrv.lib +LIBRARY c32root.lib +LIBRARY commsfw.lib +LIBRARY commsdat.lib +LIBRARY insock.lib +LIBRARY estor.lib +LIBRARY charconv.lib +LIBRARY rpnp.lib +LIBRARY esocksvr.lib + + + + + + + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/cmdnsclient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/cmdnsclient.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,180 @@ +/* +* 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: +* +*/ + + +/** +@file +@PublishedAll +*/ + +#ifndef __MDNSCLIENT_H__ +#define __MDNSCLIENT_H__ + +#include +#include +#include +#include +#include "mdnsdebug.h" +class RMdns : public RSessionBase + { + public: + //These are the helper class which help in notifying the application observer + //when the query and notify messages are served. + friend class CMdnsQueryPublishNotifier; + friend class CMdnsRegisterNotifier; + /** + * Opens a new session with the multicast DNS server. Must be called before + * any other function may be used. + * + * @param aConnectionHandle Handle to the RConnection Object + * @param aSocketServerHandle Handle to the RSocketServ Object + * @param aObserver The callback function where the return values are commnunicated back + * along with the error codes. + * @return A CService object comprising a complete description of the service parameters. + * @brief Opens a new session with the zeroconf server. + */ + + IMPORT_C TInt Open(TInt aConnectionHandle); + + + /** + * ASynchronously lists all the available servicves of the type specified. + * + * @param aServiceType A unicode descriptor containing the type of the service you wish to resolve, including leading underscore (e.g. '_http'.) + * @param aProtocol The protocol the service runs over, one of TCP or UDP. + * @brief Asynchronously resolves a network service. + */ + + IMPORT_C void QueryL( const RPnPParameterBundle& aQueryParams ); + + + /** + * ASynchronously resolves a network service. The results are returned using the Observer callback + * + * @param aServiceName A unicode descriptor containing the name of the service you wish to resolve. + * @param aServiceType A unicode descriptor containing the type of the service you wish to resolve, including leading underscore (e.g. '_http'.) + * @param aProtocol The protocol the service runs over, one of TCP or UDP. + * @brief Asynchronously resolves a network service. + */ + + IMPORT_C void ResolveL( const RPnPParameterBundle& aResolveParams ); + + + + /** + * Registers a service on the local device and will send out presence announcement on the local link + * + * @param aServiceName A unicode descriptor containing the name of the service you wish to register. + * @param aServiceType A unicode descriptor containing the type of the service you wish to register, including leading underscore (e.g. '_http'.) + * @param aProtocol The protocol the service runs over, one of TCP or UDP. + * @return Service registration id is returned + * @brief + */ + + IMPORT_C void RegisterServiceL( const RPnPParameterBundle& aPublishParams ,TBool aIsUpdate = EFalse); + + + + /** + * Register receiving notification on the desired service instance names or types + * + * @param aServiceName A unicode descriptor containing the name of the service you wish to register for notification. + * @param aServiceType A unicode descriptor containing the type of the service you wish to register for notification, + * @param aProtocol The protocol the service runs over, one of TCP or UDP. + * @return Service registration id is returned + * @brief + */ + + IMPORT_C void WaitForNotificationL( const RPnPParameterBundle& aNotifyParams ); + + + /** + * Cancel the ongoing request. + * + * @param aRequestType A enum specifying the type of request to be canceled. + * @param aServiceName A unicode descriptor containing the name of the service . + * @param aServiceType A unicode descriptor containing the type of the service , + * @param aProtocol The protocol the service runs over, one of TCP or UDP. + * @return + * @brief + */ + + IMPORT_C TInt Cancel( const RPnPParameterBundle& aCancelParams ); + + + + + /** + * + * De-register the service from the device and send out absence announcement on the local-link + * + * @param aServiceRegId A integer id that uniquely identifies a registered service. + * @return Success or failure of the close request. + * @brief + */ + + IMPORT_C TInt Close(); + + /** + Default Constructor + */ + IMPORT_C RMdns::RMdns(); + + + private: + /* + * Based on the buffer size set by the query request Recieve Message is called + * which return the set of records got from the query. + * @param aData reference to a buffer to which the records should be set. + */ + void RecieveMessage(TDes8& aData); + /* + * These is an asynchroonous request called internally by the WaitForNotification request. + * @param aData contains the list of new ptr records recieved on WaitForNotification request. + * @param aStatus used to complete asynchronous request. + */ + void RecieveNotifyMessageL(TDes8& aData,TRequestStatus& aStatus); + private: + /* + * Query and publish request will be notifies to this object. + */ + CMdnsQueryPublishNotifier* iEventNotifier; + /* + * Register for a paritcular record will be notified to this object. + */ + CMdnsRegisterNotifier* iRegisterNotifier; + /* + *Buffer used to store the data in the RPnPParameter bundle and send it across to + *the server. + */ + HBufC8* iBuffer; + /* + * Keeps the count of entries requested for notification. + */ + TInt iNotifierCount; + /* + * Pointer to the descriptor iBuffer. + */ + TPtr8 iBufPointer; + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + + +#endif /* __MDNSCLIENT_H__ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/cmdnspnpservicepublisherimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/cmdnspnpservicepublisherimpl.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,61 @@ +// Copyright (c) 2008-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 __CMDNSPNPPSERVICEPUBLISHERIMPL_H__ +#define __CMDNSPNPPSERVICEPUBLISHERIMPL_H__ + + +#include +#include + +//User includes +#include "cmdnsclient.h" +#include "mdnsparamset.h" +#include "mdnsdebug.h" + +//Uid3 of this ecomplugin interface. +const TUint KMDnsPublisherUid = 0x2001DC8A; +/* Body of RPnPServicePublisher class and calls the SubmitRequest and NotifyResults + of respective classes + */ +class CMDnsServicePublisherImpl :public CPnPServicePublisherBase + { +public: + static CMDnsServicePublisherImpl* NewL(); + ~CMDnsServicePublisherImpl ( ); + +private: + TInt Construct ( TUint aTierId ); + void Publish ( const RPnPParameterBundle& aServiceInfo ); + void SendNotify ( const RPnPParameterBundle& aServiceInfo ); + CControlChannelBase* InitiateControlL (); + + +private: + CMDnsServicePublisherImpl ( ); + void PublishL ( const RPnPParameterBundle& aServiceInfo ); + void SendNotifyL ( const RPnPParameterBundle& aServiceInfo ); + +private: + //Mdns client instance. + RMdns iMdns; + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + + }; + +#endif // __CMdnsPNPPSERVICEPUBLISHERIMPL_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/cmdnsquerypublishnotifier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/cmdnsquerypublishnotifier.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,62 @@ +// Copyright (c) 2008-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: +// cmdnsquerypublishnotifier.h +// +// +/** +@file +@internalTechnology +*/ + +#ifndef __CMDNSQUERYPUBLISHNOTIFIER_H__ +#define __CMDNSQUERYPUBLISHNOTIFIER_H__ +#include +#include "cmdnsserverconstants.h" +#include +#include "mdnsdebug.h" +class MPnPObserver; + +class RMdns; +class CMdnsQueryPublishNotifier :public CActive + { + public : + static CMdnsQueryPublishNotifier* NewL(RMdns& aMdns); + ~CMdnsQueryPublishNotifier(); + void RunL(); + void DoCancel(); + TPckg& BufferLength(); + void SetEventNotifierActive(); + TRequestStatus& EventNotifierStatus(); + void SetPnpObserver(MPnPObserver* aObserver); + TMdnsServerMessages State() const ; + void SetState(TMdnsServerMessages aState); + + private: + CMdnsQueryPublishNotifier(RMdns& aMdns); + void ConstructL(); + private: + TInt iBufferLength; + TPckg iPckgLength; + RMdns& iMdns; + MPnPObserver* iObserver; + TMdnsServerMessages iState; + TInt iPublishResult; + TBuf8 iPublishName; + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/cmdnsregisternotifier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/cmdnsregisternotifier.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,61 @@ +// Copyright (c) 2008-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: +// cmdnsregisternotifier.h +// +// + +/** +@file +@internalTechnology +*/ + +#ifndef CMDNSREGISTERNOTIFIER_H_ +#define CMDNSREGISTERNOTIFIER_H_ + +//System Include +#include + +//User Include +#include "cmdnsserverconstants.h" +#include +#include "mdnsdebug.h" +class MPnPObserver; + +class RMdns; + +class CMdnsRegisterNotifier : public CActive + { + public: + static CMdnsRegisterNotifier* NewL(RMdns& aMdns); + ~CMdnsRegisterNotifier(); + void SetPnpObserver(MPnPObserver* aObserver); + private: + CMdnsRegisterNotifier(RMdns& aMdns); + void ConstructL(); + void RunL(); + void DoCancel(); + TInt RunError(TInt aError); + void Start(); + private: + RMdns& iMdns; + HBufC8* iNotifyRcvdMessage; + TPtr8 iPtrNotifyRcvdMessage; + MPnPObserver* iObserver; + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif /* CMDNSREGISTERNOTIFIER_H_ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/cmdnsserverconstants.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/cmdnsserverconstants.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,40 @@ +/* +* 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: +* +*/ + +#ifndef __MDNSSERVERCONSTANTS_H__ +#define __MDNSSERVERCONSTANTS_H__ + +#include + + _LIT(KMdnsServerName, "MDnsServer"); + _LIT(KMdnsServerExe, "\\sys\\bin\\zeroconf_20008AD8.exe"); + +enum TMdnsServerMessages + { + EZeroconfServerMessageVersion, + EMdnsServerQueryMessages, + EMdnsServerRecieveMessages, + EMndsServerPublishMessages, + EMdnsServerRecieveNotifyMessages, + EMdnsServerStartNotifyMessages, + EMdnsServerStopNotifyMessages, + }; + +//const TVersion mdnsServerVersion(0, 8, 0); +const TUid KZeroconfServerSID = { 0x20008AD8 }; + +#endif /* __MDNSSERVERCONSTANTS_H__ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/cmdnsservicediscoveryimpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/cmdnsservicediscoveryimpl.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,67 @@ +// Copyright (c) 2008-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: +// cpnpservicediscovery.h +// +// + +#ifndef __CMDNSPSERVICEDISCOVERYIMPL_H__ +#define __CMDNSPSERVICEDISCOVERYIMPL_H__ + +//System include +#include +#include + +//User include. +#include "cmdnsclient.h" +#include "mdnsdebug.h" + +const TInt KUPnPDiscoveryUid = 0x2001DC88 ; + +/* Body of RPnPServiceDiscovery class and calls the SubmitRequest and NotifyResults + of respective classes + @internalComponent + */ +class CMDnsServiceDiscoveryImpl : public CPnPServiceDiscoveryBase + { +public: + static CMDnsServiceDiscoveryImpl* NewL(); + ~CMDnsServiceDiscoveryImpl (); + +private: + // From CPnPServiceDiscoveryBase + TInt Construct( TUint aTierId); + void Discover ( const RPnPParameterBundle& aServiceInfo ); + void Describe ( const RPnPParameterBundle& aServiceInfo ); + void Subscribe ( const RPnPParameterBundle& aServiceInfo ); + void RegisterNotify ( const RPnPParameterBundle& aServiceInfo ); + void Cancel ( const RPnPParameterBundle& aServiceInfo ); + CControlChannelBase* InitiateControlL ( const TDesC8& aUri ); + +private: + CMDnsServiceDiscoveryImpl (); + + void DiscoverL ( const RPnPParameterBundle& aServiceInfo ); + void RegisterNotifyL ( const RPnPParameterBundle& aServiceInfo ); + void SubscribeL ( const RPnPParameterBundle& aServiceInfo ); + void DescribeL ( const RPnPParameterBundle& aServiceInfo ); + +private: + RMdns iMdns; + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif // __CMDNSPSERVICEDISCOVERYIMPL_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/mdnsparamset.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/mdnsparamset.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,272 @@ +/* +* 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: +* +*/ + + +#ifndef __MDNSPARAMSET_H__ +#define __MDNSPARAMSET_H__ + +#include +#include +#include + + +const TInt KMDnsParamsFactoryUid = 0x2000D067;//0x2000D05E; + +/** +MDns ParameterSet Family Identifiers. +@publishedPartner +@prototype +*/ +enum TMDnsParamSetFamily + { + EMDnsDiscoverRequestParamSet = 1, + EMdnsPtrParamset = 2, + EMdnsSrvParamset = 3, + EMdnsAddrParamset = 4, + EMdnsTxtParamset = 5, + EMdnsPublishResponseParamset = 6, + EMdnsRegisterNotifyParamset = 7, + EMdnsPublishParamset = 8, + //@internalTechnology + //@prototype + }; + +/** +class TMDnsEvent +MDnsEvent class defines the reason code for an event callback. +@publishedPartner +@prototype +*/ +NONSHARABLE_CLASS(TMDnsEvent) + { +public: + /** Type of MDns Event. */ + enum TEventType + { + /** This signifies that the operation completed successfully. */ + ESuccess, + /** This is a 'catch-all' for communicating failures. The actual error reason is + shown in error code. */ + EFail, + /** This signifies a discovery search timeout */ + EDiscoveryTimeout, + /** This signifies a subscription request timeout */ + ESubscriptionTimeout + }; + +public: + /** The event status. */ + TInt iStatus; + /** The error code value. */ + TInt iErrorCode; + }; + + + + +/** +The base class for all MDns ParamSet classes. + +@internalTechnology +@prototype +*/ +NONSHARABLE_CLASS (CMDnsParamSetBase) : public CSubConExtensionParameterSet + { + public: + inline static CMDnsParamSetBase* NewL ( RParameterFamily& aFamily, TMDnsParamSetFamily aFamilyType ); + protected: + inline CMDnsParamSetBase (); + }; + + +// ------------------------------------------------------------------- + +/** +Parameter set class containing a Uri. All UPnP Request ParamSet classes derive from this class. + +@internalTechnology +@prototype +*/ +NONSHARABLE_CLASS ( CMDnsQueryRequestParamSet ) : public CMDnsParamSetBase + { + protected: + RBuf8 iInstanceName; + TInt iQueryType; + TInt iProtocol; + RBuf8 iServiceType; + public: + inline static CMDnsQueryRequestParamSet* NewL( RParameterFamily& aFamily ); + inline void SetInstanceNameL ( const TDesC8& aName ); + inline const TDesC8& InstanceName () const; + inline void SetQueryTypeL(TInt aQueryType ); + inline TInt QueryType()const; + inline void SetProtocol(TInt aProtocol); + inline TInt Protocol()const; + inline void SetServiceTypeL(const TDesC8& aServiceType); + inline const TDesC8& ServiceType() const; + protected: + inline ~CMDnsQueryRequestParamSet (); + protected: + DATA_VTABLE + }; + +// ---------------------------------------------------------------------- +NONSHARABLE_CLASS (CMDnsPtrParamSet): public CMDnsParamSetBase + { + protected: + RBuf8 iInstanceName; + RBuf8 iDomainName; + TInt iTtl; + public: + inline static CMDnsPtrParamSet* NewL(RParameterFamily& aFamily) ; + inline void SetInstanceNameL(const TDesC8& aName); + inline const TDesC8& InstanceName()const; + inline void SetDomainNameL(const TDesC8& aDomainName); + inline const TDesC8& DomainName() const; + inline void SetTtlL(TInt aTtl); + inline TInt Ttl() const; + protected: + inline ~CMDnsPtrParamSet(); + protected: + DATA_VTABLE + + }; + +//--------------------------------------------------------------------------- +NONSHARABLE_CLASS (CMDnsSrvParamSet): public CMDnsParamSetBase + { + protected: + RBuf8 iDomainName; + RBuf8 iTarget; + TUint16 iPrio; + TUint16 iWeight; + TUint16 iPort; + + public: + inline static CMDnsSrvParamSet* NewL(RParameterFamily& aFamily) ; + inline void SetDomainNameL(const TDesC8& aDomainName); + inline const TDesC8& DomainName() const; + inline void SetTargetL(const TDesC8& aName); + inline const TDesC8& Target()const; + inline void SetPriority(TUint16 aPriority); + inline TUint16 Priority()const; + inline void SetWeight(TUint16 aWeight); + inline TUint16 Weight()const; + inline void SetPort(TUint16 aPort); + inline TUint16 Port()const; + protected: + inline ~CMDnsSrvParamSet(); + protected: + DATA_VTABLE + + }; +//------------------------------------------------------------------------------ +NONSHARABLE_CLASS (CMDnsAddrParamSet): public CMDnsParamSetBase + { + protected: + RBuf8 iDomainName; + TInetAddr iAddr; + + public: + inline static CMDnsAddrParamSet* NewL(RParameterFamily& aFamily) ; + inline void SetDomainNameL(const TDesC8& aDomainName); + inline const TDesC8& DomainName() const; + inline void SetAddress(TInetAddr aAddr); + inline TInetAddr Address()const; + protected: + inline ~CMDnsAddrParamSet(); + protected: + DATA_VTABLE + + }; + +//------------------------------------------------------------------------------- +NONSHARABLE_CLASS (CMDnsTxtParamSet): public CMDnsParamSetBase + { + protected: + RBuf8 iDomainName; + RBuf8 iTxtData; + private: + TInt iCount; + public: + inline static CMDnsTxtParamSet* NewL(RParameterFamily& aFamily) ; + inline void SetDomainNameL(const TDesC8& aDomainName); + inline const TDesC8& DomainName() const; + inline void AppendTxtData(TDesC8& aData); + inline void TxtDataL(RArray& aTxtData); + private: + inline void TokenizeStringL(RBuf8& aString, RArray& aList, TChar aSeparator); + protected: + inline ~CMDnsTxtParamSet(); + protected: + DATA_VTABLE + + }; +//-------------------------------------------------------------------------------- +NONSHARABLE_CLASS (CMDnsPublishResponseParamSet): public CMDnsParamSetBase + { + protected: + RBuf8 iDomainName; + TInt iError; + public: + inline static CMDnsPublishResponseParamSet* NewL(RParameterFamily& aFamily) ; + inline void SetDomainNameL(const TDesC8& aDomainName); + inline const TDesC8& DomainName() const; + inline void SetError(TInt aError); + inline TInt Error()const; + protected: + inline ~CMDnsPublishResponseParamSet(); + protected: + DATA_VTABLE + + }; + +//-------------------------------------------------------------------------------- +NONSHARABLE_CLASS (CMDnsRegisterNotifyParamSet): public CMDnsParamSetBase + { + protected: + RBuf8 iInstanceName; + + public : + inline static CMDnsRegisterNotifyParamSet* NewL(RParameterFamily& aFamily); + inline void SetInstanceNameL(const TDesC8& aInstanceName); + inline const TDesC8& InstanceName()const; + protected: + inline ~CMDnsRegisterNotifyParamSet(); + protected: + DATA_VTABLE + + }; + +//-------------------------------------------------------------------------------- +NONSHARABLE_CLASS (CMDnsPublishParamSet): public CMDnsParamSetBase + { + protected: + TBool isPublish; + public: + inline static CMDnsPublishParamSet* NewL(RParameterFamily& aFamily) ; + inline void SetPublishUpdate(TBool aFlag); + inline TBool PublishUpdate()const; + protected: + inline ~CMDnsPublishParamSet(); + protected: + DATA_VTABLE + + }; +#include + +#endif // __MDNSPARAMSET_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/mdnsparamset.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/mdnsparamset.inl Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,374 @@ +/* +* 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: +* +*/ + + +CMDnsParamSetBase* CMDnsParamSetBase::NewL ( RParameterFamily& aFamily, TMDnsParamSetFamily aFamilyType ) + { + STypeId typeId; + typeId = STypeId::CreateSTypeId( KMDnsParamsFactoryUid, aFamilyType ); + CMDnsParamSetBase* self = static_cast < CMDnsParamSetBase* > ( CSubConParameterSet::NewL( typeId ) ); + TBool containerValue = aFamily.IsNull(); + if(!containerValue) + { + CleanupStack::PushL ( self ); + aFamily.AddParameterSetL ( self, RParameterFamily::ERequested ); + CleanupStack::Pop ( self ); + } + return self; + } +CMDnsParamSetBase::CMDnsParamSetBase () + { + } + +// ------------------------------------------ +CMDnsQueryRequestParamSet* CMDnsQueryRequestParamSet::NewL ( RParameterFamily& aFamily ) + { + return static_cast < CMDnsQueryRequestParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMDnsDiscoverRequestParamSet ) ); + } + +void CMDnsQueryRequestParamSet::SetInstanceNameL ( const TDesC8& aName ) + { + iInstanceName.Close (); + iInstanceName.CreateL(aName); + } + +const TDesC8& CMDnsQueryRequestParamSet::InstanceName () const + { + return iInstanceName; + } + +void CMDnsQueryRequestParamSet::SetQueryTypeL(TInt aQueryType) + { + iQueryType = aQueryType; + } + +TInt CMDnsQueryRequestParamSet::QueryType()const + { + return iQueryType; + } + +void CMDnsQueryRequestParamSet::SetProtocol(TInt aProtocol) + { + iProtocol = aProtocol; + } + +TInt CMDnsQueryRequestParamSet::Protocol() const + { + return iProtocol; + } + +void CMDnsQueryRequestParamSet::SetServiceTypeL(const TDesC8& aServiceType) + { + iServiceType.Close(); + iServiceType.CreateL(aServiceType); + } + +const TDesC8& CMDnsQueryRequestParamSet::ServiceType()const + { + return iServiceType; + } + +CMDnsQueryRequestParamSet::~CMDnsQueryRequestParamSet () + { + iInstanceName.Close (); + iServiceType.Close (); + } + +// ------------------------------------------------------------------------- + + +CMDnsPtrParamSet* CMDnsPtrParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsPtrParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsPtrParamset ) ); + } + + +void CMDnsPtrParamSet::SetInstanceNameL(const TDesC8& aName) + { + iInstanceName.Close (); + iInstanceName.CreateL(aName); + } + + +const TDesC8& CMDnsPtrParamSet::InstanceName()const + { + return iInstanceName; + } + + +void CMDnsPtrParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + + +const TDesC8& CMDnsPtrParamSet::DomainName() const + { + return iDomainName; + } + +void CMDnsPtrParamSet::SetTtlL(TInt aTtl) + { + iTtl = aTtl; + } + +TInt CMDnsPtrParamSet::Ttl() const + { + return iTtl; + } + + + +CMDnsPtrParamSet::~CMDnsPtrParamSet() + { + iInstanceName.Close(); + iDomainName.Close(); + } + + +//---------------------------------------------------------------------------------------- +CMDnsSrvParamSet* CMDnsSrvParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsSrvParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsSrvParamset ) ); + } + +void CMDnsSrvParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsSrvParamSet::DomainName() const + { + return iDomainName; + } + +void CMDnsSrvParamSet::SetTargetL(const TDesC8& aTarget) + { + iTarget.Close (); + iTarget.CreateL(aTarget); + } + +const TDesC8& CMDnsSrvParamSet::Target() const + { + return iTarget; + } + +void CMDnsSrvParamSet::SetPriority(TUint16 aPriority) + { + iPrio = aPriority; + } + +TUint16 CMDnsSrvParamSet::Priority()const + { + return iPrio; + } + +void CMDnsSrvParamSet::SetWeight(TUint16 aWeight) + { + iWeight = aWeight; + } + +TUint16 CMDnsSrvParamSet::Weight()const + { + return iWeight; + } + + +void CMDnsSrvParamSet::SetPort(TUint16 aPort) + { + iPort = aPort; + } + +TUint16 CMDnsSrvParamSet::Port()const + { + return iPort; + } + + +CMDnsSrvParamSet::~CMDnsSrvParamSet() + { + iTarget.Close(); + iDomainName.Close(); + } + +//-------------------------------------------------------------------------------- + +CMDnsAddrParamSet* CMDnsAddrParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsAddrParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsAddrParamset ) ); + } + +void CMDnsAddrParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsAddrParamSet::DomainName() const + { + return iDomainName; + } +void CMDnsAddrParamSet::SetAddress(TInetAddr aAddr) + { + iAddr = aAddr; + } + +TInetAddr CMDnsAddrParamSet::Address()const + { + return iAddr; + } + +CMDnsAddrParamSet::~CMDnsAddrParamSet() + { + iDomainName.Close(); + } + +//----------------------------------------------------------------------------------- +CMDnsTxtParamSet* CMDnsTxtParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsTxtParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsTxtParamset ) ); + } +void CMDnsTxtParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsTxtParamSet::DomainName() const + { + return iDomainName; + } + +void CMDnsTxtParamSet::AppendTxtData(TDesC8& aData) + { + _LIT8(KNewLine,"\n"); + RBuf8 temp; + temp.Create(iTxtData.Length() + aData.Length() + KNewLine().Length()); + temp.Append(iTxtData); + temp.Append(aData); + temp.Append(KNewLine); + iTxtData.Close(); + iTxtData.Create(temp); + temp.Close(); + } +void CMDnsTxtParamSet::TxtDataL(RArray& aTxtArray) + { + TokenizeStringL(iTxtData,aTxtArray,'\n'); + } + +void CMDnsTxtParamSet::TokenizeStringL(RBuf8& aString, RArray& aList, TChar aSeparator) + { + TLex8 lexer(aString); + + while(!lexer.Eos()) + { + lexer.SkipSpaceAndMark(); + + while(!lexer.Eos() && lexer.Get() != aSeparator) + { + } + + if(!lexer.Eos()) + { + lexer.UnGet(); // Do not include trailing ',' + } + RBuf8 temp; + temp.Create(lexer.MarkedToken()); + aList.Append(temp); + lexer.Inc(); + } + } +CMDnsTxtParamSet::~CMDnsTxtParamSet() + { + iDomainName.Close(); + iTxtData.Close(); + } + +//----------------------------------------------------------------------------------- +CMDnsPublishResponseParamSet* CMDnsPublishResponseParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsPublishResponseParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsSrvParamset ) ); + } +void CMDnsPublishResponseParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsPublishResponseParamSet::DomainName() const + { + return iDomainName; + } + +void CMDnsPublishResponseParamSet::SetError(TInt aError) + { + iError = aError; + } +TInt CMDnsPublishResponseParamSet::Error()const + { + return iError; + } + +CMDnsPublishResponseParamSet::~CMDnsPublishResponseParamSet() + { + iDomainName.Close(); + + } +//---------------------------------------------------------------------------------------------------------------------------- + +CMDnsRegisterNotifyParamSet* CMDnsRegisterNotifyParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsRegisterNotifyParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsRegisterNotifyParamset ) ); + } + +void CMDnsRegisterNotifyParamSet::SetInstanceNameL(const TDesC8& aDomainName) + { + iInstanceName.Close (); + iInstanceName.CreateL(aDomainName); + } + +const TDesC8& CMDnsRegisterNotifyParamSet::InstanceName() const + { + return iInstanceName; + } + +CMDnsRegisterNotifyParamSet::~CMDnsRegisterNotifyParamSet() + { + iInstanceName.Close(); + } +//----------------------------------------------------------------------------------- +CMDnsPublishParamSet* CMDnsPublishParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsPublishParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsPublishParamset ) ); + } +void CMDnsPublishParamSet::SetPublishUpdate(TBool aFlag) + { + isPublish = aFlag; + } + +TBool CMDnsPublishParamSet::PublishUpdate()const + { + return isPublish; + } + +CMDnsPublishParamSet::~CMDnsPublishParamSet() + { + + } +//---------------------------------------------------------------------------------------------------------------------------- diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/mdnsparamset__.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/mdnsparamset__.inl Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,345 @@ +/* +* 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: +* +*/ + + +CMDnsParamSetBase* CMDnsParamSetBase::NewL ( RParameterFamily& aFamily, TMDnsParamSetFamily aFamilyType ) + { + //STypeId typeId( KMDnsParamsFactoryUid, aFamilyType ); + STypeId typeId; + typeId = STypeId::CreateSTypeId( KMDnsParamsFactoryUid, aFamilyType ); + + CMDnsParamSetBase* self = static_cast < CMDnsParamSetBase* > ( CSubConParameterSet::NewL( typeId ) ); + TBool containerValue = aFamily.IsNull(); + if(!containerValue) + { + CleanupStack::PushL ( self ); + aFamily.AddParameterSetL ( self, RParameterFamily::ERequested ); + CleanupStack::Pop ( self ); + } + return self; + } +CMDnsParamSetBase::CMDnsParamSetBase () + { + } + +// ------------------------------------------ +CMDnsQueryRequestParamSet* CMDnsQueryRequestParamSet::NewL ( RParameterFamily& aFamily ) + { + return static_cast < CMDnsQueryRequestParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMDnsDiscoverRequestParamSet ) ); + } + +void CMDnsQueryRequestParamSet::SetInstanceNameL ( const TDesC8& aName ) + { + iInstanceName.Close (); + iInstanceName.CreateL(aName); + } + +const TDesC8& CMDnsQueryRequestParamSet::InstanceName () const + { + return iInstanceName; + } + +void CMDnsQueryRequestParamSet::SetQueryTypeL(TInt aQueryType) + { + iQueryType = aQueryType; + } + +TInt CMDnsQueryRequestParamSet::QueryType()const + { + return iQueryType; + } + +void CMDnsQueryRequestParamSet::SetProtocol(TInt aProtocol) + { + iProtocol = aProtocol; + } + +TInt CMDnsQueryRequestParamSet::Protocol() const + { + return iProtocol; + } + +void CMDnsQueryRequestParamSet::SetServiceTypeL(const TDesC8& aServiceType) + { + iServiceType.Close(); + iServiceType.CreateL(aServiceType); + } + +const TDesC8& CMDnsQueryRequestParamSet::ServiceType()const + { + return iServiceType; + } + +CMDnsQueryRequestParamSet::~CMDnsQueryRequestParamSet () + { + iInstanceName.Close (); + iServiceType.Close (); + } + +// ------------------------------------------------------------------------- + + +CMDnsPtrParamSet* CMDnsPtrParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsPtrParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsPtrParamset ) ); + } + + +void CMDnsPtrParamSet::SetInstanceNameL(const TDesC8& aName) + { + iInstanceName.Close (); + iInstanceName.CreateL(aName); + } + + +const TDesC8& CMDnsPtrParamSet::InstanceName()const + { + return iInstanceName; + } + + +void CMDnsPtrParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + + +const TDesC8& CMDnsPtrParamSet::DomainName() const + { + return iDomainName; + } + + +CMDnsPtrParamSet::~CMDnsPtrParamSet() + { + iInstanceName.Close(); + iDomainName.Close(); + } + + +//---------------------------------------------------------------------------------------- +CMDnsSrvParamSet* CMDnsSrvParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsSrvParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsSrvParamset ) ); + } + +void CMDnsSrvParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsSrvParamSet::DomainName() const + { + return iDomainName; + } + +void CMDnsSrvParamSet::SetTargetL(const TDesC8& aTarget) + { + iTarget.Close (); + iTarget.CreateL(aTarget); + } + +const TDesC8& CMDnsSrvParamSet::Target() const + { + return iTarget; + } + +void CMDnsSrvParamSet::SetPriority(TUint16 aPriority) + { + iPrio = aPriority; + } + +TUint16 CMDnsSrvParamSet::Priority()const + { + return iPrio; + } + +void CMDnsSrvParamSet::SetWeight(TUint16 aWeight) + { + iWeight = aWeight; + } + +TUint16 CMDnsSrvParamSet::Weight()const + { + return iWeight; + } + + +void CMDnsSrvParamSet::SetPort(TUint16 aPort) + { + iPort = aPort; + } + +TUint16 CMDnsSrvParamSet::Port()const + { + return iPort; + } + + +CMDnsSrvParamSet::~CMDnsSrvParamSet() + { + iTarget.Close(); + iDomainName.Close(); + } + +//-------------------------------------------------------------------------------- + +CMDnsAddrParamSet* CMDnsAddrParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsAddrParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsAddrParamset ) ); + } + +void CMDnsAddrParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsAddrParamSet::DomainName() const + { + return iDomainName; + } +void CMDnsAddrParamSet::SetAddress(TInetAddr aAddr) + { + iAddr = aAddr; + } + +TInetAddr CMDnsAddrParamSet::Address()const + { + return iAddr; + } + +CMDnsAddrParamSet::~CMDnsAddrParamSet() + { + iDomainName.Close(); + } + +//----------------------------------------------------------------------------------- +CMDnsTxtParamSet* CMDnsTxtParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsTxtParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsTxtParamset ) ); + } +void CMDnsTxtParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsTxtParamSet::DomainName() const + { + return iDomainName; + } + +void CMDnsTxtParamSet::AppendTxtData(TDesC8& aData) + { + _LIT8(KNewLine,"\n"); + RBuf8 temp; + temp.Create(iTxtData.Length() + aData.Length() + KNewLine().Length()); + temp.Append(iTxtData); + temp.Append(aData); + temp.Append(KNewLine); + iTxtData.Close(); + iTxtData.Create(temp); + temp.Close(); + } +void CMDnsTxtParamSet::TxtDataL(RArray& aTxtArray) + { + TokenizeStringL(iTxtData,aTxtArray,'\n'); + } + +void CMDnsTxtParamSet::TokenizeStringL(RBuf8& aString, RArray& aList, TChar aSeparator) + { + TLex8 lexer(aString); + + while(!lexer.Eos()) + { + lexer.SkipSpaceAndMark(); + + while(!lexer.Eos() && lexer.Get() != aSeparator) + { + } + + if(!lexer.Eos()) + { + lexer.UnGet(); // Do not include trailing ',' + } + RBuf8 temp; + temp.Create(lexer.MarkedToken()); + aList.Append(temp); + lexer.Inc(); + } + } +CMDnsTxtParamSet::~CMDnsTxtParamSet() + { + iDomainName.Close(); + iTxtData.Close(); + } + +//----------------------------------------------------------------------------------- +CMDnsPublishResponseParamSet* CMDnsPublishResponseParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsPublishResponseParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsSrvParamset ) ); + } +void CMDnsPublishResponseParamSet::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close (); + iDomainName.CreateL(aDomainName); + } + +const TDesC8& CMDnsPublishResponseParamSet::DomainName() const + { + return iDomainName; + } + +void CMDnsPublishResponseParamSet::SetError(TInt aError) + { + iError = aError; + } +TInt CMDnsPublishResponseParamSet::Error()const + { + return iError; + } + +CMDnsPublishResponseParamSet::~CMDnsPublishResponseParamSet() + { + iDomainName.Close(); + + } +//---------------------------------------------------------------------------------------------------------------------------- + +CMDnsRegisterNotifyParamSet* CMDnsRegisterNotifyParamSet::NewL(RParameterFamily& aFamily) + { + return static_cast < CMDnsRegisterNotifyParamSet* > ( CMDnsParamSetBase::NewL( aFamily, EMdnsRegisterNotifyParamset ) ); + } + +void CMDnsRegisterNotifyParamSet::SetInstanceNameL(const TDesC8& aDomainName) + { + iInstanceName.Close (); + iInstanceName.CreateL(aDomainName); + } + +const TDesC8& CMDnsRegisterNotifyParamSet::InstanceName() const + { + return iInstanceName; + } + +CMDnsRegisterNotifyParamSet::~CMDnsRegisterNotifyParamSet() + { + iInstanceName.Close(); + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/mdnsparamsextfactory.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/mdnsparamsextfactory.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,33 @@ +/* +* 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: +* +*/ + + + +#ifndef __MDNSPARAMSEXTFACTORY_H__ +#define __MDNSPARAMSEXTFACTORY_H__ + +#include + +class CMDnsParamSetBase; + +class CMDnsParamsExtFactory : public CBase +{ + public: + static CMDnsParamSetBase* NewL ( TAny* aConstructionParams ); +}; + +#endif // __MDNSPARAMSEXTFACTORY_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/inc/mmdnseventnotification.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/inc/mmdnseventnotification.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,30 @@ +/* +* 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: +* +*/ + + +#ifndef __MMDNSEVENTNOTIFICATION_H_ +#define __MMDNSEVENTNOTIFICATION_H_ +#include + +class MMDnsEventNotification + { +public: + virtual void OnNotificationL(TUint32)=0; + }; + +#endif /*MMDNSEVENTNOTIFICATION_H_*/ + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/2000D066.rss --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/2000D066.rss Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,87 @@ +/* +* 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: +* +*/ + + +#include + +RESOURCE REGISTRY_INFO theInfo +{ +dll_uid = 0x2000D066; +interfaces = + { + INTERFACE_INFO + { + interface_uid = 0x10204303; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x2000D067; + version_no = 1; + display_name = "UPnP Sub-Connection Extension Parameter Set Factory"; + default_data = "text/wml"; + } + }; + }, + INTERFACE_INFO + { + interface_uid = 0x2000D060; + implementations = + { + IMPLEMENTATION_INFO + { + implementation_uid = 0x2001DC88; + version_no = 1; + display_name = "Mdns Discovery"; + default_data = "536924288/Client"; + }, + IMPLEMENTATION_INFO + { + implementation_uid = 0x2001DC8A; + version_no = 1; + display_name = "Mdns Publish"; + default_data = "536992906/Server"; + } + }; + } + + }; +} +//INTERFACE_INFO + // { + // interface_uid = 0x10204305; + // implementations = + // { + // IMPLEMENTATION_INFO + // { + // implementation_uid = 0x2000D05F; + // version_no = 1; + // display_name = "UPnP Sub-Connection Events Factory"; + // default_data = "text/wml"; + // } + // }; + // }, + + // IMPLEMENTATION_INFO + // { + // implementation_uid = 0x2001DC6A; + // version_no = 1; + // display_name = "UPnP Publish"; + // default_data = "536924244/Server"; + // } + // }; + // } \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/cmdnsclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/cmdnsclient.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,252 @@ +// Copyright (c) 2008-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: +// cmdnsclient.cpp +// +// +/** +@file +@PublishedAll +*/ + +//User include +#include "cmdnsclient.h" +#include "cmdnsserverconstants.h" + + +//System include +#include +#include +#include + +__FLOG_STMT(_LIT8(KComponent,"MDNSClient");) +/* + * Default constructor -Assigns the buffer pointer to Null + */ +EXPORT_C RMdns::RMdns():iBufPointer(NULL,0) + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + } + +/* + * Interface to start the Mdns server . + * KMdnsServerName referes to the name of the Mdns server. + * @param aConnectionHandle handle to the RConnection object // TODO + * @param aSocketServerHandle handler to the RSocketServ object //TODO + * + */ +EXPORT_C TInt RMdns::Open(TInt aConnectionHandle) + { + __FLOG(_L8("RMdns::Open - Entry")); + TVersion serverVersion(0, 0, 0); + //creates a new session if the server exists and it is up and running . + //returns KErrNotFound if the server needs to be launched. + TInt err = CreateSession(KMdnsServerName, serverVersion, 2); + if (err == KErrNotFound) + { + // try starting the server, since create session didn't work + //iap refers to the iap application wants to use. + TBuf<16> iap; + iap.AppendNum(aConnectionHandle); + RProcess server; + User::LeaveIfError(server.Create(KMdnsServerExe, iap)); + server.Resume(); + TRequestStatus status; + status = KRequestPending; + server.Rendezvous(status); + //waits for the server to construct all the required object. + User::WaitForRequest(status); + User::LeaveIfError(status.Int()); + User::LeaveIfError(CreateSession(KMdnsServerName, serverVersion, 2)); + server.Close(); + } + else + { + User::LeaveIfError(err); + } + iNotifierCount =0; + //creates a buffer object with buffer length KDnsBufferlength = 1000 this is the max application + //could send stored in the bundle. + iBuffer = HBufC8::NewL(KDnsBufferlength); + //Set the pointer to point buffer. + iBufPointer.Set(iBuffer->Des()); + //Create a notifier which will be used to catch all the publish and + // query response . There will be only one eventobserver for the client. + //Will be destroyed when the client will be closed. + TRAPD(error,iEventNotifier = CMdnsQueryPublishNotifier::NewL(*this)); + __FLOG(_L8("RMdns::Open - Exit")); + return error; + } + +/* + * Hanldes any queries either the ptr ,srv txt and address record + * IN case of PTR query will be send to the network . + * For SRV and TXT if it exist in the cache ,request will be completed immediately . + * @param aQueryParams contains the query bundle. + * Leaves with KErrAlreadyExists if a request is pending. + */ +EXPORT_C void RMdns::QueryL( const RPnPParameterBundle& aQueryParams ) + { + __FLOG(_L8("RMdns::QueryL - Entry")); + //Get the status of the event notifies . If it is KRequestPending + //there exists a query which needs to be completed . + //Leaves with KErrAlreadyExist if there is query which is pending. + TRequestStatus &status = iEventNotifier->EventNotifierStatus(); + if( status.Int() == KRequestPending) + { + User::Leave(KErrAlreadyExists); + } + //Set the buffer pointer to zero and convert bundle in to buffer and store it in buffer. + iBufPointer.Zero(); + TInt temp = aQueryParams.Length(); + aQueryParams.Store(iBufPointer); + //TODO + //Create a reference to buffer length and send it along the with the request. + //On completion contains the length of the buffer client should create to get the + //response for the query. + //TPckg len(iEventNotifier->BufferLength()); + TIpcArgs args(&iBufPointer,&iEventNotifier->BufferLength()); + //Set Event notifier active + iEventNotifier->SetEventNotifierActive(); + iEventNotifier->SetPnpObserver(aQueryParams.PnPObserver()); + //Set the state as query message so that on response it can decide wheteher it is query or publish. + iEventNotifier->SetState(EMdnsServerQueryMessages); + TRAPD(error,SendReceive(EMdnsServerQueryMessages,args, status)); + __FLOG(_L8("RMdns::QueryL - Exit")); + } + +//TODO yet to decide wat to do with this +//as query itself can handle all the requests + +EXPORT_C void RMdns::ResolveL( const RPnPParameterBundle& aResolveParams ) + { + __FLOG(_L8("RMdns::ResolveL - Entry")); + QueryL(aResolveParams); + __FLOG(_L8("RMdns::ResolveL - Exit")); + } + +/* + * Interferace for the applicaion to register for a particular service it serves + * on the network , A copy of this will be kept in the cache . + * applicaion dont have to renew the service .Consistency Manager will take care of renewing the service. + * @param aPublishParam contains the srv record and the txt record if required need to be published. + * + */ +EXPORT_C void RMdns::RegisterServiceL( const RPnPParameterBundle& aPublishParams ,TBool aIsUpdate) + { + __FLOG(_L8("RMdns::RegisterServiceL - Entry")); + iBufPointer.Zero(); + aPublishParams.Store(iBufPointer); + TIpcArgs args(&iBufPointer,&iEventNotifier->BufferLength(),aIsUpdate); + iEventNotifier->SetEventNotifierActive(); + iEventNotifier->SetPnpObserver(aPublishParams.PnPObserver()); + TRequestStatus &status = iEventNotifier->EventNotifierStatus(); + iEventNotifier->SetState(EMndsServerPublishMessages); + TRAPD(error,SendReceive(EMndsServerPublishMessages,args,status)); + User::LeaveIfError(error); + __FLOG(_L8("RMdns::RegisterServiceL - Exit")); + } + +/* + * An Asychronous request which tells the mdns about the service it is interested in . + * Internally it calls RecieveNotifyMessageL which is a private function, feasible only to CMDnsregisterNotifier + * CMDnsRegisterNotifier is an active object running all the time waiting for any ptr enteries. + * @param aNotifyParam contains the ptr type the application is interrested in ;to be notified. + */ +EXPORT_C void RMdns::WaitForNotificationL( const RPnPParameterBundle& aNotifyParams ) + { + __FLOG(_L8("RMdns::WaitForNotificationL - Entry")); + if(!iRegisterNotifier) + { + iRegisterNotifier = CMdnsRegisterNotifier::NewL(*this); + } + iRegisterNotifier->SetPnpObserver(aNotifyParams.PnPObserver()); + HBufC8* buffer = HBufC8::NewL(KDnsBufferlength); + TPtr8 aNotifyMessage(NULL,0,0); + aNotifyMessage.Set(buffer->Des()); + aNotifyParams.Store(aNotifyMessage); + TIpcArgs args(&aNotifyMessage); + SendReceive(EMdnsServerStartNotifyMessages,args); + iNotifierCount++; + delete buffer; + __FLOG(_L8("RMdns::WaitForNotificationL - Exit")); + } + +/* + *Interface to cancel any notification client requested for . + *@param aCancelParams contains the name of the ptr type client is not interested to be notified. + * + */ +EXPORT_C TInt RMdns::Cancel( const RPnPParameterBundle& aCancelParams ) + { + __FLOG(_L8("RMdns::Cancel - Entry")); + //notifier count keeps track of the number of entries requested for. + iNotifierCount--; + HBufC8* buffer = HBufC8::NewL(KDnsBufferlength); + TPtr8 aNotifyMessage(NULL,0,0); + aNotifyMessage.Set(buffer->Des()); + aCancelParams.Store(aNotifyMessage); + TIpcArgs args(&aNotifyMessage); + SendReceive(EMdnsServerStopNotifyMessages,args); + //when notifier count is zero close the CMdnsRegisterNotifier active object. + //count =0 means the concerned client is not interested in any notification. + if(iNotifierCount == 0) + { + iRegisterNotifier->Cancel(); + } + delete buffer; + __FLOG(_L8("RMdns::Cancel - Exit")); + return KErrNone; + } + +/* + * Destructor + */ +EXPORT_C TInt RMdns::Close() + { + __FLOG(_L8("RMdns::Close - Entry")); + RSessionBase::Close(); + delete iEventNotifier; + delete iRegisterNotifier; + delete iBuffer; + __FLOG(_L8("RMdns::Close - Exit")); + __FLOG_CLOSE; + return KErrNone; + } + +/* + * Private function used by the Query and publish notifier . + * Based on the size of the buffer recieved by the query and publish request. + * a new buffer is allocated and sent to recieve the response. + * @param aData contains the buffer allocated to recieve the response. + */ +void RMdns::RecieveMessage(TDes8& aData) + { + __FLOG(_L8("RMdns::RecieveMessage - Entry")); + TIpcArgs args(&aData); + TRAPD(error,SendReceive(EMdnsServerRecieveMessages,args)); + __FLOG(_L8("RMdns::RecieveMessage - Exit")); + } + +/* + * An synchronous request will be running all the time . whenever a waitfornotification been called. + * @param aData contains the buffer for which data to be set to . + * @param aStatus used to complete the asynchronous request. + */ +void RMdns::RecieveNotifyMessageL(TDes8& aData,TRequestStatus& aStatus) + { + __FLOG(_L8("RMdns::RecieveNotifyMessageL - Entry")); + TIpcArgs args(&aData); + SendReceive(EMdnsServerRecieveNotifyMessages,args,aStatus); + __FLOG(_L8("RMdns::RecieveNotifyMessageL - Exit")); + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/cmdnspnpservicepublisher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/cmdnspnpservicepublisher.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,156 @@ +// Copyright (c) 2008-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: +// cmdnspnpservicepublisherimpl.cpp +// +// + +//User include +#include "cmdnspnpservicepublisherimpl.h" +__FLOG_STMT(_LIT8(KComponent,"CMDnsServicePublisherImpl");) +/* + *Default constructor + */ +CMDnsServicePublisherImpl::CMDnsServicePublisherImpl () + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + } + +/* + * Two phase constructor + */ +CMDnsServicePublisherImpl* CMDnsServicePublisherImpl::NewL() + { + + return new ( ELeave ) CMDnsServicePublisherImpl; + + } + +/* + * Destructor + */ +CMDnsServicePublisherImpl::~CMDnsServicePublisherImpl () + { + __FLOG(_L8("CMDnsServicePublisherImpl::~CMDnsServicePublisherImpl - Entry")); + iMdns.Close(); + __FLOG(_L8("CMDnsServicePublisherImpl::~CMDnsServicePublisherImpl - Exit")); + __FLOG_CLOSE; + } + +/* + * virtual function in the base class CPnPServicePublisherBase + * Will be called to construct the object. + * Launches the Mdns server if not already and creates a new session. + * Graps the Iap and sends the same to server to use . + * + */ +TInt CMDnsServicePublisherImpl::Construct(TUint /*aTierId*/) + { + __FLOG(_L8("CMDnsServicePublisherImpl::Construct - Entry")); + RSocketServ sockServ; + RConnection connection; + TInt error = sockServ.Connect(); + error = connection.Open(sockServ); + + // start a connection, and grab the IAP ID + error = connection.Start(); + + TUint32 iap ; + _LIT(KCommdbIapSetting, "IAP\\Id"); + connection.GetIntSetting(KCommdbIapSetting, iap); + iMdns.Open(iap); + connection.Close(); + sockServ.Close(); + __FLOG(_L8("CMDnsServicePublisherImpl::Construct - Exit")); + return error; + } + +/* + * Publishes the service client sent along with bundle. + * any error will be notified back using the Observer inside the bundle. + */ +void CMDnsServicePublisherImpl::Publish ( const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServicePublisherImpl::Publish - Entry")); + TRAPD(err, PublishL( aServiceInfo )); + if(err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + __FLOG(_L8("CMDnsServicePublisherImpl::Publish - Exit")); + } + +/* + *Leaving function which publish any services client want to . + *Might contain the additional text record . If client wish to publish. + *@param aServiceInfo RPnpParameterBundle contains the domainName need to be published. + */ +void CMDnsServicePublisherImpl::PublishL (const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServicePublisherImpl::PublishL - Entry")); + TBool isUpdate = EFalse; + HBufC8* data = HBufC8::NewLC(aServiceInfo.Length()); + TPtr8 buffer = data->Des(); + aServiceInfo.Store(buffer); + RPnPParameterBundle serviceInfo; + serviceInfo.CreateL(); + serviceInfo.Load(buffer); + RParameterFamily publishFamily = serviceInfo.FindFamily( EMdnsPublishParamset) ; + if(!publishFamily.IsNull() && publishFamily.CountParameterSets()>0) + { + CMDnsPublishParamSet* publishParamSet = static_cast (publishFamily.GetParameterSetAtIndex ( 0, RParameterFamily::ERequested )); + isUpdate = publishParamSet->PublishUpdate(); + } + iMdns.RegisterServiceL(aServiceInfo,isUpdate); + serviceInfo.Close(); + CleanupStack::PopAndDestroy();//data + __FLOG(_L8("CMDnsServicePublisherImpl::PublishL - Exit")); + } + +/* + * Used to request for any notification of the service type client is interested in . + * @param aServiceInfo a RPnPParameterBundle which contains the servicetype , + * client is interested in . + */ +void CMDnsServicePublisherImpl::SendNotify ( const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServicePublisherImpl::SendNotify - Entry")); + TRAPD( err, SendNotifyL( aServiceInfo )); + if ( err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + __FLOG(_L8("CMDnsServicePublisherImpl::SendNotify - Exit")); + } + +/* + *@param aServiceInfo a RPnPParameterBundle which contains the servicetype , + *client is interested in . + */ +void CMDnsServicePublisherImpl::SendNotifyL ( const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServicePublisherImpl::SendNotifyL - Entry")); + iMdns.RegisterServiceL(aServiceInfo); + __FLOG(_L8("CMDnsServicePublisherImpl::SendNotifyL - Exit")); + } + +/* + * Nothing to do with this . + * Might need it in future. + */ +CControlChannelBase* CMDnsServicePublisherImpl::InitiateControlL () + { + __FLOG(_L8("CMDnsServicePublisherImpl::InitiateControlL - Entry")); + //Nothing to do . + //Not Implemented + __FLOG(_L8("CMDnsServicePublisherImpl::InitiateControlL - Exit")); + return NULL; + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/cmdnsquerypublishnotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/cmdnsquerypublishnotifier.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,187 @@ +// Copyright (c) 2008-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: +// cmdnsquerypublishnotifier.cpp +// +// + +/** +@file +@internalTechnology +*/ +//User include +#include "cmdnsquerypublishnotifier.h" +#include "cmdnsclient.h" + +//System include +#include +#include +__FLOG_STMT(_LIT8(KComponent,"CMdnsQueryPublishNotifier");) +/* + * Two phase constructor. + * @param aMdns a refernce to the mdns client . + * @return returns the instance . + */ +CMdnsQueryPublishNotifier* CMdnsQueryPublishNotifier::NewL(RMdns& aMdns) + { + CMdnsQueryPublishNotifier* self = new (ELeave)CMdnsQueryPublishNotifier(aMdns); + return self; + } + +/* + * Destructor + */ +CMdnsQueryPublishNotifier::~CMdnsQueryPublishNotifier() + { + __FLOG(_L8("CMdnsQueryPublishNotifier::~CMdnsQueryPublishNotifier - Entry")); + iObserver = NULL; + __FLOG(_L8("CMdnsQueryPublishNotifier::~CMdnsQueryPublishNotifier - Exit")); + __FLOG_CLOSE; + } +/* + * :)Function gets hit whenever a query or publish request gets completed. + * On completeion iBufferlength contains the no of bytes to be allocated to read + * the response. + */ +void CMdnsQueryPublishNotifier::RunL() + { + __FLOG(_L8("CMdnsQueryPublishNotifier::RunL - Entry")); + if(iStatus.Int() == KErrNone ) + { + HBufC8* data = HBufC8::NewL(iBufferLength); + CleanupStack::PushL(data); + TPtr8 dataPointer(data->Des()); + RPnPParameterBundle responseBundle; + responseBundle.CreateL(); + switch (iState) + { + case EMdnsServerQueryMessages : + { + iMdns.RecieveMessage(dataPointer); + responseBundle.Load(dataPointer); + iObserver->OnPnPEventL(responseBundle); + + + break; + } + case EMndsServerPublishMessages: + { + iMdns.RecieveMessage(dataPointer); + responseBundle.Load(dataPointer); + iObserver->OnPnPEventL(responseBundle); + break; + + } + } + responseBundle.Close(); + CleanupStack::PopAndDestroy();//data + } + else + { + iObserver->OnPnPError(iStatus.Int()); + } + __FLOG(_L8("CMdnsQueryPublishNotifier::RunL - Exit")); + } + + +void CMdnsQueryPublishNotifier::DoCancel() + { + __FLOG(_L8("CMdnsQueryPublishNotifier::DoCancel - Entry")); + iObserver = NULL; + __FLOG(_L8("CMdnsQueryPublishNotifier::DoCancel - Exit")); + } + +/* + * Constructor + * @param reference to RMdns + */ +CMdnsQueryPublishNotifier::CMdnsQueryPublishNotifier(RMdns& aMdns):CActive(EPriorityStandard),iMdns(aMdns),iPckgLength(iBufferLength) + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CMdnsQueryPublishNotifier::CMdnsQueryPublishNotifier - Entry")); + CActiveScheduler::Add(this); + __FLOG(_L8("CMdnsQueryPublishNotifier::CMdnsQueryPublishNotifier - Exit")); + } + +/* + * return reference to iBufferLength object .\\ + * Same will be used to set the size of the buffer client can expect on completion of + * query and publish. + * @return iBufferlength areference to iBufferLength object + */ +TPckg& CMdnsQueryPublishNotifier::BufferLength() + { + __FLOG(_L8("CMdnsQueryPublishNotifier::BufferLength - Entry")); + return iPckgLength; + __FLOG(_L8("CMdnsQueryPublishNotifier::BufferLength - Exit")); + } + +/* + * Cancel the asynchoronous request if it is already active. + * Calls SetActive and sets the status to KRequestPending. + */ +void CMdnsQueryPublishNotifier::SetEventNotifierActive() + { + __FLOG(_L8("CMdnsQueryPublishNotifier::SetEventNotifierActive - Entry")); + if(IsActive()) + { + Cancel(); + } + SetActive(); + iStatus = KRequestPending; + __FLOG(_L8("CMdnsQueryPublishNotifier::SetEventNotifierActive - Exit")); + } + +/* + * Returns the refernce to iStatus of the active object + * @return iStatus reference to status of the active object. + */ +TRequestStatus& CMdnsQueryPublishNotifier::EventNotifierStatus() + { + __FLOG(_L8("CMdnsQueryPublishNotifier::EventNotifierStatus - Entry")); + return iStatus; + __FLOG(_L8("CMdnsQueryPublishNotifier::EventNotifierStatus - Exit")); + } + +/* + * Function to keep a refernce to the observer of the client. + * @param aObserver An observer to the client. + */ + +void CMdnsQueryPublishNotifier::SetPnpObserver(MPnPObserver* aObserver) + { + __FLOG(_L8("CMdnsQueryPublishNotifier::SetPnpObserver - Entry")); + iObserver = aObserver; + __FLOG(_L8("CMdnsQueryPublishNotifier::SetPnpObserver - Exit")); + } +/* + * Set the state to either query or publish based on the request. + * @param aState either query or publish. + */ +void CMdnsQueryPublishNotifier::SetState(TMdnsServerMessages aState) + { + __FLOG(_L8("CMdnsQueryPublishNotifier::SetState - Entry")); + iState = aState; + __FLOG(_L8("CMdnsQueryPublishNotifier::SetState - Exit")); + } + +/* + * Returns the service notifier is in + * @return iState returns the state. + */ +TMdnsServerMessages CMdnsQueryPublishNotifier::State() const + { + __FLOG(_L8("CMdnsQueryPublishNotifier::State - Entry")); + return iState; + __FLOG(_L8("CMdnsQueryPublishNotifier::State - Exit")); + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/cmdnsregisternotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/cmdnsregisternotifier.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,155 @@ +// Copyright (c) 2008-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: +// cmdnsregisternotifier.cpp +// +// + +/** +@file +@internalTechnology +*/ + +//System include +#include +#include + +//User include +#include "cmdnsregisternotifier.h" +#include "cmdnsclient.h" +__FLOG_STMT(_LIT8(KComponent,"CMdnsRegisterNotifier");) +/* + * Two phase constructor + * @param aMdns reference to RMdns client object + */ +CMdnsRegisterNotifier* CMdnsRegisterNotifier::NewL(RMdns& aMdns) + { + CMdnsRegisterNotifier* self = new (ELeave) CMdnsRegisterNotifier(aMdns); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self ; + } +/* + * Destructor + */ +CMdnsRegisterNotifier::~CMdnsRegisterNotifier() + { + __FLOG(_L8("CMdnsRegisterNotifier:: - Entry")); + //Cancel any pending asynchronous request. + Cancel(); + delete iNotifyRcvdMessage; + iNotifyRcvdMessage = NULL; + __FLOG(_L8("CMdnsRegisterNotifier:: - Exit")); + __FLOG_CLOSE; + } + +/* + * Constructor + * @param aMdns reference to mdns object. + */ +CMdnsRegisterNotifier::CMdnsRegisterNotifier(RMdns& aMdns):CActive(EPriorityStandard),iMdns(aMdns),iPtrNotifyRcvdMessage(NULL,0,0) + { + + } + +/* + * Two phase constructor + * Construct a buffer to recieve a new record from the network. + * and start listening to it. + */ +void CMdnsRegisterNotifier::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CMdnsRegisterNotifier::ConstructL - Entry")); + CActiveScheduler::Add(this); + iNotifyRcvdMessage = HBufC8::NewL(KMaxDNSNameLength); + iPtrNotifyRcvdMessage.Set(iNotifyRcvdMessage->Des()); + Start(); + __FLOG(_L8("CMdnsRegisterNotifier::ConstructL - Exit")); + } +/* + * Constructs a bundle and notifies the same to the client. + * + */ +void CMdnsRegisterNotifier::RunL() + { + __FLOG(_L8("CMdnsRegisterNotifier::RunL - Entry")); + if(iObserver != NULL) + { + if(iStatus.Int() == KErrNone) + { + RPnPParameterBundle pnpBundle; + pnpBundle.CreateL(); + pnpBundle.Load(iPtrNotifyRcvdMessage); + iObserver->OnPnPEventL(pnpBundle); + pnpBundle.Close(); + } + else + { + iObserver->OnPnPError(iStatus.Int()); + } + } + Start(); + __FLOG(_L8("CMdnsRegisterNotifier::RunL - Exit")); + } + +/* + * Clears the buffer . + */ +void CMdnsRegisterNotifier::DoCancel() + { + __FLOG(_L8("CMdnsRegisterNotifier::DoCancel - Entry")); + TRequestStatus * status = &iStatus; + User::RequestComplete(status,KErrCancel); + delete iNotifyRcvdMessage; + iNotifyRcvdMessage = NULL; + __FLOG(_L8("CMdnsRegisterNotifier::DoCancel - Exit")); + } + +/* + * Returns the error to activeschedluler as the RunL is not expected to leave. + * @param aError error with which RunL leaves. + * @return aError returns the error back to activescheduler . + */ +TInt CMdnsRegisterNotifier::RunError(TInt aError) + { + __FLOG(_L8("CMdnsRegisterNotifier::RunError - Entry")); + return aError; + __FLOG(_L8("CMdnsRegisterNotifier::RunError - Exit")); + } + +/* + * Start as Asynchoronous request and wait for this to be completed by the server . + * Will be called internally whenever a client requests for the notification. + * + */ +void CMdnsRegisterNotifier::Start() + { + __FLOG(_L8("CMdnsRegisterNotifier::Start - Entry")); + iStatus = KRequestPending; + iMdns.RecieveNotifyMessageL(iPtrNotifyRcvdMessage,iStatus); + SetActive(); + __FLOG(_L8("CMdnsRegisterNotifier::Start - Exit")); + } + +/* + * Set the observer + * @param aObserver a pointer to the observer sent by the client along with the bundle. + */ +void CMdnsRegisterNotifier::SetPnpObserver(MPnPObserver* aObserver) + { + __FLOG(_L8("CMdnsRegisterNotifier::SetPnpObserver - Entry")); + iObserver = aObserver; + __FLOG(_L8("CMdnsRegisterNotifier::SetPnpObserver - Exit")); + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/cpnpservicediscovery.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/cpnpservicediscovery.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,182 @@ +// Copyright (c) 2008-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: +// cpnpservicediscovery.cpp +// +// +//System include +#include + +//User include +#include "CMDnsServiceDiscoveryImpl.h" +#include "pnp/mpnpobserver.h" +__FLOG_STMT(_LIT8(KComponent,"CMDnsServiceDiscoveryImpl");) +/* + * Constructor. + */ +CMDnsServiceDiscoveryImpl::CMDnsServiceDiscoveryImpl () + { + } +/* + * Two phase constructor + */ +CMDnsServiceDiscoveryImpl* CMDnsServiceDiscoveryImpl::NewL() + { + CMDnsServiceDiscoveryImpl* self = new (ELeave) CMDnsServiceDiscoveryImpl; + return self; + } + +/* + * Destructor + */ +CMDnsServiceDiscoveryImpl::~CMDnsServiceDiscoveryImpl () + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + iMdns.Close(); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + __FLOG_CLOSE; + } + +/* + * Explicitly start the connection + * Read the iap using RConnection and send the same to the RMdns. + * @param aTierId implementation uid of the plugin + */ +TInt CMDnsServiceDiscoveryImpl::Construct( TUint aTierId ) + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + RSocketServ sockServ; + RConnection connection; + User::LeaveIfError(sockServ.Connect()); + User::LeaveIfError(connection.Open(sockServ)); + + // start a connection, and grab the IAP ID + User::LeaveIfError(connection.Start()); + + TUint32 iap ; + _LIT(KCommdbIapSetting, "IAP\\Id"); + User::LeaveIfError(connection.GetIntSetting(KCommdbIapSetting, iap)); + iMdns.Open(iap); + connection.Close(); + sockServ.Close(); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + return KErrNone; + } + +/* + * Any query request will be handled by this. + * @param aServiceInfo parameter bundle which contains the query. + */ +void CMDnsServiceDiscoveryImpl::Discover ( const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + TRAPD( err, DiscoverL( aServiceInfo )); + if(err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } + +/* + * Any query request will be handled by this. + * @param aServiceInfo parameter bundle which contains the query. + */ +void CMDnsServiceDiscoveryImpl::DiscoverL ( const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + iMdns.QueryL(aServiceInfo); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } + +/* + * Not supported in ZeroConf. + */ +void CMDnsServiceDiscoveryImpl::Describe( const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + TRAPD( err, DescribeL( aServiceInfo )); + if(err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } + +/* + * Not supported in ZeroConf. + */ +void CMDnsServiceDiscoveryImpl::DescribeL ( const RPnPParameterBundle& /*aServiceInfo*/ ) + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + User::Leave(KErrNotSupported); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } +/* + * Not supported in ZeroConf. + */ +void CMDnsServiceDiscoveryImpl::Subscribe ( const RPnPParameterBundle& aServiceInfo ) + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + TRAPD( err, SubscribeL( aServiceInfo )); + if(err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } + +/* + * Not supported in ZeroConf. + */ +void CMDnsServiceDiscoveryImpl::SubscribeL ( const RPnPParameterBundle& /* aServiceInfo*/ ) + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + User::Leave(KErrNotSupported); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } +/* + * Client intersted in any new service to be notified, will call this. + * @param aServiceInfo parameter bundle which contains the ptr domain name client is intersted in. + */ +void CMDnsServiceDiscoveryImpl::RegisterNotify( const RPnPParameterBundle& aServiceInfo )//done + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + TRAPD( err, RegisterNotifyL( aServiceInfo )); + if(err != KErrNone ) + aServiceInfo.PnPObserver()->OnPnPError(err); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } +// Used to register for advertisements of specific service type +void CMDnsServiceDiscoveryImpl::RegisterNotifyL ( const RPnPParameterBundle& aServiceInfo )//done + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + iMdns.WaitForNotificationL(aServiceInfo); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } + +/* Used to cancel previous requests of services. */ +void CMDnsServiceDiscoveryImpl::Cancel ( const RPnPParameterBundle& aServiceInfo )//done + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + //Ignore the error. + TRAP_IGNORE(iMdns.Cancel(aServiceInfo)); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + } + + +/* + * Not supported in ZeroConf. + */ +CControlChannelBase* CMDnsServiceDiscoveryImpl::InitiateControlL (const TDesC8& /*aUri*/ ) + { + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Entry")); + __FLOG(_L8("CMDnsServiceDiscoveryImpl:: - Exit")); + return NULL; + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/ecom_impl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/ecom_impl.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,37 @@ +// Copyright (c) 2008-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_impl.cpp +// +// + +#include +#include "mdnsparamsextfactory.h" +#include "mdnsparamset.h" +#include "cmdnsservicediscoveryimpl.h" +#include "cmdnspnpservicepublisherimpl.h" + + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KMDnsParamsFactoryUid, CMDnsParamsExtFactory::NewL), + IMPLEMENTATION_PROXY_ENTRY(KUPnPDiscoveryUid, CMDnsServiceDiscoveryImpl::NewL), + IMPLEMENTATION_PROXY_ENTRY(KMDnsPublisherUid, CMDnsServicePublisherImpl::NewL) + }; + + +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/client/src/mdnsparamsextfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/client/src/mdnsparamsextfactory.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,112 @@ +// Copyright (c) 2008-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_impl.cpp +// +// + +#include +#include +#include "mdnsparamsextfactory.h" +#include "mdnsparamset.h" + + +START_ATTRIBUTE_TABLE(CMDnsQueryRequestParamSet, KMDnsParamsFactoryUid, EMDnsDiscoverRequestParamSet) + REGISTER_ATTRIBUTE(CMDnsQueryRequestParamSet, iInstanceName, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsQueryRequestParamSet, iQueryType, TMetaNumber) + REGISTER_ATTRIBUTE(CMDnsQueryRequestParamSet, iProtocol, TMetaNumber) + REGISTER_ATTRIBUTE(CMDnsQueryRequestParamSet, iServiceType, TMetaBuf8) +END_ATTRIBUTE_TABLE() + + +START_ATTRIBUTE_TABLE(CMDnsPtrParamSet, KMDnsParamsFactoryUid, EMdnsPtrParamset) + REGISTER_ATTRIBUTE(CMDnsPtrParamSet, iInstanceName, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsPtrParamSet, iDomainName, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsPtrParamSet, iTtl, TMetaNumber) + END_ATTRIBUTE_TABLE() + +START_ATTRIBUTE_TABLE(CMDnsSrvParamSet, KMDnsParamsFactoryUid, EMdnsSrvParamset) + REGISTER_ATTRIBUTE(CMDnsSrvParamSet, iDomainName, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsSrvParamSet, iTarget, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsSrvParamSet, iPrio, TMetaNumber) + REGISTER_ATTRIBUTE(CMDnsSrvParamSet, iWeight, TMetaNumber) + REGISTER_ATTRIBUTE(CMDnsSrvParamSet, iPort, TMetaNumber) +END_ATTRIBUTE_TABLE() + +START_ATTRIBUTE_TABLE(CMDnsAddrParamSet, KMDnsParamsFactoryUid, EMdnsAddrParamset) + REGISTER_ATTRIBUTE(CMDnsAddrParamSet, iDomainName, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsAddrParamSet, iAddr, TMeta) +END_ATTRIBUTE_TABLE() + +START_ATTRIBUTE_TABLE(CMDnsTxtParamSet, KMDnsParamsFactoryUid, EMdnsTxtParamset) + REGISTER_ATTRIBUTE(CMDnsTxtParamSet, iDomainName, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsTxtParamSet, iTxtData, TMetaBuf8) +END_ATTRIBUTE_TABLE() + +START_ATTRIBUTE_TABLE(CMDnsPublishResponseParamSet, KMDnsParamsFactoryUid, EMdnsPublishResponseParamset) + REGISTER_ATTRIBUTE(CMDnsPublishResponseParamSet, iDomainName, TMetaBuf8) + REGISTER_ATTRIBUTE(CMDnsPublishResponseParamSet, iError, TMetaNumber) +END_ATTRIBUTE_TABLE() + +START_ATTRIBUTE_TABLE(CMDnsRegisterNotifyParamSet, KMDnsParamsFactoryUid, EMdnsRegisterNotifyParamset) + REGISTER_ATTRIBUTE(CMDnsRegisterNotifyParamSet, iInstanceName, TMetaBuf8) +END_ATTRIBUTE_TABLE() + +START_ATTRIBUTE_TABLE(CMDnsPublishParamSet, KMDnsParamsFactoryUid, EMdnsPublishParamset) + REGISTER_ATTRIBUTE(CMDnsPublishParamSet, isPublish, TMetaNumber) +END_ATTRIBUTE_TABLE() +CMDnsParamSetBase* CMDnsParamsExtFactory::NewL ( TAny* aConstructionParams ) + { + const TInt32 familyType = reinterpret_cast(aConstructionParams); + CMDnsParamSetBase* myMDnsParamBase = NULL; + switch ( familyType ) + { + case EMDnsDiscoverRequestParamSet: + myMDnsParamBase = new (ELeave) CMDnsQueryRequestParamSet; + break; + + case EMdnsPtrParamset: + myMDnsParamBase = new (ELeave) CMDnsPtrParamSet; + break; + + case EMdnsSrvParamset : + myMDnsParamBase = new (ELeave) CMDnsSrvParamSet; + break; + + case EMdnsAddrParamset : + myMDnsParamBase = new (ELeave) CMDnsAddrParamSet; + break; + + case EMdnsTxtParamset : + myMDnsParamBase = new (ELeave) CMDnsTxtParamSet; + break; + + case EMdnsPublishResponseParamset: + myMDnsParamBase = new (ELeave) CMDnsPublishResponseParamSet; + break; + + case EMdnsRegisterNotifyParamset: + myMDnsParamBase = new (ELeave) CMDnsRegisterNotifyParamSet; + break; + + case EMdnsPublishParamset: + myMDnsParamBase = new (ELeave) CMDnsPublishParamSet; + break; + + default: + ASSERT(0); + break; + } + return myMDnsParamBase; + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/common/inc/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/common/inc/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/common/inc/mdnsdebug.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/common/inc/mdnsdebug.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2006 - 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: +* +*/ + + +/** +@file +@internalComponent +*/ + +#ifndef MDNSDEBUG_H +#define MDNSDEBUG_H + +#include + +__FLOG_STMT(_LIT8(KMDNSSubsystem, "MDNS");) + +#ifdef __FLOG_ACTIVE +#define __MDNS_HEAP_FLOG \ + { \ + TInt allocated; \ + TInt largest; \ + TInt available(User::Heap().Available(largest)); \ + TInt size(User::Heap().Size()); \ + User::Heap().AllocSize(allocated); \ + __FLOG_STATIC_VA((KMDNSSubsystem, KComponent, _L8("Heap: Size = %d, Allocated = %d, Available = %d, Largest block = %d"), size, allocated, available, largest)); \ + } +#else +#define __MDNS_HEAP_FLOG +#endif // __FLOG_ACTIVE + +#endif // MDNSDEBUG_H diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/bwins/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/bwins/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/bwins/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/bwins/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/bwins/dnsparseru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/bwins/dnsparseru.def Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,63 @@ +EXPORTS + ?SetHeader@CDnsMessage@@QAEXABVTDnsHeader@@@Z @ 1 NONAME ; void CDnsMessage::SetHeader(class TDnsHeader const &) + ?NewL@CRdTypePtr@@SAPAV1@XZ @ 2 NONAME ; class CRdTypePtr * CRdTypePtr::NewL(void) + ?AppendTextDataL@CRdTypeTxt@@QAEXABVRBuf8@@@Z @ 3 NONAME ; void CRdTypeTxt::AppendTextDataL(class RBuf8 const &) + ?Size@CRdTypeTxt@@UBEGXZ @ 4 NONAME ; unsigned short CRdTypeTxt::Size(void) const + ?SetUnicast@CDnsQuestion@@QAEXH@Z @ 5 NONAME ; void CDnsQuestion::SetUnicast(int) + ?NewL@CRdTypeTxt@@SAPAV1@XZ @ 6 NONAME ; class CRdTypeTxt * CRdTypeTxt::NewL(void) + ?SetFlushBit@CDnsResourceData@@QAEXH@Z @ 7 NONAME ; void CDnsResourceData::SetFlushBit(int) + ?Type@CDnsSection@@QBEGXZ @ 8 NONAME ; unsigned short CDnsSection::Type(void) const + ?IsFlushBitSet@CDnsResourceData@@QBEHXZ @ 9 NONAME ; int CDnsResourceData::IsFlushBitSet(void) const + ?AppendQueryL@CDnsMessage@@QAEXPBVCDnsQuestion@@@Z @ 10 NONAME ; void CDnsMessage::AppendQueryL(class CDnsQuestion const *) + ?Priority@CRdTypeSrv@@QBEGXZ @ 11 NONAME ; unsigned short CRdTypeSrv::Priority(void) const + ?NewL@CRdTypeA@@SAPAV1@XZ @ 12 NONAME ; class CRdTypeA * CRdTypeA::NewL(void) + ?Size@CDnsMessage@@QBEGXZ @ 13 NONAME ; unsigned short CDnsMessage::Size(void) const + ?IsUnicast@CDnsQuestion@@QBEHXZ @ 14 NONAME ; int CDnsQuestion::IsUnicast(void) const + ??1CRdTypeTxt@@UAE@XZ @ 15 NONAME ; CRdTypeTxt::~CRdTypeTxt(void) + ?AppendAuthorityL@CDnsMessage@@QAEXPBVCDnsResourceData@@@Z @ 16 NONAME ; void CDnsMessage::AppendAuthorityL(class CDnsResourceData const *) + ?SetDomainNameL@CRdTypePtr@@QAEXABVTDesC8@@@Z @ 17 NONAME ; void CRdTypePtr::SetDomainNameL(class TDesC8 const &) + ?CreateMessageL@CDnsMessageComposerParser@@QAEXAAVRBuf8@@ABVCDnsMessage@@@Z @ 18 NONAME ; void CDnsMessageComposerParser::CreateMessageL(class RBuf8 &, class CDnsMessage const &) + ?Text@CRdTypeTxt@@QBEABV?$RArray@VRBuf8@@@@XZ @ 19 NONAME ; class RArray const & CRdTypeTxt::Text(void) const + ?SetNameL@CDnsSection@@QAEXABVTDesC8@@@Z @ 20 NONAME ; void CDnsSection::SetNameL(class TDesC8 const &) + ?Queries@CDnsMessage@@QBEABV?$RPointerArray@VCDnsQuestion@@@@XZ @ 21 NONAME ; class RPointerArray const & CDnsMessage::Queries(void) const + ?AppendAdditionalL@CDnsMessage@@QAEXPBVCDnsResourceData@@@Z @ 22 NONAME ; void CDnsMessage::AppendAdditionalL(class CDnsResourceData const *) + ?Class@CDnsSection@@QBEGXZ @ 23 NONAME ; unsigned short CDnsSection::Class(void) const + ?SetPort@CRdTypeSrv@@QAEXG@Z @ 24 NONAME ; void CRdTypeSrv::SetPort(unsigned short) + ??1CDnsResourceData@@UAE@XZ @ 25 NONAME ; CDnsResourceData::~CDnsResourceData(void) + ?SetTargetL@CRdTypeSrv@@QAEXABVTDesC8@@@Z @ 26 NONAME ; void CRdTypeSrv::SetTargetL(class TDesC8 const &) + ?SetTtl@CDnsResourceData@@QAEXK@Z @ 27 NONAME ; void CDnsResourceData::SetTtl(unsigned long) + ?NewL@CDnsMessage@@SAPAV1@GH@Z @ 28 NONAME ; class CDnsMessage * CDnsMessage::NewL(unsigned short, int) + ?Answers@CDnsMessage@@QBEABV?$RPointerArray@VCDnsResourceData@@@@XZ @ 29 NONAME ; class RPointerArray const & CDnsMessage::Answers(void) const + ?Additional@CDnsMessage@@QBEABV?$RPointerArray@VCDnsResourceData@@@@XZ @ 30 NONAME ; class RPointerArray const & CDnsMessage::Additional(void) const + ?Size@CRdTypeA@@UBEGXZ @ 31 NONAME ; unsigned short CRdTypeA::Size(void) const + ?Target@CRdTypeSrv@@QBEABVTDesC8@@XZ @ 32 NONAME ; class TDesC8 const & CRdTypeSrv::Target(void) const + ?Header@CDnsMessage@@QBEABVTDnsHeader@@XZ @ 33 NONAME ; class TDnsHeader const & CDnsMessage::Header(void) const + ??1CRdTypeA@@UAE@XZ @ 34 NONAME ; CRdTypeA::~CRdTypeA(void) + ?Size@CRdTypePtr@@UBEGXZ @ 35 NONAME ; unsigned short CRdTypePtr::Size(void) const + ?NewL@CRdTypeSrv@@SAPAV1@XZ @ 36 NONAME ; class CRdTypeSrv * CRdTypeSrv::NewL(void) + ?Address@CRdTypeA@@QBEABVTInetAddr@@XZ @ 37 NONAME ; class TInetAddr const & CRdTypeA::Address(void) const + ?AppendAnswerL@CDnsMessage@@QAEXPBVCDnsResourceData@@@Z @ 38 NONAME ; void CDnsMessage::AppendAnswerL(class CDnsResourceData const *) + ?DomainName@CRdTypePtr@@QBEABVTDesC8@@XZ @ 39 NONAME ; class TDesC8 const & CRdTypePtr::DomainName(void) const + ?CloneL@CDnsResourceData@@QBEPAV1@XZ @ 40 NONAME ; class CDnsResourceData * CDnsResourceData::CloneL(void) const + ?ParseMessageL@CDnsMessageComposerParser@@QAEPAVCDnsMessage@@ABVTDesC8@@@Z @ 41 NONAME ; class CDnsMessage * CDnsMessageComposerParser::ParseMessageL(class TDesC8 const &) + ?SetWeight@CRdTypeSrv@@QAEXG@Z @ 42 NONAME ; void CRdTypeSrv::SetWeight(unsigned short) + ?NewL@CDnsMessageComposerParser@@SAPAV1@XZ @ 43 NONAME ; class CDnsMessageComposerParser * CDnsMessageComposerParser::NewL(void) + ??1CRdTypePtr@@UAE@XZ @ 44 NONAME ; CRdTypePtr::~CRdTypePtr(void) + ??1CDnsQuestion@@UAE@XZ @ 45 NONAME ; CDnsQuestion::~CDnsQuestion(void) + ?Size@CRdTypeSrv@@UBEGXZ @ 46 NONAME ; unsigned short CRdTypeSrv::Size(void) const + ?SetPriority@CRdTypeSrv@@QAEXG@Z @ 47 NONAME ; void CRdTypeSrv::SetPriority(unsigned short) + ?Weight@CRdTypeSrv@@QBEGXZ @ 48 NONAME ; unsigned short CRdTypeSrv::Weight(void) const + ?SetType@CDnsSection@@QAEXG@Z @ 49 NONAME ; void CDnsSection::SetType(unsigned short) + ??1CDnsSection@@UAE@XZ @ 50 NONAME ; CDnsSection::~CDnsSection(void) + ?SetRdLength@CDnsResourceData@@QAEXG@Z @ 51 NONAME ; void CDnsResourceData::SetRdLength(unsigned short) + ??1CRdTypeSrv@@UAE@XZ @ 52 NONAME ; CRdTypeSrv::~CRdTypeSrv(void) + ?Port@CRdTypeSrv@@QBEGXZ @ 53 NONAME ; unsigned short CRdTypeSrv::Port(void) const + ?RdLength@CDnsResourceData@@QBEGXZ @ 54 NONAME ; unsigned short CDnsResourceData::RdLength(void) const + ?Authorities@CDnsMessage@@QBEABV?$RPointerArray@VCDnsResourceData@@@@XZ @ 55 NONAME ; class RPointerArray const & CDnsMessage::Authorities(void) const + ?Name@CDnsSection@@QBEABVTDesC8@@XZ @ 56 NONAME ; class TDesC8 const & CDnsSection::Name(void) const + ?NewL@CDnsQuestion@@SAPAV1@XZ @ 57 NONAME ; class CDnsQuestion * CDnsQuestion::NewL(void) + ?Ttl@CDnsResourceData@@QBEKXZ @ 58 NONAME ; unsigned long CDnsResourceData::Ttl(void) const + ?Size@CDnsQuestion@@QBEGXZ @ 59 NONAME ; unsigned short CDnsQuestion::Size(void) const + ?SetClass@CDnsSection@@QAEXG@Z @ 60 NONAME ; void CDnsSection::SetClass(unsigned short) + ?SetAddr@CRdTypeA@@QAEXABVTInetAddr@@@Z @ 61 NONAME ; void CRdTypeA::SetAddr(class TInetAddr const &) + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/eabi/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/eabi/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/eabi/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/eabi/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/eabi/dnsparseru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/eabi/dnsparseru.def Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,101 @@ +EXPORTS + _ZN10CRdTypePtr14SetDomainNameLERK6TDesC8 @ 1 NONAME + _ZN10CRdTypePtr4NewLEv @ 2 NONAME + _ZN10CRdTypePtrD0Ev @ 3 NONAME + _ZN10CRdTypePtrD1Ev @ 4 NONAME + _ZN10CRdTypePtrD2Ev @ 5 NONAME + _ZN10CRdTypeSrv10SetTargetLERK6TDesC8 @ 6 NONAME + _ZN10CRdTypeSrv11SetPriorityEt @ 7 NONAME + _ZN10CRdTypeSrv4NewLEv @ 8 NONAME + _ZN10CRdTypeSrv9SetWeightEt @ 9 NONAME + _ZN10CRdTypeSrvD0Ev @ 10 NONAME + _ZN10CRdTypeSrvD1Ev @ 11 NONAME + _ZN10CRdTypeSrvD2Ev @ 12 NONAME + _ZN10CRdTypeTxt15AppendTextDataLERK5RBuf8 @ 13 NONAME + _ZN10CRdTypeTxt4NewLEv @ 14 NONAME + _ZN10CRdTypeTxtD0Ev @ 15 NONAME + _ZN10CRdTypeTxtD1Ev @ 16 NONAME + _ZN10CRdTypeTxtD2Ev @ 17 NONAME + _ZN11CDnsMessage12AppendQueryLEPK12CDnsQuestion @ 18 NONAME + _ZN11CDnsMessage13AppendAnswerLEPK16CDnsResourceData @ 19 NONAME + _ZN11CDnsMessage16AppendAuthorityLEPK16CDnsResourceData @ 20 NONAME + _ZN11CDnsMessage17AppendAdditionalLEPK16CDnsResourceData @ 21 NONAME + _ZN11CDnsMessage4NewLEti @ 22 NONAME + _ZN11CDnsMessage9SetHeaderERK10TDnsHeader @ 23 NONAME + _ZN11CDnsSection7SetTypeEt @ 24 NONAME + _ZN11CDnsSection8SetClassEt @ 25 NONAME + _ZN11CDnsSection8SetNameLERK6TDesC8 @ 26 NONAME + _ZN11CDnsSectionD0Ev @ 27 NONAME + _ZN11CDnsSectionD1Ev @ 28 NONAME + _ZN11CDnsSectionD2Ev @ 29 NONAME + _ZN12CDnsQuestion10SetUnicastEi @ 30 NONAME + _ZN12CDnsQuestion4NewLEv @ 31 NONAME + _ZN12CDnsQuestionD0Ev @ 32 NONAME + _ZN12CDnsQuestionD1Ev @ 33 NONAME + _ZN12CDnsQuestionD2Ev @ 34 NONAME + _ZN16CDnsResourceData11SetFlushBitEi @ 35 NONAME + _ZN16CDnsResourceData11SetRdLengthEt @ 36 NONAME + _ZN16CDnsResourceData6SetTtlEm @ 37 NONAME + _ZN16CDnsResourceDataD0Ev @ 38 NONAME + _ZN16CDnsResourceDataD1Ev @ 39 NONAME + _ZN16CDnsResourceDataD2Ev @ 40 NONAME + _ZN25CDnsMessageComposerParser13ParseMessageLERK6TDesC8 @ 41 NONAME + _ZN25CDnsMessageComposerParser14CreateMessageLER5RBuf8RK11CDnsMessage @ 42 NONAME + _ZN25CDnsMessageComposerParser4NewLEv @ 43 NONAME + _ZN8CRdTypeA4NewLEv @ 44 NONAME + _ZN8CRdTypeA7SetAddrERK9TInetAddr @ 45 NONAME + _ZN8CRdTypeAD0Ev @ 46 NONAME + _ZN8CRdTypeAD1Ev @ 47 NONAME + _ZN8CRdTypeAD2Ev @ 48 NONAME + _ZNK10CRdTypePtr10DomainNameEv @ 49 NONAME + _ZNK10CRdTypePtr4SizeEv @ 50 NONAME + _ZNK10CRdTypeSrv4SizeEv @ 51 NONAME + _ZNK10CRdTypeSrv6TargetEv @ 52 NONAME + _ZNK10CRdTypeSrv6WeightEv @ 53 NONAME + _ZNK10CRdTypeSrv8PriorityEv @ 54 NONAME + _ZNK10CRdTypeTxt4SizeEv @ 55 NONAME + _ZNK10CRdTypeTxt4TextEv @ 56 NONAME + _ZNK11CDnsMessage10AdditionalEv @ 57 NONAME + _ZNK11CDnsMessage11AuthoritiesEv @ 58 NONAME + _ZNK11CDnsMessage4SizeEv @ 59 NONAME + _ZNK11CDnsMessage6HeaderEv @ 60 NONAME + _ZNK11CDnsMessage7AnswersEv @ 61 NONAME + _ZNK11CDnsMessage7QueriesEv @ 62 NONAME + _ZNK11CDnsSection4NameEv @ 63 NONAME + _ZNK11CDnsSection4TypeEv @ 64 NONAME + _ZNK11CDnsSection5ClassEv @ 65 NONAME + _ZNK12CDnsQuestion4SizeEv @ 66 NONAME + _ZNK12CDnsQuestion9IsUnicastEv @ 67 NONAME + _ZNK16CDnsResourceData13IsFlushBitSetEv @ 68 NONAME + _ZNK16CDnsResourceData3TtlEv @ 69 NONAME + _ZNK16CDnsResourceData6CloneLEv @ 70 NONAME + _ZNK16CDnsResourceData8RdLengthEv @ 71 NONAME + _ZNK8CRdTypeA4SizeEv @ 72 NONAME + _ZNK8CRdTypeA7AddressEv @ 73 NONAME + _ZTI10CDnsMsgBuf @ 74 NONAME + _ZTI10CDnsPacket @ 75 NONAME + _ZTI10CRdTypePtr @ 76 NONAME + _ZTI10CRdTypeSrv @ 77 NONAME + _ZTI10CRdTypeTxt @ 78 NONAME + _ZTI11CDnsMessage @ 79 NONAME + _ZTI11CDnsSection @ 80 NONAME + _ZTI12CDnsQuestion @ 81 NONAME + _ZTI13CStringParser @ 82 NONAME + _ZTI16CDnsResourceData @ 83 NONAME + _ZTI25CDnsMessageComposerParser @ 84 NONAME + _ZTI8CRdTypeA @ 85 NONAME + _ZTV10CDnsMsgBuf @ 86 NONAME + _ZTV10CDnsPacket @ 87 NONAME + _ZTV10CRdTypePtr @ 88 NONAME + _ZTV10CRdTypeSrv @ 89 NONAME + _ZTV10CRdTypeTxt @ 90 NONAME + _ZTV11CDnsMessage @ 91 NONAME + _ZTV11CDnsSection @ 92 NONAME + _ZTV12CDnsQuestion @ 93 NONAME + _ZTV13CStringParser @ 94 NONAME + _ZTV16CDnsResourceData @ 95 NONAME + _ZTV25CDnsMessageComposerParser @ 96 NONAME + _ZTV8CRdTypeA @ 97 NONAME + _ZN10CRdTypeSrv7SetPortEt @ 98 NONAME + _ZNK10CRdTypeSrv4PortEv @ 99 NONAME + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/group/bld.inf Thu Jun 24 19:09:47 2010 +0530 @@ -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: +* +*/ + + +PRJ_EXPORTS +../inc/cdnsmessagecomposerparser.h /epoc32/include/mdns/cdnsmessagecomposerparser.h +../inc/cdnsmessage.h /epoc32/include/mdns/cdnsmessage.h +../inc/cdnssection.h /epoc32/include/mdns/cdnssection.h +../inc/cdnsquestion.h /epoc32/include/mdns/cdnsquestion.h +../inc/cdnsresourcedata.h /epoc32/include/mdns/cdnsresourcedata.h +../inc/crdtypea.h /epoc32/include/mdns/crdtypea.h +../inc/crdtypesrv.h /epoc32/include/mdns/crdtypesrv.h +../inc/crdtypeptr.h /epoc32/include/mdns/crdtypeptr.h +../inc/crdtypetxt.h /epoc32/include/mdns/crdtypetxt.h +../inc/tdnsheader.h /epoc32/include/mdns/tdnsheader.h +../inc/tdnsheader.inl /epoc32/include/mdns/tdnsheader.inl +../inc/dnsconstants.h /epoc32/include/mdns/dnsconstants.h + + + +PRJ_MMPFILES +dnsparser.mmp + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/group/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/group/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/group/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/group/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/group/dnsparser.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/group/dnsparser.mmp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,51 @@ +/* +* 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: +* +*/ + + + + +TARGET dnsparser.dll +TARGETTYPE dll +UID 0x1000008d 0x01827777 + +CAPABILITY ALL -TCB + +SOURCEPATH ../src +SOURCE cdnsmessagecomposerparser.cpp +SOURCE cdnsmessage.cpp +SOURCE cdnssection.cpp +SOURCE cdnsresourcedata.cpp +SOURCE cdnsquestion.cpp +SOURCE crdtypea.cpp +SOURCE crdtypesrv.cpp +SOURCE crdtypeptr.cpp +SOURCE crdtypetxt.cpp +SOURCE cdnspacket.cpp +SOURCE cstringparser.cpp cdnsmsgbuf.cpp + +USERINCLUDE ../inc +SYSTEMINCLUDE /epoc32/include + +LIBRARY euser.lib +LIBRARY esock.lib +LIBRARY insock.lib + +MW_LAYER_SYSTEMINCLUDE + +#include + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cdnsmessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cdnsmessage.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,60 @@ +/* +* 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 __CDNSMESSAGE_H__ +#define __CDNSMESSAGE_H__ + +#include +#include +#include +#include +#include +#include +#include + + +//This class represents the complete dns message +class CDnsMessage : public CBase + { +public: + ~CDnsMessage(); + IMPORT_C static CDnsMessage* NewL(TUint16 aId, TBool aQuery); + IMPORT_C void AppendQueryL(const CDnsQuestion* aQuery ); + IMPORT_C void AppendAnswerL( const CDnsResourceData* aAnswer ); + IMPORT_C void AppendAuthorityL( const CDnsResourceData* aAuthority ); + IMPORT_C void AppendAdditionalL(const CDnsResourceData* aAdditional ); + IMPORT_C void SetHeader(const TDnsHeader& aHeader); + IMPORT_C const RPointerArray& Queries()const; + IMPORT_C const RPointerArray& Answers()const; + IMPORT_C const RPointerArray& Authorities()const; + IMPORT_C const RPointerArray& Additional()const; + IMPORT_C const TDnsHeader& Header()const; + IMPORT_C TUint16 Size()const; + +private : + CDnsMessage(TUint16 aId, TBool aQuery); + +private: + TDnsHeader iHeader; + RPointerArray iQueries; + RPointerArray iAnswers; + RPointerArray iAuthorities; + RPointerArray iAdditional; + }; + +#endif //__CDNSMESSAGE_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cdnsmessagecomposerparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cdnsmessagecomposerparser.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,59 @@ +/* +* 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 __CDNSMESSAGECOMPOSERPARSER_H__ +#define __CDNSMESSAGECOMPOSERPARSER_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class CDnsPacket; +class CDnsMsgBuf; + +//Main class which mDNS Responder will be making use to evoke compose and parse operations +class CDnsMessageComposerParser: public CBase + { +public: + IMPORT_C static CDnsMessageComposerParser* NewL(); + IMPORT_C void CreateMessageL(RBuf8& aMessageBuffer, const CDnsMessage& aMessage ); + IMPORT_C CDnsMessage* ParseMessageL(const TDesC8& aBuffer); + ~CDnsMessageComposerParser(); + void ConstructL(); + +private: + CDnsMessageComposerParser(); + CDnsResourceData* GetResourceRecordsL(); + void AppendResourceRecordsL( CDnsResourceData* aResourceRecord ); + TUint16 GetLength( const CDnsMessage& aMessage )const; + +private: + RBuf8 iBuf; + CDnsPacket* iPacket; + CDnsMsgBuf* iMsgBuf; + __FLOG_DECLARATION_MEMBER; + }; + +#endif //__CDNSMESSAGECOMPOSERPARSER_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cdnsmsgbuf.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cdnsmsgbuf.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,57 @@ +/* +* 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 __CDNSMSGBUF_H__ +#define __CDNSMSGBUF_H__ + +#include +#include +#include + +#include "tdnsheader.h" +#include "cstringparser.h" + + +//CDnsMsgBuf class composes a raw buffer from the supplied inputs +class CDnsMsgBuf : public CBase + { +public: + ~CDnsMsgBuf(); + static CDnsMsgBuf* NewL(const TDesC8& aBuf); + void SetChar(TUint8 aVal); + void SetInt16(TUint16 aVal); + void SetInt32(TUint32 aVal); + void SetDomainNameL(const TDesC8& aName); + void SetText(const TDesC8& aTxt); + void SetPtrRdLengthL(const TDesC8& aName); + void SetSrvRdLengthL(const TDesC8& aName); + void SetTxtRdLength(const RArray& aTxtList); + +private: + void ConstructL(const TDesC8& aBuf); + CDnsMsgBuf(const TDesC8& aBuf); + TUint16 GetDomainLengthL(const TDesC8& aName)const; + +private: + TUint8* iPtr; + TUint iIndex; + TUint iDataLength; + }; + +#endif //__CDNSMSGBUF_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cdnspacket.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cdnspacket.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,60 @@ +/* +* 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 __CDNSPACKET_H__ +#define __CDNSPACKET_H__ + +#include +#include +#include + +#include "tdnsheader.h" + +#define __OOB(aIndex,aDataLength) {if(aIndex >= aDataLength) User::Leave(KErrCorrupt);} + +_LIT8(KDot,"."); + +class CDnsPacket : public CBase + { +public: + ~CDnsPacket(); + static CDnsPacket* NewL(const TDes8& aPacketPtr); + TUint8 GetCharL(); + TUint16 GetInt16L(); + TUint32 GetInt32L(); + const TDnsHeader& GetHeaderL(); + void GetDomainNameL(TDes8& aName); + void GetRdDomainNameL(TDes8& aDomainName,TUint aLength); + void GetStringL(TDes8& aString, TUint16 aLength); + +private: + void ConstructL(); + CDnsPacket(const TDes8& aPacketPtr); + void GetStringAtIndexL(TDes8& aLabel, TUint aOffset); + void GetDomainNameAtIndexL(TDes8& aDomainName, TUint aOffset); + +private: + TDnsHeader iHeader; + const TUint8* iPtr; + TUint iIndex; + TUint iDataLength; + TUint iMaxLength; + }; + +#endif //__CDNSPACKET_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cdnsquestion.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cdnsquestion.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,55 @@ +/* +* 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 __CDNSQUESTION_H__ +#define __CDNSQUESTION_H__ + +#include +#include +#include + +/* 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | | + / QNAME / + / / + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | QTYPE | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |UC QCLASS | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +*/ + +class CDnsQuestion : public CDnsSection + { +public: + IMPORT_C ~CDnsQuestion(); + IMPORT_C static CDnsQuestion* NewL(); + + IMPORT_C TBool IsUnicast()const; + IMPORT_C void SetUnicast(TBool); + + IMPORT_C TUint16 Size()const; + +private: + CDnsQuestion(); + }; + +#endif //__CDNSQUESTION_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cdnsresourcedata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cdnsresourcedata.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,79 @@ +/* +* 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 __CDNSRESOURCEDATA_H__ +#define __CDNSRESOURCEDATA_H__ + + +#include +#include +#include + + +/* 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | | + / / + / NAME / + | | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | TYPE | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |FL CLASS | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | TTL | + | | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | RDLENGTH | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| + / RDATA / + / / + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +*/ + +class CDnsResourceData: public CDnsSection + { +public: + IMPORT_C virtual ~CDnsResourceData(); + + IMPORT_C CDnsResourceData* CloneL()const; + + IMPORT_C TBool IsFlushBitSet()const; + IMPORT_C void SetFlushBit(TBool aFlushBit); + + IMPORT_C TUint16 RdLength()const; + IMPORT_C void SetRdLength(TUint16 aRdLength); + + IMPORT_C TUint32 Ttl()const; + IMPORT_C void SetTtl(TUint32 aTtl); + + virtual TUint16 Size()const; + +protected: + CDnsResourceData(); + + +protected: + TUint16 iRdLength; + TUint32 iTtl; + }; + +#endif __CDNSRESOURCEDATA_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cdnssection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cdnssection.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,50 @@ +/* +* 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 __CDNSSECTION_H__ +#define __CDNSSECTION_H__ + +#include +#include + + +// Base class for Question and Data section of the message +class CDnsSection : public CBase + { +public: + IMPORT_C virtual ~CDnsSection(); + IMPORT_C const TDesC8& Name()const; + IMPORT_C void SetNameL(const TDesC8& aName); + + IMPORT_C TUint16 Type()const; + IMPORT_C void SetType(TUint16 aType); + + IMPORT_C TUint16 Class()const; + IMPORT_C void SetClass(TUint16 aClass); + +protected: + CDnsSection(); + +protected: + RBuf8 iName; + TUint16 iType; + TUint16 iClass; + }; + +#endif // __CDNSSECTION_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/crdtypea.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/crdtypea.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,45 @@ +/* +* 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 _CRDTYPEA_H__ +#define _CRDTYPEA_H__ + +#include +#include +#include +#include + +class CRdTypeA : public CDnsResourceData + { +public: + IMPORT_C ~CRdTypeA(); + IMPORT_C static CRdTypeA* NewL(); + + IMPORT_C const TInetAddr& Address()const; + IMPORT_C void SetAddr(const TInetAddr& aAddr ); + + IMPORT_C TUint16 Size()const; + +private: + CRdTypeA(); + +private: + TInetAddr iAddr; + }; + +#endif //_CRDTYPEA_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/crdtypeptr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/crdtypeptr.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,60 @@ +/* +* 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 __CRDTYPEPTR_H__ +#define __CRDTYPEPTR_H__ + +#include +#include +#include + + +/* +The compression scheme allows a domain name in a message to be +represented as either: + + - a sequence of labels ending in a zero octet + + - a pointer + + - a sequence of labels ending with a pointer +*/ + + +class CRdTypePtr : public CDnsResourceData + { +public: + IMPORT_C ~CRdTypePtr(); + IMPORT_C static CRdTypePtr* NewL(); + + IMPORT_C const TDesC8& DomainName()const; + IMPORT_C void SetDomainNameL(const TDesC8& aDomainName); + + void ConstructL(const TDesC8& aDomainName); + IMPORT_C TUint16 Size()const; + +private : + CRdTypePtr(); + +private : + RBuf8 iDomainName; + }; + +#endif //__CRDTYPEPTR_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/crdtypesrv.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/crdtypesrv.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,58 @@ +/* +* 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 __CRDTYPESRV_H__ +#define __CRDTYPESRV_H__ + +#include +#include +#include + +class CRdTypeSrv : public CDnsResourceData + { +public: + IMPORT_C ~CRdTypeSrv(); + IMPORT_C static CRdTypeSrv* NewL(); + + IMPORT_C TUint16 Priority()const; + IMPORT_C void SetPriority(TUint16 aPriority); + + IMPORT_C TUint16 Weight()const; + IMPORT_C void SetWeight(TUint16 aWeight); + + IMPORT_C TUint16 Port()const; + IMPORT_C void SetPort(TUint16 aPort); + + IMPORT_C const TDesC8& Target()const; + IMPORT_C void SetTargetL(const TDesC8& aTarget); + + void ConstructL(const TDesC8& aTarget); + IMPORT_C TUint16 Size()const; + +private: + CRdTypeSrv(); + +private: + RBuf8 iTarget; + TUint16 iPrio; + TUint16 iWeight; + TUint16 iPort; + }; + +#endif //__CRDTYPESRV_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/crdtypetxt.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/crdtypetxt.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,44 @@ +/* +* 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 __CRDTYPETXT_H__ +#define __CRDTYPETXT_H__ + +#include + +#include +#include + +class CRdTypeTxt : public CDnsResourceData + { +public: + IMPORT_C ~CRdTypeTxt(); + IMPORT_C static CRdTypeTxt* NewL(); + IMPORT_C const RArray& Text()const; + IMPORT_C void AppendTextDataL(const RBuf8& aTextData); + void ConstructL(); + IMPORT_C TUint16 Size()const; + +private: + CRdTypeTxt(); + +private: + RArray iTxtData; + }; + +#endif //__CRDTYPETXT_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/cstringparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/cstringparser.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,49 @@ +/* +* 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 __CSTRINGPARSER_H__ +#define __CSTRINGPARSER_H__ + +// String parser class to parse a string incremently +class CStringParser : public CBase + { +public: + static CStringParser* NewL ( const TDesC8& aBuffer ); + + virtual ~CStringParser (); + + TBool GetNextCharacter ( TChar& aChar ); + TBool GetCurrentCharacter ( TChar& aChar ); + TBool ParseTill ( TPtrC8& aWord, TChar aEndChar ); + void ParseTill ( TPtrC8& aWord, const TDesC8& aCharSet ); + + TBool SkipLength ( TInt aLen ); + + void GetRemainder ( TPtrC8& aBuffer ); +protected: + CStringParser ( const TDesC8& aBuffer ); + +private: + void IncrementCurrentPos (); + +private: + const TDesC8& iBuffer; + TInt iCurrentPos; + }; + +#endif // __CSTRINGPARSER_H__ \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/dnsconstants.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/dnsconstants.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,123 @@ +/* +* 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 __DNSCONSTANTS_H__ +#define __DNSCONSTANTS_H__ + +#include + +const TInt KDnsPort = 53; +const TInt KMdnsPort = 5353; +const TUint32 KMDnsAddr = INET_ADDR(224, 0, 0, 251); + +const TInt KDnsTtl = 60 * 60; //< default one hour TTL +const TInt KKnownAnswerTtl = 120; +const TInt KQueryWaitInterval = 225; // + +class TDnsHeader + { +public: + inline TUint16 Id()const; + inline TUint16 IsQuery()const; + inline TUint16 Opcode()const; + inline TUint16 IsAuthoritative()const; + inline TUint16 IsTruncated()const; + inline TUint16 RecursionDesired()const; + inline TUint16 RecursionAvailable()const; + inline TUint16 Reserved()const; + inline TUint16 ResponseCode()const; + inline TUint16 QueryCount()const; + inline TUint16 AnswerCount()const; + inline TUint16 AuthorityNSCount()const; + inline TUint16 AdditionalRCount()const; + inline TUint16 Flags()const; + + inline void SetId(TUint16 aId); + inline void SetQuery(TBool aQuery); + inline void SetOpcode(TUint16 aOpcode); + inline void SetAuthoritative(TBool aAuthBit); + inline void SetTruncated(TBool aTruncBit); + inline void SetRecursionDesired(TBool aRecDesired); + inline void SetRecursionAvailable(TBool aRecAvailable); + inline void SetReserved(TUint16 aResv); + inline void SetResponseCode(TUint16 aRespCode); + inline void SetFlags(TUint16 aFlags); + inline void SetQueryCount(TUint16 aCount); + inline void SetAnswerCount(TUint16 aCount); + inline void SetAuthorityNSCount(TUint16 aCount); + inline void SetAdditionalRCount(TUint16 aCount); + + inline TDnsHeader(); + inline TDnsHeader(const TDnsHeader& aHeader); + +private: +/* 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ID | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |QR| Opcode |AA|TC|RD|RA| Z | RCODE | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | QDCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ANCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | NSCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ARCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + +*/ + TUint16 iID; + TUint16 iFlags; + TUint16 iQCount; + TUint16 iACount; + TUint16 iNSCount; + TUint16 iARCount; + }; + +#include + +#endif //__TDNSHEADER_H__ + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/inc/tdnsheader.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/inc/tdnsheader.inl Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,206 @@ +/* +* 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 __TDNSHEADER_INL__ +#define __TDNSHEADER_INL__ + + +TDnsHeader::TDnsHeader() + { + iQCount = 0; + iACount = 0; + iNSCount = 0; + iARCount = 0; + iID = 0; + iFlags = 0; + } + + +TDnsHeader::TDnsHeader(const TDnsHeader& aHeader) + { + iQCount = aHeader.QueryCount(); + iACount = aHeader.AnswerCount(); + iNSCount = aHeader.AuthorityNSCount(); + iARCount = aHeader.AdditionalRCount(); + iID = aHeader.Id(); + iFlags = aHeader.Flags(); + } + + + +TUint16 TDnsHeader::Id()const + { + return iID; + } + +TUint16 TDnsHeader::IsQuery()const + { + return !(iFlags & EFlagQuery); + } + +TUint16 TDnsHeader::Opcode()const + { + return (iFlags >> 3) & EFlagOpcode; + } + +TUint16 TDnsHeader::IsAuthoritative()const + { + return iFlags & EFlagAuthoritative; + } + +TUint16 TDnsHeader::IsTruncated()const + { + return iFlags & EFlagTruncated; + } + +TUint16 TDnsHeader::RecursionDesired()const + { + return iFlags & EFlagRecurse; + } + +TUint16 TDnsHeader::RecursionAvailable()const + { + return iFlags & EFlagRecursionAvailable; + } + +TUint16 TDnsHeader::Reserved()const + { + return iFlags & EFlagReserved; + } + +TUint16 TDnsHeader::ResponseCode()const + { + return iFlags & EFlagResponseCode; + } + +TUint16 TDnsHeader::Flags()const + { + return iFlags; + } + +TUint16 TDnsHeader::QueryCount()const + { + return iQCount; + } + +TUint16 TDnsHeader::AnswerCount()const + { + return iACount; + } + +TUint16 TDnsHeader::AuthorityNSCount()const + { + return iNSCount; + } + +TUint16 TDnsHeader::AdditionalRCount()const + { + return iARCount; + } + +void TDnsHeader::SetId(TUint16 aId) + { + iID = aId; + } + +void TDnsHeader::SetQuery(TBool aQuery) + { + if (!aQuery) + iFlags |= EFlagQuery; + else + iFlags &= ~EFlagQuery; + } + + +void TDnsHeader::SetOpcode(TUint16 aOpcode) + { + aOpcode << 11; + iFlags |= aOpcode ; + } + +void TDnsHeader::SetAuthoritative(TBool aAuthBit) + { + if(aAuthBit) + iFlags |= EFlagAuthoritative; + else + iFlags &= ~EFlagAuthoritative; + } + + +void TDnsHeader::SetTruncated(TBool aTruncBit) + { + if(aTruncBit) + iFlags |= EFlagTruncated; + else + iFlags &= ~EFlagTruncated; + } + +void TDnsHeader::SetRecursionDesired(TBool aRecDesired) + { + if (aRecDesired) + iFlags |= EFlagRecurse; + else + iFlags &= ~EFlagRecurse; + } + +void TDnsHeader::SetRecursionAvailable(TBool aRecAvailable) + { + if (aRecAvailable) + iFlags |= EFlagRecursionAvailable; + else + iFlags &= ~EFlagRecursionAvailable; + } + +void TDnsHeader::SetReserved(TUint16 aResv) + { + aResv << 4; + iFlags |= aResv; + } + +void TDnsHeader::SetResponseCode(TUint16 aRespCode) + { + iFlags |= aRespCode; + } + +void TDnsHeader::SetFlags(TUint16 aFlags) + { + iFlags = aFlags; + } + +void TDnsHeader::SetQueryCount(TUint16 aCount) + { + iQCount = aCount; + } + +void TDnsHeader::SetAnswerCount(TUint16 aCount) + { + iACount = aCount; + } + +void TDnsHeader::SetAuthorityNSCount(TUint16 aCount) + { + iNSCount = aCount; + } + +void TDnsHeader::SetAdditionalRCount(TUint16 aCount) + { + iARCount = aCount; + } + +#endif //__TDNSHEADER_INL__ + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnsmessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnsmessage.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,134 @@ +/* +* 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 "cdnsmessage.h" + + +CDnsMessage::CDnsMessage(TUint16 aId, TBool aQuery) + { + iHeader.SetId(aId); + iHeader.SetQuery(aQuery); + } + +EXPORT_C CDnsMessage* CDnsMessage::NewL(TUint16 aId, TBool aQuery) + { + return ( new(ELeave)CDnsMessage(aId, aQuery) ); + } + +CDnsMessage::~CDnsMessage() + { + iQueries.ResetAndDestroy(); + iQueries.Close(); + iAnswers.ResetAndDestroy(); + iAnswers.Close(); + iAuthorities.ResetAndDestroy(); + iAuthorities.Close(); + iAdditional.ResetAndDestroy(); + iAdditional.Close(); + } + +EXPORT_C void CDnsMessage::SetHeader(const TDnsHeader& aHeader) + { + iHeader = aHeader; + } + +EXPORT_C void CDnsMessage::AppendQueryL(const CDnsQuestion* aQuery) + { + iQueries.AppendL(aQuery); + iHeader.SetQueryCount(iQueries.Count()); + } + +EXPORT_C void CDnsMessage::AppendAnswerL(const CDnsResourceData* aAnswer) + { + iAnswers.AppendL(aAnswer); + iHeader.SetAnswerCount(iAnswers.Count()); + } + +EXPORT_C void CDnsMessage::AppendAuthorityL(const CDnsResourceData* aAuthority) + { + iAuthorities.AppendL(aAuthority); + iHeader.SetAuthorityNSCount(iAuthorities.Count()); + } + +EXPORT_C void CDnsMessage::AppendAdditionalL(const CDnsResourceData* aAdditional) + { + iAdditional.AppendL(aAdditional); + iHeader.SetAdditionalRCount(iAdditional.Count()); + } + +EXPORT_C const RPointerArray& CDnsMessage::Queries()const + { + return iQueries; + } + +EXPORT_C const RPointerArray& CDnsMessage::Answers()const + { + return iAnswers; + } + +EXPORT_C const RPointerArray& CDnsMessage::Authorities()const + { + return iAuthorities; + } + +EXPORT_C const RPointerArray& CDnsMessage::Additional()const + { + return iAdditional; + } + +EXPORT_C const TDnsHeader& CDnsMessage::Header()const + { + return iHeader; + } + +//Calculates the size of the dns message +EXPORT_C TUint16 CDnsMessage::Size()const + { + TUint16 size =0; + size += sizeof(iHeader); + + TInt i; + + for ( i=0; iSize(); + } + + for ( i=0; iSize(); + } + + for ( i=0; iSize(); + } + + for ( i=0; iSize(); + } + return size ; + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnsmessagecomposerparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnsmessagecomposerparser.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,372 @@ +/* +* 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 "cdnsmessagecomposerparser.h" +#include "cdnsmsgbuf.h" +#include "cdnspacket.h" + + +__FLOG_STMT(_LIT8(KSubsys,"Dns Message Composer Parser");) +__FLOG_STMT(_LIT8(KComponent,"DnsMessage");) + + + +CDnsMessageComposerParser::CDnsMessageComposerParser() + { + } + + +EXPORT_C CDnsMessageComposerParser* CDnsMessageComposerParser::NewL() + { + CDnsMessageComposerParser* self= new(ELeave)CDnsMessageComposerParser; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + + +CDnsMessageComposerParser::~CDnsMessageComposerParser() + { + iBuf.Close(); + delete iPacket; + delete iMsgBuf; + __FLOG(_L8("-> Composer Parser destroyed")); + __FLOG_CLOSE; + } + + +void CDnsMessageComposerParser::ConstructL() + { + __FLOG_OPEN(KSubsys, KComponent); + __FLOG(_L8("-> Composer parser created")); + } + + +/** + Composes mdns message + @param aMessage + @param aType RR type + @param aUnicast + @return iBuf composed dns buffer + */ +EXPORT_C void CDnsMessageComposerParser::CreateMessageL(RBuf8& aMessageBuffer, const CDnsMessage& aMessage ) + { + __FLOG(_L8("-> Composing Dns Message")); + + aMessageBuffer.CreateL(GetLength(aMessage)); + + iMsgBuf = CDnsMsgBuf::NewL(aMessageBuffer); + + const TDnsHeader& header = aMessage.Header(); + iMsgBuf->SetInt16(header.Id()); + iMsgBuf->SetInt16(header.Flags()); + + const RPointerArray& quesList = aMessage.Queries(); + const RPointerArray& ansList = aMessage.Answers(); + const RPointerArray& authList= aMessage.Authorities(); + const RPointerArray& additionalList = aMessage.Additional(); + + iMsgBuf->SetInt16(quesList.Count()); + iMsgBuf->SetInt16(ansList.Count()); + iMsgBuf->SetInt16(authList.Count()); + iMsgBuf->SetInt16(additionalList.Count()); + + TInt i; + for(i=0; iSetDomainNameL(ques->Name()); + iMsgBuf->SetInt16(ques->Type()); + iMsgBuf->SetInt16(ques->Class()); + } + + // add answer section + for(i=0; i Parsing Dns Raw Buffer")); + iBuf.CreateL(aBuf); + iPacket = CDnsPacket::NewL(iBuf.LeftTPtr(iBuf.Length())); + + const TDnsHeader& header = iPacket->GetHeaderL(); + + CDnsMessage* dnsMessage = CDnsMessage::NewL(header.Id(),header.IsQuery()); + CleanupStack::PushL(dnsMessage); + + dnsMessage->SetHeader(header); + + TInt i; + // extract the query section; + for(i=0; i Retrieving Query Section")); + RBuf8 domainName; + domainName.CreateL(KMaxDNSNameLength); + iPacket->GetDomainNameL(domainName); + CDnsQuestion* question = CDnsQuestion::NewL(); + CleanupStack::PushL(question); + question->SetNameL(domainName); + question->SetType(iPacket->GetInt16L()); + question->SetClass(iPacket->GetInt16L()); + domainName.Close(); + dnsMessage->AppendQueryL(question); + CleanupStack::Pop(question); + } + + // extract the answer section + for(i=0; i Retrieving Answer Section")); + CDnsResourceData* resourceRecord = GetResourceRecordsL(); + CleanupStack::PushL(resourceRecord); + dnsMessage->AppendAnswerL(resourceRecord); + CleanupStack::Pop(resourceRecord); + } + + // extract the authority section + for(i=0; i Retrieving Authority NS Section")); + CDnsResourceData* resourceRecord = GetResourceRecordsL(); + CleanupStack::PushL(resourceRecord); + dnsMessage->AppendAuthorityL(resourceRecord); + CleanupStack::Pop(resourceRecord); + } + + // extract the additional section + for(i=0; i Retrieving Additional Record Section")); + CDnsResourceData* resourceRecord = GetResourceRecordsL(); + CleanupStack::PushL(resourceRecord); + dnsMessage->AppendAdditionalL(resourceRecord); + CleanupStack::Pop(resourceRecord); + } + + CleanupStack::Pop(dnsMessage); + return dnsMessage; + } + + +CDnsResourceData* CDnsMessageComposerParser::GetResourceRecordsL() + { + __FLOG(_L8("-> Retrieving Resource Records")); + RBuf8 name; + name.CreateL(KMaxDNSNameLength); + iPacket->GetDomainNameL(name); + TUint16 type = iPacket->GetInt16L(); + TUint16 classType = iPacket->GetInt16L(); + TUint32 ttl = iPacket->GetInt32L(); + TUint16 rdLength = iPacket->GetInt16L(); + + CDnsResourceData* resourceData = NULL; + + switch(type) + { + case EDnsType_A : // A record + { + TInetAddr addr; + addr.SetAddress(iPacket->GetInt32L()); + + CRdTypeA* addrRecord = CRdTypeA::NewL(); + CleanupStack::PushL(addrRecord); + + addrRecord->SetNameL(name); + addrRecord->SetType(type); + addrRecord->SetClass(classType); + addrRecord->SetTtl(ttl); + addrRecord->SetRdLength(rdLength); + addrRecord->SetAddr(addr); + + CleanupStack::Pop(addrRecord); + resourceData = addrRecord; + } + break; + case EDnsType_PTR: // PTR record + { + RBuf8 ptrDomainName; + ptrDomainName.CreateL(KMaxDNSNameLength); + iPacket->GetRdDomainNameL(ptrDomainName,rdLength); + + CRdTypePtr* ptrRecord = CRdTypePtr::NewL(); + CleanupStack::PushL(ptrRecord); + + ptrRecord->SetNameL(name); + ptrRecord->SetType(type); + ptrRecord->SetClass(classType); + ptrRecord->SetTtl(ttl); + ptrRecord->SetRdLength(rdLength); + ptrRecord->SetDomainNameL(ptrDomainName); + + ptrDomainName.Close(); + CleanupStack::Pop(ptrRecord); + resourceData = ptrRecord; + } + break; + case EDnsType_SRV: // SRC record + { + TUint16 priority = iPacket->GetInt16L(); + TUint16 weight = iPacket->GetInt16L(); + TUint16 port = iPacket->GetInt16L(); + RBuf8 srvDomainName; + srvDomainName.CreateL(KMaxDNSNameLength); + TInt length1 = sizeof(priority); + TInt length2 = sizeof(weight); + TInt length3 = sizeof(port); + TInt length = length1+length2+length3; // 6 = sizeof( prio + weight + port ) + iPacket->GetRdDomainNameL(srvDomainName,rdLength - length); + + CRdTypeSrv* srvRecord = CRdTypeSrv::NewL(); + CleanupStack::PushL(srvRecord); + + srvRecord->SetNameL(name); + srvRecord->SetType(type); + srvRecord->SetClass(classType); + srvRecord->SetTtl(ttl); + srvRecord->SetRdLength(rdLength); + srvRecord->SetPriority(priority); + srvRecord->SetWeight(weight); + srvRecord->SetPort(port); + srvRecord->SetTargetL(srvDomainName); + + srvDomainName.Close(); + CleanupStack::Pop(srvRecord); + resourceData = srvRecord; + } + break; + case EDnsType_TXT: // TXT record + { + TInt strLength = 0; + CRdTypeTxt* txtRecord = CRdTypeTxt::NewL(); + CleanupStack::PushL(txtRecord); + + txtRecord->SetNameL(name); + txtRecord->SetType(type); + txtRecord->SetClass(classType); + txtRecord->SetTtl(ttl); + txtRecord->SetRdLength(rdLength); + + while(rdLength) + { + RBuf8 txtString; + strLength = iPacket->GetCharL(); + rdLength--; + txtString.CreateL(strLength); + iPacket->GetStringL(txtString,strLength); + rdLength -= strLength; + txtRecord->AppendTextDataL(txtString); + } + CleanupStack::Pop(txtRecord); + resourceData = txtRecord; + } + break; + default: + //User::Leave(KErrCorrupt); + break; + } + name.Close(); + return resourceData; + } + + +void CDnsMessageComposerParser::AppendResourceRecordsL( CDnsResourceData* aResourceRecord ) + { + __FLOG(_L8("-> Adding Resource Records to buffer")); + + iMsgBuf->SetDomainNameL(aResourceRecord->Name()); + iMsgBuf->SetInt16(aResourceRecord->Type()); + iMsgBuf->SetInt16(aResourceRecord->Class()); + iMsgBuf->SetInt32(aResourceRecord->Ttl()); + + switch( aResourceRecord->Type()) + { + case EDnsType_A: // A record + { + CRdTypeA* addrRecord = static_cast(aResourceRecord); + const TInetAddr& addr = addrRecord->Address(); + iMsgBuf->SetInt16(4); + iMsgBuf->SetInt32(addr.Address()); + } + break; + case EDnsType_PTR: // PTR record + { + CRdTypePtr* ptrRecord = static_cast(aResourceRecord); + iMsgBuf->SetPtrRdLengthL(ptrRecord->DomainName()); + iMsgBuf->SetDomainNameL(ptrRecord->DomainName()); + } + break; + case EDnsType_SRV: // SRV record + { + CRdTypeSrv* srvRecord = static_cast(aResourceRecord); + iMsgBuf->SetSrvRdLengthL(srvRecord->Target()); + iMsgBuf->SetInt16(srvRecord->Priority()); + iMsgBuf->SetInt16( srvRecord->Weight()); + iMsgBuf->SetInt16( srvRecord->Port()); + iMsgBuf->SetDomainNameL(srvRecord->Target()); + } + break; + case EDnsType_TXT: // TXT record + { + CRdTypeTxt* txtRecord = static_cast(aResourceRecord); + const RArray& txtList = txtRecord->Text(); + iMsgBuf->SetTxtRdLength(txtList); + for(TInt j=0; jSetText(txt); + txt.Close(); + } + } + break; + } + } + + +//Returns the size of the dns message +TUint16 CDnsMessageComposerParser::GetLength(const CDnsMessage& aMessage)const + { + return (aMessage.Size()); + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnsmsgbuf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnsmsgbuf.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,166 @@ +/* +* 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 "cdnsmsgbuf.h" + + +CDnsMsgBuf::CDnsMsgBuf(const TDesC8& aBuf):iDataLength(aBuf.Size()) + { + } + +CDnsMsgBuf* CDnsMsgBuf::NewL(const TDesC8& aBuf) + { + CDnsMsgBuf* self = new (ELeave) CDnsMsgBuf(aBuf); + CleanupStack::PushL(self); + self->ConstructL(aBuf); + CleanupStack::Pop(self); + return self; + } + +CDnsMsgBuf::~CDnsMsgBuf() + { + } + +void CDnsMsgBuf::ConstructL(const TDesC8& aBuf) + { + iPtr = (TUint8*)aBuf.Ptr(); + iIndex = 0; + } + +void CDnsMsgBuf::SetChar(TUint8 aVal) + { + *(iPtr+iIndex) = aVal; + iIndex += sizeof(TUint8); + } + +void CDnsMsgBuf::SetInt16(TUint16 aVal) + { + BigEndian::Put16(iPtr + iIndex, aVal); + iIndex += sizeof(TUint16); + } + +void CDnsMsgBuf::SetInt32(TUint32 aVal) + { + BigEndian::Put32(iPtr + iIndex, aVal); + iIndex += sizeof(TUint32); + } + +void CDnsMsgBuf::SetDomainNameL(const TDesC8& aName) + { + RBuf8 name; + if(aName.LocateReverse('.')== aName.Length()-1) + { + name.Create(aName.Left(aName.Length()-1)); + } + else + { + name.Create(aName); + } + CStringParser* strParser = CStringParser::NewL (name); + CleanupStack::PushL ( strParser ); + TPtrC8 token; + TChar ch = '.'; + TUint8 len = 0; + while(1) + { + TBool result = strParser->ParseTill(token,ch); + len = token.Size(); + SetChar(len); + for(TInt i = 0; i< len; i++) + { + SetChar(token.Ptr()[i]); + } + strParser->SkipLength(1); + if(!result) + break; + } + + // append a zero at the end + SetChar(NULL); + CleanupStack::PopAndDestroy ( strParser ); + name.Close(); + } + +void CDnsMsgBuf::SetText(const TDesC8& aTxt) + { + TUint8 len = 0; + len = aTxt.Size(); + SetChar(len); + for(TInt i=0; i& aTxtList) + { + TUint16 len = 0; + TInt count = aTxtList.Count(); + for (TInt i=0; i< count; i++) + { + len++; + len += aTxtList[i].Size(); + } + SetInt16(len); + } + +TUint16 CDnsMsgBuf::GetDomainLengthL(const TDesC8& aName)const + { + RBuf8 name; + if(aName.LocateReverse('.')== aName.Length()-1) + { + name.Create(aName.Left(aName.Length()-1)); + } + else + { + name.Create(aName); + } + + CStringParser* strParser = CStringParser::NewL (name); + CleanupStack::PushL ( strParser ); + TPtrC8 token; + TChar ch = '.'; + TUint16 len = 0; + while(1) + { + TBool result = strParser->ParseTill(token,ch); + len++; + len += token.Size(); + strParser->SkipLength(1); + if(!result) + break; + } + len++; //0 length octet appended at the end + CleanupStack::PopAndDestroy ( strParser ); + name.Close(); + return len; + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnspacket.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnspacket.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,254 @@ +/* +* 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 "cdnspacket.h" + + +CDnsPacket::CDnsPacket(const TDes8& aPacketPtr): iPtr(aPacketPtr.Ptr()),iDataLength(aPacketPtr.Size()), + iMaxLength(aPacketPtr.MaxSize()) + { + } + +CDnsPacket* CDnsPacket::NewL(const TDes8& aPacketPtr) + { + CDnsPacket* self = new (ELeave) CDnsPacket( aPacketPtr ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CDnsPacket::~CDnsPacket() + { + } + +void CDnsPacket::ConstructL() + { + iIndex = 0; + } + +TUint8 CDnsPacket::GetCharL() + { + __OOB(iIndex,iDataLength) + TUint8 val = *(iPtr+iIndex); + iIndex += sizeof(TUint8); + return val; + } + +TUint16 CDnsPacket::GetInt16L() + { + __OOB(iIndex,iDataLength) + TUint16 val = BigEndian::Get16(iPtr+iIndex); + iIndex += sizeof(TUint16); + return val; + } + +TUint32 CDnsPacket::GetInt32L() + { + __OOB(iIndex,iDataLength) + TUint32 val = BigEndian::Get32(iPtr+iIndex); + iIndex += sizeof(TUint32); + return val; + } + +const TDnsHeader& CDnsPacket::GetHeaderL() + { + iHeader.SetId(GetInt16L()); + iHeader.SetFlags(GetInt16L()); + iHeader.SetQueryCount(GetInt16L()); + iHeader.SetAnswerCount(GetInt16L()); + iHeader.SetAuthorityNSCount(GetInt16L()); + iHeader.SetAdditionalRCount(GetInt16L()); + + return iHeader; + } + +void CDnsPacket::GetDomainNameL(TDes8& aName) + { + TInt labelLen = GetCharL(); + RBuf8 label; + TInt isStartingWithPointer = labelLen & KPointerBit; + + if(isStartingWithPointer) + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + __OOB(pointerOffset,iDataLength) + pointerOffset = (pointerOffset << 8) + GetCharL(); + GetDomainNameAtIndexL(aName, pointerOffset); + } + else + { + while(labelLen) + { + TInt isPointer = labelLen & KPointerBit; + if(isPointer) + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + __OOB(pointerOffset,iDataLength) + pointerOffset = (pointerOffset << 8) + GetCharL(); + label.CreateL(KMaxDNSNameLength); + GetStringAtIndexL(label,pointerOffset); + } + else + { + label.CreateL(labelLen); + GetStringL(label,labelLen); + } + aName.Append(label); + if(aName[aName.Size()-1]!='.') + aName.Append(KDot); + label.Close(); + if(isPointer ) + { + break; + } + else + { + labelLen = GetCharL(); + } + } + } + } + +void CDnsPacket::GetRdDomainNameL(TDes8& aDomainName,TUint aLength) + { + TInt labelLen = GetCharL(); + aLength--; + RBuf8 label; + TInt isStartingWithPointer = labelLen & KPointerBit; + + while(aLength) + { + TInt isPointer = labelLen & KPointerBit; + if(isPointer) + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + __OOB(pointerOffset,iDataLength) + pointerOffset = (pointerOffset << 8) + GetCharL(); + aLength--; + label.CreateL(KMaxLabelLength); + if(isStartingWithPointer ) + { + GetDomainNameAtIndexL(aDomainName, pointerOffset); + } + else + { + GetDomainNameAtIndexL(label, pointerOffset); + //GetStringAtIndexL(label, pointerOffset); + } + } + else + { + label.CreateL(labelLen); + GetStringL(label,labelLen); + aLength-=labelLen; + } + + aDomainName.Append(label); + label.Close(); + if(isStartingWithPointer) + { + break; + } + else + { + if(aLength ) + { + labelLen = GetCharL(); + aLength--; + if(aDomainName[aDomainName.Size()-1]!='.') + aDomainName.Append(KDot); + } + } + } + } + +void CDnsPacket::GetStringL(TDes8& aString, TUint16 aLength) + { + __OOB(iIndex,iDataLength) + aString.Copy(iPtr+iIndex,aLength); + iIndex+= aLength; + } + +void CDnsPacket::GetDomainNameAtIndexL(TDes8& aDomainName, TUint aOffset) + { + __OOB(aOffset,iDataLength) + TUint8 labelLen = *(iPtr + aOffset); + RBuf8 label; + TInt isPointer; + TUint16 pointerOffset; + TInt isStartingWithPointer = labelLen & KPointerBit; + TUint8 ptrPos; + if(isStartingWithPointer) + { + pointerOffset = labelLen & KPointerOffsetBit; + __OOB(aOffset,iDataLength) + aOffset++; + ptrPos = *(iPtr + aOffset); + pointerOffset = (pointerOffset << 8) + ptrPos; + GetDomainNameAtIndexL(aDomainName, pointerOffset); + } + else + { + while(labelLen) + { + label.CreateL(KMaxLabelLength); + GetStringAtIndexL(label, aOffset); + aDomainName.Append(label); + if(aDomainName[aDomainName.Size()-1]!='.') + aDomainName.Append(KDot); + __OOB(aOffset,iDataLength) + aOffset++; // increment by one byte for length field + aOffset += labelLen; + label.Close(); + labelLen = *(iPtr + aOffset); + isPointer = labelLen & KPointerBit; + if(isPointer) + { + pointerOffset = labelLen & KPointerOffsetBit; + __OOB(aOffset,iDataLength) + aOffset++; + ptrPos = *(iPtr + aOffset); + pointerOffset = (pointerOffset << 8) + ptrPos; + label.CreateL(KMaxLabelLength); + GetStringAtIndexL(label, pointerOffset); + aDomainName.Append(label); + if(aDomainName[aDomainName.Size()-1]!='.') + aDomainName.Append(KDot); + label.Close(); + break; + } + } + } + } + +void CDnsPacket::GetStringAtIndexL(TDes8& aLabel, TUint aOffset) + { + __OOB(aOffset,iDataLength) + TUint8 labelLen = *(iPtr + aOffset); + if(labelLen & KPointerBit) // recursive pointers + { + TUint16 pointerOffset = labelLen & KPointerOffsetBit; + pointerOffset = (pointerOffset << 8) + GetCharL(); + GetStringAtIndexL(aLabel, pointerOffset); + } + else + { + aLabel.Copy(iPtr+aOffset+1, labelLen); + } + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnsquestion.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnsquestion.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,57 @@ +/* +* 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 "CDnsQuestion.h" + + +EXPORT_C CDnsQuestion* CDnsQuestion::NewL() + { + return (new(ELeave) CDnsQuestion()); + } + +CDnsQuestion::CDnsQuestion():CDnsSection() + { + + } + +EXPORT_C CDnsQuestion::~CDnsQuestion() + { + } + +EXPORT_C TBool CDnsQuestion::IsUnicast()const + { + if(iClass & KQueryBit) + return ETrue; + else + return EFalse; + } + +EXPORT_C void CDnsQuestion::SetUnicast(TBool ) + { + iClass |= KQueryBit; + } + +EXPORT_C TUint16 CDnsQuestion::Size()const + { + TUint16 count = 0; + count += iName.Size(); + count += 2; // 2 bytes = descriptor length+ 0 length octet at the end + count += sizeof(iType); + count += sizeof(iClass); + return count; + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnsresourcedata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnsresourcedata.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,169 @@ +/* +* 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 "cdnsresourcedata.h" +#include "crdtypeptr.h" +#include "crdtypea.h" +#include "crdtypesrv.h" +#include "crdtypetxt.h" + + +CDnsResourceData::CDnsResourceData():CDnsSection() + { + } + +EXPORT_C CDnsResourceData::~CDnsResourceData() + { + } + + +EXPORT_C TBool CDnsResourceData::IsFlushBitSet()const + { + if(iClass & KFlushBit) + return ETrue; + else + return EFalse; + } + +EXPORT_C void CDnsResourceData::SetFlushBit(TBool aFlushBit) + { + if(aFlushBit) + iClass |= KFlushBit; + else + iClass &= ~KFlushBit; + } + +EXPORT_C TUint16 CDnsResourceData::RdLength()const + { + return iRdLength; + } + +EXPORT_C void CDnsResourceData::SetRdLength(TUint16 aRdLength) + { + iRdLength = aRdLength; + } + +EXPORT_C TUint32 CDnsResourceData::Ttl()const + { + return iTtl; + } + +EXPORT_C void CDnsResourceData::SetTtl(TUint32 aTtl) + { + iTtl = aTtl; + } + + +//Creates a new copy of this object. Leaves if a memory allocation fails +EXPORT_C CDnsResourceData* CDnsResourceData::CloneL()const + { + CDnsResourceData* recordData = NULL; + + switch(Type()) + { + case EDnsType_A: // A record + { + const CRdTypeA* addrRecord = static_cast(this); + CRdTypeA* rrAddrRecord = CRdTypeA::NewL(); + CleanupStack::PushL(rrAddrRecord); + + rrAddrRecord->SetNameL(addrRecord->Name()); + rrAddrRecord->SetType(addrRecord->Type()); + rrAddrRecord->SetClass(addrRecord->Class()); + rrAddrRecord->SetTtl(addrRecord->Ttl()); + rrAddrRecord->SetRdLength(addrRecord->RdLength()); + rrAddrRecord->SetAddr(addrRecord->Address()); + + CleanupStack::Pop(rrAddrRecord); + recordData = rrAddrRecord; + } + break; + + case EDnsType_PTR: // ptr record + { + const CRdTypePtr* ptrRecord = static_cast(this); + CRdTypePtr* rrPtrRecord = CRdTypePtr::NewL(); + CleanupStack::PushL(rrPtrRecord); + + rrPtrRecord->SetNameL(ptrRecord->Name()); + rrPtrRecord->SetType(ptrRecord->Type()); + rrPtrRecord->SetClass(ptrRecord->Class()); + rrPtrRecord->SetTtl(ptrRecord->Ttl()); + rrPtrRecord->SetRdLength(ptrRecord->RdLength()); + rrPtrRecord->SetDomainNameL(ptrRecord->DomainName()); + + CleanupStack::Pop(rrPtrRecord); + recordData = rrPtrRecord; + } + break; + + case EDnsType_SRV: // srv record + { + const CRdTypeSrv* srvRecord = static_cast(this); + CRdTypeSrv* rrSrvRecord = CRdTypeSrv::NewL(); + CleanupStack::PushL(rrSrvRecord); + + rrSrvRecord->SetNameL(srvRecord->Name()); + rrSrvRecord->SetClass(srvRecord->Class()); + rrSrvRecord->SetType(srvRecord->Type()); + rrSrvRecord->SetTtl(srvRecord->Ttl()); + rrSrvRecord->SetRdLength(srvRecord->RdLength()); + rrSrvRecord->SetPriority(srvRecord->Priority()); + rrSrvRecord->SetWeight(srvRecord->Weight()); + rrSrvRecord->SetPort(srvRecord->Port()); + rrSrvRecord->SetTargetL(srvRecord->Target()); + + CleanupStack::Pop(rrSrvRecord); + recordData = rrSrvRecord; + } + break; + + case EDnsType_TXT: // Txt record + { + const CRdTypeTxt* txtRecord = static_cast(this); + CRdTypeTxt* rrTxtRecord = CRdTypeTxt::NewL(); + CleanupStack::PushL(rrTxtRecord); + + rrTxtRecord->SetNameL(txtRecord->Name()); + rrTxtRecord->SetType(txtRecord->Type()); + rrTxtRecord->SetClass(txtRecord->Class()); + rrTxtRecord->SetTtl(txtRecord->Ttl()); + rrTxtRecord->SetRdLength(txtRecord->RdLength()); + + const RArray& txtList = txtRecord->Text(); + TInt count = txtList.Count(); + for(TInt j=0; jAppendTextDataL(txtBuf); + } + CleanupStack::Pop(rrTxtRecord); + recordData = rrTxtRecord; + } + break; + } + return recordData; + } + +TUint16 CDnsResourceData::Size()const + { + return 0; + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/cdnssection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/cdnssection.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,63 @@ +/* +* 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 "cdnssection.h" + + + +CDnsSection::CDnsSection() + { + } + +EXPORT_C const TDesC8& CDnsSection::Name()const + { + return iName; + } + +EXPORT_C void CDnsSection::SetNameL(const TDesC8& aName) + { + iName.Close(); + iName.CreateL(aName); + } + +EXPORT_C TUint16 CDnsSection::Type()const + { + return iType; + } + +EXPORT_C void CDnsSection::SetType(TUint16 aType) + { + iType = aType; + } + +EXPORT_C TUint16 CDnsSection::Class()const + { + return iClass; + } + +EXPORT_C void CDnsSection::SetClass(TUint16 aClass) + { + iClass = aClass; + } + +EXPORT_C CDnsSection::~CDnsSection() + { + iName.Close(); + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/crdtypea.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/crdtypea.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,59 @@ +/* +* 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 "crdtypea.h" + + +CRdTypeA::CRdTypeA():CDnsResourceData() + { + } + +EXPORT_C CRdTypeA* CRdTypeA::NewL() + { + return (new(ELeave)CRdTypeA()); + } + +EXPORT_C CRdTypeA::~CRdTypeA() + { + } + +EXPORT_C const TInetAddr& CRdTypeA::Address()const + { + return iAddr; + } + +EXPORT_C void CRdTypeA::SetAddr(const TInetAddr& aAddr ) + { + iAddr = aAddr; + } + +EXPORT_C TUint16 CRdTypeA::Size()const + { + TUint16 count = 0; + count += iName.Size(); + count += 2; // 2 bytes = descriptor length+ 0 length octet at the end + count += sizeof(iType); + count += sizeof(iClass); + count += sizeof(iTtl); + count += sizeof(iRdLength); + count += sizeof(iAddr); + return count; + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/crdtypeptr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/crdtypeptr.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -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: +* +*/ + + +#include "crdtypeptr.h" + + +CRdTypePtr::CRdTypePtr():CDnsResourceData() + { + } + +EXPORT_C CRdTypePtr* CRdTypePtr::NewL() + { + return (new(ELeave)CRdTypePtr()); + } + +EXPORT_C CRdTypePtr::~CRdTypePtr() + { + iDomainName.Close(); + } + +EXPORT_C const TDesC8& CRdTypePtr::DomainName()const + { + return iDomainName; + } + +EXPORT_C void CRdTypePtr::SetDomainNameL(const TDesC8& aDomainName) + { + iDomainName.Close(); + iDomainName.CreateL(aDomainName); + } + +EXPORT_C TUint16 CRdTypePtr::Size()const + { + TUint16 count = 0; + count += iName.Size(); + count += 2; // 2 bytes = descriptor length+ 0 length octet at the end + count += sizeof(iType); + count += sizeof(iClass); + count += sizeof(iTtl); + count += sizeof(iRdLength); + count += iDomainName.Size(); + count += 2; // 2 bytes = descriptor length+ 0 length octet at the end + return count; + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/crdtypesrv.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/crdtypesrv.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,92 @@ +/* +* 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 "crdtypesrv.h" + + +CRdTypeSrv::CRdTypeSrv():CDnsResourceData() + { + } + +EXPORT_C CRdTypeSrv* CRdTypeSrv::NewL() + { + return (new(ELeave)CRdTypeSrv()); + } + +EXPORT_C CRdTypeSrv::~CRdTypeSrv() + { + iTarget.Close(); + } + +EXPORT_C TUint16 CRdTypeSrv::Priority()const + { + return iPrio; + } + +EXPORT_C void CRdTypeSrv::SetPriority(TUint16 aPriority) + { + iPrio = aPriority; + } + +EXPORT_C TUint16 CRdTypeSrv::Weight() const + { + return iWeight; + } + +EXPORT_C void CRdTypeSrv::SetWeight(TUint16 aWeight) + { + iWeight = aWeight; + } + +EXPORT_C TUint16 CRdTypeSrv::Port()const + { + return iPort; + } +EXPORT_C void CRdTypeSrv::SetPort(TUint16 aPort) + { + iPort = aPort; + } + +EXPORT_C const TDesC8& CRdTypeSrv::Target() const + { + return iTarget; + } + +EXPORT_C void CRdTypeSrv::SetTargetL(const TDesC8& aTarget) + { + iTarget.Close(); + iTarget.CreateL(aTarget); + } + +EXPORT_C TUint16 CRdTypeSrv::Size()const + { + TUint16 count = 0; + count += iName.Size(); + count += 2; // 2 bytes = descriptor length+ 0 length octet at the end + count += sizeof(iType); + count += sizeof(iClass); + count += sizeof(iTtl); + count += sizeof(iRdLength); + count += sizeof(iPrio); + count += sizeof(iWeight); + count += sizeof(iPort); + count += iTarget.Size(); + count += 2; // 2 bytes = descriptor length+ 0 length octet at the end + return count; + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/crdtypetxt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/crdtypetxt.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,68 @@ +/* +* 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 "crdtypetxt.h" + + +CRdTypeTxt::CRdTypeTxt():CDnsResourceData() + { + } + +EXPORT_C CRdTypeTxt* CRdTypeTxt::NewL() + { + return (new(ELeave)CRdTypeTxt()); + } + +EXPORT_C CRdTypeTxt::~CRdTypeTxt() + { + for ( TInt i=0 ; i < iTxtData.Count(); i++) + { + iTxtData[i].Close(); + } + iTxtData.Close(); + } + + +EXPORT_C void CRdTypeTxt::AppendTextDataL( const RBuf8& aTextData ) + { + iTxtData.AppendL(aTextData); + } + +EXPORT_C const RArray& CRdTypeTxt::Text()const + { + return iTxtData; + } + +EXPORT_C TUint16 CRdTypeTxt::Size()const + { + TUint16 count = 0; + count += iName.Size(); + count += 2; // 2 bytes = descriptor length+ 0 length octet at the end + count += sizeof(iType); + count += sizeof(iClass); + count += sizeof(iTtl); + count += sizeof(iRdLength); + for ( TInt i= 0; i +#include "cstringparser.h" + + +CStringParser::CStringParser ( const TDesC8& aBuffer ): iBuffer ( aBuffer ), + iCurrentPos ( 0 ) + { + } + +CStringParser::~CStringParser () + { + } + + +CStringParser* CStringParser::NewL ( const TDesC8& aBuffer ) + { + return (new( ELeave)CStringParser( aBuffer )); + } + +/** + Get the next character from the current position, and increments the + current position by 1. + + @param aChar [out] Next character to be read + + @return TBool ETrue if the current position is less than the string length + else returns EFalse + */ +TBool CStringParser::GetNextCharacter ( TChar& aChar ) + { + IncrementCurrentPos (); + return ( GetCurrentCharacter ( aChar ) ); + } + +/** + Get the character from the current position. + + @param aChar [out] Current character to be read + + @return TBool ETrue if the current position is less than the string length + else returns EFalse + */ +TBool CStringParser::GetCurrentCharacter ( TChar& aChar ) + { + if ( iCurrentPos >= iBuffer.Length () ) + { + return EFalse; + } + + aChar = iBuffer[ iCurrentPos ]; + return ETrue; + } + +/** + Parses the string till it finds the aEndChar. + + @param TChar [in] Character to search for. + @see GetNextWorrd + */ +TBool CStringParser::ParseTill ( TPtrC8& aWord, TChar aEndChar ) + { + TPtrC8 cur( iBuffer.Mid( iCurrentPos ) ); + TBool found = ETrue; + TInt pos = cur.Locate( aEndChar ); + if ( pos < 0 ) + { + // Unable to locate the aEndChar. Sets the end position to + // the length of the string. + pos = iBuffer.Length (); + found = EFalse; + } + + aWord.Set ( cur.Left (pos) ); + SkipLength ( pos ); + return found; + } + +/** + Increments the current parsing position by aLen. + + @param TInt [in] Number of character to skip. + + @return TBool ETrue if the current parsing position is less than the buffer length + else returns EFalse. + */ +TBool CStringParser::SkipLength ( TInt aLen ) + { + iCurrentPos += aLen; + + if ( iCurrentPos < iBuffer.Length () ) + { + return ETrue; + } + return EFalse; + } + +/** + Finds the remainder string from the current parsing position to the buffer length. + + @param TPtrC8& [out] Points to the current starting position till end + + @return TBool ETrue if the current parsing position is less than the buffer length + else returns EFalse. + */ +void CStringParser::GetRemainder ( TPtrC8& aBuffer ) + { + aBuffer.Set ( iBuffer.Mid ( iCurrentPos ) ); + SkipLength ( aBuffer.Length () ); + } + +/** + Increments the current parsing position by 1. + */ +void CStringParser::IncrementCurrentPos ( ) + { + ++iCurrentPos; + } + +/** + Parses till the first occurrence of any one of a set of characters in aCharSet, + from the current parsing position. + + @param TPtrC8& [out] Points to the current starting position. + @param const TDesC8& [in] Descriptor containing characters for matching. + */ +void CStringParser::ParseTill ( TPtrC8& aWord, const TDesC8& aCharSet ) + { + TPtrC8 cur( iBuffer.Mid( iCurrentPos ) ); + + TInt lowpos = cur.Length (); + TInt pos = KErrNotFound; + + for ( TInt i = 0; i < aCharSet.Length(); ++i ) + { + pos = cur.Locate ( aCharSet [ i ] ); + + if ( (pos != KErrNotFound) && (pos < lowpos ) ) + { + lowpos = pos; + } + } + + aWord.Set ( cur.Left ( lowpos ) ); + SkipLength ( lowpos ); + } + + + + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/distribution.policy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/distribution.policy Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,2 @@ +Category E +OSD: Optional Replaceable Bonjour Framework diff -r 78fbd574edf4 -r da856f45b798 zeroconf/dnsparser/src/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/dnsparser/src/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/group/bld.inf Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,32 @@ +/* +* 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: +* +*/ + + + + +PRJ_EXPORTS + + +PRJ_MMPFILES + +#include "../dnsparser/group/bld.inf" +#include "../cachemanager/group/bld.inf" +#include "../server/group/bld.inf" +#include "../client/group/bld.inf" + +PRJ_TESTMMPFILES +PRJ_MMPFILES diff -r 78fbd574edf4 -r da856f45b798 zeroconf/group/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/group/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/group/bld.inf Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,19 @@ +/* +* 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: +* +*/ + +PRJ_MMPFILES +mdnsserver.mmp diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/group/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/group/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/group/mdnsserver.mmp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/group/mdnsserver.mmp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,79 @@ +/* +* 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: +* +*/ +#include +TARGET zeroconf_20008AD8.exe +TARGETTYPE exe +UID 0 0x20008AD8 +VENDORID 0 + + +CAPABILITY NetworkServices LocalServices ALL -TCB + +SOURCEPATH ..\src + +// ______________________________ +// | FRONT END SRV | +// + +SOURCE mdns.cpp +SOURCE mdnsserver.cpp +SOURCE mdnsserversession.cpp +SOURCE shutdowntimer.cpp + +// +SOURCE csockethandler.cpp +SOURCE cadvertizehandler.cpp +SOURCE cbasehandler.cpp +SOURCE cmessagehandler.cpp +SOURCE cqueryhandler.cpp +SOURCE cresponsehandler.cpp +SOURCE csendmessagequeue.cpp +SOURCE cmdnsprobemanager.cpp cinternalmessagequeue.cpp cmdnscacheconsistencymgr.cpp +SOURCE CEngSettingsObserver.cpp + +// +// |____________________________| +// + + +USERINCLUDE ..\inc +USERINCLUDE ..\..\CacheManager\inc +USERINCLUDE ..\..\client\inc +USERINCLUDE ..\..\common\inc + + +SYSTEMINCLUDE \epoc32\include +SYSTEMINCLUDE \epoc32\include\mw +SYSTEMINCLUDE \epoc32\include\platform\mw + +LIBRARY euser.lib +LIBRARY esock.lib +LIBRARY commdb.lib +LIBRARY insock.lib +LIBRARY charconv.lib +LIBRARY efsrv.lib +LIBRARY estor.lib +LIBRARY mdnscachemanager.lib +LIBRARY dnsparser.lib +LIBRARY rpnp.lib +LIBRARY inetprotutil.lib +LIBRARY ecom.lib +LIBRARY btengsettings.lib commsdataobjects.lib c32root.lib commsfw.lib commsdat.lib + + +MW_LAYER_SYSTEMINCLUDE + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/CEngSettingsObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/CEngSettingsObserver.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,58 @@ +/* +* 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: +* +*/ +/* + * CEngSettingsObserver.h + * + * Created on: Jun 17, 2010 + * Author: lachamar + */ + +#ifndef CENGSETTINGSOBSERVER_H_ +#define CENGSETTINGSOBSERVER_H_ + + +#endif /* CENGSETTINGSOBSERVER_H_ */ + +#include +#include +#include + + + +class CEngSettingsObserver : public CBase,public MBTEngSettingsObserver + { + + public: + + void PowerStateChanged( TBTPowerStateValue aState ); + + void VisibilityModeChanged( TBTVisibilityMode aState ); + + public: + + static CEngSettingsObserver* NewLC(); + + ~CEngSettingsObserver(); + + private: + + CEngSettingsObserver(); + void ConstructL(); + + private: + + }; diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cadvertizehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cadvertizehandler.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,75 @@ +/* +* 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: +* +*/ + + +/** +@file +@internalTechnology +*/ + +#ifndef __CADVERTIZEHANDLER_H__ +#define __CADVERTIZEHANDLER_H__ + +//User include +#include "cmessagehandler.h" +#include +#include "cbasehandler.h" +#include "cmdnsprobemanager.h" +#include "mmessagehandler.h" +#include "mdnsdebug.h" + +class CAdvertizeHandler : public CBaseHandler ,public MMessageHandler + { + public: + static CAdvertizeHandler* NewL(CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled = ETrue); + ~CAdvertizeHandler(); + void HandleIncomingPacketL(CDnsMessage& aMessage); + void AdvertizePacketL(const RPointerArray aData, TInt aSessionId, TBool aIsUpdate); + void SetAutoResolve(TBool aFlag); + //From MMessageHandler + void OnPacketSendL(TInt aError); + private: + CAdvertizeHandler(CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled); + void ConstructL(); + void RunL(); + TInt RunError(TInt aError); + void Schedule(); + TInt GenerateNonConflictingName(); + TBool DefensiveResponseL(); + void SendAnnouncementL(); + void InsertInCache(); + void SendProbeL(TBool aUnicast); + void ChangeDomainL(TDesC8& aName); + private: + RBuf8 iName; + TBool iAutoResolveEnabled; + TProbeStates iCurrentProbeState; + TConflictResolveState iConflict; + TInt iProbeCounter; + RPointerArray iData; + RBuf8 iProbeName; + RBuf8 iProbeType; + TInt iSessionId; + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + + + +#endif //__CADVERTIZEHANDLER_H__ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cbasehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cbasehandler.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,100 @@ +// Copyright (c) 2008-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: +// cbasehandler.h +// +// +/** +@file +@internalTechnology +*/ + +#ifndef __CBASEHANDLER_H__ +#define __CBASEHANDLER_H__ +//System include +#include + +//User include +#include "cmessagehandler.h" +#include "mdnsdebug.h" + +class COutStandingQuery : public CBase + { + public : + static COutStandingQuery* NewL(CDnsMessage* aDnsMessage,TInt aTransactionId,TTime aTime, TSockAddr aAddr); + ~COutStandingQuery(); + TTime GetAddTime()const; + TInt TransactionId()const ; + TSockAddr SocketAddress()const; + CDnsMessage& DnsMessage()const; + TInt ClientHandle()const; + void SetClientHandle(TInt aHandle); + private: + void ConstructL(); + COutStandingQuery(CDnsMessage* aDnsMessage,TInt aTransactionId,TTime aTime, TSockAddr aAddr); + + + private: + TInt iTransactionID; + TTime iReviewTime; + TSockAddr iSockAddress; + CDnsMessage* iDnsMessage; + TInt iClientHandle; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +/** +This is a Baseclass to handle common functionality to both the response and query handler +this contains a reference to messagehandler which the derived class can make use of using +the MessageHandler() api + +A reference to cache entry to be passed in order to build a cache wrapper as cache requires +all the records to be present in the CacheEntry variable. + +Seperate functions are provide to handle address,pointer,text and srv records as , same can +be used by both query and response handler. + +*/ +class CBaseHandler : public CTimer + { + public : + static CBaseHandler* NewL(CMessageHandler& aMessageHandler); + virtual ~CBaseHandler(); + + //From CTimer + void RunL(); + void DoCancel(); + + virtual void HandleIncomingPacketL(CDnsMessage& aMessage, const TSockAddr& aAddr); + + protected: + CBaseHandler(CMessageHandler& aMessageHandler); + void ConstructL(); + CMessageHandler& MessageHandler()const; + + protected: + RPointerArray iOutStandingQueryArray; + TBool IsLastTruncated; + + private: + CMessageHandler& iMessageHandler; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cinternalmessagequeue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cinternalmessagequeue.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,81 @@ +// Copyright (c) 2008-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: +// cinternalmessagequeue.h +// +// + +#ifndef CINTERNALMESSAGEQUEUE_H_ +#define CINTERNALMESSAGEQUEUE_H_ + +//System Include +#include +#include "mdnsdebug.h" +class CMdnsServer; + +//Message type server handles as of now. +enum TMessageType + { + EQueryMessage, + EPublishMessage, + ERegisterMessage + }; +/* + * CInternalMessageQueue class is used to keep a refernce of all the services + * requested by the client to the server. + * There are two cases where this is used. + * case1: + * When the server is probing the hostname and it recieves a query or publish request. + * case2: + * When the server is adveritsing a packet and it reiceves one more request for advertizement. + * + * + */ + +class CInternalMessageQueue : public CBase + { + public: + static CInternalMessageQueue* NewL(CMdnsServer& aServer); + ~CInternalMessageQueue(); + void StartProcessing(); + TInt Count(); + void AppendMessageL(TMessageType aType, const RMessage2& aMessage,TInt aSessionId ); + private: + class TMessageObject + { + private: + TMessageType iType; + TInt iSessionId; + RMessage2 iMessage; + public: + inline TMessageObject(TMessageType aType , const RMessage2& aMessage,TInt aSessionId):iType(aType), iMessage(aMessage),iSessionId(aSessionId){} + inline const TMessageType Type()const{return iType;} + inline const RMessage2& MessageObject()const {return iMessage;} + inline const TInt SessionId()const{return iSessionId;} + }; + void ConstructL(); + CInternalMessageQueue(CMdnsServer& aServer); + + private: + TInt iQueueLength; + RArray iMessageQueue; + CMdnsServer& iServer; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + + }; + + +#endif /* CINTERNALMESSAGEQUEUE_H_ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cmdnscacheconsistencymgr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cmdnscacheconsistencymgr.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,86 @@ +// Copyright (c) 2008-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: +// cmdnsconsistencymgr.cpp +// +// + +#ifndef CMDNSCACHECONSISTENCYMGR_H_ +#define CMDNSCACHECONSISTENCYMGR_H_ + +#include +#include +#include +#include +#include "mmessagehandler.h" +#include "mdnsdebug.h" + +const TUint KDefaultCheckInterval = 10;//*60; // TODO:Change to 60 seconds for practical purposes +//#include "cmessagehandler.h" +class CMessageHandler; +class CMDNSCacheConsistencyMgr : public CActive,public MMessageHandler + { + public: + + static CMDNSCacheConsistencyMgr* NewL(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler); + static CMDNSCacheConsistencyMgr* NewLC(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler); + + //From MMessageHandler + void OnPacketSendL(TInt aError); + + void Start(TUint aWalkInterval = KDefaultCheckInterval); + + void Stop(); + + ~CMDNSCacheConsistencyMgr(); + void DoCancel(); + + private: + + void RunL(); + TInt RunError(TInt aError); + + void IterateCacheL(); + void DeleteEntry(CCacheEntry* aEntry); + void Query(CCacheEntry* aEntry); + const TDesC8& GetHostName(CCacheEntry* aEntry); + const TDesC8& GetServiceName(CCacheEntry* aEntry); + + void Delay(TRequestStatus& status); + + private: + + CMDNSCacheConsistencyMgr(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler); + void ConstructL(); + + private: + + //MDNSCacheMgr& iCache; + + TBool iActiveCacheMgmtEnabled; + + CMessageHandler& iMessageHandler; + + TUint iWalkInterval; + + RTimer iTimer; + + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + + }; + + +#endif /*CMDNSCACHECONSISTENCYMGR_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cmdnsprobemanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cmdnsprobemanager.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,132 @@ +// Copyright (c) 2008-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: +// cmdnsprobemanager.h +// +// +#ifndef CMDNSPROBEMANAGER_H_ +#define CMDNSPROBEMANAGER_H_ + +#include +#include +#include "mdnscachemgr.h" +#include "cmessagehandler.h" +#include "mmessagehandler.h" +#include "mdnsdebug.h" + +const TUint32 KProbeDelay = 250; + +const TUint32 KMaxFailures = 15; + +const TUint16 KMaxLength = 255; + +/*Maximum Length allocated for the service name part of the ServiceInstanceName +excluding the service type*/ +const TUint16 KMaxNameLength = 128; +enum TConflictResolveState + { + ESuccess=0, + EConflictWithAutoReslove, + EConflictWithoutAutoResolve, + EFail, + }; +enum TProbeStates + { + EIdle, + EStart, + EProbeBegin, + EProbeFirstUnicast, + EProbeSecondUnicast, + EProbeMulticast, + EProbeComplete, + EFirstAnnouncement,//First gratuitous mDNS announcement + ESecondAnnouncement//Second gratuitous mDNS announcement + }; + +class CMDNSProbeManager : public CTimer,public MMessageHandler + { + public: + + /*Probe Handler to probe for Unique Host Name*/ + static CMDNSProbeManager* NewL(MDNSCacheMgr& aCache,CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled); + /*Probe Handler to probe for Service Instance Name*/ + static CMDNSProbeManager* NewLC(MDNSCacheMgr& aCache,CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled); + + ~CMDNSProbeManager(); + + //From MMessageHandler + void OnPacketSendL(TInt aError); + + + TInt StartNameProbeL(const TDesC8&aHostName,TInetAddr aAddr); + TInt StartServiceProbeL(const TDesC8& aServiceName,const TDesC8& aTargetMachine,TUint16 aPort); + + //Called if Auto Resolve Enabled,Probe Manager would have obtained new name + const TDesC8& GetUniqueName(); + + private: + + void RunL(); + TInt RunError(TInt aError); + + private: + + CRdTypeA* FormAddressRecordL(); + CRdTypeSrv* FormServiceRecordL(); + + void InsertInCache(); + + TInt GenerateNonConflictingName(); + + TBool DefensiveResponseL();//Get a unique name (DNS Label) + + void Schedule(); + + void SendProbeL(TBool aUnicast); //Probe for Unique name , Create Probe and Send + void SendAnnouncementL();//Send out Gratitous mDNS Announcement , Create Announcement and Send + + CMDNSProbeManager (MDNSCacheMgr& aCache,CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled); + + void ConstructL(); + + + private: + + + + TProbeStates iCurrentProbeState; + TConflictResolveState iConflict; + + TInt iProbeCounter; + + MDNSCacheMgr& iCache; + + TBool iAutoResolveEnabled; + + CMessageHandler& iMessageHandler; + + TDnsType iType; + RBuf8 iName; + RBuf8 iProbeName; + RBuf8 iProbeType; + TInetAddr iAddr; + TUint16 iPort; + RBuf8 iTarget; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + + }; + +#endif /*CMDNSPROBEMANAGER_H_*/ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cmessagehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cmessagehandler.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,107 @@ +// Copyright (c) 2008-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: +// cmessagehandler.h +// +// +/** +@file +@internalTechnology +*/ + +#ifndef __CMESSAGEHANDLER_H__ +#define __CMESSAGEHANDLER_H__ + +//System include +#include +#include +#include +#include +#include +#include + +//user include +#include "cmdnscachemanager.h" +#include "msockethandlerobserver.h" +#include "csockethandler.h" +#include "csendmessagequeue.h" +#include "mdnsserver.h" +#include "mmessagehandler.h" +#include "mdnsdebug.h" + +// +_LIT8(KTcpProtocolType, "_tcp."); +_LIT8(KUdpProtocolType, "_udp."); +_LIT8(KLocalTld, "local"); +// +class CBaseHandler; +class CQueryHandler; +class CResponseHandler; +class CAdvertizeHandler; + + +/** + +Derives from the abstract class MSocketHandlerObserver +This instance of this will be owned by the bonjour server. +This holds an instance of +1.iRecieveSocket Pointer to CSocketHandler which continously reads packet from the mdns port . +2.iOperationHandler Pointer to CBaseHandler , +3.iSendMessageQueue Pointer to CSendMessageQueue Any resonse ,query or advertizig packet to be sent ,should be added to send message queue. +4.iServer Used to notify server on any new service arrival. +5.iDnsCache pointer to dnscache + +*/ +class CMessageHandler : public CBase, public MSocketHandlerObserver + { + + public: + static CMessageHandler* NewL(CMdnsServer& aServer); + MDNSCacheMgr& DnsCache()const; + //Derived from MSocketHandlerObserver + virtual void OnCompletionL(TDesC8& aData, const TSockAddr& aAddr, TInt length ) ; + virtual void OnError(TInt aError); + ~CMessageHandler(); + void ServiceClientQueryL(CDnsMessage* aMessage,TInt aHandle); + CSendMessageQueue& MessageQueue()const; + void NotifyClientQuery(TInt aClientHandle); + void NotifyServicePublishL(const RBuf8& aName,TInt aError, TInt aSessionId); + void SendQueryL(CDnsMessage* aMessage, MMessageHandler& aObserver); + void AdvertizePacketL(const RPointerArray aData, TInt aSessionId ,TBool aIsUpdate=EFalse); + void SetStateHostProbing(TBool aProbing); + void NotifyNewServiceL(const RArray& aName); + CMdnsServer& Server(); + private: + CMessageHandler(CMdnsServer& aServer); + void ConstructL(); + + void HandleIncomingPacketL(TDesC8& aData, const TSockAddr& aAddr, TInt length); + CBaseHandler& GetHandlerL(CDnsMessage& aMessage); + + private: + CSocketHandler* iRecieveSocket; + CQueryHandler* iQueryHandler; + CResponseHandler* iResponseHandler; + CAdvertizeHandler* iAdvertizeHandler; + CSendMessageQueue* iSendMessageQueue; + CMdnsServer& iServer; + HBufC8* iPacket; + MDNSCacheMgr* iDnsCache; + CBaseHandler* iDummyhandler; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cqueryhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cqueryhandler.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,64 @@ +// Copyright (c) 2008-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: +// cqueryhandler.h +// +// +/** +@file +@internalTechnology +*/ + + + +#ifndef __CQUERYHANDLER_H__ +#define __CQUERYHANDLER_H__ + +//User include +#include "cmessagehandler.h" +#include +#include "cbasehandler.h" +#include "mmessagehandler.h" +#include "mdnsdebug.h" +/** +Derived From CBaseHandler +Used to process response packet read from the mdns port +*/ +class CQueryHandler : public CBaseHandler,public MMessageHandler + { + public : + static CQueryHandler* NewL(CMessageHandler& aMessageHandler); + ~CQueryHandler(); + + // Derived from CBaseHandler + void HandleIncomingPacketL(CDnsMessage& aMessage, const TSockAddr& aAddr); + void ServiceClientQueryL(CDnsMessage* aMessage,TInt aClientHandle); + void OnPacketSendL(TInt aError); + void SendQueryL(CDnsMessage* aMessage, MMessageHandler& aObserver); + private: + CQueryHandler(CMessageHandler& aMessageHandler); + void ConstructL(); + TBool SuppressDuplicateAnswerL(const RPointerArray& aAnswers,const CDnsResourceData& aResourceData); + void HandleAnyQuestionL(CDnsMessage* aPacket,const RPointerArray& aAnswers,const CCacheEntry& aEntry); + + void ScheduleOutStandingQueryL(TInt aClientHandle , TBool aTriggerNow, TTime aInTime); + private : + TInt iClientHandle; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/cresponsehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/cresponsehandler.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,65 @@ +// Copyright (c) 2008-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: +// cresponsehandler.cpp +// +// +/** +@file +@internalTechnology +*/ + +#ifndef __CRESPONSEHANDLER_H__ +#define __CRESPONSEHANDLER_H__ + +//System include +#include +#include +//User include +#include "cmessagehandler.h" +#include "cbasehandler.h" +#include "mdnsdebug.h" + +/** +Derived From CBaseHandler +Used to process response packet read from the mdns port +*/ + +class CResponseHandler : public CBaseHandler + { + public: + static CResponseHandler* NewL(CMessageHandler& aMessageHandler); + ~CResponseHandler(); + + //Derived from CBaseHandler + void HandleIncomingPacketL(CDnsMessage& aMessage ,const TSockAddr& aAddr); + + private: + CResponseHandler(CMessageHandler& aMessageHandler); + void ConstructL(); + void HandlePacketAnswersL(CDnsResourceData* aResourceData); + void HandleAddrAnswersL(CDnsResourceData* aResourceData); + void HandlePTRAnswersL(CDnsResourceData* aResourceData); + void HandleTXTAnswersL(CDnsResourceData* aResourceData); + void HandleAAAAAnswersL(CDnsResourceData* aResourceData); + void HandleSRVAnswersL(CDnsResourceData* aResourceData); + + private: + RArray< RBuf8> iNotifyPtrName; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/csendmessagequeue.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/csendmessagequeue.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,98 @@ +// Copyright (c) 2008-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: +// csendmessagequeue.h +// +// +/** +@file +@internalTechnology +*/ + +#ifndef __CSENDMESSAGEQUEUE_H__ +#define __CSENDMESSAGEQUEUE_H__ + +//system include +#include +#include +#include +#include +#include + +//user include + +#include "msockethandlerobserver.h" +#include "csockethandler.h" +#include "mmessagehandler.h" +#include "mdnsdebug.h" + +class MMessageHandler; +class CSendMessageData + { + public: + static CSendMessageData* NewL(CDnsMessage* aDnsMessage, TBool aUnicast,TSockAddr aAddr, MMessageHandler& aCallback); + const CDnsMessage& GetDnsMessage()const; + const TSockAddr& GetSockAddress()const; + const TBool& IsUnicast()const; + ~CSendMessageData(); + MMessageHandler& Callback(); + private: + void ConstructL(); + CSendMessageData(CDnsMessage* aDnsMessage,TBool aUnicast,TSockAddr aAddr, MMessageHandler& aCallback); + + private: + CDnsMessage* iMessage; + TBool iUnicast; + TSockAddr iSockAddr ; + MMessageHandler& iCallback; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + + +class CSendMessageQueue : public CTimer, public MSocketHandlerObserver + { + public: + static CSendMessageQueue* NewL(RSocket& aSocket); + ~CSendMessageQueue(); + virtual void OnCompletionL(TDesC8& aData, const TSockAddr& aAddr, TInt aLength); + virtual void OnError(TInt aError); + void RunL(); + void DoCancel(); + void QueueDnsMessageL(const CSendMessageData& aMessageData); + + private: + CSendMessageQueue(); + void ConstructL(RSocket& aSocket); + void NextTransmitTime(TTime aTime); + void StartTransmit(); + CSendMessageData* NextDnsMessageL(); + TBool MessageReady(); + + private: + CSendMessageData* iSendMessageData; + CSocketHandler* iSendSocket; + RPointerArray iMessageQueue; + TInt64 iRandomSeed; + TTime iNextTransmit; + TBool iIsSocketActive; + RBuf8 iOutput; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/csockethandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/csockethandler.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,101 @@ +// Copyright (c) 2008-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: +// csockethandler.h +// +// +/** +@file +@internalTechnology +*/ +#ifndef __CSOCKETHANDLER_H__ +#define __CSOCKETHANDLER_H__ + +//System include +#include +#include +#include + + +//User include +#include "msockethandlerobserver.h" +#include "mdnsdebug.h" + +/* + 1. This is an Active Object which can be activated to recieve or + send asynchronusly as per the operation list mentioned.An Observer should be + provided at the time of construction so as to notify the success or failure of + opertion.The client using CSocketHandler should implement the observer class + MSOcketHandlerObserver. + + 2. Maximum size of the packet this could either send or recieve is KMaxDnsPacketSize = 9216 + + 3. TSocketHandlerParams-- This is typedef from TIpcArgs ,which can hold an + pointer to an array of four variables. + a. The first variable it is pointing to should specify the operation(TSocketOPeration). + b. Second should provide the packet to be send . + c. Third should provide the address to which it should be send. + + + */ + +const TInt KDefaultFlags = 0; +//const TInt KMaxDnsPacketSize = 9216; + +enum TSocketOperation + { + ESocketIdle, + ESocketSend, + ESocketSendTo, + ESocketRecieve, + ESocketRecieveFrom, + }; + +typedef TIpcArgs TSocketHandlerParams; + +class CSocketHandler : public CActive + { + public: + + static CSocketHandler* NewL(RSocket& aSocket, MSocketHandlerObserver& aObserver, TSocketOperation aOperation); + void Activate ( const TSocketHandlerParams& aParams ); + ~CSocketHandler(); + + private: + CSocketHandler(RSocket& aSocket, MSocketHandlerObserver& aObserver, TSocketOperation aOperation); + void ConstructL(); + void CompleteSelf ( TInt aError ); + void CancelCurrent(); + void NotifyCompletionL( ); + + //Derived from CActive + void RunL(); + void DoCancel(); + TInt RunError(TInt aError); + + private: + HBufC8* iPacketBuffer; + TPtr8 iPacketPtr; + TSockAddr iSockAddr; + TSocketOperation iOperation; + RSocket& iSocket; + MSocketHandlerObserver& iObserver; + TSockXfrLength iLength; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/mdnsserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/mdnsserver.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,131 @@ +// Copyright (c) 2008-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: +// mdnsserver.h +// +// +/** +@file +@internalTechnology +*/ + +#ifndef __MDNSSERVER_H__ +#define __MDNSSERVER_H__ + +#include +#include +#include +#include +#include + +#include "cinternalmessagequeue.h" +#include "mmessagehandler.h" +#include "mdnsdebug.h" + +//class TMessageType; +class CMessageHandler; +class CMDNSProbeManager; +class CMDNSCacheConsistencyMgr; +// zeroconf messages policy - all NetworkService + +const TUint zeroconfRangeCount = 1; +const TInt zeroconfRanges[zeroconfRangeCount] = + { + 0 + }; + +const TUint8 zeroconfElementsIndex[zeroconfRangeCount] = + { + 0 + }; + +const CPolicyServer::TPolicyElement zeroconfElements[] = + { + {_INIT_SECURITY_POLICY_C1(ECapabilityNetworkServices), CPolicyServer::EFailClient} + }; + +const CPolicyServer::TPolicy zeroconfPolicy = + { + CPolicyServer::EAlwaysPass, + zeroconfRangeCount, + zeroconfRanges, + zeroconfElementsIndex, + zeroconfElements, + }; + +// The zeroconf server class + +class CSocketHandler; +class CShutdownTimer; + +class CMdnsServer : public CPolicyServer,public MMessageHandler + { +public: + static CMdnsServer* NewL(); + static CMdnsServer* NewLC(); + + CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const; + + TInt NewSession(); + void DropSession(); + void BeginShutdownL(); + void JoinMulticastGroupL(TInetAddr& aMulticastAddr); + RSocket& Socket(); + CMessageHandler& MessageHandler()const; + void NotifyClientQuery(TInt aClientHandle); + void NotifyServicePublishL(const RBuf8& aName,TInt aError, TInt aSessionId); + ~CMdnsServer(); + TDesC8& HostName()const; + void SetHostNameL(const TDesC8& aName); + void SetStateHostProbing(TBool aProbing); + void SetPublishingService(TBool aFlag); + TBool IsHostProbing()const; + TBool IsPublishingService() const; + void ProcessQueuedMessage(const RMessage2& aMessage, const TMessageType aType,TInt aSessionId); + void NotifyNewServiceL(const RArray& aName); + CInternalMessageQueue* MessageQueue(); + //From MMessageHandler + void OnPacketSendL(TInt aError); + + +private: + TInt GetLocalHost ( TSockAddr& aAddr ); + CMdnsServer(); + void ConstructL(); + + + +private: + RSocketServ iSockServ; + RConnection iConnection; + RSocket iSocket; + + CShutdownTimer* iShutdownTimer; + CMessageHandler* iMessageHandler; + CInternalMessageQueue* iInternalMessageQueue; + CMDNSCacheConsistencyMgr* iCacheConsistencyMgr; + TInt iConnectionCount; + TInt iSessionIdCounter; + TBool iShutdownInProgress; + CMDNSProbeManager* iProbeManager; + RBuf8 iHostName; + TBool iData; + TBool iIsHostProbing; + TBool iIsPublishing; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif /* __MDNSSERVER_H__ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/mdnsserversession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/mdnsserversession.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,86 @@ +// Copyright (c) 2008-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: +// mdnsserversession.h +// +// +/** +@file +@internalTechnology +*/ + +#ifndef __MDNSSERVERSESSION_H__ +#define __MDNSSERVERSESSION_H__ + +#include +#include +#include +#include + +//User Include +#include "cmessagehandler.h" +#include "mdnsdebug.h" +class CMdnsServer; + + +class CMdnsServerSession : public CSession2 + { +public: + static CMdnsServerSession* NewL(const CMdnsServer& aServer); + static CMdnsServerSession* NewLC(const CMdnsServer& aServer); + + void ServiceL(const RMessage2& aMessage); + void ServiceError(const RMessage2& aMessage, TInt aError); + TInt OutStandQueryClientHandle()const; + void SendResponseL(); + //void HandleNameChangeL(); + void HandleServiceNameConflictL(const RBuf8& aName,TInt aError); + void ServiceQueryL(const RMessage2& aMessage); + void PublishL(const RMessage2& aMessage); + void NewServiceL(const RArray& aName); + TInt SessionId(); + ~CMdnsServerSession(); + +private: + CMdnsServerSession(const CMdnsServer& aServer); + void ConstructL(); + TInt CountResources(); + void RegisterNotifyL(const RMessage2& aMessage); + void ServerVersionL(const RMessage2& aMessage); + void StopNotifyL (const RMessage2& aMessage); + void CleanUp(); + void CreateAnyQueryResponseL(CCacheEntry& aEntry); +private: + CMdnsServer& iServer; + RMessage2 iClientQuery; + RMessage2 iPublishRequest; + RMessage2 iNotifyMessageRequest; + RPnPParameterBundle iQueryBundle; + RPnPParameterBundle iResponseBundle; + RPnPParameterBundle iPublishBundle; + RArray iRegisterNotifyArray; + + //TInt iNextSubsessionId; + TInt iSessionId; + TBool iIsNotifyRequested; + + TInt iLastTypeSent; + + TInt iLastServiceSent; + /** + *FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif /* __MDNSSERVERSESSION_H__ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/mmessagehandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/mmessagehandler.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,33 @@ +/* +* 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: +* +*/ +/* + * mmessagehandler.h + * + * Created on: Oct 6, 2009 + * Author: kiprabha + */ + +#ifndef MMESSAGEHANDLER_H_ +#define MMESSAGEHANDLER_H_ + +class MMessageHandler + { + public: + virtual void OnPacketSendL(TInt aError) =0 ; + }; + +#endif /* MMESSAGEHANDLER_H_ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/msockethandlerobserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/msockethandlerobserver.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,34 @@ +/* +* 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: +* +*/ + + +/** +@file +@internalTechnology +*/ +#ifndef __MSOCKETHANDLEROBSERVER_H__ +#define __MSOCKETHANDLEROBSERVER_H__ + +class MSocketHandlerObserver + { + public: + virtual void OnCompletionL(TDesC8& aData, const TSockAddr& aAddr, TInt length ) = 0; + virtual void OnError(TInt aError)=0; + + }; + +#endif \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/inc/shutdowntimer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/inc/shutdowntimer.h Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,49 @@ +/* + 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: A simple shutdown timer definition. + +*/ + +#ifndef __SHUTDOWNTIMER_H__ +#define __SHUTDOWNTIMER_H__ + +#include +#include "mdnsdebug.h" +// shutdown delay, 5 minutes. +const TInt KShutdownDelay = 5 * 60 * 1000000; + +class CMdnsServer; + +class CShutdownTimer : public CTimer + { +public: + static CShutdownTimer* NewL(CMdnsServer& aServer); + static CShutdownTimer* NewLC(CMdnsServer& aServer); + + void Start(); + void RunL(); + TInt RunError(TInt aError); + ~CShutdownTimer(); +private: + CShutdownTimer(CMdnsServer& aServer); + +private: + CMdnsServer& iServer; + /** + FLOGGER debug trace member variable. + */ + __FLOG_DECLARATION_MEMBER_MUTABLE; + }; + +#endif /* __SHUTDOWNTIMER_H__ */ diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/CBaseHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/CBaseHandler.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,237 @@ +// Copyright (c) 2008-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: +// cbasehandler.cpp +// +// +/** +@file +@internalTechnology +*/ + +//System include +#include +#include + +//User Include +#include "cbasehandler.h" +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/* + * Two phase constructor + * @param aDnsMessage pointer to DnsMessage which should be sent to the network. + * @param aTransactionId transaction id + * @param aTime time at which this message should be scheduled. + * @Param aSockAddr address to which this should be sent. + */ +COutStandingQuery* COutStandingQuery::NewL(CDnsMessage* aDnsMessage,TInt aTransactionId,TTime aTime, TSockAddr aAddr) + { + COutStandingQuery* self = new (ELeave) COutStandingQuery(aDnsMessage,aTransactionId, aTime, aAddr); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +/* + * Destructor + */ +COutStandingQuery::~COutStandingQuery() + { + __FLOG(_L8("COutStandingQuery::~COutStandingQuery- Entry")); + delete iDnsMessage; + __FLOG(_L8("COutStandingQuery::~COutStandingQuery- Exit")); + __FLOG_CLOSE; + } + +/* + * @return iReviewTime returns the time data is added to queue. + */ + TTime COutStandingQuery::GetAddTime() const + { + __FLOG(_L8("COutStandingQuery::GetAddTime- Entry")); + __FLOG(_L8("COutStandingQuery::GetAddTime- Exit")); + return iReviewTime; + } + + /* + *Sets the clienhandle (session) which request for the query. + *@param aHandle Sessionid of the client. + */ +void COutStandingQuery::SetClientHandle(TInt aHandle) + { + __FLOG(_L8("COutStandingQuery::SetClientHandle- Entry")); + iClientHandle = aHandle; + __FLOG(_L8("COutStandingQuery::SetClientHandle- Exit")); + } + +/* + * @return returns ths transaction id + */ +TInt COutStandingQuery::TransactionId()const + { + __FLOG(_L8("COutStandingQuery::TransactionId- Entry")); + return iTransactionID; + } + +/* + * @return returns the socket address + */ +TSockAddr COutStandingQuery::SocketAddress()const + { + __FLOG(_L8("COutStandingQuery::SocketAddress- Entry")); + return iSockAddress; + } + +/* + * @return iDnsMessage returns the reference to dns message. + */ +CDnsMessage& COutStandingQuery::DnsMessage()const + { + __FLOG(_L8("COutStandingQuery::DnsMessage- Entry")); + return *iDnsMessage; + } + +/* + * Two phase constructor + */ +void COutStandingQuery::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + } + +/* + * Constructor + * @param aDnsMessage pointer to DnsMessage which should be sent to the network. + * @param aTransactionId transaction id + * @param aTime time at which this message should be scheduled. + * @Param aSockAddr address to which this should be sent. + */ +COutStandingQuery::COutStandingQuery(CDnsMessage* aDnsMessage,TInt aTransactionId,TTime aTime, TSockAddr aAddr): iDnsMessage(aDnsMessage) , iTransactionID(aTransactionId) ,iReviewTime(aTime), iSockAddress(aAddr) + { + iClientHandle = 0; + } + +/* + * @return iClientHandle clinethandle to which request is handled. + */ +TInt COutStandingQuery::ClientHandle() const + { + __FLOG(_L8("COutStandingQuery::ClientHandle- Entry")); + return iClientHandle; + } + +/** +Two phase constructor +@param aMessageHandler refernce to messagehandler +@return void +*/ +CBaseHandler* CBaseHandler::NewL(CMessageHandler& aMessageHandler) + { + CBaseHandler* self = new (ELeave)CBaseHandler(aMessageHandler); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } +/** +Destructor +*/ +CBaseHandler::~CBaseHandler() + { + __FLOG(_L8("CBaseHandler::~CBaseHandler - Entry")); + Cancel(); + iOutStandingQueryArray.ResetAndDestroy(); + iOutStandingQueryArray.Close(); + __FLOG(_L8("CBaseHandler::~CBaseHandler - Exit")); + __FLOG_CLOSE; + } + +/** +Constructor +*/ +CBaseHandler::CBaseHandler(CMessageHandler& aMessageHandler): CTimer(EPriorityStandard),iMessageHandler(aMessageHandler) + { + + CActiveScheduler::Add(this); + + } +/** +Two phase constructor +*/ +void CBaseHandler::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CBaseHandler::Open - Entry")); + CTimer::ConstructL(); + __FLOG(_L8("CBaseHandler::Open - Exit")); + } +/** +Constant function returns a reference to messagehandler +*/ +CMessageHandler& CBaseHandler::MessageHandler()const + { + __FLOG(_L8("CBaseHandler::MessageHandler - Entry Exit")); + return iMessageHandler; + } + +/** +Handles any incoming packet +@param aMessage packet recieved form mdns port +*/ +void CBaseHandler::HandleIncomingPacketL(CDnsMessage& /*aMessage*/, const TSockAddr& /*aAddr*/) + { + __FLOG(_L8("CBaseHandler::HandleIncomingPacketL - Entry")); + //Nothing To do ........... + __FLOG(_L8("CBaseHandler::HandleIncomingPacketL - Exit")); + } + +/* + * Wait for 120ms after the query is sent to the network. + * After 120ms asynchronous request gets complete and will hit this runl + * server will be notified with the same and it will take care of sending the + * response back to client. + */ +void CBaseHandler::RunL() + { + __FLOG(_L8("CBaseHandler::RunL - Entry")); + COutStandingQuery* query = iOutStandingQueryArray[0]; + if(0 != query->ClientHandle()) + { + MessageHandler().NotifyClientQuery(query->ClientHandle()); + } + else + { + IsLastTruncated = EFalse; + } + iOutStandingQueryArray.Remove(0); + if(iOutStandingQueryArray.Count()) + { + SetActive(); + const TTime outTime = iOutStandingQueryArray[0]->GetAddTime(); + At(outTime); + } + __FLOG(_L8("CBaseHandler::Open - Exit")); + delete query; + } + +/* + * Nothing to do. + */ +void CBaseHandler::DoCancel() + { + __FLOG(_L8("CBaseHandler::RunL - Exit")); + } + + + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/CEngSettingsObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/CEngSettingsObserver.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -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: +* +*/ +/* + * CEngSettingsObserver.cpp + * + * Created on: Jun 17, 2010 + * Author: lachamar + */ + +#include "cengsettingsobserver.h" + + + +CEngSettingsObserver* CEngSettingsObserver::NewLC() + { + CEngSettingsObserver* self = new (ELeave)CEngSettingsObserver(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + +CEngSettingsObserver::CEngSettingsObserver() + { + + } + +CEngSettingsObserver::~CEngSettingsObserver() + { + + } + + +void CEngSettingsObserver::ConstructL() + { + + } + +void CEngSettingsObserver::PowerStateChanged( TBTPowerStateValue aState ) + { + + } + +void CEngSettingsObserver::VisibilityModeChanged( TBTVisibilityMode aState ) + { + + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/cadvertizehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/cadvertizehandler.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,470 @@ +// Copyright (c) 2008-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: +// cadvertizehandler.cpp +// +// +/** +@file +@internalTechnology +*/ +//System include +#include + +//UserInclude +#include "cadvertizehandler.h" +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) + +/* + * Two phase constructor + * @param aMessagHandler areference to messagehandler object. + * @param aAutoResolveEnabled If true sercice name conflict will be handled. + * aAutoResolveEnabled is True by default + */ +CAdvertizeHandler* CAdvertizeHandler::NewL(CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled) + { + CAdvertizeHandler* self = new (ELeave) CAdvertizeHandler(aMessageHandler,aAutoResolveEnabled); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +/* + * Destructor + */ +CAdvertizeHandler::~CAdvertizeHandler() + { + __FLOG(_L8("CAdvertizeHandler::~CAdvertizeHandler- Entry")); + iData.ResetAndDestroy(); + iData.Close(); + iName.Close(); + iProbeName.Close(); + iProbeType.Close(); + __FLOG(_L8("CAdvertizeHandler::~CAdvertizeHandler- Exit")); + __FLOG_CLOSE; + } +/* + * No incoming packet for this so no need to handle + */ +void CAdvertizeHandler::HandleIncomingPacketL(CDnsMessage& /*aMessage*/) + { + __FLOG(_L8("CAdvertizeHandler::HandleIncomingPacketL- Entry")); + //Nothing To Do ............ + __FLOG(_L8("CAdvertizeHandler::HandleIncomingPacketL- Exit")); + } + +static void CleanUpCache(TAny* aAny) + { + + //RPointerArray records = static_cast < RPointerArray > (*aAny); + RPointerArray * records = static_cast < RPointerArray *> (aAny); + records->ResetAndDestroy(); + records->Close(); + } +/* + * Constructor + * @param aMessageHandler reference to messagehandler + * @param aAutoResolveEnabled will be true by default ,if true servicename conflict + * will be handled by default + */ +CAdvertizeHandler::CAdvertizeHandler(CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled):CBaseHandler(aMessageHandler) + { + __FLOG(_L8("CAdvertizeHandler::CAdvertizeHandler- Entry")); + iAutoResolveEnabled = aAutoResolveEnabled; + iCurrentProbeState = EIdle; + iProbeCounter = 0 ; + __FLOG(_L8("CAdvertizeHandler::CAdvertizeHandler- Exit")); + } + +/* + * Twophase constructor + */ +void CAdvertizeHandler::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CAdvertizeHandler::ConstructL- Entry")); + CBaseHandler::ConstructL(); + //Nothing + __FLOG(_L8("CAdvertizeHandler::ConstructL- Exit")); + } +/* + * Keeps a copy of the records to be published and starts the active object. + * @param aData an array of records to be published. + * @param aSessionId session id initiating the advertizement. + */ +void CAdvertizeHandler::AdvertizePacketL(const RPointerArray aData, TInt aSessionId,TBool aIsUpdate) + { + __FLOG(_L8("CAdvertizeHandler::AdvertizePacketL- Entry")); + iName.Close(); + iName.Create(aData[0]->Name()); + iProbeName.Close(); + iProbeName.CreateL(KMaxLength); + iProbeName.Append(iName); + iCurrentProbeState = EStart; + iData.ResetAndDestroy(); + for(TInt i =0 ; i= KMaxFailures) + { + //If Probe Failure rate is greater then 15 per second, wait for + //5 seconds before probing again + iProbeCounter = 0; + After(5*1000*1000); + } + } + else // to intimate server of failure + { + MessageHandler().NotifyServicePublishL(iName,EConflictWithoutAutoResolve,iSessionId); + } + + } + } + + switch(iCurrentProbeState) + { + case EIdle: + break;//Do Nothing + + case EStart: + { + currentTime.UniversalTime(); + TInt64 randseed = currentTime.Int64(); + + //Random time between 0 & 250 ms + TInt delay = Math::Rand(randseed) % 250; + iCurrentProbeState = EProbeFirstUnicast; + //Convert to microsecond + + After(delay*1000); + } + break; + + case EProbeFirstUnicast: + { + SendProbeL(ETrue); + iCurrentProbeState = EProbeSecondUnicast; + } + break; + + case EProbeSecondUnicast: + { + SendProbeL(ETrue); + iCurrentProbeState = EProbeMulticast; + } + break; + + case EProbeMulticast: + { + SendProbeL(EFalse); + iCurrentProbeState = EProbeComplete; + } + break; + + case EProbeComplete: + { + iCurrentProbeState = EFirstAnnouncement; + //Probe succeeded ,insert in cache + InsertInCache(); + After(KProbeDelay*1000); + //Some Delay ?? Required or defensive response HAS TO come within 750ms? + } + break; + + case EFirstAnnouncement: + { + SendAnnouncementL(); + iCurrentProbeState = ESecondAnnouncement; + //After(1000);// A Millisecond delay: Required?? + } + break; + + case ESecondAnnouncement: + { + SendAnnouncementL(); + iCurrentProbeState = EIdle; + } + break; + } + __FLOG(_L8("CAdvertizeHandler::RunL- Exit")); + } +/* + * Handles any leave in RunL + * @param aError error with which runL leaves. + */ +TInt CAdvertizeHandler::RunError(TInt aError) + { + __FLOG(_L8("CAdvertizeHandler::RunError- Entry")); + return aError; + } + +/* + * Self completes the request. + */ +void CAdvertizeHandler::Schedule() + { + __FLOG(_L8("CAdvertizeHandler::Schedule- Entry")); + TRequestStatus* status(&iStatus); + *status = KRequestPending; + SetActive(); + User::RequestComplete(status, KErrNone); + __FLOG(_L8("CAdvertizeHandler::Schedule- Exit")); + } + +/* + * Function will be called when there is a conflict. + * this will change the publishing name by appending a + * number at the end of it. + * @return iProbeCounter returns probecounter value. + */ +TInt CAdvertizeHandler::GenerateNonConflictingName() + { + __FLOG(_L8("CAdvertizeHandler::GenerateNonConflictingName- Entry")); + _LIT8(KDot,"."); + + RBuf8 oldName; + oldName.CreateL(iName); + + ++iProbeCounter; + TBuf8 newName; + iName.Close(); + iName.Create(KMaxLength); + iName.Append(iProbeName); + + TInt pos = iName.Locate('.'); + _LIT8(KOpenBrace,"("); + newName.Append(KOpenBrace); + newName.AppendNum(iProbeCounter); + _LIT8(KCloseBrace,")"); + newName.Append(KCloseBrace); + iName.Insert(pos,newName); + ChangeDomainL(oldName); + oldName.Close(); + __FLOG(_L8("CAdvertizeHandler::GenerateNonConflictingName- Exit")); + return iProbeCounter; + } + +/* + * Finds whether the service already exists in the network . + * If service is in the network ,same will be present in the cache. + * @return probFailed returns true if probe has failed. + */ +TBool CAdvertizeHandler::DefensiveResponseL() + { + __FLOG(_L8("CAdvertizeHandler::DefensiveResponseL- Entry")); + TBool probeFailed(EFalse); + RPointerArray entries; + CleanupStack::PushL(TCleanupItem(TCleanupOperation(&CleanUpCache),&entries)); + + _LIT8(KDot,"."); + TBuf8 buffer; + + buffer.Copy(iName); + buffer.Append(KDot); + MessageHandler().DnsCache().FindServiceL(entries,buffer,EDnsQType_Any); + if(entries.Count()>0) + { + probeFailed = ETrue; + } + CleanupStack::PopAndDestroy(); + //entries.ResetAndDestroy(); + //entries.Close(); + __FLOG(_L8("CAdvertizeHandler::DefensiveResponseL- Exit")); + return probeFailed; + } + +/* + * creates a DnsMessage object and send it to the messagehandler to handle it. + * @param aUnicast true if the packet to be sent is an unicast one;false for multicast. + * + */ +void CAdvertizeHandler::SendProbeL(TBool aUnicast) + { + __FLOG(_L8("CAdvertizeHandler::SendProbeL- Entry")); + //Construct DNS Message + CDnsMessage* message = CDnsMessage::NewL(0,ETrue); + CleanupStack::PushL(message); + + //Form the Query/Question part of the message + CDnsQuestion* question = CDnsQuestion::NewL(); + CleanupStack::PushL(question); + question->SetNameL(iName); + question->SetClass(EDnsClass_IN); + question->SetType(EDnsQType_Any); + if(aUnicast) + { + question->SetUnicast(ETrue); + } + + //Append the Query to the Message + message->AppendQueryL(question); + //Append to the Authoritative Section + for(TInt i =0 ; i < iData.Count();i++) + { + message->AppendAuthorityL(iData[i]->CloneL()); + } + + //Send the query + MessageHandler().SendQueryL(message,*this); + + CleanupStack::Pop();//question + CleanupStack::Pop();//message + __FLOG(_L8("CAdvertizeHandler::SendProbeL- Exit")); + } + +/* + * If probing is successfull ,new service record will + * be added to the cache using this. + */ +void CAdvertizeHandler::InsertInCache() + { + __FLOG(_L8("CAdvertizeHandler::InsertInCache- Entry")); + TBuf8 name; + _LIT8(KDot,"."); + //TODO name should be appended with dot + + for(TInt i =0 ; iName()); + name.Append(KDot); + iData[i]->SetNameL(name); + MessageHandler().DnsCache().UpdateCacheL(*(iData[i]),ETrue,iSessionId); + } + __FLOG(_L8("CAdvertizeHandler::InsertInCache- Exit")); + } + +/* + * Announces the new service. + */ +void CAdvertizeHandler::SendAnnouncementL() + { + __FLOG(_L8("CAdvertizeHandler::SendAnnouncementL- Entry")); + RPointerArray entries; + //An API in Cache Interface that returns a list of all Authoritative records + MessageHandler().DnsCache().AuthoritativeEntriesL(entries); + CDnsMessage* message = CDnsMessage::NewL(0,EFalse); + CleanupStack::PushL(message); + + TDnsHeader header(message->Header()); + header.SetAuthoritative(ETrue); + message->SetHeader(header); + + //Append to the Authoritative Section + for(TInt i =0 ; i < iData.Count();i++) + { + message->AppendAuthorityL(iData[i]->CloneL()); + } + +/* + for(TInt index =0; indexAddressRecord()) + message->AppendAnswerL(entry->AddressRecord()->CloneL()); + if(entry->ServiceRecord()) + message->AppendAnswerL(entry->ServiceRecord()->CloneL()); + if(entry->PtrRecord()) + message->AppendAnswerL(entry->PtrRecord()->CloneL()); + if(entry->TxtRecord()) + message->AppendAnswerL(entry->TxtRecord()->CloneL()); + + //should've been a new API sendresponse + + } +*/ + MessageHandler().SendQueryL(message,*this); + CleanupStack::Pop();//message + entries.ResetAndDestroy(); + entries.Close(); + __FLOG(_L8("CAdvertizeHandler::SendAnnouncementL- Exit")); + } +void CAdvertizeHandler::ChangeDomainL(TDesC8& aName) + { + for(TInt i =0 ; iName().Compare(aName) == 0) + { + iData[i]->SetNameL(iName); + } + if(iData[i]->Type()==EDnsType_PTR) + { + CRdTypePtr* ptr = static_cast(iData[i]); + if(ptr->DomainName().Compare(aName) == 0) + { + ptr->SetDomainNameL(iName); + } + + } + + } + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/cinternalmessagequeue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/cinternalmessagequeue.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,106 @@ +// Copyright (c) 2008-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: +// cinternalmessagequeue.cpp +// +// +/** +@file +@internalTechnology +*/ +//User include +#include "cinternalmessagequeue.h" +#include "mdnsserver.h" +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/* + * Two phase constructor + * @param aServer reference to the server + */ +CInternalMessageQueue* CInternalMessageQueue::NewL(CMdnsServer& aServer) + { + CInternalMessageQueue* self = new (ELeave)CInternalMessageQueue(aServer); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop();//self + return self; + } + +//Destructor +CInternalMessageQueue:: ~CInternalMessageQueue() + { + __FLOG(_L8("CInternalMessageQueue::~CInternalMessageQueue - Exit")); + __FLOG_CLOSE; + } + +/* + * When this is called reads the first request form the + * queue and start processing. + */ +void CInternalMessageQueue::StartProcessing() + { + __FLOG(_L8("CInternalMessageQueue::StartProcessing - Entry")); + if(iMessageQueue.Count() == 0) + { + return; + } + else + { + TMessageObject message = iMessageQueue[0]; + iServer.ProcessQueuedMessage(message.MessageObject(),message.Type(),message.SessionId()); + iMessageQueue.Remove(0); + } + __FLOG(_L8("CInternalMessageQueue::StartProcessing - Exit")); + } + +/* + * @return count returns the count of messageQueue + */ + +TInt CInternalMessageQueue::Count() + { + __FLOG(_L8("CInternalMessageQueue::Count - Entry Exit")); + return iMessageQueue.Count(); + } + +/* + * Interface to append the message to the queue + * @param aType represents the type of message. + * @param aMessage RMessage object of the query or publish request. + * @param aSessionId session to which request is made. + */ +void CInternalMessageQueue::AppendMessageL(TMessageType aType, const RMessage2& aMessage,TInt aSessionId ) + { + __FLOG(_L8("CInternalMessageQueue::AppendMessageL - Entry")); + TMessageObject messageObject(aType,aMessage,aSessionId); + iMessageQueue.AppendL(messageObject); + __FLOG(_L8("CInternalMessageQueue::AppendMessageL - Exit")); + } + +/* + * Two phase constructor. + */ +void CInternalMessageQueue::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CInternalMessageQueue::ConstructL -Entry Exit")); + } + +/* + * Constructor + * @param aServer reference to the server. + */ +CInternalMessageQueue::CInternalMessageQueue(CMdnsServer& aServer): iServer(aServer) + { + + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/cmdnscacheconsistencymgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/cmdnscacheconsistencymgr.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,360 @@ +// Copyright (c) 2008-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: +// cmdnsconsistencymgr.cpp +// +// +/** +@file +@internalTechnology +*/ + +//User include +#include "cmdnscacheconsistencymgr.h" +#include "cmdnscachemanager.h" +#include "cmessagehandler.h" + +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) + + +const TUint32 KMinActivityCount = 5;//TODO: to Define correct Min Work Count + + +/* + * Two phase constructor + * @param aActiveCacheMgmtEnabled + * @param aMessageHandler reference to message handler. + */ + CMDNSCacheConsistencyMgr* CMDNSCacheConsistencyMgr::NewL(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler) + { + CMDNSCacheConsistencyMgr* self = CMDNSCacheConsistencyMgr::NewLC(aActiveCacheMgmtEnabled,aMessageHandler); + CleanupStack::Pop(self); + return self; + } + +/* + * Two phase constructor + * @param aActiveCacheMgmtEnabled + * @param aMessageHandler reference to message handler. + */ +CMDNSCacheConsistencyMgr* CMDNSCacheConsistencyMgr::NewLC(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler) + { + CMDNSCacheConsistencyMgr* self = new (ELeave)CMDNSCacheConsistencyMgr(aActiveCacheMgmtEnabled,aMessageHandler); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/* + * Constructor. + */ +CMDNSCacheConsistencyMgr::CMDNSCacheConsistencyMgr(TBool aActiveCacheMgmtEnabled,CMessageHandler& aMessageHandler) +:CActive(EPriorityStandard),iMessageHandler(aMessageHandler) + { + iActiveCacheMgmtEnabled=aActiveCacheMgmtEnabled; + iWalkInterval= KDefaultCheckInterval; + CActiveScheduler::Add(this); + } + + +//Destructor +CMDNSCacheConsistencyMgr::~CMDNSCacheConsistencyMgr() + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::~CMDNSCacheConsistencyMgr - Entry")); + iTimer.Close(); + __FLOG(_L8("CMDNSCacheConsistencyMgr::~CMDNSCacheConsistencyMgr - Exit")); + __FLOG_CLOSE; + } +/* + * Two phase constructor + */ +void CMDNSCacheConsistencyMgr::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CMDNSCacheConsistencyMgr::ConstructL - Entry")); + User::LeaveIfError(iTimer.CreateLocal()); + __FLOG(_L8("CMDNSCacheConsistencyMgr::ConstructL - Exit")); + } + +/* + * Function to stop running the consistemcy manager . + * Cancels all the asynchronous request. + */ +void CMDNSCacheConsistencyMgr::Stop() + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::Stop - Entry")); + Cancel(); + __FLOG(_L8("CMDNSCacheConsistencyMgr::Stop - Exit")); + } + +/* + * Starts the consistency Manager + * @param aWalkInterval specifies the walk interval in seconds. + */ +void CMDNSCacheConsistencyMgr::Start(TUint aWalkInterval) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::Start - Entry")); + iWalkInterval = aWalkInterval; + TUint Interval= iWalkInterval*1000000; + //Converted to Microseconds + iTimer.After(iStatus,Interval); + SetActive(); + __FLOG(_L8("CMDNSCacheConsistencyMgr::Start - Exit")); + } +/* + * Delay between two Walk thourgh . + * Starts a time to complete the request after an interval mentioned in the iWalkinterval. + * @param aStatus reference to status variable. + */ + void CMDNSCacheConsistencyMgr::Delay(TRequestStatus& aStatus) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::Delay - Entry")); + TUint Interval= iWalkInterval*1000000; + //Converted to Microseconds + iTimer.After(aStatus,Interval); + SetActive(); + __FLOG(_L8("CMDNSCacheConsistencyMgr::Delay - Exit")); + } + + + /* + * Iterates the cache on each hit + * and sets a delay for the nexthit. + */ +void CMDNSCacheConsistencyMgr::RunL() + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::RunL - Entry")); + IterateCacheL(); + Delay(iStatus); + __FLOG(_L8("CMDNSCacheConsistencyMgr::RunL - Exit")); + } + +/* + * Handles any leave at RunL + * + */ +TInt CMDNSCacheConsistencyMgr::RunError(TInt aError) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::RunError - Entry")); + User::LeaveIfError(aError); + return aError; + __FLOG(_L8("CMDNSCacheConsistencyMgr::RunError - Exit")); + } + +/* + * Cancels any asynchoronous request. + */ +void CMDNSCacheConsistencyMgr::DoCancel() + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::DoCancel - Entry")); + iTimer.Cancel(); + __FLOG(_L8("CMDNSCacheConsistencyMgr::DoCancel - Exit")); + } + +/* + * Walk through the cache .Does two function + * 1. Publish any authoritative entries. + * 2. Query for the enteries if not authoritative. + */ +void CMDNSCacheConsistencyMgr::IterateCacheL() + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - Entry")); + TBool iterateReset(ETrue); + TBool cacheUpToDate(ETrue); + TInt count = iMessageHandler.DnsCache().NumberOfEntries(); + TInt index(0); + + + + for(index=0; indexEntryExpired()) + { + + if(entry->IsAuthoritative()) + { + //Republish the record + //Goodbye packet is sent while the session for publish is closed + CDnsMessage * announcement = CDnsMessage::NewL(0,EFalse); + CleanupStack::PushL(announcement); + if(entry->PtrRecord()) + { + entry->PtrRecord()->SetTtl(120); + announcement->AppendAnswerL(entry->PtrRecord()->CloneL()); + iMessageHandler.DnsCache().UpdateCacheL(*(entry->PtrRecord()),ETrue,entry->SessionId()); + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 2")); + } + if(entry->ServiceRecord()) + { + entry->ServiceRecord()->SetTtl(120); + announcement->AppendAnswerL(entry->ServiceRecord()->CloneL()); + iMessageHandler.DnsCache().UpdateCacheL(*(entry->ServiceRecord()),ETrue,entry->SessionId()); + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 3")); + } + if(entry->TxtRecord()) + { + entry->TxtRecord()->SetTtl(120); + announcement->AppendAnswerL(entry->TxtRecord()->CloneL()); + iMessageHandler.DnsCache().UpdateCacheL(*(entry->TxtRecord()),ETrue,entry->SessionId()); + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 4")); + } + if(entry->AddressRecord()) + { + entry->AddressRecord()->SetTtl(120); + announcement->AppendAnswerL(entry->AddressRecord()->CloneL()); + iMessageHandler.DnsCache().UpdateCacheL(*(entry->AddressRecord()),ETrue,0); + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 5")); + } + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 6")); + iMessageHandler.SendQueryL(announcement,*this); + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - 7")); + CleanupStack::Pop();//announcement + } + else + { + if(!entry->IsAuthoritative()) + { + DeleteEntry(entry); + //Query(entry); + } + } + } + cacheUpToDate = EFalse; + } + delete entry; + } + __FLOG(_L8("CMDNSCacheConsistencyMgr::IterateCacheL - Exit")); + } + +/* + * Delete the particular entry from the cache. + * @param aEntry cacheentry to be delete. + */ +void CMDNSCacheConsistencyMgr::DeleteEntry(CCacheEntry* aEntry) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::DeleteEntry - Entry")); + RBuf8 key; + //Extract the key & delete + + if(aEntry->AddressRecord()) + { + key.CreateL(GetHostName(aEntry)); + TInt delError = iMessageHandler.DnsCache().DeleteEntryL(key);//TODO: handle error + } + + key.Close(); + key.CreateL(GetServiceName(aEntry)); + + TInt error = iMessageHandler.DnsCache().DeleteEntryL(key); + //Handle error + key.Close(); + __FLOG(_L8("CMDNSCacheConsistencyMgr::DeleteEntry - Exit")); + } + +/* + * Create a CDnsMessage object to be sent to the network using aEntry. + * + */ +void CMDNSCacheConsistencyMgr::Query(CCacheEntry* aEntry) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::Query - Entry")); + //Construct DNS Message + CDnsMessage* message = CDnsMessage::NewL(0,ETrue); + CleanupStack::PushL(message); + + //Form the Query/Question part of the message + CDnsQuestion* question = CDnsQuestion::NewL(); + CleanupStack::PushL(question); + + question->SetNameL(GetServiceName(aEntry)); + question->SetClass(EDnsClass_IN); + question->SetType(EDnsQType_Any); + + //Append the Query to the Message + message->AppendQueryL(question); + if(aEntry->AddressRecord()) + message->AppendAnswerL(aEntry->AddressRecord()->CloneL()); + + if(aEntry->ServiceRecord()) + message->AppendAnswerL(aEntry->ServiceRecord()->CloneL()); + + if(aEntry->TxtRecord()) + message->AppendAnswerL(aEntry->TxtRecord()->CloneL()); + + if(aEntry->PtrRecord()) + message->AppendAnswerL(aEntry->PtrRecord()->CloneL()); + + + + //Send the query + iMessageHandler.SendQueryL(message,*this); + + CleanupStack::Pop();//question + CleanupStack::Pop();//message + __FLOG(_L8("CMDNSCacheConsistencyMgr::Query - Exit")); + } + +/* + * @return the hostname for the particular record. + */ +const TDesC8& CMDNSCacheConsistencyMgr::GetHostName(CCacheEntry* aEntry) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::GetHostName - Entry Exit")); + return aEntry->AddressRecord()->Name(); + } + + +/* + * @param aEntry for which service name is required. + * @return Domain name for the particular service. + */ +const TDesC8& CMDNSCacheConsistencyMgr::GetServiceName(CCacheEntry* aEntry) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::GetServiceName - Entry")); + if(aEntry->ServiceRecord()) + { + return aEntry->ServiceRecord()->Name(); + } + else if (aEntry->TxtRecord()) + { + return aEntry->TxtRecord()->Name(); + } + else if(aEntry->PtrRecord()) + { + return aEntry->PtrRecord()->DomainName(); + } + else if(aEntry->AddressRecord()) + { + return aEntry->AddressRecord()->Name(); + } + + __FLOG(_L8("CMDNSCacheConsistencyMgr::GetServiceName - Exit")); + } + +/* + * Notified for any queries sent . + */ +void CMDNSCacheConsistencyMgr::OnPacketSendL(TInt /*aError*/) + { + __FLOG(_L8("CMDNSCacheConsistencyMgr::OnPacketSendL - Entry")); + //Do nothing + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/cmdnsprobemanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/cmdnsprobemanager.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,561 @@ +// Copyright (c) 2008-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: +// cmdnsprobemanager.cpp +// +// +/** +@file +@internalTechnology +*/ +//User include +#include "e32math.h" +#include "cmdnsprobemanager.h" +//System include +#include +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/* + * Two phase constructor + * @param aCache reference to cache + * @param aMessageHandler reference to message handler. + * @param aAutoresolveEnabled True if name conflict to be handled. + */ +CMDNSProbeManager* CMDNSProbeManager::NewL(MDNSCacheMgr& aCache,CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled) + { + CMDNSProbeManager* self = CMDNSProbeManager::NewLC(aCache,aMessageHandler,aAutoResolveEnabled); + CleanupStack::Pop(self); + return self; + } + +static void CleanUpCache(TAny* aAny) + { + RPointerArray * records = static_cast < RPointerArray * > (aAny); + records->ResetAndDestroy(); + records->Close(); + } +/* + * Two phase constructor + * @param aCache reference to cache + * @param aMessageHandler reference to message handler. + * @param aAutoresolveEnabled True if name conflict to be handled. + */ +CMDNSProbeManager* CMDNSProbeManager::NewLC(MDNSCacheMgr& aCache,CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled) + { + CMDNSProbeManager* self = new (ELeave)CMDNSProbeManager(aCache,aMessageHandler,aAutoResolveEnabled); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/* + * Constructor + */ +CMDNSProbeManager::CMDNSProbeManager(MDNSCacheMgr& aCache,CMessageHandler& aMessageHandler,TBool aAutoResolveEnabled) +:CTimer(CActive::EPriorityStandard),iCache(aCache),iMessageHandler(aMessageHandler),iAutoResolveEnabled(aAutoResolveEnabled) + { + CActiveScheduler::Add(this); + } + +/* + * Two phase Constructor + */ +void CMDNSProbeManager::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + CTimer::ConstructL(); + iCurrentProbeState = EIdle; + } +/* + * Destructor + */ +CMDNSProbeManager::~CMDNSProbeManager() + { + __FLOG(_L8("CMDNSProbeManager::~CMDNSProbeManager - Entry")); + iName.Close(); + iTarget.Close(); + iProbeName.Close(); + iProbeType.Close(); + __FLOG(_L8("CMDNSProbeManager::~CMDNSProbeManager - Exit")); + __FLOG_CLOSE; + } + +/* + * State machine which probe send announcement and handle conflicts + * if autoresolve enabled. + */ +void CMDNSProbeManager::RunL() + { + __FLOG(_L8("CMDNSProbeManager::RunL - Entry")); + TTime currentTime; + + if(iCurrentProbeState <= EProbeComplete) + { + if(DefensiveResponseL()) + { + iCurrentProbeState = EStart; + if(iAutoResolveEnabled) + { + GenerateNonConflictingName(); + } + // else { }// to intimate server of failure + if(iProbeCounter >= KMaxFailures) + { + //If Probe Failure rate is greater then 15 per second, wait for + //5 seconds before probing again + iProbeCounter = 0; + After(5*1000*1000); + } + } + } + + switch(iCurrentProbeState) + { + case EIdle: + break;//Do Nothing + + case EStart: + { + currentTime.UniversalTime(); + TInt64 randseed = currentTime.Int64(); + + //Random time between 0 & 250 ms + TInt delay = Math::Rand(randseed) % 250; + iCurrentProbeState = EProbeFirstUnicast; + //Convert to microsecond + + After(delay*1000); + } + break; + + case EProbeFirstUnicast: + { + SendProbeL(ETrue); + iCurrentProbeState = EProbeSecondUnicast; + } + break; + + case EProbeSecondUnicast: + { + SendProbeL(ETrue); + iCurrentProbeState = EProbeMulticast; + } + break; + + case EProbeMulticast: + { + SendProbeL(EFalse); + iCurrentProbeState = EProbeComplete; + } + break; + + case EProbeComplete: + { + iCurrentProbeState = EFirstAnnouncement; + //Probe succeeded ,insert in cache + InsertInCache(); + iMessageHandler.Server().SetHostNameL(iName); + After(KProbeDelay*1000); + //Some Delay ?? Required or defensive response HAS TO come within 750ms? + } + break; + + case EFirstAnnouncement: + { + SendAnnouncementL(); + iCurrentProbeState = ESecondAnnouncement; + //After(1000);// A Millisecond delay: Required?? + } + break; + + case ESecondAnnouncement: + { + SendAnnouncementL(); + iCurrentProbeState = EIdle; + } + break; + } + __FLOG(_L8("CMDNSProbeManager::RunL - Exit")); + } + +/* + * Handles any leave from RunL + */ +TInt CMDNSProbeManager::RunError(TInt aError) + { + __FLOG(_L8("CMDNSProbeManager::RunError - Entry Exit")); + return aError; + } + +/* + * Probe host + * @param aUnicast True if unicast or else multicast. + */ +void CMDNSProbeManager::SendProbeL(TBool aUnicast) + { + __FLOG(_L8("CMDNSProbeManager::SendProbeL - Entry")); + //Construct DNS Message + CDnsMessage* message = CDnsMessage::NewL(0,ETrue); + CleanupStack::PushL(message); + + //Form the Query/Question part of the message + CDnsQuestion* question = CDnsQuestion::NewL(); + CleanupStack::PushL(question); + question->SetNameL(iName); + question->SetClass(EDnsClass_IN); + question->SetType(EDnsQType_Any); + if(aUnicast) + { + question->SetUnicast(ETrue); + } + + //Append the Query to the Message + message->AppendQueryL(question); + + + //Form the Record to be filled in the Authoritative Field of the Query + switch(iType) + { + case EDnsType_A: + { + CRdTypeA* addRec = FormAddressRecordL(); + //Append to the Authoritative Section + message->AppendAuthorityL(addRec); + } + break; + + case EDnsType_SRV: + { + CRdTypeSrv* srvRec = FormServiceRecordL(); + //Append to the Authoritative Section + message->AppendAuthorityL(srvRec); + } + + break; + } + //Send the query + iMessageHandler.SendQueryL(message,*this); + + CleanupStack::Pop();//question + CleanupStack::Pop();//message + __FLOG(_L8("CMDNSProbeManager::SendProbeL - Exit")); + } + + +/* + * Send an announcement if probing is successfull. + */ +void CMDNSProbeManager::SendAnnouncementL() + { + __FLOG(_L8("CMDNSProbeManager::SendAnnouncementL - Entry")); + RPointerArray entries; + + + //An API in Cache Interface that returns a list of all Authoritative records + iCache.AuthoritativeEntriesL(entries); + + for(TInt index =0; indexHeader()); + header.SetAuthoritative(ETrue); + message->SetHeader(header); + + if(entry->AddressRecord()) + message->AppendAnswerL(entry->AddressRecord()->CloneL()); + if(entry->ServiceRecord()) + message->AppendAnswerL(entry->ServiceRecord()->CloneL()); + if(entry->PtrRecord()) + message->AppendAnswerL(entry->PtrRecord()->CloneL()); + if(entry->TxtRecord()) + message->AppendAnswerL(entry->TxtRecord()->CloneL()); + + //should've been a new API sendresponse + + iMessageHandler.SendQueryL(message,*this); + + CleanupStack::Pop();//message + entries.ResetAndDestroy(); + entries.Close(); + } + __FLOG(_L8("CMDNSProbeManager::SendAnnouncementL - Exit")); + } + +/* + * Returns ture hostname exists in the cache. + * True means there is already a record in the network with the same name. + */ +TBool CMDNSProbeManager::DefensiveResponseL() + { + __FLOG(_L8("CMDNSProbeManager::DefensiveResponseL - Entry")); + TBool probeFailed(EFalse); + RPointerArray entries; + CleanupStack::PushL(TCleanupItem(TCleanupOperation(&CleanUpCache),&entries)); + + _LIT8(KDot,"."); + TBuf8 buffer; + + buffer.Copy(iName); + buffer.Append(KDot); + + iCache.FindServiceL(entries,buffer,EDnsQType_Any); + + if(entries.Count()>0) + { + probeFailed = ETrue; + } + + CleanupStack::PopAndDestroy(); + entries.ResetAndDestroy(); + entries.Close(); + __FLOG(_L8("CMDNSProbeManager::DefensiveResponseL - Exit")); + return probeFailed; + } + +TInt CMDNSProbeManager::StartNameProbeL(const TDesC8& aHostName,TInetAddr aAddr) + { + __FLOG(_L8("CMDNSProbeManager::StartNameProbeL - Entry")); + iName.Close(); + iName.CreateL(aHostName); + iProbeName.Close(); + iProbeName.CreateL(KMaxLength); + iProbeName.Append(iName); + iAddr = aAddr; + iCurrentProbeState = EStart; + iType = EDnsType_A; + iMessageHandler.SetStateHostProbing(ETrue); + Schedule(); + __FLOG(_L8("CMDNSProbeManager::StartNameProbeL - Exit")); + return KErrNone; + } + +/* + * Start probing the service. + */ +TInt CMDNSProbeManager::StartServiceProbeL(const TDesC8& aServiceName,const TDesC8& aTargetMachine,TUint16 aPort) + { + __FLOG(_L8("CMDNSProbeManager::StartServiceProbeL - Entry")); + iName.Close(); + iName.CreateL(aServiceName); + + iTarget.Close(); + iTarget.CreateL(aTargetMachine); + + iPort = aPort; + iType = EDnsType_SRV; + + iCurrentProbeState = EStart; + + Schedule(); + __FLOG(_L8("CMDNSProbeManager::StartServiceProbeL - Exit")); + return KErrNone; + } + + +/* + * Callback method + * Will be notified on successfully sending a packet to the network . + * State will be EIdle when an address is successully announced twice. + */ +void CMDNSProbeManager::OnPacketSendL(TInt /*aError*/) + { + __FLOG(_L8("CMDNSProbeManager::OnPacketSendL - Entry")); + if( iCurrentProbeState != EIdle) + { + After(KProbeDelay*1000);//Give more delay than this + return; + } + iMessageHandler.SetStateHostProbing(EFalse); + __FLOG(_L8("CMDNSProbeManager::OnPacketSendL - Exit")); + } + + +/* + * Create an address record + * @return returns an address record created. + */ +CRdTypeA* CMDNSProbeManager::FormAddressRecordL() + { + __FLOG(_L8("CMDNSProbeManager::FormAddressRecordL - Entry")); + CRdTypeA* addRec = CRdTypeA::NewL(); + CleanupStack::PushL(addRec); + + TInt dataLength(4); + + addRec->SetNameL(iName); + addRec->SetType(EDnsType_A); + addRec->SetClass(EDnsClass_IN); + addRec->SetFlushBit(EFalse); + addRec->SetAddr(iAddr); + addRec->SetTtl(120); + + CleanupStack::Pop();//addRec + __FLOG(_L8("CMDNSProbeManager::FormAddressRecordL - Exit")); + return addRec; + } + +/* + * Create a service record + * @return retrun the newly created service record. + */ +CRdTypeSrv* CMDNSProbeManager::FormServiceRecordL() + { + __FLOG(_L8("CMDNSProbeManager::FormServiceRecordL - Entry")); + CRdTypeSrv* srvRec = CRdTypeSrv::NewL(); + CleanupStack::PushL(srvRec); + + srvRec->SetClass(EDnsClass_IN); + srvRec->SetFlushBit(EFalse); + srvRec->SetNameL(iName); + srvRec->SetPort(iPort); + srvRec->SetPriority(/*Default Priority*/0 ); + srvRec->SetTargetL(iTarget); + srvRec->SetTtl(120*60); + srvRec->SetType(EDnsType_SRV); + srvRec->SetWeight(/*Default Weight*/ 0); + + + CleanupStack::Pop();//srvRec + __FLOG(_L8("CMDNSProbeManager::FormServiceRecordL - Exit")); + return srvRec; + } + +void CMDNSProbeManager::InsertInCache() + { + __FLOG(_L8("CMDNSProbeManager::InsertInCache - Entry")); + TBuf8 name; + _LIT8(KDot,"."); + + CDnsResourceData* data = NULL; + + switch(iType) + { + case EDnsType_A: + { + data = FormAddressRecordL(); + } + break; + + case EDnsType_SRV: + { + data = FormServiceRecordL(); + } + break; + + } + + //Append a "." at the end of the name + name.Copy(iName); + name.Append(KDot); + data->SetNameL(name); + + iCache.UpdateCacheL(*data,ETrue,0/*session Id*/); + + delete data; + __FLOG(_L8("CMDNSProbeManager::InsertInCache - Exit")); + } + + + + +/* + * If autoresolve enable a non conflict name will be generated using this. + * @return returns the probecount. + */ +TInt CMDNSProbeManager::GenerateNonConflictingName() + { +/* + __FLOG(_L8("CMDNSProbeManager::GenerateNonConflictingName - Entry")); + _LIT8(KDot,"."); + + if(iProbeCounter) + { + //From 2nd time, chop the last 3 characters + iProbeName.SetLength(iProbeName.Length() - 3); + } + + ++iProbeCounter; + + TBuf8 newName; + newName.Append(iProbeName); + + _LIT8(KOpenBrace,"("); + newName.Append(KOpenBrace); + + newName.AppendNum(iProbeCounter); + + _LIT8(KCloseBrace,")"); + newName.Append(KCloseBrace); + + iProbeName.Close(); + iProbeName.Create(KMaxNameLength); + iProbeName.Append(newName); + + iName.Close(); + iName.Create(KMaxLength); + iName.Append(iProbeName); + + iName.Append(KDot); + iName.Append(iProbeType); + + __FLOG(_L8("CMDNSProbeManager::GenerateNonConflictingName - Exit")); + return iProbeCounter; +*/ + //------------------------------------------------------- + __FLOG(_L8("CMDNSProbeManager::GenerateNonConflictingName- Entry")); + _LIT8(KDot,"."); + + ++iProbeCounter; + + TBuf8 newName; + + iName.Close(); + iName.Create(KMaxLength); + iName.Append(iProbeName); + + TInt pos = iName.Locate('.'); + _LIT8(KOpenBrace,"("); + newName.Append(KOpenBrace); + newName.AppendNum(iProbeCounter); + _LIT8(KCloseBrace,")"); + newName.Append(KCloseBrace); + iName.Insert(pos,newName); + //ChangeDomainL(iName); + + __FLOG(_L8("CMDNSProbeManager::GenerateNonConflictingName- Exit")); + return iProbeCounter; + + + + + + } + +/* + * Self complete the request. + */ + +void CMDNSProbeManager::Schedule() + { + __FLOG(_L8("CMDNSProbeManager::Schedule - Entry")); + TRequestStatus* status(&iStatus); + *status = KRequestPending; + SetActive(); + User::RequestComplete(status, KErrNone); + __FLOG(_L8("CMDNSProbeManager::Schedule - Exit")); + } + + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/cmessagehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/cmessagehandler.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,268 @@ +// Copyright (c) 2008-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: +// cmessagehandler.cpp +// +// +/** +@file +@internalTechnology +*/ + +//System include +#include +#include +#include + +//user include +#include "cmessagehandler.h" +#include "cqueryhandler.h" +#include "ccacheentry.h" +#include "cresponsehandler.h" +#include "cadvertizehandler.h" +#include + +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +// +/** +Two phase constructor +@param aServer reference to CBonjourServer +@return pointer to CMessageHandler +*/ +CMessageHandler* CMessageHandler::NewL(CMdnsServer& aServer) + { + CMessageHandler* self = new (ELeave) CMessageHandler(aServer); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } +/** +Implementation of MSocketHandlerObserver +@param aData packet recieved from the mdns port +@param aAddr address from which packet is recieved +@param aLength length of the packet reieved +@return void +*/ +void CMessageHandler::OnCompletionL(TDesC8& aData, const TSockAddr& aAddr, TInt aLength ) + { + __FLOG(_L8("CMessageHandler::OnCompletionL - Entry")); + HandleIncomingPacketL(aData ,aAddr ,aLength ); + iRecieveSocket->Activate(TSocketHandlerParams(ESocketRecieve)); + __FLOG(_L8("CMessageHandler::OnCompletionL - Exit")); + } +/** +Any error in the socket will be notified here +@paran aError error with which socket leaves +@return void +*/ +void CMessageHandler::OnError(TInt /*aError*/) + { + __FLOG(_L8("CMessageHandler::OnError -Entry Exit")); + } + +/** +Constructor +*/ +CMessageHandler::CMessageHandler(CMdnsServer& aServer):iServer(aServer) + { + + } + +/** +Two phase constructor +*/ +void CMessageHandler::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CMessageHandler::ConstructL - Entry")); + iQueryHandler = CQueryHandler::NewL(*this); + iResponseHandler = CResponseHandler::NewL(*this); + iAdvertizeHandler = CAdvertizeHandler::NewL(*this); + iRecieveSocket = CSocketHandler::NewL(iServer.Socket(),*this,ESocketRecieve); + iSendMessageQueue = CSendMessageQueue::NewL(iServer.Socket()); + iRecieveSocket->Activate(TSocketHandlerParams(ESocketRecieve)); + iDnsCache = CMDNSCacheManager::NewL(200); + iDummyhandler = CBaseHandler::NewL(*this); + __FLOG(_L8("CMessageHandler::ConstructL - Exit")); + } + +/* +Destructor +*/ +CMessageHandler::~CMessageHandler() + { + __FLOG(_L8("CMessageHandler::~CMessageHandler - Entry")); + delete iQueryHandler; + delete iResponseHandler; + delete iAdvertizeHandler; + delete iRecieveSocket; + TRAPD(err,iDnsCache->DumpCacheL()); + delete iDnsCache; + delete iPacket; + delete iSendMessageQueue; + delete iDummyhandler; + __FLOG(_L8("CMessageHandler::~CMessageHandler - Exit")); + __FLOG_CLOSE; + } +/** +This method parse the packet and dispatch the packet for handling it based on the operation requested. +from the header +@param aData packet read from the mdns port +@param aAddr address from which the packet is recieved +@param length lenght of the data recieved +@return void +*/ +void CMessageHandler::HandleIncomingPacketL(TDesC8& aData, const TSockAddr& aAddr, TInt /*length*/) + { + __FLOG(_L8("CMessageHandler::HandleIncomingPacketL - Entry")); + CDnsMessageComposerParser* comPos = CDnsMessageComposerParser::NewL(); + CleanupStack::PushL(comPos); + CDnsMessage* message = comPos->ParseMessageL(aData); + CleanupStack::PushL(message); + CBaseHandler& iOperationHandler = GetHandlerL(*message); + iOperationHandler.HandleIncomingPacketL(*message ,aAddr); + CleanupStack::PopAndDestroy(message);//comPos and message + CleanupStack::PopAndDestroy(comPos); + __FLOG(_L8("CMessageHandler::HandleIncomingPacketL - Exit")); + } + +/** +This is a factory method which reads the packet and returns the handle to either +response or query handler +@param aMessage Dnspacket to read the header and to constructthe appropriate handler. +@return Poointer to CBaseHandler --base class to both response and query handler. +*/ +CBaseHandler& CMessageHandler::GetHandlerL(CDnsMessage& aMessage) + { + __FLOG(_L8("CMessageHandler::GetHandlerL - Entry")); + TDnsHeader header = aMessage.Header(); + // + if(header.IsQuery() && !header.IsAuthoritative()) + { + return *iQueryHandler; + } + else if(header.IsAuthoritative()) + { + return *iResponseHandler; + } + else + { + return *iDummyhandler; + } + __FLOG(_L8("CMessageHandler::GetHandlerL - Exit")); + } +/** +@return return a reference to CacheManager +*/ +MDNSCacheMgr& CMessageHandler::DnsCache() const + { + __FLOG(_L8("CMessageHandler::DnsCache -Entry Exit")); + return *iDnsCache; + } + +/* + * Routes the query sent by the client to query handler to handle it. + * @param aMessage Pointer to a message object ;contains the query. + * @param aHandle session id which generated the query. + */ +void CMessageHandler::ServiceClientQueryL(CDnsMessage* aMessage,TInt aHandle) + { + __FLOG(_L8("CMessageHandler::ServiceClientQueryL - Entry")); + iQueryHandler->ServiceClientQueryL(aMessage, aHandle); + __FLOG(_L8("CMessageHandler::ServiceClientQueryL - Exit")); + } + +/* + * returns the pointer to the messagequeue. + */ +CSendMessageQueue& CMessageHandler::MessageQueue()const + { + __FLOG(_L8("CMessageHandler::MessageQueue -Entry Exit")); + return *iSendMessageQueue; + } + +/* + * Notify the server after the query has been handled. + * @param aClientHandle SessionId which had sent the query. + */ +void CMessageHandler::NotifyClientQuery(TInt aClientHandle) + { + __FLOG(_L8("CMessageHandler::NotifyClientQuery - Entry")); + iServer.NotifyClientQuery(aClientHandle); + __FLOG(_L8("CMessageHandler::NotifyClientQuery - Exit")); + } + +/* + * Route an internal query to the query handler + * @param aMessage pointer to the dnsmeesage containg the query. + * @param Observer to which successfull delivery of packet to be notified. + */ +void CMessageHandler::SendQueryL(CDnsMessage* aMessage, MMessageHandler& aObserver) + { + __FLOG(_L8("CMessageHandler::SendQueryL - Entry")); + iQueryHandler->SendQueryL(aMessage, aObserver); + __FLOG(_L8("CMessageHandler::SendQueryL - Exit")); + } +/* + * Route the packet to be advertised to the adveritser. + * @param aData array of CDnsresourceData to be advertised. + * @param aSessionId session which adveritised the packet. + */ +void CMessageHandler::AdvertizePacketL(const RPointerArray aData, TInt aSessionId,TBool aIsUpdate) + { + __FLOG(_L8("CMessageHandler::AdvertizePacketL - Entry")); + iAdvertizeHandler->AdvertizePacketL(aData, aSessionId,aIsUpdate); + __FLOG(_L8("CMessageHandler::AdvertizePacketL - Exit")); + } + +/* + * Notify the server when a new service is published + * @param aName name of the service published + * inacase of autoresolve name will be the new published name. + * @param aError will be the result of publish.ESuccess if successfull and E*Conflict. + * @param aSessionId session which initaiated publish. + * + */ +void CMessageHandler::NotifyServicePublishL(const RBuf8& aName,TInt aError, TInt aSessionId) + { + __FLOG(_L8("CMessageHandler::NotifyServicePublishL - Entry")); + iServer.NotifyServicePublishL(aName,aError, aSessionId); + __FLOG(_L8("CMessageHandler::NotifyServicePublishL - Exit")); + } + +/* + * @param aProbing ETrue if hostprobing in progress. + */ +void CMessageHandler::SetStateHostProbing(TBool aProbing) + { + __FLOG(_L8("CMessageHandler::SetStateHostProbing - Entry")); + iServer.SetStateHostProbing(aProbing); + __FLOG(_L8("CMessageHandler::SetStateHostProbing - Exit")); + } + +/* + * notify the server when a new service has been published in the network + * @param aName array of new service published , for the servcetype client has requested. + */ +void CMessageHandler::NotifyNewServiceL(const RArray& aName) + { + __FLOG(_L8("CMessageHandler::NotifyNewServiceL - Entry")); + iServer.NotifyNewServiceL(aName); + __FLOG(_L8("CMessageHandler::NotifyNewServiceL - Exit")); + } + +CMdnsServer& CMessageHandler::Server() + { + return iServer; + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/cqueryhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/cqueryhandler.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,497 @@ +// Copyright (c) 2008-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: +// cqueryhandler.cpp +// +// +/** +@file +@internalTechnology +*/ + +//User include +#include "cqueryhandler.h" +//System include +#include +#include +#include +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/* + * Two phase constructor + * @param aMessageHandler reference to the message handler. + */ +CQueryHandler* CQueryHandler::NewL(CMessageHandler& aMessageHandler) + { + CQueryHandler* self = new(ELeave)CQueryHandler(aMessageHandler); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +/* + * Destructor + */ +CQueryHandler::~CQueryHandler() + { + __FLOG(_L8("CQueryHandler::~CQueryHandler - Entry Exit")); + __FLOG_CLOSE; + } + +/* + * Handles any query from the network + * @param aMessage message which contains the query. + * @param aSockAddr address form which query id recieved. + */ +void CQueryHandler::HandleIncomingPacketL(CDnsMessage& aMessage ,const TSockAddr& aAddr) + { + __FLOG(_L8("CQueryHandler::HandleIncomingPacketL - Entry")); + if(aMessage.Header().IsQuery()) + { + CDnsMessage* ret= CDnsMessage::NewL(aMessage.Header().Id(),EFalse); + CleanupStack::PushL(ret); + TInt qCount = aMessage.Header().QueryCount(); + for(TInt i =0; i< qCount;i++) + { + const CDnsQuestion* query = aMessage.Queries()[i]; + TBufC8<100> domainName(query->Name()); + RPointerArray cacheArray; + TRAPD(error,MessageHandler().DnsCache().FindServiceL(cacheArray,domainName,(TDnsType)query->Type())); + for(TInt i =0 ; iIsAuthoritative()) + { + TBool suppress = EFalse; + switch(query->Type()) + { + case EDnsType_A: + { + suppress = SuppressDuplicateAnswerL(aMessage.Answers(),*(cacheArray[i]->AddressRecord())); + if(suppress == EFalse) + { + ret->AppendAnswerL(cacheArray[i]->AddressRecord()->CloneL()); + + } + break; + } + case EDnsType_PTR: + { + suppress = SuppressDuplicateAnswerL(aMessage.Answers(),*(cacheArray[i]->PtrRecord())); + if(suppress == EFalse) + { + ret->AppendAnswerL(cacheArray[i]->PtrRecord()->CloneL()); + } + break; + } + case EDnsType_SRV: + { + suppress = SuppressDuplicateAnswerL(aMessage.Answers(),*(cacheArray[i]->ServiceRecord())); + if(suppress == EFalse) + { + ret->AppendAnswerL(cacheArray[i]->ServiceRecord()->CloneL()); + } + break; + } + case EDnsType_TXT: + { + suppress = SuppressDuplicateAnswerL(aMessage.Answers(),*(cacheArray[i]->TxtRecord())); + if(suppress == EFalse) + { + ret->AppendAnswerL(cacheArray[i]->TxtRecord()->CloneL()); + } + break; + } + case EDnsType_AAAA: + { + //HandleAAAAQuestionL(); + break; + } + case EDnsQType_Any: + { + HandleAnyQuestionL(ret,aMessage.Answers(),*cacheArray[i]); + break; + } + default: + User::Invariant(); + + } + + } + } + cacheArray.ResetAndDestroy(); + cacheArray.Close(); + } + if(ret->Header().AnswerCount() == 0 && !IsLastTruncated) + { + CleanupStack::PopAndDestroy(ret); + } + else + { + TDnsHeader& header = const_cast (ret->Header()); + header.SetAuthoritative(ETrue); + if(IsLastTruncated) + { + COutStandingQuery* query = NULL; + TInt index = 0; + for( index =0 ; index< iOutStandingQueryArray.Count();index++) + { + query = iOutStandingQueryArray[index]; + if(query->TransactionId() == header.Id() && query->SocketAddress() == aAddr) + { + break; + } + } + if(index < iOutStandingQueryArray.Count()) + { + CDnsMessage* message = &(query->DnsMessage()); + TInt i = 0; + while(i++ Header().AnswerCount()) + { + ret->AppendAnswerL(message->Answers()[i]); + } + } + + } + + if(aMessage.Header().IsTruncated()) + { + IsLastTruncated = ETrue; + TTime time; + time.HomeTime(); + time + TTimeIntervalMicroSeconds(500); + COutStandingQuery* outstandingQuery = COutStandingQuery::NewL(ret,ret->Header().Id(),time,aAddr); + iOutStandingQueryArray.Append(outstandingQuery); + if(!IsActive()) + { + SetActive(); + At(time); + } + + } + else + { + const TUint32 KMDnsAddr = INET_ADDR(224, 0, 0, 251); + TInetAddr addr(KMDnsAddr, KMdnsPort); + CSendMessageData* data = CSendMessageData::NewL(ret,ETrue,addr,*this); + MessageHandler().MessageQueue().QueueDnsMessageL(*data); + } + CleanupStack::Pop(); + } + } + else + { + User::Leave(KErrGeneral); + } + __FLOG(_L8("CQueryHandler::HandleIncomingPacketL - Exit")); + } +/* + * Constructor + * by default clienthandle is 0 + */ +CQueryHandler::CQueryHandler(CMessageHandler& aMessageHandler):CBaseHandler(aMessageHandler) + { + + iClientHandle =0 ; + } + +/* + * Two phase constructor + */ +void CQueryHandler::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CQueryHandler::ConstructL - Entry")); + CBaseHandler::ConstructL(); + __FLOG(_L8("CQueryHandler::ConstructL - Exit")); + } + +/* + * compares the answer section and the authoritative entries in the cache . + * If there is a match returns ETrue. which mean remove the entry , as the + * client is not interested in this record. + * @param aAnswers array of records recieved from the external client. + * @param aResourceData data from the cache to be checked with the answer section. + */ +TBool CQueryHandler::SuppressDuplicateAnswerL(const RPointerArray& aAnswers,const CDnsResourceData& aResourceData) + { + __FLOG(_L8("CQueryHandler::SuppressDuplicateAnswerL - Entry")); + TBool ret =EFalse; + TInt answersCount = aAnswers.Count(); + for(TInt i=0 ;i< answersCount;i++) + { + if(0 == aAnswers[i]->Name().Compare(aResourceData.Name()) && aAnswers[i]->Type() == aResourceData.Type()) + { + switch(aResourceData.Type()) + { + case EDnsType_A: + { + const CRdTypeA& rdata = (CRdTypeA&)(aResourceData); + const CRdTypeA* rEntry = static_cast(aAnswers[i]); + if(rdata.Address() == rEntry->Address() && rdata.Ttl() > rEntry->Ttl()) + { + ret = ETrue; + } + break; + } + case EDnsType_PTR: + { + const CRdTypePtr& rdata = (CRdTypePtr&)(aResourceData); + const CRdTypePtr* rEntry = static_cast(aAnswers[i]); + if(0 ==rdata.Name().Compare(rEntry->Name()) && rdata.Ttl() > rEntry->Ttl()) + { + ret = ETrue; + } + break; + } + case EDnsType_SRV: + { + const CRdTypeSrv& rdata = (CRdTypeSrv&)(aResourceData); + const CRdTypeSrv* rEntry = static_cast(aAnswers[i]); + if(0 == rdata.Name().Compare(rEntry->Name()) && rdata.Port() == rEntry->Port() && rdata.Ttl() > rEntry->Ttl()) + { + ret = ETrue; + } + break; + } + case EDnsType_TXT: + { + const CRdTypeTxt& rdata = (CRdTypeTxt&)(aResourceData); + const CRdTypeTxt* rEntry = static_cast(aAnswers[i]); + if(rdata.Text().Count() == rEntry->Text().Count()) + { + for(TInt i =0; i< rdata.Text().Count();i++) + { + if(0 != rdata.Text()[i].Compare(rEntry->Text()[i])) + { + break; + } + } + ret =ETrue; + } + break; + } + default: + { + User::Invariant(); + } + + } + } + } + __FLOG(_L8("CQueryHandler::SuppressDuplicateAnswerL - Exit")); + return ret; + + } + +/* + * Handle query from the network of type *Any + * @param aPacket packet to be sent to the network in response to the query. + * @param aAnswers an array of answers in the query packet. + * @param aEntry authoritative entries in the cache. + */ +void CQueryHandler::HandleAnyQuestionL(CDnsMessage* aPacket,const RPointerArray& aAnswers,const CCacheEntry& aEntry) + { + __FLOG(_L8("CQueryHandler::HandleAnyQuestionL - Entry")); + if(aEntry.AddressRecord() && !SuppressDuplicateAnswerL(aAnswers,*(aEntry.AddressRecord()))) + { + aPacket->AppendAnswerL(aEntry.AddressRecord()->CloneL()); + } + if(aEntry.PtrRecord() && !SuppressDuplicateAnswerL(aAnswers,*(aEntry.PtrRecord()))) + { + aPacket->AppendAnswerL(aEntry.PtrRecord()->CloneL()); + } + if(aEntry.ServiceRecord() && !SuppressDuplicateAnswerL(aAnswers,*(aEntry.ServiceRecord()))) + { + aPacket->AppendAnswerL(aEntry.ServiceRecord()->CloneL()); + } + if(aEntry.TxtRecord() && !SuppressDuplicateAnswerL(aAnswers,*(aEntry.TxtRecord()))) + { + aPacket->AppendAnswerL(aEntry.TxtRecord()->CloneL()); + } + __FLOG(_L8("CQueryHandler::HandleAnyQuestionL - Exit")); + } + +/* + * Handles query from the application. + * 1.Query for the ptr entries are sent to the network by default. + * 2.Query for the srv or txt record will be sent to the network only if it is not present in the cache + * @param aMessage contains the query sent by the client. + * @param aClientHandle sessionid of the client. + */ +void CQueryHandler::ServiceClientQueryL(CDnsMessage* aMessage,TInt aClientHandle) + { + __FLOG(_L8("CQueryHandler::ServiceClientQueryL - Entry")); + TInt queryCount = aMessage->Header().QueryCount(); + TBool isSendQueryToNw = EFalse; + for(TInt i =0 ; i< queryCount ; i++) + { + switch(aMessage->Queries()[i]->Type()) + { + case EDnsType_A: + { + RPointerArray iAddressRecords; + TInt err = KErrNone; + TRAPD(error ,err = MessageHandler().DnsCache().FindServiceL(iAddressRecords, aMessage->Queries()[i]->Name(), EDnsType_A)); + if(error == KErrNone && err==KErrNotFound /*&& (NULL == iAddressRecords[0]->AddressRecord())*/) + { + isSendQueryToNw = ETrue; + } + else + { + CDnsQuestion* question = aMessage->Queries()[i]; + const_cast &>(aMessage->Queries()).Remove(i); + delete question; + } + iAddressRecords.ResetAndDestroy(); + iAddressRecords.Close(); + break; + } + + case EDnsType_PTR: + case EDnsQType_Any: + { + RPointerArray ptrRecords; + TRAPD(error,MessageHandler().DnsCache().FindServiceL(ptrRecords,aMessage->Queries()[i]->Name(),EDnsType_PTR)); + for(TInt index =0 ; (error == KErrNone) && index < ptrRecords.Count(); index++) + { + aMessage->AppendAnswerL(ptrRecords[index]->PtrRecord()->CloneL()); + } + isSendQueryToNw = ETrue; + ptrRecords.ResetAndDestroy(); + ptrRecords.Close(); + break; + } + + case EDnsType_SRV: + case EDnsType_TXT: + { + RPointerArray records; + TRAPD(error,MessageHandler().DnsCache().FindServiceL(records,aMessage->Queries()[i]->Name(),(TDnsType)aMessage->Queries()[i]->Type())); + if(error == KErrNone && 0 != records.Count()) + { + CDnsQuestion* question = aMessage->Queries()[i]; + const_cast &>(aMessage->Queries()).Remove(i); + delete question; + } + else + { + isSendQueryToNw = ETrue; + } + records.ResetAndDestroy(); + records.Close(); + break; + } + + + } + } + + if(isSendQueryToNw) + { + SendQueryL(aMessage,*this); + iClientHandle = aClientHandle; + //On succesfull sending the packet query handler will be notified there query will be + // added to outstanding queue + } + else + { + delete aMessage;//as the question is not to be send . + TTime time; + time.HomeTime(); + ScheduleOutStandingQueryL(aClientHandle,ETrue,time); + } + __FLOG(_L8("CQueryHandler::ServiceClientQueryL - Exit")); + } +/* + * Any queries to be sent to the network goes through this + * @param aMessage contains the query to be sent. + * @param aObserver callback which is interested in getting notified when + * a packet is successfully sent to the network. + */ +void CQueryHandler::SendQueryL(CDnsMessage* aMessage, MMessageHandler& aObserver) + { + __FLOG(_L8("CQueryHandler::SendQueryL - Entry")); + // + //TODO in case in case the size exceeds max size + // + TInetAddr addr(KMDnsAddr, KMdnsPort); + TBuf<255> buf; + addr.Output(buf); + CSendMessageData* data = CSendMessageData::NewL(aMessage,EFalse,addr,aObserver); + CleanupStack::PushL(data); + MessageHandler().MessageQueue().QueueDnsMessageL(*data); + CleanupStack::Pop();//data + __FLOG(_L8("CQueryHandler::SendQueryL - Exit")); + } + + +/* + * Creates an outstanding query object from the client query and adds it to the outstanding query arry. + * 1. For queries sent to the network ,waits for 120ms before sending the response back . + * 2. For queries not sent to network ,reponse will be sent back immediately. + */ +void CQueryHandler::ScheduleOutStandingQueryL(TInt aClientHandle , TBool aTriggerNow, TTime aInTime) + { + __FLOG(_L8("CQueryHandler::ScheduleOutStandingQueryL - Entry")); + COutStandingQuery* outstandingQuery = COutStandingQuery::NewL(NULL,0,aInTime,NULL); + outstandingQuery->SetClientHandle(aClientHandle); + if(aTriggerNow) + { + if(IsActive()) + { + Cancel(); + } + iOutStandingQueryArray.Insert(outstandingQuery,0); + TRequestStatus* status = &iStatus; + SetActive(); + User::RequestComplete(status,KErrNone); + } + else + { + TInt pos = 0; + for(pos = 0 ; pos< iOutStandingQueryArray.Count(); pos++ ) + { + if(outstandingQuery->GetAddTime().Int64() < iOutStandingQueryArray[pos]->GetAddTime().Int64() ) + { + break; + } + } + iOutStandingQueryArray.Insert(outstandingQuery, pos); + if(!IsActive()) + { + TTime nextReview = iOutStandingQueryArray[0]->GetAddTime(); + At(nextReview); + } + } + __FLOG(_L8("CQueryHandler::ScheduleOutStandingQueryL - Exit")); + } + +/*Only for the query recieved from the application there should be a delay + * before sending the response .So wait for 120ms before sending the response + * back to client. + * Only for the query recieved from the client ,iClientHandle will not be NULL + * @param aError is the error in case any in delivering the packet. + */ +void CQueryHandler::OnPacketSendL(TInt /*aError*/) + { + __FLOG(_L8("CQueryHandler::OnPacketSendL - Entry")); + if(iClientHandle != 0) + { + TTime time; + time.HomeTime(); + time = time + TTimeIntervalMicroSeconds(120000); + ScheduleOutStandingQueryL(iClientHandle,EFalse,time); + iClientHandle =0 ; + } + __FLOG(_L8("CQueryHandler::OnPacketSendL - Exit")); + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/cresponsehandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/cresponsehandler.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,423 @@ +// Copyright (c) 2008-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: +// cresponsehandler.cpp +// +// +/** +@file +@internalTechnology +*/ + +//System include +#include + +//User include +#include "cresponsehandler.h" +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/** +Two phase constructor +@param aMessageHandler a reference to messagehandler +*/ +CResponseHandler* CResponseHandler::NewL(CMessageHandler& aMessageHandler) + { + CResponseHandler* self = new(ELeave) CResponseHandler(aMessageHandler); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +/** +Destructor +*/ +CResponseHandler::~CResponseHandler() + { + __FLOG(_L8("CResponseHandler::~CResponseHandler - Entry")); + iNotifyPtrName.Close(); + __FLOG(_L8("CResponseHandler::~CResponseHandler - Exit")); + __FLOG_CLOSE; + } + +/** +Handles any resopnse packet recieved from the mdns port +@param response packet +@return void +*/ +void CResponseHandler::HandleIncomingPacketL(CDnsMessage& aMessage, const TSockAddr& /*aAddr*/) + { + __FLOG(_L8("CResponseHandler::HandleIncomingPacketL - Entry")); + iNotifyPtrName.Close(); + // process the answer section, and add to the host and service caches + TInt aCount(aMessage.Header().AnswerCount()); + const RPointerArray& answers = aMessage.Answers(); + for (TInt i = 0; i < aCount; ++i) + { + HandlePacketAnswersL(answers[i]); + } + aCount = aMessage.Header().AdditionalRCount(); + const RPointerArray& additional = aMessage.Additional(); + for (TInt i = 0; i < aCount; ++i) + { + if(additional[i]!=NULL) + HandlePacketAnswersL(additional[i]); + } + aCount = aMessage.Header().AuthorityNSCount(); + const RPointerArray& authoritative = aMessage.Authorities(); + for (TInt i = 0; i < aCount; ++i) + { + if(authoritative[i]!=NULL) + HandlePacketAnswersL(authoritative[i]); + } + + if(iNotifyPtrName.Count() > 0 ) + { + MessageHandler().NotifyNewServiceL(iNotifyPtrName); + for(TInt i=0 ; iType()) + { + case EDnsType_A: + { + HandleAddrAnswersL(aResourceData); + break; + } + + case EDnsType_PTR: + { + HandlePTRAnswersL(aResourceData); + break; + } + + case EDnsType_TXT: + { + HandleTXTAnswersL(aResourceData); + break; + } + + case EDnsType_AAAA: + { + HandleAAAAAnswersL(aResourceData); + //MessageHandler().DnsCache().Insert(); + break; + } + + case EDnsType_SRV: + { + HandleSRVAnswersL(aResourceData); + break; + } + } + __FLOG(_L8("CResponseHandler::HandlePacketAnswersL - Exit")); + } + +/** +This handles any address content in the answer section . +If the cache already contains a address entry with the same name .This will notify the server to change the name. +If the cache doesnt contain the entry it will just add this entry in to it. +@param aResourceData Contains the answers and nspackets recieved from the mdns port +@param aEntry Reference to entry to which record should be added so as to add the same to cache later. +@return void +*/ +void CResponseHandler::HandleAddrAnswersL(CDnsResourceData* aResourceData) + { + __FLOG(_L8("CResponseHandler::HandleAddrAnswersL - Entry")); + CRdTypeA* addrRecord = static_cast(aResourceData); + CleanupStack::PushL(addrRecord); + TBufC8<100> domainName(addrRecord->Name()); + RPointerArray aCacheArray; + TBool isUpdated = EFalse; + TRAPD(error,MessageHandler().DnsCache().FindServiceL(aCacheArray,domainName,EDnsType_A)); + if(error == KErrNone && 0 != aCacheArray.Count()) + { + const CRdTypeA* addrRecordCEntry = (aCacheArray[0])->AddressRecord(); + if(addrRecordCEntry != NULL && addrRecordCEntry->Name().Compare(domainName) == 0) + { + if(aCacheArray[0]->IsAuthoritative()) + { + if(addrRecordCEntry->Address() != addrRecord->Address() && addrRecord->IsFlushBitSet()) + { + MessageHandler().DnsCache().UpdateCacheL(*addrRecord,EFalse,0); + isUpdated = ETrue; + } + } + else + { + isUpdated = ETrue; + MessageHandler().DnsCache().UpdateCacheL(*addrRecord,EFalse,0); + } + + } + + } + + if (! isUpdated&& 0 != aResourceData->Ttl()) + { + // we didn't find it, add a new entry. + MessageHandler().DnsCache().UpdateCacheL(*addrRecord,EFalse,0); + } + aCacheArray.ResetAndDestroy(); + aCacheArray.Close(); + CleanupStack::Pop();//addrRecord + __FLOG(_L8("CResponseHandler::HandleAddrAnswersL - Exit")); + } + +/* + * Handles any PTR records in the answer section. + * 1.Updates the cache if not present . + * 2.Notitfies the client about the new service availability if registered for it. + * @param aResourceData ptr record recieved from the network. + */ + +void CResponseHandler::HandlePTRAnswersL(CDnsResourceData* aResourceData) + { + __FLOG(_L8("CResponseHandler::HandlePTRAnswersL - Entry")); + CRdTypePtr* ptrEntry = static_cast(aResourceData); + CleanupStack::PushL(ptrEntry); + TBufC8<100> name(ptrEntry->Name()); + RPointerArray aCacheArray; + MessageHandler().DnsCache().FindServiceL(aCacheArray,name,EDnsType_PTR); + TBool isUpdated = EFalse; + for (TInt i =0 ; i< aCacheArray.Count(); i++) + { + if(NULL != aCacheArray[i]) + { + const CRdTypePtr* ptrRecord = aCacheArray[i]->PtrRecord(); + if(ptrRecord->DomainName().CompareF(ptrEntry->DomainName()) == 0) + { + MessageHandler().DnsCache().UpdateCacheL(*ptrEntry,EFalse,0); + isUpdated = ETrue; + if(aResourceData->Ttl() == 0) + { + if(ptrEntry->DomainName().Find(ptrEntry->Name()) != KErrNotFound) + { + RBuf8 temp; + temp.CreateL(ptrEntry->DomainName()); + if(iNotifyPtrName.Find(temp) == KErrNotFound) + { + iNotifyPtrName.AppendL(temp); + } + else + { + temp.Close(); + } + } + CRdTypeSrv* srvRecord = static_cast ( aCacheArray[i]->ServiceRecord()); + if(srvRecord != NULL) + { + srvRecord->SetTtl(0); + MessageHandler().DnsCache().UpdateCacheL(*srvRecord,EFalse,0); + } + CRdTypeTxt* txtRecord = static_cast (aCacheArray[i]->TxtRecord()); + if(txtRecord != NULL) + { + txtRecord->SetTtl(0); + MessageHandler().DnsCache().UpdateCacheL(*txtRecord,EFalse,0); + } + } + + break; + } + } + } + if(!isUpdated && 0 != aResourceData->Ttl()) + { + MessageHandler().DnsCache().UpdateCacheL(*ptrEntry,EFalse,0); + //Notify the client about new service + if(ptrEntry->DomainName().Find(ptrEntry->Name()) != KErrNotFound) + { + RBuf8 temp; + temp.CreateL(ptrEntry->DomainName()); + if(iNotifyPtrName.Find(temp) == KErrNotFound) + { + iNotifyPtrName.AppendL(temp); + } + else + { + temp.Close(); + } + } + } + aCacheArray.ResetAndDestroy(); + aCacheArray.Close(); + CleanupStack::Pop(ptrEntry); + __FLOG(_L8("CResponseHandler::HandlePTRAnswersL - Exit")); + } + +/* + * Handles any TXT records in the answer section. + * 1.Updates the cache if not present . + * @param aResourceData ptr record recieved from the network. + */ +void CResponseHandler::HandleTXTAnswersL(CDnsResourceData* aResourceData) + { + __FLOG(_L8("CResponseHandler::HandleTXTAnswersL - Entry")); + CRdTypeTxt* txtEntry = static_cast(aResourceData); + CleanupStack::PushL(txtEntry); + RPointerArray aCacheArray; + TBool isUpdated = EFalse; + TRAPD(error,MessageHandler().DnsCache().FindServiceL(aCacheArray,txtEntry->Name(),EDnsType_TXT)); + if(error == KErrNone && 0 != aCacheArray.Count() && NULL != aCacheArray[0]->TxtRecord()) + { + const CRdTypeTxt* txtRecord = aCacheArray[0]->TxtRecord(); + if(NULL != txtRecord && txtRecord->Name().CompareF(txtEntry->Name()) == 0) + { + if(aCacheArray[0]->IsAuthoritative()) + { + isUpdated = ETrue; + MessageHandler().DnsCache().UpdateCacheL(*txtEntry,ETrue,0); + } + else + { + isUpdated = ETrue; + MessageHandler().DnsCache().UpdateCacheL(*txtEntry,EFalse,0); + } + + } + } + if(!isUpdated && aResourceData->Ttl() != 0 ) + { + MessageHandler().DnsCache().UpdateCacheL(*txtEntry,EFalse,0); + } + RBuf8 temp; + temp.CreateL(txtEntry->Name()); + if(iNotifyPtrName.Find(temp) == KErrNotFound) + { + iNotifyPtrName.AppendL(temp); + } + else + { + temp.Close(); + } + aCacheArray.ResetAndDestroy(); + aCacheArray.Close(); + CleanupStack::Pop();//txtEntry*/ + __FLOG(_L8("CResponseHandler::HandleTXTAnswersL - Exit")); + } + +void CResponseHandler::HandleAAAAAnswersL(CDnsResourceData* /*aResourceData*/) + { + + } + +/* + * Handles any SRV records in the answer section. + * 1.Updates the cache if not present . + * @param aResourceData ptr record recieved from the network. + */ +void CResponseHandler::HandleSRVAnswersL(CDnsResourceData* aResourceData) + { + __FLOG(_L8("CResponseHandler::HandleSRVAnswersL - Entry")); + CRdTypeSrv* srvEntry = static_cast(aResourceData); + CleanupStack::PushL(srvEntry); + RPointerArray cacheArray; + TBool isUpdated = EFalse; + TRAPD(error,MessageHandler().DnsCache().FindServiceL(cacheArray,srvEntry->Name(),EDnsType_SRV)); + if(KErrNone == error && cacheArray.Count() != 0 && NULL != cacheArray[0]->ServiceRecord()) + { + const CRdTypeSrv* srvRecord = cacheArray[0]->ServiceRecord(); + /*if(aResourceData->Ttl() == 0) + { + if(srvEntry->Name().Find(srvEntry->Target()) != KErrNotFound) + { + RBuf8 temp; + temp.CreateL(srvEntry->Name()); + if(iNotifyPtrName.Find(temp) == KErrNotFound) + { + iNotifyPtrName.AppendL(temp); + } + else + { + temp.Close(); + } + } + CRdTypeSrv* srvRecord = static_cast ( cacheArray[i]->ServiceRecord()); + if(srvRecord != NULL) + { + srvRecord->SetTtl(0); + MessageHandler().DnsCache().UpdateCacheL(*srvRecord,EFalse,0); + } + CRdTypeTxt* txtRecord = static_cast (aCacheArray[i]->TxtRecord()); + if(txtRecord != NULL) + { + txtRecord->SetTtl(0); + MessageHandler().DnsCache().UpdateCacheL(*txtRecord,EFalse,0); + } + }*/ + + if(srvRecord->Name().CompareF(srvEntry->Name()) == 0 && srvEntry->IsFlushBitSet()) + { + if(cacheArray[0]->IsAuthoritative()) + { + isUpdated = ETrue; + MessageHandler().DnsCache().UpdateCacheL(*srvEntry,ETrue,0); + } + else + { + isUpdated = ETrue; + MessageHandler().DnsCache().UpdateCacheL(*srvEntry,EFalse,0); + } + } + + } + RBuf8 temp; + temp.CreateL(srvEntry->Name()); + if(iNotifyPtrName.Find(temp) == KErrNotFound) + { + iNotifyPtrName.AppendL(temp); + } + else + { + temp.Close(); + } + if(!isUpdated && srvEntry->Ttl() != 0) + { + MessageHandler().DnsCache().UpdateCacheL(*srvEntry,EFalse,0); + } + cacheArray.ResetAndDestroy(); + cacheArray.Close(); + CleanupStack::Pop();//srvEntry + __FLOG(_L8("CResponseHandler::HandleSRVAnswersL - Exit")); + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/csendmessagequeue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/csendmessagequeue.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,338 @@ +// Copyright (c) 2008-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: +// csendmessagequeue.cpp +// +// +/** +@file +@internalTechnology +*/ + +#include "f32file.h" + +#include "cmessagehandler.h" +#include "csendmessagequeue.h" +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/** +Two phase constructor +@param aDnsMessage Dns message to be sent +@param aUnicast True if it is a unicast response +@param aAddr address to which the packet to be send +@return CSendMessageData object +*/ +CSendMessageData* CSendMessageData::NewL(CDnsMessage* aDnsMessage, TBool aUnicast,TSockAddr aAddr,MMessageHandler& aCallback) + { + CSendMessageData* self = new(ELeave)CSendMessageData(aDnsMessage,aUnicast,aAddr,aCallback); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +/** +Constant function which returns the reference to the Dns message object it wraps +@return constant reference to dnsmessage object +*/ +const CDnsMessage& CSendMessageData::GetDnsMessage()const + { + __FLOG(_L8("CSendMessageData::GetDnsMessage - Exit")); + return const_cast (*iMessage); + } + +/** +Constant function which returns the address of the data to be sent +@return Constant reference to the address +*/ +const TSockAddr& CSendMessageData::GetSockAddress()const + { + __FLOG(_L8("CSendMessageData::GetSockAddress - Exit")); + return iSockAddr; + } + +/** +Constant function which returns true if the message is unicast +@return True if message is unicast +*/ +const TBool& CSendMessageData::IsUnicast()const + { + __FLOG(_L8("CSendMessageData::IsUnicast - Exit")); + return iUnicast; + } +/** +Destructor +*/ +CSendMessageData::~CSendMessageData() + { + __FLOG(_L8("CSendMessageData::~CSendMessageData - Entry")); + delete iMessage; + __FLOG(_L8("CSendMessageData::~CSendMessageData - Exit")); + __FLOG_CLOSE; + } + +/** +Two phase constructor +@param aDnsMessage DnsMessage to be send +*/ +void CSendMessageData::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + } + +/** +Constructor +@param aUnicast True if it is a unicast response +@param aAddr Address to which the data to be sent +*/ +CSendMessageData::CSendMessageData(CDnsMessage* aDnsMessage,TBool aUnicast,TSockAddr aAddr,MMessageHandler& aCallback):iMessage(aDnsMessage),iUnicast(aUnicast),iSockAddr(aAddr),iCallback(aCallback) + { + + } + +MMessageHandler& CSendMessageData::Callback() + { + __FLOG(_L8("CSendMessageData::Callback - Exit")); + return iCallback; + } +/** +Two phase Constructor +@param aSocket reference to the RSocket +*/ +CSendMessageQueue* CSendMessageQueue::NewL(RSocket& aSocket) + { + CSendMessageQueue* self = new (ELeave)CSendMessageQueue(); + CleanupStack::PushL(self); + self->ConstructL(aSocket); + CleanupStack::Pop(self); + return self; + } + +/** +Constructor +*/ +CSendMessageQueue::CSendMessageQueue():CTimer(EPriorityStandard) + { + CActiveScheduler::Add(this); + } + +/** +Function derived from MSocketHandler Observer. +This method will be called on succesfull sending of the packet. +*/ +void CSendMessageQueue::OnCompletionL(TDesC8& /*aData*/, const TSockAddr& /*aAddr*/, TInt /*aLength*/) + { + __FLOG(_L8("CSendMessageQueue::OnCompletionL - Entry")); + if(iSendMessageData) + { + iIsSocketActive = EFalse; + iSendMessageData->Callback().OnPacketSendL(KErrNone); + } + delete iSendMessageData; + iSendMessageData = NULL; + if(iMessageQueue.Count() > 0 && !IsActive() ) + { + StartTransmit(); + } + __FLOG(_L8("CSendMessageQueue::OnCompletionL - Exit")); + } + +/* +Function derived from MSocketHandler Observer. +This method will be called on error in sending the packet. +*/ +void CSendMessageQueue::OnError(TInt aError) + { + __FLOG(_L8("CSendMessageQueue::OnError - Entry")); + if(iSendMessageData) + { + iSendMessageData->Callback().OnPacketSendL(aError); + } + __FLOG(_L8("CSendMessageQueue::OnError - Exit")); + } + +/** +Destructor +*/ +CSendMessageQueue::~CSendMessageQueue() + { + __FLOG(_L8("CSendMessageQueue::~CSendMessageQueue - Entry")); + delete iSendSocket; + delete iSendMessageData; + iMessageQueue.ResetAndDestroy(); + iMessageQueue.Close(); + iOutput.Close(); + __FLOG(_L8("CSendMessageQueue::~CSendMessageQueue - Exit")); + __FLOG_CLOSE; + } + +/** +Two phase constructor +@param refernce to RSocket +*/ +void CSendMessageQueue::ConstructL(RSocket& aSocket) + { + __FLOG(_L8("CSendMessageQueue::ConstructL - Entry")); + iSendSocket = CSocketHandler::NewL(aSocket, *this, ESocketSend); + CTimer::ConstructL(); + iIsSocketActive = EFalse; + __FLOG(_L8("CSendMessageQueue::ConstructL - Exit")); + } + +/** +Derived from CActive +*/ +void CSendMessageQueue::RunL() + { + __FLOG(_L8("CSendMessageQueue::RunL - Entry")); + if (MessageReady()) + { + iSendMessageData = NextDnsMessageL(); + CleanupStack::PushL(iSendMessageData); + const CDnsMessage& dnsMessage = iSendMessageData->GetDnsMessage(); + // close the previously allocated memory. + iOutput.Close(); + //composes the message from the Dnsmessage object . + CDnsMessageComposerParser* comPos = CDnsMessageComposerParser::NewL(); + CleanupStack::PushL(comPos); + comPos->CreateMessageL(iOutput, iSendMessageData->GetDnsMessage()); + TSocketHandlerParams param(ESocketSendTo,&iOutput,&(iSendMessageData->GetSockAddress())); + iSendSocket->Activate(param); + iIsSocketActive = ETrue; + CleanupStack::PopAndDestroy();//comPos + CleanupStack::Pop(); + } + __FLOG(_L8("CSendMessageQueue::RunL - Exit")); + } +/* + * Nothing to do. + */ +void CSendMessageQueue::DoCancel() + { + __FLOG(_L8("CSendMessageQueue::DoCancel - Exit")); + } + +void CSendMessageQueue::QueueDnsMessageL(const CSendMessageData& aMessageData) + { + __FLOG(_L8("CSendMessageQueue::QueueDnsMessageL - Entry")); + if (aMessageData.IsUnicast()) + { + // Unicast replies are to be given higher priority . + // Insert the unicast response in the queue. + TInt count(iMessageQueue.Count()); + TInt index(0); + for (; index < count; ++index) + { + if (!iMessageQueue[index]->IsUnicast()) + { + break; + } + } + iMessageQueue.InsertL(&aMessageData, index); + + iNextTransmit.HomeTime(); + Cancel(); + } + else + { + // Queue the packet + iMessageQueue.AppendL(&aMessageData); + } + + // kick the transmit limiter, so we're sure the message will be sent + if(!iIsSocketActive) + { + NextTransmitTime(iNextTransmit); + } + __FLOG(_L8("CSendMessageQueue::QueueDnsMessageL - Exit")); + } + +void CSendMessageQueue::NextTransmitTime(TTime aTime) + { + __FLOG(_L8("CSendMessageQueue::NextTransmitTime - Entry")); + // if we aren't already active, set the next TX time + if (!IsActive()) + { + TTime now; + now.HomeTime(); + + if (aTime > now) + { + At(aTime); + } + else + { + StartTransmit(); + } + } + __FLOG(_L8("CSendMessageQueue::NextTransmitTime - Exit")); + } + +void CSendMessageQueue::StartTransmit() + { + __FLOG(_L8("CSendMessageQueue::StartTransmit - Entry")); + SetActive(); + TRequestStatus *status = &iStatus; + User::RequestComplete(status,KErrNone); + __FLOG(_L8("CSendMessageQueue::StartTransmit - Exit")); + } + +CSendMessageData* CSendMessageQueue::NextDnsMessageL() + { + __FLOG(_L8("CSendMessageQueue::NextDnsMessageL - Entry")); + if (0 == iMessageQueue.Count()) + { + User::Leave(KErrNotReady); + } + + CSendMessageData* ret = iMessageQueue[0]; + iMessageQueue.Remove(0); + // calculate the next possible transmit time. + iNextTransmit.HomeTime(); + TInt delay = 20 + (Math::Rand(iRandomSeed) % 100); + iNextTransmit += TTimeIntervalMicroSeconds(delay * 1000); + __FLOG(_L8("CSendMessageQueue::NextDnsMessageL - Exit")); + return ret; + } + +TBool CSendMessageQueue::MessageReady() + { + __FLOG(_L8("CSendMessageQueue::MessageReady - Entry")); + TBool ready = EFalse; + if (0 != iMessageQueue.Count()) + { + if (iMessageQueue[0]->IsUnicast()) + { + // unicast messages go out straight away. + ready = ETrue; + } + else + { + TTime now; + now.HomeTime(); + if (!IsActive()) + { + if (now >= iNextTransmit) + { + ready = ETrue; + } + else + { + NextTransmitTime(iNextTransmit); + } + } + } + } + __FLOG(_L8("CSendMessageQueue::MessageReady - Exit")); + return ready; + } + diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/csockethandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/csockethandler.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,241 @@ +// Copyright (c) 2008-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: +// csockethandler.cpp +// +// +/** +@file +@internalTechnology +*/ + +//User include +#include "csockethandler.h" + +#include +#include +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/** +Two-phase construction method +@param aSocket Reference to RSocket +@param aObserver Reference to MSocketHandlerObserver used to notify the client. +@param aOperation TSocketOperation specfies the operation socket should perform. +@return a pointer to the requested socket handler object +*/ + +CSocketHandler* CSocketHandler::NewL(RSocket& aSocket, MSocketHandlerObserver& aObserver, TSocketOperation aOperation) + { + CSocketHandler* self = new (ELeave)CSocketHandler(aSocket, aObserver, aOperation); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + + + /** + Destructor + */ +CSocketHandler::~CSocketHandler() + { + __FLOG(_L8("CSocketHandler::~CSocketHandler - Entry")); + Cancel(); + delete iPacketBuffer; + __FLOG(_L8("CSocketHandler::~CSocketHandler - Exit")); + __FLOG_CLOSE; + } + + +/** +This to activate the socket to perform either send or recieve based on the operation set. +@param aParams Reference to TSocketHandlerParams containing operation,packet and address +@return void +*/ +void CSocketHandler::Activate ( const TSocketHandlerParams& aParams ) + { + __FLOG(_L8("CSocketHandler::Activate - Entry")); + iOperation = static_cast < TSocketOperation > ( aParams.iArgs[0] ); + switch ( iOperation ) + { + case ESocketSend: + { + iPacketPtr.Zero(); + HBufC8* bufChain = reinterpret_cast < HBufC8* > ( aParams.iArgs[1] ); + iLength = 0; + iSocket.Send(*bufChain, KDefaultFlags, iStatus, iLength ); + } + break; + + case ESocketSendTo: + { + iPacketPtr.Zero(); + RBuf8* bufChain = reinterpret_cast < RBuf8* > ( aParams.iArgs[1] ); + iSockAddr = *(reinterpret_cast < TSockAddr* > ( aParams.iArgs[2] )); + iLength = 0; + iSocket.SendTo ( *bufChain, iSockAddr, KDefaultFlags, iStatus, iLength ); + } + break; + + case ESocketRecieve: + { + iPacketPtr.Zero(); + iSocket.Recv (iPacketPtr, KDefaultFlags, iStatus ); + } + break; + + case ESocketRecieveFrom: + { + iPacketPtr.Zero(); + iSocket.RecvFrom ( iPacketPtr, iSockAddr, KDefaultFlags, iStatus ); + } + break; + + default: + User::Invariant (); + }; + + SetActive(); + __FLOG(_L8("CSocketHandler::Activate - Exit")); + } +/** + +*/ +void CSocketHandler::CompleteSelf ( TInt aError ) + { + __FLOG(_L8("CSocketHandler::CompleteSelf - Entry")); + TRequestStatus* pStat = &iStatus; + User::RequestComplete ( pStat, aError ); + SetActive ( ); + __FLOG(_L8("CSocketHandler::CompleteSelf - Exit")); + } +/** +Constructor +*/ +CSocketHandler::CSocketHandler(RSocket& aSocket, MSocketHandlerObserver& aObserver, TSocketOperation aOperation):CActive ( EPriorityNormal ),iSocket(aSocket),iObserver(aObserver),iOperation(aOperation),iPacketPtr(NULL,0) + { + + } +/** +Constructs a heap to hold the packet of almost 9k size +*/ +void CSocketHandler::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CSocketHandler::ConstructL - Entry")); + // Allocate a 9K buffer to contain the biggest mDNS packet allowable + iPacketBuffer = HBufC8::NewL(KMaxDnsPacketSize); + iPacketPtr.Set(iPacketBuffer->Des()); + CActiveScheduler::Add(this); + __FLOG(_L8("CSocketHandler::ConstructL - Exit")); + } + +/** +cancels the current operation +*/ +void CSocketHandler::CancelCurrent() + { + __FLOG(_L8("CSocketHandler::CancelCurrent - Entry")); + switch ( iOperation ) + { + case ESocketSend: + case ESocketSendTo: + iSocket.CancelSend (); + break; + + case ESocketRecieve: + case ESocketRecieveFrom: + iSocket.CancelRecv (); + break; + + }; + __FLOG(_L8("CSocketHandler::CancelCurrent - Exit")); + } +/** +Notifies the client with parameters based on the operation. +a. Returns the packet and addres for recieve operation. +b. returns only length of data send for send operation. +*/ +void CSocketHandler::NotifyCompletionL( ) + { + __FLOG(_L8("CSocketHandler::NotifyCompletionL - Entry")); + switch ( iOperation ) + { + case ESocketSend: + { + iObserver.OnCompletionL(iPacketPtr,NULL,iLength()); + break; + } + + case ESocketSendTo: + { + iObserver.OnCompletionL(iPacketPtr,iSockAddr,iLength()); + break; + } + + case ESocketRecieve: + case ESocketRecieveFrom: + { + + iObserver.OnCompletionL(iPacketPtr,iSockAddr,iLength()); + break; + } + + }; + __FLOG(_L8("CSocketHandler::NotifyCompletionL - Exit")); + } +/** +Notifies the client after the send or recieve +//Derived from CActive +*/ +void CSocketHandler::RunL() + { + __FLOG(_L8("CSocketHandler::RunL - Entry")); + TInt err = iStatus.Int (); + if ( err == KErrNone ) + { + NotifyCompletionL(); + } + else + { + iObserver.OnError ( err ); + } + __FLOG(_L8("CSocketHandler::RunL - Exit")); + } + + +/** +Derived from CActive +Cancellation of an outstanding request. +*/ +void CSocketHandler::DoCancel() + { + __FLOG(_L8("CSocketHandler::DoCancel - Entry")); + CancelCurrent (); + __FLOG(_L8("CSocketHandler::DoCancel - Exit")); + } + + + +/** +Handles any leave from the RunL +@param aError Error with which Runl leaves +@return error +*/ +TInt CSocketHandler::RunError(TInt /*aError*/) + { + __FLOG(_L8("CSocketHandler::RunError - Entry")); + //__ASSERT_DEBUG(aError,User::Invariant()); + //Ignore any leave from RSocket + __FLOG(_L8("CSocketHandler::RunError - Exit")); + return KErrNone; + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/mdns.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/mdns.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,57 @@ +// Copyright (c) 2008-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: +// mdns.cpp +// +// +/** +@file +@internalTechnology +*/ + +#include +#include +#include "mdnsserver.h" + +void MainL() + { + + CActiveScheduler* sched = new (ELeave) CActiveScheduler; + CleanupStack::PushL(sched); + CActiveScheduler::Install(sched); + + CMdnsServer::NewLC(); + RProcess::Rendezvous(KErrNone); + CActiveScheduler::Start(); + + + + CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(); + + } + +TInt E32Main() + { + // --------- check memory leak ------------- + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + TInt err = KErrNone; + if (cleanup) + { + TRAPD(err, MainL()); + delete cleanup; + } + __UHEAP_MARKEND; + return err; + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/mdnsserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/mdnsserver.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,450 @@ +// Copyright (c) 2008-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: +// mdnsserver.cpp +// +// +/** +@file +@internalTechnology +*/ + +#include "mdnsserver.h" +#include +#include "mdnsserversession.h" +#include "shutdowntimer.h" +#include "cmessagehandler.h" +#include "cmdnscacheconsistencymgr.h" +#include +#include "cmdnsprobemanager.h" +#include +#include +#include +#include +#include // Console +#include "cengsettingsobserver.h" +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +CMdnsServer* CMdnsServer::NewL() + { + + CMdnsServer* self = CMdnsServer::NewLC(); + CleanupStack::Pop(self); + + return self; + } + +/* + * Two phase constructor + */ +CMdnsServer* CMdnsServer::NewLC() + { + CMdnsServer* self = new (ELeave) CMdnsServer; + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/* + * Derived from CPolicy server + * Creates a new session object. + */ +CSession2* CMdnsServer::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const + { + __FLOG(_L8("CMdnsServer::NewSessionL - Entry")); + // if we're in the process of shutting the server down cleanly, + // don't accept any more connections. + if (iShutdownInProgress) + { + User::Leave(KErrCouldNotConnect); + } + + CMdnsServerSession* session = CMdnsServerSession::NewL(*this); + __FLOG(_L8("CMdnsServer::NewSessionL - Exit")); + return session; + } + +TInt CMdnsServer::NewSession() + { + __FLOG(_L8("CMdnsServer::NewSession - Entry")); + iShutdownTimer->Cancel(); + ++iConnectionCount; + ++iSessionIdCounter; + __FLOG(_L8("CMdnsServer::NewSession - Exit")); + return iSessionIdCounter; + } + +void CMdnsServer::DropSession() + { + __FLOG(_L8("CMdnsServer::DropSession - Entry")); + if (0 == --iConnectionCount) + { + //CActiveScheduler::Stop(); + iShutdownTimer->Start(); + } + __FLOG(_L8("CMdnsServer::DropSession - Exit")); + } + +void CMdnsServer::BeginShutdownL() + { + __FLOG(_L8("CMdnsServer::BeginShutdownL - Entry")); + iShutdownInProgress = ETrue; + CActiveScheduler::Stop(); + __FLOG(_L8("CMdnsServer::BeginShutdownL - Exit")); + } + +/* + * Destructor + */ +CMdnsServer::~CMdnsServer() + { + __FLOG(_L8("CMdnsServer::~CMdnsServer - Entry")); + iCacheConsistencyMgr->Stop(); + delete iShutdownTimer; + delete iMessageHandler; + delete iProbeManager; + delete iInternalMessageQueue; + delete iCacheConsistencyMgr; + iConnection.Close(); + iSockServ.Close(); + iHostName.Close(); + REComSession::FinalClose(); + __FLOG(_L8("CMdnsServer::~CMdnsServer - Exit")); + __FLOG_CLOSE; + } + +CMdnsServer::CMdnsServer() + : CPolicyServer(EPriorityStandard, zeroconfPolicy),iConnectionCount(0),iSessionIdCounter(0) + { + } + +/* + * Get the system ipaddress by amaking a query to the dns. + * @param aAddr on return contains the address. + */ +TInt CMdnsServer::GetLocalHost ( TSockAddr& aAddr ) + { + __FLOG(_L8("CMdnsServer::GetLocalHost - Entry")); + RSocket socket; + TInt err = socket.Open ( iSockServ, KAfInet, KSockStream, KProtocolInetTcp ); + + if ( err == KErrNone ) + { + TInetAddr localHost; + localHost.SetAddress ( KInetAddrAny ); + TPckgBuf query; + query ().iDstAddr = localHost; + + err = socket.GetOpt ( KSoInetIfQueryByDstAddr, KSolInetIfQuery, query ); + + if ( err == KErrNone ) + { + // its local IP address + localHost = query ().iSrcAddr; + aAddr = localHost; + TBuf<255>name ; + name.Append(query ().iName); + } + } + + socket.Close (); + __FLOG(_L8("CMdnsServer::GetLocalHost - Exit")); + return err; + } + +/* + * Two phase constructor + */ +void CMdnsServer::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + __FLOG(_L8("CMdnsServer::ConstructL - Entry")); + User::LeaveIfError(iSockServ.Connect()); + User::LeaveIfError(iConnection.Open(iSockServ)); + + // fetch the IAP from the command line + HBufC* iapBuf = HBufC::NewLC(User::CommandLineLength()); + TPtr iapPtr = iapBuf->Des(); + User::CommandLine(iapPtr); + + TUint32 iap(0); + TLex lex(*iapBuf); + User::LeaveIfError(lex.Val(iap, EDecimal)); + + CleanupStack::PopAndDestroy(iapBuf); + + // start a connection with the appropriate IAP + TCommDbConnPref prefs; + prefs.SetIapId(iap); + prefs.SetDialogPreference(ECommDbDialogPrefDoNotPrompt); + User::LeaveIfError(iConnection.Start(prefs)); + + User::LeaveIfError(iSocket.Open(iSockServ, KAfInet, KSockDatagram, KProtocolInetUdp)); + User::LeaveIfError(iSocket.SetLocalPort(KMdnsPort)); + TInetAddr broadcast; + //To be added in constant header + const TUint32 KMDnsAddr = INET_ADDR(224, 0, 0, 251); + broadcast.SetAddress(KMDnsAddr); + JoinMulticastGroupL(broadcast); + iMessageHandler = CMessageHandler::NewL(*this); + iShutdownTimer = CShutdownTimer::NewL(*this); + /***************************************PROBE**************************************************/ + //From here : Probe only for Host Name + iProbeManager = CMDNSProbeManager::NewL(iMessageHandler->DnsCache(),*iMessageHandler,ETrue); + TInetAddr addr; + GetLocalHost(addr); + //iHostName.Create(_L8("vadan.Local")); + CEngSettingsObserver* observer = CEngSettingsObserver::NewLC(); + + CBTEngSettings* btsettings= CBTEngSettings::NewL(observer); + + RBuf name; + name.CreateL(64); + btsettings->GetLocalName(name); + if(name.Length()==0) + { + iHostName.CreateL(_L8("MyNokiaPhone.Local")); + } + else + { + name.Append(_L(".local")); + iHostName.CreateL(name.Collapse()); + } + + iProbeManager->StartNameProbeL(iHostName,addr); + /*****************************************END**************************************************/ + iInternalMessageQueue = CInternalMessageQueue::NewL(*this); + /*****************************************ConsistencyMgr***************************************/ + iCacheConsistencyMgr = CMDNSCacheConsistencyMgr::NewL(ETrue,*iMessageHandler); + iCacheConsistencyMgr->Start(); + // start up the server + StartL(KMdnsServerName); + __FLOG(_L8("CMdnsServer::ConstructL - Exit")); + } +/* + * Interface to join the multicast group. + * @param aMulticastAddr specifies the multicast address to which it will join + * this is generally the mdns multicast address. + */ +void CMdnsServer::JoinMulticastGroupL(TInetAddr& aMulticastAddr) + { + __FLOG(_L8("CMdnsServer::JoinMulticastGroupL - Entry")); + TPckgBuf mReq; + + if (aMulticastAddr.Family() != KAfInet6) + { + aMulticastAddr.ConvertToV4Mapped(); + } + + mReq().iAddr = aMulticastAddr.Ip6Address(); + mReq().iInterface = 0; + User::LeaveIfError(iSocket.SetOpt(KSoIp6MulticastHops, KSolInetIp, 255)); + User::LeaveIfError(iSocket.SetOpt(KSoIp6JoinGroup, KSolInetIp, mReq)); + User::LeaveIfError(iSocket.SetOpt(KSoIp6MulticastLoop, KSolInetIp, 0)); + __FLOG(_L8("CMdnsServer::JoinMulticastGroupL - Exit")); + } + +/* + * @return returns the reference to the socket. + */ +RSocket& CMdnsServer::Socket() + { + __FLOG(_L8("CMdnsServer::Socket -Entry Exit")); + return iSocket; + } +/* + * returns the reference to messagehandler. + */ +CMessageHandler& CMdnsServer::MessageHandler()const + { + __FLOG(_L8("CMdnsServer::MessageHandler -Entry Exit")); + return *iMessageHandler; + } + +/* + * Query from the client should be served after a delay .If sent to the + * network. usually 120ms. + * Server will be notified with the same after the time elapses. + * @param aClientHandle session id which actually requested for the query . + * + * */ +void CMdnsServer::NotifyClientQuery(TInt aClientHandle) + { + __FLOG(_L8("CMdnsServer::NotifyClientQuery - Entry")); + iSessionIter.SetToFirst(); + CSession2* session = NULL; + while (NULL != (session = iSessionIter++)) + { + CMdnsServerSession* serverSession = static_cast(session); + if(serverSession->OutStandQueryClientHandle() == aClientHandle) + { + serverSession->SendResponseL(); + } + } + __FLOG(_L8("CMdnsServer::NotifyClientQuery - Exit")); + } + +/* + * Returns the hostname with which it has been probed. + */ +TDesC8& CMdnsServer::HostName()const + { + __FLOG(_L8("CMdnsServer::HostName -Entry Exit")); + return (TDesC8&)iHostName; + } + + +void CMdnsServer::SetHostNameL(const TDesC8& aName) + { + iHostName.Close(); + iHostName.CreateL(aName); + } + +/* + * When a new service appears in the network. + * will be notified to the server using this. + * Server in turn looks for the session interested in the service and completes the asynchronous reuest. + */ +void CMdnsServer::NotifyNewServiceL(const RArray& aName) + { + __FLOG(_L8("CMdnsServer::NotifyNewServiceL - Entry")); + iSessionIter.SetToFirst(); + CSession2* session = NULL; + while (NULL != (session = iSessionIter++)) + { + CMdnsServerSession* serverSession = static_cast(session); + serverSession->NewServiceL(aName); + } + __FLOG(_L8("CMdnsServer::NotifyNewServiceL - Exit")); + } + +/* + * After the service has been published succesfully. + * Server will be notified with this interface. + * @param aName name with which the service is published. + * @param aError result of submission. + * @param aSessionId session id of the client. + */ +void CMdnsServer::NotifyServicePublishL(const RBuf8& aName,TInt aError, TInt aSessionId) + { + __FLOG(_L8("CMdnsServer::NotifyServicePublishL - Entry")); + iSessionIter.SetToFirst(); + CSession2* session = NULL; + while ((NULL != (session = iSessionIter++)) ) + { + CMdnsServerSession* serverSession = static_cast(session); + if(serverSession->SessionId() == aSessionId) + { + serverSession->HandleServiceNameConflictL(aName,aError); + } + } + SetPublishingService(EFalse); + if(MessageQueue()->Count()>0) + { + MessageQueue()->StartProcessing(); + } + __FLOG(_L8("CMdnsServer::NotifyServicePublishL - Exit")); + } + +/* + * This performs two tast. + * 1. Set the iIsHostprobing to ETrue if host probing is going on. + * 2. If Hostprobing is over it sees whether there are any pending queries or + * publish request . IF there are any it will start processing the same . + * @param aProbing true if host probing. + */ +void CMdnsServer::SetStateHostProbing(TBool aProbing) + { + __FLOG(_L8("CMdnsServer::SetStateHostProbing - Entry")); + iIsHostProbing = aProbing; + if(!aProbing && MessageQueue()->Count()>0) + { + MessageQueue()->StartProcessing(); + } + __FLOG(_L8("CMdnsServer::SetStateHostProbing - Exit")); + } + +/* + * @return returns wheteher host probing is going on or not. + */ +TBool CMdnsServer::IsHostProbing()const + { + __FLOG(_L8("CMdnsServer::IsHostProbing - Exit")); + return iIsHostProbing; + } + +/* + * Starts any pending publish or query request in the queue. + * @param aMessage query or publish request. + * @param aType can be either publish or query. + * @param aSessionId session which requested . + */ +void CMdnsServer::ProcessQueuedMessage(const RMessage2& aMessage, const TMessageType aType,TInt aSessionId) + { + __FLOG(_L8("CMdnsServer::ProcessQueuedMessage - Entry")); + iSessionIter.SetToFirst(); + CSession2* session = NULL; + while (NULL != (session = iSessionIter++)) + { + CMdnsServerSession* serverSession = static_cast(session); + if(aSessionId == serverSession->SessionId()) + { + switch(aType) + { + case EQueryMessage: + { + serverSession->ServiceQueryL(aMessage); + break; + } + case EPublishMessage: + { + serverSession->PublishL(aMessage); + break; + } + } + } + } + __FLOG(_L8("CMdnsServer::ProcessQueuedMessage - Exit")); + } + +/* + * Pointer to the internall message queue. + */ +CInternalMessageQueue* CMdnsServer::MessageQueue() + { + __FLOG(_L8("CMdnsServer::MessageQueue -Entry Exit")); + return iInternalMessageQueue; + } + + +void CMdnsServer::OnPacketSendL(TInt /*aError*/) + { + // this is the call back after the bye-bye packet is sent. + // do nothing + __FLOG(_L8("CMdnsServer::OnPacketSendL -Entry Exit")); + } +/* + * if publishing will be set to true. + * this is to halt any further publish , till the one undergoing gets over. + */ +void CMdnsServer::SetPublishingService(TBool aFlag) + { + __FLOG(_L8("CMdnsServer::SetPublishingService - Entry")); + iIsPublishing = aFlag; + __FLOG(_L8("CMdnsServer::SetPublishingService - Exit")); + + } +TBool CMdnsServer::IsPublishingService() const + { + __FLOG(_L8("CMdnsServer::IsPublishingService -Entry Exit")); + return iIsPublishing ; + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/mdnsserversession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/mdnsserversession.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,732 @@ +// Copyright (c) 2008-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: +// mdnsserversession.cpp +// +// +/** +@file +@internalTechnology +*/ + +#include "mdnsserversession.h" +#include +#include +#include "mdnsserver.h" +#include +#include +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) +/* + * Two phase constructor. + */ +CMdnsServerSession* CMdnsServerSession::NewL(const CMdnsServer& aServer) + { + CMdnsServerSession* self = CMdnsServerSession::NewLC(aServer); + CleanupStack::Pop(self); + return self; + } + + +/* + * Two phase constructor + * @param aServer reference to the server. + */ +CMdnsServerSession* CMdnsServerSession::NewLC(const CMdnsServer& aServer) + { + CMdnsServerSession* self = new (ELeave) CMdnsServerSession(aServer); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/* + * @param aMessage RMessage object. + */ +void CMdnsServerSession::ServiceL(const RMessage2& aMessage) + { + __FLOG(_L8("CMdnsServerSession::ServiceL - Entry")); + switch (aMessage.Function()) + { + case EZeroconfServerMessageVersion: + break; + + case EMdnsServerQueryMessages: + { + if(NULL != iClientQuery.Handle()) + { + aMessage.Complete(KErrInUse); + } + else if (iServer.IsHostProbing() ) + { + iServer.MessageQueue()->AppendMessageL(EQueryMessage,aMessage,SessionId()); + } + else + { + ServiceQueryL(aMessage); + } + } + break; + + case EMdnsServerRecieveMessages: + { + HBufC8* buffer = HBufC8::NewLC(KDnsBufferlength); + TPtr8 bufferPointer(buffer->Des()); + iResponseBundle.Store(bufferPointer); + aMessage.Write(0,bufferPointer); + CleanupStack::PopAndDestroy();//delete buffer + aMessage.Complete(KErrNone); + iResponseBundle.Close(); + } + break; + + case EMndsServerPublishMessages: + { + if( iServer.IsHostProbing() || iServer.IsPublishingService()) + { + iServer.MessageQueue()->AppendMessageL(EPublishMessage,aMessage,SessionId()); + } + else + { + iServer.SetPublishingService(ETrue); + PublishL(aMessage); + } + break; + } + case EMdnsServerStartNotifyMessages: + { + RegisterNotifyL(aMessage); + aMessage.Complete(KErrNone); + break; + } + + case EMdnsServerStopNotifyMessages: + { + StopNotifyL(aMessage); + aMessage.Complete(KErrNone); + break; + } + + case EMdnsServerRecieveNotifyMessages: + { + iNotifyMessageRequest = aMessage; + break; + } + default: + User::Leave(KErrUnknown); + break; + } + + __FLOG(_L8("CMdnsServerSession::ServiceL - Exit")); + } + +void CMdnsServerSession::ServiceError(const RMessage2& aMessage, TInt aError) + { + __FLOG(_L8("CMdnsServerSession::ServiceError - Entry Exit")); + aMessage.Complete(aError); + } + + + +void CMdnsServerSession::CleanUp() + { + __FLOG(_L8("CMdnsServerSession::CleanUp - Entry")); + // First thing is to send bye-bye packets to the services that we have published. + + RPointerArray cacheEntries; + iServer.MessageHandler().DnsCache().AuthoritativeEntriesL(cacheEntries); + + for(TInt index =0; index < cacheEntries.Count();index++) + { + CCacheEntry* entry = cacheEntries[index]; + if(entry->SessionId()==iSessionId) + { + // To filter out address records. + if(entry->ServiceRecord()) + { + + // found the entry to be deleted + if(entry->ServiceRecord()) + entry->ServiceRecord()->SetTtl(0); + if(entry->TxtRecord()) + entry->TxtRecord()->SetTtl(0); + if(entry->PtrRecord()) + entry->PtrRecord()->SetTtl(0); + + // delete the entry in the cache + + // !!!!!! Assuming that the entry will always contain a srv record. + iServer.MessageHandler().DnsCache().DeleteEntryL(entry->ServiceRecord()->Name()); + + CDnsMessage* message = CDnsMessage::NewL(0,EFalse); + CleanupStack::PushL(message); + + TDnsHeader header(message->Header()); + header.SetAuthoritative(ETrue); + message->SetHeader(header); + + if(entry->ServiceRecord()) + message->AppendAnswerL(entry->ServiceRecord()->CloneL()); + if(entry->PtrRecord()) + message->AppendAnswerL(entry->PtrRecord()->CloneL()); + if(entry->TxtRecord()) + message->AppendAnswerL(entry->TxtRecord()->CloneL()); + + // bye-bye packet on the way to the network !!! + iServer.MessageHandler().SendQueryL(message,iServer); + CleanupStack::Pop(); //message + } + + } + } + + + cacheEntries.ResetAndDestroy(); + cacheEntries.Close(); + __FLOG(_L8("CMdnsServerSession::CleanUp - Exit")); + } +/* + * Destructor + */ +CMdnsServerSession::~CMdnsServerSession() + { + __FLOG(_L8("CMdnsServerSession::~CMdnsServerSession - Entry")); + CleanUp(); + iQueryBundle.Close(); + iResponseBundle.Close(); + iServer.DropSession(); + for(TInt i =0 ; i(aServer)) + { + iSessionId = iServer.NewSession(); + } + +/* + * Two phase constructor + */ +void CMdnsServerSession::ConstructL() + { + __FLOG_OPEN(KMDNSSubsystem, KComponent); + } + +//TODO +TInt CMdnsServerSession::CountResources() + { + return 3; + } + +void CMdnsServerSession::ServerVersionL(const RMessage2& aMessage) + { + __FLOG(_L8("CMdnsServerSession::ServerVersionL - Entry")); + TVersion mdnsServerVersion(0, 8, 0); + TPckgC pkg(mdnsServerVersion); + aMessage.WriteL(0, pkg); + aMessage.Complete(KErrNone); + __FLOG(_L8("CMdnsServerSession::ServerVersionL - Exit")); + + } +/* + * Service any query rom the client + */ +void CMdnsServerSession::ServiceQueryL(const RMessage2& aMessage) + { + __FLOG(_L8("CMdnsServerSession::ServiceQueryL - Entry")); + iQueryBundle.Close(); + iClientQuery = aMessage; + TInt len = aMessage.GetDesLengthL(0); + HBufC8* query = HBufC8::NewLC(aMessage.GetDesLengthL(0)); + TPtr8 loadPtr = query->Des(); + aMessage.ReadL(0,loadPtr); + iQueryBundle.CreateL(); + TInt retOnLoad = iQueryBundle.Load(loadPtr); + User::LeaveIfError(retOnLoad); + RParameterFamily pnpFamily = iQueryBundle.GetFamilyAtIndex(0); + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + CDnsMessage* message = CDnsMessage::NewL(0,ETrue ); + CleanupStack::PushL(message); + for ( TInt paramIndex = count - 1; paramIndex >= 0; paramIndex-- ) + { + CMDnsQueryRequestParamSet* queryParam = static_cast (pnpFamily.GetParameterSetAtIndex ( paramIndex, RParameterFamily::ERequested )); + HBufC8* name = HBufC8::NewL(256); + CleanupStack::PushL(name); + TPtr8 ptrName(name->Des()); + ptrName.Append(queryParam->InstanceName()); + if(queryParam->InstanceName().Length() > 0) + { + ptrName.Append(_L8(".")); + } + ptrName.Append(queryParam->ServiceType()); + if(queryParam->QueryType() != EDnsType_A) + { + ptrName.Append(1 == queryParam->Protocol() ? KTcpProtocolType : KUdpProtocolType); + } + ptrName.Append(KLocalTld); + ptrName.Append(_L8(".")); + CDnsQuestion* question = CDnsQuestion::NewL(); + CleanupStack::PushL(question); + question->SetNameL(ptrName); + question->SetClass(EDnsClass_IN); + question->SetType(queryParam->QueryType()); + question->SetUnicast(EFalse); + message->AppendQueryL(question); + CleanupStack::Pop(); + CleanupStack::PopAndDestroy();//name + } + iServer.MessageHandler().ServiceClientQueryL(message,aMessage.Handle()); + CleanupStack::Pop();//message + CleanupStack::PopAndDestroy();//query + __FLOG(_L8("CMdnsServerSession::ServiceQueryL - Exit")); + } + +TInt CMdnsServerSession::OutStandQueryClientHandle()const + { + return iClientQuery.Handle(); + } + +void CMdnsServerSession::SendResponseL() + { + __FLOG(_L8("CMdnsServerSession::SendResponseL - Entry")); + RParameterFamily pnpFamily = iQueryBundle.GetFamilyAtIndex(0); + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + //Open a new reference to ResponseBundle + iResponseBundle.Open (); + CleanupClosePushL( iResponseBundle ); + for(TInt index =0 ;index (pnpFamily.GetParameterSetAtIndex ( index, RParameterFamily::ERequested )); + HBufC8* name = HBufC8::NewL(KDnsBufferlength); + CleanupStack::PushL(name); + TPtr8 ptrName(name->Des()); + ptrName.Append(queryParam->InstanceName()); + if(queryParam->InstanceName().Size()>0) + ptrName.Append(_L8(".")); + ptrName.Append(queryParam->ServiceType()); + if(queryParam->QueryType() != EDnsType_A) + { + ptrName.Append(1 == queryParam->Protocol() ? KTcpProtocolType : KUdpProtocolType); + } + ptrName.Append(KLocalTld); + ptrName.Append(_L8(".")); + RPointerArray records; + iServer.MessageHandler().DnsCache().FindServiceL(records,ptrName,(TDnsType)queryParam->QueryType()); + TInt count = records.Count(); + switch((TDnsType)queryParam->QueryType()) + { + case EDnsType_PTR: + { + RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsPtrParamset); + while(count -- > 0 ) + { + iResponseBundle.SetPnPObserver((MPnPObserver*)NULL); + CMDnsPtrParamSet* responseParam = CMDnsPtrParamSet::NewL(pnpFamily); + responseParam->SetInstanceNameL(records[count]->PtrRecord()->Name()); + responseParam->SetDomainNameL(records[count]->PtrRecord()->DomainName()); + //responseParam->SetTtlL(records[count]->PtrRecord()->Ttl()); + } + break; + } + case EDnsType_SRV: + { + RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsSrvParamset); + while(count -- > 0 ) + { + iResponseBundle.SetPnPObserver((MPnPObserver*)NULL); + CMDnsSrvParamSet* responseParam = CMDnsSrvParamSet::NewL(pnpFamily); + responseParam->SetDomainNameL(records[count]->ServiceRecord()->Name()); + responseParam->SetTargetL(records[count]->ServiceRecord()->Target()); + responseParam->SetPriority(records[count]->ServiceRecord()->Priority()); + responseParam->SetWeight(records[count]->ServiceRecord()->Weight()); + responseParam->SetPort(records[count]->ServiceRecord()->Port()); + } + break; + } + case EDnsType_TXT: + { + RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsTxtParamset); + while(count -- > 0 ) + { + iResponseBundle.SetPnPObserver((MPnPObserver*)NULL); + CMDnsTxtParamSet* responseParam = CMDnsTxtParamSet::NewL(pnpFamily); + responseParam->SetDomainNameL(records[count]->TxtRecord()->Name()); + RArray txtData = records[count]->TxtRecord()->Text(); + + for(TInt j=0;jAppendTxtData(txtData[j]); + } + } + break; + } + case EDnsType_A: + { + RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsAddrParamset); + while(count -- > 0 ) + { + iResponseBundle.SetPnPObserver((MPnPObserver*)NULL); + CMDnsAddrParamSet* responseParam = CMDnsAddrParamSet::NewL(pnpFamily); + responseParam->SetDomainNameL(records[count]->AddressRecord()->Name()); + responseParam->SetAddress(records[count]->AddressRecord()->Address()); + } + break; + } + case EDnsQType_Any: + { + iResponseBundle.SetPnPObserver((MPnPObserver*)NULL); + while(count -- > 0 ) + { + CreateAnyQueryResponseL(*records[count]); + } + break; + } + + } + records.ResetAndDestroy(); + records.Close(); + CleanupStack::PopAndDestroy();//name + }//end of for loop + + HBufC8* buffer = HBufC8::NewLC(KDnsBufferlength); + TPtr8 bufferPointer(buffer->Des()); + iResponseBundle.Store(bufferPointer); + TInt len = bufferPointer.Length(); + TPckgC lenbuf(len); + iClientQuery.Write(1,lenbuf); + CleanupStack::PopAndDestroy();//buffer + iClientQuery.Complete(KErrNone); + CleanupStack::Pop();//iResponseBundle + __FLOG(_L8("CMdnsServerSession::SendResponseL - Exit")); + } + +void CMdnsServerSession::PublishL(const RMessage2& aMessage) + { + __FLOG(_L8("CMdnsServerSession::PublishL - Entry")); + TBool isUpdate = aMessage.Int2(); + iPublishRequest = aMessage; + TInt len = aMessage.GetDesLengthL(0); + HBufC8* query = HBufC8::NewLC(aMessage.GetDesLengthL(0)); + TPtr8 loadPtr = query->Des(); + aMessage.ReadL(0,loadPtr); + iPublishBundle.CreateL(); + TInt retOnLoad = iPublishBundle.Load(loadPtr); + TInt familyCount = iPublishBundle.CountParameterFamilies(); + RPointerArray publishRecordArray; + for(TInt i =0 ; i< familyCount; i++) + { + RParameterFamily pnpFamily = iPublishBundle.GetFamilyAtIndex(i); + switch (pnpFamily.Id()) + { + case EMdnsSrvParamset: + { + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + for (TInt index= 0; index < count ; index++ ) + { + CMDnsSrvParamSet* srvParamSet = static_cast (pnpFamily.GetParameterSetAtIndex ( index, RParameterFamily::ERequested )); + CRdTypeSrv* srvRecord = CRdTypeSrv::NewL(); + CleanupStack::PushL(srvRecord); + srvRecord->SetNameL(srvParamSet->DomainName()); + srvRecord->SetClass(EDnsClass_IN); + srvRecord->SetFlushBit(EFalse); + srvRecord->SetPort(srvParamSet->Port()); + srvRecord->SetPriority(srvParamSet->Priority() ); + srvRecord->SetTargetL(iServer.HostName()); + srvRecord->SetTtl(120); + srvRecord->SetType(EDnsType_SRV); + srvRecord->SetWeight(srvParamSet->Weight()); + publishRecordArray.AppendL(srvRecord); + CleanupStack::Pop();//CRdtypeSrv + //Ptr Record + /* + CRdTypePtr* ptrRecord = CRdTypePtr::NewL(); + CleanupStack::PushL(ptrRecord); + TInt pos = srvParamSet->DomainName().Locate('.'); + ptrRecord->SetNameL(srvParamSet->DomainName().Mid(pos+1)); + ptrRecord->SetClass(EDnsClass_IN); + ptrRecord->SetFlushBit(EFalse); + ptrRecord->SetTtl(120); + ptrRecord->SetType(EDnsType_PTR); + ptrRecord->SetDomainNameL(srvParamSet->DomainName()); + publishRecordArray.AppendL(ptrRecord); + CleanupStack::Pop(); + */ + } + break; + } + case EMdnsPtrParamset: + { + //do nothing + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + for (TInt index= 0; index < count ; index++ ) + { + CMDnsPtrParamSet* ptrParamSet = static_cast(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested )); + CRdTypePtr* ptrRecord = CRdTypePtr::NewL(); + CleanupStack::PushL(ptrRecord); + ptrRecord->SetNameL(ptrParamSet->InstanceName()); + ptrRecord->SetClass(EDnsClass_IN); + ptrRecord->SetFlushBit(EFalse); + ptrRecord->SetTtl(120); + ptrRecord->SetType(EDnsType_PTR); + ptrRecord->SetDomainNameL(ptrParamSet->DomainName()); + publishRecordArray.AppendL(ptrRecord); + CleanupStack::Pop();//Remove Ptr Record from the queue.. + } + break; + } + case EMdnsAddrParamset: + { + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + for (TInt index= 0; index < count ; index++ ) + { + CMDnsAddrParamSet* addrParamSet = static_cast(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested )); + CRdTypeA* addrRecord = CRdTypeA::NewL(); + CleanupStack::PushL(addrRecord); + addrRecord->SetAddr(addrParamSet->Address()); + addrRecord->SetNameL(addrParamSet->DomainName()); + addrRecord->SetClass(EDnsClass_IN); + addrRecord->SetFlushBit(EFalse); + addrRecord->SetTtl(120); + addrRecord->SetType(EDnsType_A); + publishRecordArray.AppendL(addrRecord); + CleanupStack::Pop();//remove addrecord from the queue + } + break; + } + case EMdnsTxtParamset: + { + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + for (TInt index= 0; index < count ; index++ ) + { + CMDnsTxtParamSet* txtParamSet = static_cast(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested )); + CRdTypeTxt* txtRecord = CRdTypeTxt::NewL(); + CleanupStack::PushL(txtRecord); + txtRecord->SetNameL(txtParamSet->DomainName()); + txtRecord->SetClass(EDnsClass_IN); + txtRecord->SetFlushBit(EFalse); + txtRecord->SetTtl(120); + txtRecord->SetType(EDnsType_TXT); + RArray txtArray ; + txtParamSet->TxtDataL(txtArray); + TInt txtCnt = txtArray.Count(); + for(TInt count = 0; count < txtCnt ; count ++ ) + { + txtRecord->AppendTextDataL(txtArray[count]); + } + txtArray.Close(); + publishRecordArray.AppendL(txtRecord); + CleanupStack::Pop();//remove txtRecord from the queue.. + } + break; + } + } + + } + TRAPD(publishError ,iServer.MessageHandler().AdvertizePacketL(publishRecordArray,iSessionId , isUpdate)); + if(publishError == KErrNotFound) + { + aMessage.Complete(KErrNotFound); + } + publishRecordArray.Close(); + iPublishBundle.Close(); + CleanupStack::PopAndDestroy(query); + __FLOG(_L8("CMdnsServerSession::PublishL - Exit")); + } + +void CMdnsServerSession::HandleServiceNameConflictL(const RBuf8& aName,TInt aError) + { + __FLOG(_L8("CMdnsServerSession::HandleServiceNameConflictL - Entry")); + iResponseBundle.Open (); + CleanupClosePushL( iResponseBundle ); + + RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsPublishResponseParamset); + iResponseBundle.SetPnPObserver((MPnPObserver*)NULL); + + CMDnsPublishResponseParamSet* responseParam = CMDnsPublishResponseParamSet::NewL(pnpFamily); + responseParam->SetDomainNameL(aName); + responseParam->SetError(aError); + + + TInt len = iResponseBundle.Length(); + TPckgC lenbuf(len); + iPublishRequest.Write(1,lenbuf); + + iPublishRequest.Complete(KErrNone); + CleanupStack::Pop();//iResponseBundle + __FLOG(_L8("CMdnsServerSession::HandleServiceNameConflictL - Exit")); + } + +void CMdnsServerSession::RegisterNotifyL(const RMessage2& aMessage) + { + __FLOG(_L8("CMdnsServerSession::RegisterNotifyL - Entry")); + iIsNotifyRequested = ETrue; + RPnPParameterBundle registerBundle; + TInt size = aMessage.GetDesLength(0); + HBufC8* registerbuf = HBufC8::NewLC(aMessage.GetDesLengthL(0)); + TPtr8 loadPtr = registerbuf->Des(); + aMessage.ReadL(0,loadPtr); + registerBundle.CreateL(); + registerBundle.Load(loadPtr); + RParameterFamily pnpFamily = registerBundle.GetFamilyAtIndex(0); + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + for(TInt index =0 ; index(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested )); + RBuf8 instanceName; + instanceName.CreateL(registerParamSet->InstanceName()); + iRegisterNotifyArray.AppendL(instanceName); + } + registerBundle.Close(); + CleanupStack::PopAndDestroy();//registerbuffer + __FLOG(_L8("CMdnsServerSession::RegisterNotifyL - Exit")); + } + +void CMdnsServerSession::StopNotifyL(const RMessage2& aMessage) + { + __FLOG(_L8("CMdnsServerSession::StopNotifyL - Entry")); + RPnPParameterBundle registerBundle; + TInt size = aMessage.GetDesLength(0); + HBufC8* registerbuf = HBufC8::NewLC(aMessage.GetDesLengthL(0)); + TPtr8 loadPtr = registerbuf->Des(); + aMessage.ReadL(0,loadPtr); + registerBundle.CreateL(); + registerBundle.Load(loadPtr); + RParameterFamily pnpFamily = registerBundle.GetFamilyAtIndex(0); + TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ; + for(TInt index =0 ; index< count; index++) + { + CMDnsRegisterNotifyParamSet* registerParamSet = static_cast(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested )); + RBuf8 instanceName; + instanceName.CreateL(registerParamSet->InstanceName()); + for(TInt i =0 ; i< iRegisterNotifyArray.Count();i++) + { + if(instanceName.Compare(iRegisterNotifyArray[i]) == 0) + { + RBuf8& temp = iRegisterNotifyArray[i]; + iRegisterNotifyArray.Remove(i); + temp.Close(); + } + } + instanceName.Close(); + } + if(iRegisterNotifyArray.Count() == 0 ) + { + iIsNotifyRequested =EFalse; + } + registerBundle.Close(); + CleanupStack::PopAndDestroy();//registerbuffer + __FLOG(_L8("CMdnsServerSession::StopNotifyL - Exit")); + } + +TInt CMdnsServerSession::SessionId() + { + __FLOG(_L8("CMdnsServerSession::SessionId - Exit")); + return iSessionId; + } +void CMdnsServerSession::NewServiceL(const RArray& aName) + { + __FLOG(_L8("CMdnsServerSession::NewServiceL - Entry")); + if(iIsNotifyRequested && iNotifyMessageRequest.Handle()) + { + RPnPParameterBundle publishBundle; + publishBundle.CreateL(); + RParameterFamily pnpFamily = publishBundle.CreateFamilyL (EMdnsPtrParamset); + publishBundle.SetPnPObserver((MPnPObserver*)NULL); + for(TInt i =0 ; i < aName.Count();i++) + { + for(TInt j= 0 ; j< iRegisterNotifyArray.Count(); j++) + { + TInt pos = aName[i].Find(iRegisterNotifyArray[j]); + if(pos != KErrNotFound) + { + CMDnsPtrParamSet* responseParam = CMDnsPtrParamSet::NewL(pnpFamily); + responseParam->SetInstanceNameL(iRegisterNotifyArray[j]); + responseParam->SetDomainNameL(aName[i]); + // have to fill up the ttl field, query the cache + RPointerArray aEntries; + iServer.MessageHandler().DnsCache().FindServiceL(aEntries,aName[i],EDnsType_SRV); + responseParam->SetTtlL(0); + if(aEntries.Count()==0) + { + // already deleted from cache + responseParam->SetTtlL(0); + } + else if(aEntries[0]->PtrRecord()!=NULL) + { + responseParam->SetTtlL(aEntries[0]->PtrRecord()->Ttl()); + } + aEntries.ResetAndDestroy(); + aEntries.Close(); + break; + } + } + } + HBufC8* buffer = HBufC8::NewLC(KDnsBufferlength); + TPtr8 bufferPointer(buffer->Des()); + publishBundle.Store(bufferPointer); + iNotifyMessageRequest.Write(0,bufferPointer); + iNotifyMessageRequest.Complete(KErrNone); + CleanupStack::PopAndDestroy(buffer);//buffer + publishBundle.Close(); + } + __FLOG(_L8("CMdnsServerSession::NewServiceL - Exit")); + } + + +void CMdnsServerSession::CreateAnyQueryResponseL(CCacheEntry& aEntry) + { + RParameterFamily ptrFamily = iResponseBundle.CreateFamilyL (EMdnsPtrParamset); + RParameterFamily srvFamily = iResponseBundle.CreateFamilyL (EMdnsSrvParamset); + RParameterFamily txtFamily = iResponseBundle.CreateFamilyL (EMdnsTxtParamset); + RParameterFamily AFamily = iResponseBundle.CreateFamilyL (EMdnsAddrParamset); + if(aEntry.AddressRecord()!= NULL) + { + CMDnsAddrParamSet* responseParam = CMDnsAddrParamSet::NewL(AFamily); + responseParam->SetDomainNameL(aEntry.AddressRecord()->Name()); + responseParam->SetAddress(aEntry.AddressRecord()->Address()); + } + if(aEntry.ServiceRecord()!= NULL) + { + CMDnsSrvParamSet* responseParam = CMDnsSrvParamSet::NewL(srvFamily); + responseParam->SetDomainNameL(aEntry.ServiceRecord()->Name()); + responseParam->SetTargetL(aEntry.ServiceRecord()->Target()); + responseParam->SetPriority(aEntry.ServiceRecord()->Priority()); + responseParam->SetWeight(aEntry.ServiceRecord()->Weight()); + responseParam->SetPort(aEntry.ServiceRecord()->Port()); + } + if(aEntry.PtrRecord()!= NULL) + { + CMDnsPtrParamSet* responseParam = CMDnsPtrParamSet::NewL(ptrFamily); + responseParam->SetInstanceNameL(aEntry.PtrRecord()->Name()); + responseParam->SetDomainNameL(aEntry.PtrRecord()->DomainName()); + //responseParam->SetTtlL(aEntry.PtrRecord()->Ttl()); + } + if(aEntry.TxtRecord()!= NULL) + { + CMDnsTxtParamSet* responseParam = CMDnsTxtParamSet::NewL(txtFamily); + responseParam->SetDomainNameL(aEntry.TxtRecord()->Name()); + RArray txtData = aEntry.TxtRecord()->Text(); + for(TInt txtCount = 0 ;txtCount < txtData.Count();txtCount++) + { + responseParam->AppendTxtData(txtData[txtCount]); + } + } + + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/server/src/shutdowntimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/server/src/shutdowntimer.cpp Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,78 @@ +/* +* 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: +* +*/ + + +/** +@file +@internalTechnology +*/ + +//User Include +#include "shutdowntimer.h" +#include "mdnsserver.h" +__FLOG_STMT(_LIT8(KComponent,"MDNSServer");) + +CShutdownTimer* CShutdownTimer::NewL(CMdnsServer& aServer) + { + + CShutdownTimer* self = CShutdownTimer::NewLC(aServer); + CleanupStack::Pop(self); + + return self; + } + + +CShutdownTimer* CShutdownTimer::NewLC(CMdnsServer& aServer) + { + + CShutdownTimer* self = new (ELeave) CShutdownTimer(aServer); + CleanupStack::PushL(self); + self->ConstructL(); + + return self; + } + +void CShutdownTimer::Start() + { + TTimeIntervalMicroSeconds32 interval(KShutdownDelay); + //After(interval); + After(1000000); + } + + +void CShutdownTimer::RunL() + { + // tell the server to begin the shutdown process + iServer.BeginShutdownL(); + } + +TInt CShutdownTimer::RunError(TInt /*aError*/) + { + CActiveScheduler::Stop(); + return KErrNone; + } + +CShutdownTimer::CShutdownTimer(CMdnsServer& aServer) + : CTimer(EPriorityStandard), iServer(aServer) + { + CActiveScheduler::Add(this); + } + +CShutdownTimer::~CShutdownTimer() + { + + } diff -r 78fbd574edf4 -r da856f45b798 zeroconf/sis/bonjour.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/sis/bonjour.pkg Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,37 @@ +; +; 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: +; +;Language - standard language definitions +&EN + +; SIS file header +#{"ZeroConf"},(0x2000D154),0,1,0 + +;Localised Vendor name +%{"Nokia"} + +;Unique Vendor name +:"Nokia" + +;Supports Series 60 +[0x101F7961], *, *, *, {"Series60ProductID"} + + +; reference files +"\epoc32\release\armv5\urel\mdnscachemanager.dll" - "!:\Sys\Bin\mdnscachemanager.dll" +"\epoc32\release\armv5\urel\dnsparser.dll" - "!:\Sys\Bin\dnsparser.dll" +"\epoc32\release\armv5\urel\mdnsclient.dll" - "!:\Sys\Bin\mdnsclient.dll" +"\epoc32\data\z\resource\plugins\mdnsclient.rsc" - "!:\resource\plugins\mdnsclient.rsc" +"\epoc32\release\armv5\urel\zeroconf_20008AD8.exe" - "!:\Sys\Bin\zeroconf_20008AD8.exe" diff -r 78fbd574edf4 -r da856f45b798 zeroconf/sis/distribution.policy.s60 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/sis/distribution.policy.s60 Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,1 @@ +7 \ No newline at end of file diff -r 78fbd574edf4 -r da856f45b798 zeroconf/sis/rd-key.pem --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/sis/rd-key.pem Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDLRF+r1FGGkCwTrb420kbnAps7gi1yYUcXYUdWeFTuBeQe5eW4 +6Y+LWaA8HMlDdoHRB0FgASisYcFagwno9+oFf4AJka4H1gWEs5XTGwAA1s0d8XGh +7W7Dt9F5FZij8F7/9Pi6+FhhxZFIf1DD+yry9D7+Sp+BgdNALe4XOpf25QIBAwKB +gQCHgupyjYuvCsgNHn7PNtnvVxInrB5MQNoPli+O+uNJWUK/Q+57Rl+yO8AoEzDX +pFaLWiuVVhsdloDnAgabT/FXzYncs6uOHyEUV+dSXb78vtLPJqAX+Fg2i3hOXreB +yskcZ13/OsKVOu5wgrJkx2baZufkqMwOSytf5y9nwjEIKwJBAP+inobagVNrN62j +KQva3cC+UN/6XnKdTc0CA6bHyLOaJoH1xiMwG/VS2PGjHI0tiSMNtLn/QPpHJ003 +iabGhdUCQQDLjp/9UjFT6K6CF66Chqf30pZXhx+GTSQZmv/gvZiMly7X9fX9BGX3 +2MbJohBC4yI21XKTbisWywkF73Hwh+TRAkEAqmxprzxWN5zPyRdwspHpKymLP/w+ +9xOJM1atGdqFzRFvAU6EF3Vn+OHl9my9s3OwwgkjJqorUYTE3iUGby8D4wJBAIe0 +aqjhdjfwdFa6dFcEb/qMZDpaFQQzbWZnVUB+ZbMPdI/5TqitmU/l2dvBYCyXbCSO +TGJJcg8yBgP09qBamIsCQFL7j1tM0XPVQJQ89WpKCld7O9ORxRGVj1eG0tWijrH8 +mGbYh8SGCVoWV3vrKSS8GBrFVgQnqUaHuEdtM7tpCAQ= +-----END RSA PRIVATE KEY----- diff -r 78fbd574edf4 -r da856f45b798 zeroconf/sis/rd.cer --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zeroconf/sis/rd.cer Thu Jun 24 19:09:47 2010 +0530 @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICzDCCAjWgAwIBAgIBADANBgkqhkiG9w0BAQUFADArMRAwDgYDVQQKEwdSRCBD +ZXJ0MRcwFQYDVQQDEw5SRCBDZXJ0aWZpY2F0ZTAeFw0wNDExMTUxMjQyMDZaFw0z +NzA5MjMxMjQyMDZaMCsxEDAOBgNVBAoTB1JEIENlcnQxFzAVBgNVBAMTDlJEIENl +cnRpZmljYXRlMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDLRF+r1FGGkCwT +rb420kbnAps7gi1yYUcXYUdWeFTuBeQe5eW46Y+LWaA8HMlDdoHRB0FgASisYcFa +gwno9+oFf4AJka4H1gWEs5XTGwAA1s0d8XGh7W7Dt9F5FZij8F7/9Pi6+FhhxZFI +f1DD+yry9D7+Sp+BgdNALe4XOpf25QIBA6OCAQAwgf0wDAYDVR0TBAUwAwEB/zAL +BgNVHQ8EBAMCAoQwHQYDVR0OBBYEFFi/kuGzxhVpjGxe9ZwlxC3fH9jFMFMGA1Ud +IwRMMEqAFFi/kuGzxhVpjGxe9ZwlxC3fH9jFoS+kLTArMRAwDgYDVQQKEwdSRCBD +ZXJ0MRcwFQYDVQQDEw5SRCBDZXJ0aWZpY2F0ZYIBADBsBgNVHSAEZTBjMGEGBFUd +IAAwWTATBggrBgEFBQcCARYHaHR0cDovLzBCBggrBgEFBQcCAjA2GjRGb3IgUiZE +IHVzYWdlIG9ubHkuIFRoaXMgY2VydGlmaWNhdGUgaXMgbm90IHRydXN0ZWQuMA0G +CSqGSIb3DQEBBQUAA4GBAHGB4RQMAgBdeT2hxfOr6f2nA/dZm+M5yX5daUtZnET9 +Ed0A9sazLawfN2G1KFQT9kxEParAyoAkpbMAsRrnRz/9cM3OHgFm/NiKRnf50DpT +7oCx0I/65mVD2kt+xXE62/Ii5KPnTufIkPi2uLvURCia1tTS8JmJ8dtxDGyQt8BR +-----END CERTIFICATE-----