zeroconf/zeroconfsharing/zeroconfclient.cpp
changeset 21 ff5174af067c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zeroconf/zeroconfsharing/zeroconfclient.cpp	Wed Jul 21 14:28:48 2010 +0530
@@ -0,0 +1,405 @@
+/*
+* 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 "zeroconfclient.h"
+#include "e32math.h"
+
+#include <in_sock.h>
+#include <ecom/ecom.h>
+const TUint KPublishTierId = 0x2001DC8A;
+
+CZeroconfClient* CZeroconfClient::NewL(MPnPObserver* aObserver)
+	{
+	CZeroconfClient* self = CZeroconfClient::NewLC(aObserver);
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+
+CZeroconfClient* CZeroconfClient::NewLC(MPnPObserver* aObserver)
+	{
+	CZeroconfClient* self = new (ELeave) CZeroconfClient(aObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+
+
+void CZeroconfClient::ConnectL()
+	{
+  
+    GetBTName();    
+    TInt openStatus1 = iServicePublish.Open(KPublishTierId);
+    const TUint KTestTierId = 536924288;
+    TInt openStatus = iControlPoint.Open(KTestTierId);
+	//
+	}
+
+CZeroconfClient::~CZeroconfClient()
+	{
+	iServicePublish.Close();
+	iControlPoint.Close();
+	iBTName.Close();
+	REComSession::FinalClose();
+	}
+	
+CZeroconfClient::CZeroconfClient(MPnPObserver* aObserver)
+	{
+	iMdnsObserver = aObserver;
+	}
+	
+void CZeroconfClient::ConstructL()
+	{
+
+	}
+
+void CZeroconfClient::GetBTName()
+    {
+    iBTName.CreateL(KMaxFileName);
+    TInt rand = Math::Random()%100;
+    iBTName.Num(rand);
+    
+    }
+
+void CZeroconfClient::PublishMyService(const TDesC8& aBaseUrl,const TDesC8& aFileList,const TDesC8& aIconName)
+    {
+    RPnPParameterBundle pnpBundle;
+    pnpBundle.Open ();
+        //CleanupClosePushL( pnpBundle );
+    RParameterFamily srvFamily = pnpBundle.CreateFamilyL (EMdnsSrvParamset);
+    RParameterFamily txtFamily = pnpBundle.CreateFamilyL (EMdnsTxtParamset);
+    RParameterFamily ptrFamily = pnpBundle.CreateFamilyL (EMdnsPtrParamset);
+        //Srv Record
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+    CMDnsSrvParamSet* srvParam = CMDnsSrvParamSet::NewL(srvFamily);
+        //CleanupStack::PushL(srvParam);
+    RBuf8 serviceName;
+    serviceName.CreateL(KMaxFileName);
+    serviceName.Append(_L8("DeviceService"));
+    serviceName.Append(iBTName.Collapse());
+    serviceName.Append(_L8("._daap._tcp.local"));
+    srvParam->SetDomainNameL(serviceName);
+    srvParam->SetTargetL(_L8("2IND50001.Local"));
+    srvParam->SetPriority(2);
+    srvParam->SetWeight(100);
+    srvParam->SetPort(80);
+    
+    CMDnsPtrParamSet* ptrParam = CMDnsPtrParamSet::NewL(ptrFamily);
+    ptrParam->SetInstanceNameL(_L8("_daap._tcp.local"));
+    ptrParam->SetDomainNameL(serviceName);
+        //Txt record
+    CMDnsTxtParamSet* txtParam = CMDnsTxtParamSet::NewL(txtFamily);
+    //CleanupStack::PushL(txtParam);
+    txtParam->SetDomainNameL(serviceName);
+    RBuf8 baseUrl,fileUrl,iconUrl;
+   
+    //data3 contains the base ip addr
+    baseUrl.Create(KMaxPath);
+    fileUrl.Create(KMaxFileName);
+    iconUrl.Create(KMaxFileName);
+    
+    //data4 contains the filelist name
+    baseUrl.Append(_L8("BaseUrl = "));
+    baseUrl.Append(aBaseUrl);
+    
+    fileUrl.Append(_L8("FileUrl = "));
+    fileUrl.Append(aFileList);
+    
+    iconUrl.Append(_L8("IconUrl = "));
+    iconUrl.Append(aIconName);
+    
+    txtParam->AppendTxtData(baseUrl);
+    txtParam->AppendTxtData(fileUrl);
+    txtParam->AppendTxtData(iconUrl);
+    
+    iServicePublish.Publish(pnpBundle);
+    pnpBundle.Close();
+    
+    baseUrl.Close();
+    fileUrl.Close();
+    iconUrl.Close();
+    serviceName.Close();
+    }
+
+void CZeroconfClient::PublishNowPlayingServiceL(TDes& aTitleBuf)
+    {
+    TInt openStatus1 = iMusicPublish.Open(KPublishTierId);
+    
+    RPnPParameterBundle pnpBundle;
+    pnpBundle.Open ();
+    CleanupClosePushL( pnpBundle );
+    RParameterFamily srvFamily = pnpBundle.CreateFamilyL (EMdnsSrvParamset);
+    RParameterFamily txtFamily = pnpBundle.CreateFamilyL (EMdnsTxtParamset);
+    //Srv Record
+
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+    
+    CMDnsSrvParamSet* srvParam = CMDnsSrvParamSet::NewL(srvFamily);
+    //CleanupStack::PushL(srvParam);
+    RBuf8 serviceName;
+    serviceName.CreateL(KMaxFileName);
+    serviceName.Append(_L8("MusicService"));
+    serviceName.Append(iBTName.Collapse());
+    serviceName.Append(_L8("._daap._tcp.local"));
+    
+    srvParam->SetDomainNameL(serviceName);
+    srvParam->SetTargetL(_L8("2IND04990.Local"));
+    srvParam->SetPriority(2);
+    srvParam->SetWeight(100);
+    srvParam->SetPort(80);
+    //Txt record
+    RBuf8 data;
+    TUint KMaxLength(255);
+    data.CreateL(_L8("Now playing = "),KMaxLength);
+    data.Append(aTitleBuf.Collapse());  
+    CMDnsTxtParamSet* txtParam = CMDnsTxtParamSet::NewL(txtFamily);
+    //CleanupStack::PushL(txtParam);
+    txtParam->SetDomainNameL(serviceName); 
+    txtParam->AppendTxtData(data);  
+    iServicePublish.Publish(pnpBundle); 
+    data.Close();
+    serviceName.Close();
+    CleanupStack::PopAndDestroy(1);//pnpBundle
+    
+    }     
+
+void CZeroconfClient::UpdateNowPlayingServiceL(TDes& aTitleBuf)
+    {
+    RPnPParameterBundle pnpBundle;
+    pnpBundle.Open ();
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+
+    RParameterFamily srvFamily = pnpBundle.CreateFamilyL (EMdnsSrvParamset);
+    RParameterFamily txtFamily = pnpBundle.CreateFamilyL (EMdnsTxtParamset);
+    //update Publish 
+    //pnpBundle.ClearAllParameters(RParameterFamily::ERequested);
+    RParameterFamily publishFamily = pnpBundle.CreateFamilyL (EMdnsPublishParamset);
+    CMDnsPublishParamSet* publishParam = CMDnsPublishParamSet::NewL(publishFamily);
+    publishParam->SetPublishUpdate(ETrue);
+    CMDnsSrvParamSet* srvParam = CMDnsSrvParamSet::NewL(srvFamily);
+    //CleanupStack::PushL(srvParam);
+    RBuf8 serviceName;
+    serviceName.CreateL(KMaxFileName);
+    serviceName.Append(_L8("MusicService"));
+    serviceName.Append(iBTName.Collapse());
+    serviceName.Append(_L8("._daap._tcp.local"));
+    
+    srvParam->SetDomainNameL(serviceName);
+    srvParam->SetTargetL(_L8("2IND04990.Local"));
+    srvParam->SetPriority(2);
+    srvParam->SetWeight(100);
+    srvParam->SetPort(80);
+    //Txt record
+    RBuf8 data;
+    TUint KMaxLength(255);
+    data.CreateL(_L8("Now playing = "),KMaxLength);
+    data.Append(aTitleBuf.Collapse());   
+    CMDnsTxtParamSet* txtParam = CMDnsTxtParamSet::NewL(txtFamily);
+    //CleanupStack::PushL(txtParam);
+    txtParam->SetDomainNameL(serviceName); 
+    txtParam->AppendTxtData(data);
+    iServicePublish.Publish(pnpBundle); 
+    data.Close();
+    serviceName.Close();
+    pnpBundle.Close();        
+    }
+void CZeroconfClient::PublishCurrentStatusServiceL(const TDesC8& aStatus)
+    {
+    TInt openStatus1 = iStatusPublish.Open(KPublishTierId);
+    RPnPParameterBundle pnpBundle;
+    pnpBundle.Open ();
+    CleanupClosePushL( pnpBundle );
+    RParameterFamily srvFamily = pnpBundle.CreateFamilyL (EMdnsSrvParamset);
+    RParameterFamily txtFamily = pnpBundle.CreateFamilyL (EMdnsTxtParamset);
+    //Srv Record
+
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+    
+    CMDnsSrvParamSet* srvParam = CMDnsSrvParamSet::NewL(srvFamily);
+    //CleanupStack::PushL(srvParam);
+    
+    RBuf8 serviceName;
+    serviceName.CreateL(KMaxFileName);
+    serviceName.Append(_L8("StatusService"));
+    serviceName.Append(iBTName.Collapse());
+    serviceName.Append(_L8("._daap._tcp.local"));
+    
+    srvParam->SetDomainNameL(serviceName);
+    
+    srvParam->SetTargetL(_L8("2IND04990.Local"));
+    srvParam->SetPriority(2);
+    srvParam->SetWeight(100);
+    srvParam->SetPort(80);
+    //Txt record
+    RBuf8 data;
+    TUint KMaxLength(255);
+    data.CreateL(_L8("Status = "),KMaxLength);
+    data.Append(aStatus);  
+    CMDnsTxtParamSet* txtParam = CMDnsTxtParamSet::NewL(txtFamily);
+    //CleanupStack::PushL(txtParam);
+    txtParam->SetDomainNameL(serviceName); 
+    txtParam->AppendTxtData(data);  
+    iServicePublish.Publish(pnpBundle); 
+    data.Close();
+    serviceName.Close();
+    CleanupStack::PopAndDestroy(1);//pnpBundle
+    
+    }     
+
+void CZeroconfClient::UpdateCurrentStatusServiceL(const TDesC8& aStatus)
+    {
+    RPnPParameterBundle pnpBundle;
+    pnpBundle.Open ();
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+
+    RParameterFamily srvFamily = pnpBundle.CreateFamilyL (EMdnsSrvParamset);
+    RParameterFamily txtFamily = pnpBundle.CreateFamilyL (EMdnsTxtParamset);
+    //update Publish 
+    //pnpBundle.ClearAllParameters(RParameterFamily::ERequested);
+    RParameterFamily publishFamily = pnpBundle.CreateFamilyL (EMdnsPublishParamset);
+    CMDnsPublishParamSet* publishParam = CMDnsPublishParamSet::NewL(publishFamily);
+    publishParam->SetPublishUpdate(ETrue);
+    CMDnsSrvParamSet* srvParam = CMDnsSrvParamSet::NewL(srvFamily);
+    //CleanupStack::PushL(srvParam);
+    
+    RBuf8 serviceName;
+    serviceName.CreateL(KMaxFileName);
+    serviceName.Append(_L8("StatusService"));
+    serviceName.Append(iBTName.Collapse());
+    serviceName.Append(_L8("._daap._tcp.local"));
+    
+    srvParam->SetDomainNameL(serviceName);
+    srvParam->SetTargetL(_L8("2IND04990.Local"));
+    srvParam->SetPriority(2);
+    srvParam->SetWeight(100);
+    srvParam->SetPort(80);
+    //Txt record
+    RBuf8 data;
+    TUint KMaxLength(255);
+    data.CreateL(_L8("Status = "),KMaxLength);
+    data.Append(aStatus);   
+    CMDnsTxtParamSet* txtParam = CMDnsTxtParamSet::NewL(txtFamily);
+    //CleanupStack::PushL(txtParam);
+    txtParam->SetDomainNameL(serviceName); 
+    txtParam->AppendTxtData(data);
+    iServicePublish.Publish(pnpBundle); 
+    data.Close();
+    serviceName.Close();
+    pnpBundle.Close();        
+    }
+void CZeroconfClient::PublishService()
+	{
+    RPnPParameterBundle pnpBundle;
+    pnpBundle.Open ();
+    //CleanupClosePushL( pnpBundle );
+    RParameterFamily srvFamily = pnpBundle.CreateFamilyL (EMdnsSrvParamset);
+    RParameterFamily txtFamily = pnpBundle.CreateFamilyL (EMdnsTxtParamset);
+    //Srv Record
+
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+    
+    CMDnsSrvParamSet* srvParam = CMDnsSrvParamSet::NewL(srvFamily);
+    //CleanupStack::PushL(srvParam);
+    srvParam->SetDomainNameL(_L8("xyz._daap._tcp.local"));
+    srvParam->SetTargetL(_L8("2IND04990.Local"));
+    srvParam->SetPriority(2);
+    srvParam->SetWeight(100);
+    srvParam->SetPort(80);
+    //Txt record
+    CMDnsTxtParamSet* txtParam = CMDnsTxtParamSet::NewL(txtFamily);
+    //CleanupStack::PushL(txtParam);
+    txtParam->SetDomainNameL(_L8("xyz._daap._tcp.local")); 
+    RBuf8 data1,data2;
+    data1.Create(_L8("vadan = ct "));
+    data2.Create(_L8("prakash  = sharma "));
+    txtParam->AppendTxtData(data1);
+    txtParam->AppendTxtData(data2);
+    iServicePublish.Publish(pnpBundle);	
+    pnpBundle.Close();
+    data1.Close();
+    data2.Close();
+	}
+	
+void CZeroconfClient::WriteServices()
+	{
+    RPnPParameterBundle pnpBundle;
+    pnpBundle.Open ();
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+    RParameterFamily pnpFamily = pnpBundle.CreateFamilyL (EMdnsRegisterNotifyParamset);
+    CMDnsRegisterNotifyParamSet* registerParam = CMDnsRegisterNotifyParamSet::NewL(pnpFamily);
+    _LIT8(KInstance,"_daap._tcp.local");
+    registerParam->SetInstanceNameL(KInstance);
+    iControlPoint.RegisterNotify(pnpBundle);	
+    pnpBundle.Close();
+	}
+
+void CZeroconfClient::WriteServiceTypes()
+	{
+	
+	_LIT8(KInstance,"");
+    _LIT8(KServiceType,"_daap.");
+    RPnPParameterBundle pnpBundle;
+    
+    pnpBundle.Open ();
+    
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+    RParameterFamily pnpFamily = pnpBundle.CreateFamilyL (EMDnsDiscoverRequestParamSet);
+    CMDnsQueryRequestParamSet* queryParam = CMDnsQueryRequestParamSet::NewL(pnpFamily);
+
+    queryParam->SetInstanceNameL(KInstance);
+    queryParam->SetQueryTypeL(EDnsQType_Any);
+    queryParam->SetProtocol(1);
+    queryParam->SetServiceTypeL(KServiceType);
+    
+    User::After(5000000);
+    iControlPoint.Discover(pnpBundle);
+    pnpBundle.Close();
+	
+	}
+
+void CZeroconfClient::GetService(const TDesC8& aInstanceName,TDnsType aType)
+    {
+    _LIT8(KServiceType,"_daap.");
+    RPnPParameterBundle pnpBundle;
+    
+    pnpBundle.Open ();
+    
+    pnpBundle.SetPnPObserver((MPnPObserver*)iMdnsObserver);
+    RParameterFamily pnpFamily = pnpBundle.CreateFamilyL (EMDnsDiscoverRequestParamSet);
+    CMDnsQueryRequestParamSet* queryParam = CMDnsQueryRequestParamSet::NewL(pnpFamily);
+
+    queryParam->SetInstanceNameL(aInstanceName);
+    queryParam->SetQueryTypeL(aType);
+    queryParam->SetProtocol(1);
+    queryParam->SetServiceTypeL(KServiceType);
+    
+    
+    iControlPoint.Discover(pnpBundle);
+    pnpBundle.Close();
+    }
+
+
+void CZeroconfClient::SearchService()
+	{}
+
+void CZeroconfClient::UnPublishServices()
+    {
+        iServicePublish.Close();
+        iMusicPublish.Close();
+        iStatusPublish.Close();
+    }