zeroconf/server/src/mdnsserversession.cpp
changeset 14 da856f45b798
equal deleted inserted replaced
12:78fbd574edf4 14:da856f45b798
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // mdnsserversession.cpp
       
    15 // 
       
    16 //
       
    17 /**
       
    18 @file
       
    19 @internalTechnology
       
    20 */
       
    21 
       
    22 #include "mdnsserversession.h"
       
    23 #include <s32mem.h>
       
    24 #include <utf.h>
       
    25 #include "mdnsserver.h"
       
    26 #include <mdns/cmdnsserverconstants.h>
       
    27 #include <f32file.h>
       
    28 __FLOG_STMT(_LIT8(KComponent,"MDNSServer");)
       
    29 /*
       
    30  * Two phase constructor.
       
    31  */
       
    32 CMdnsServerSession* CMdnsServerSession::NewL(const CMdnsServer& aServer)
       
    33 	{
       
    34 	CMdnsServerSession* self = CMdnsServerSession::NewLC(aServer);
       
    35 	CleanupStack::Pop(self);
       
    36 	return self;
       
    37 	}
       
    38 
       
    39 
       
    40 /*
       
    41  * Two phase constructor
       
    42  * @param aServer reference to the server.
       
    43  */
       
    44 CMdnsServerSession* CMdnsServerSession::NewLC(const CMdnsServer& aServer)
       
    45 	{
       
    46 	CMdnsServerSession* self = new (ELeave) CMdnsServerSession(aServer);
       
    47 	CleanupStack::PushL(self);
       
    48 	self->ConstructL();
       
    49 	return self;
       
    50 	}
       
    51 
       
    52 /*
       
    53  * @param aMessage RMessage object.
       
    54  */
       
    55 void CMdnsServerSession::ServiceL(const RMessage2& aMessage)
       
    56 	{
       
    57 	__FLOG(_L8("CMdnsServerSession::ServiceL - Entry"));
       
    58 	switch (aMessage.Function())
       
    59 		{
       
    60 	case EZeroconfServerMessageVersion:
       
    61 		break;
       
    62 		
       
    63 	case EMdnsServerQueryMessages:
       
    64 		{
       
    65 		if(NULL != iClientQuery.Handle())
       
    66 			{
       
    67 			aMessage.Complete(KErrInUse);	
       
    68 			}
       
    69 		else if (iServer.IsHostProbing() )
       
    70             {
       
    71             iServer.MessageQueue()->AppendMessageL(EQueryMessage,aMessage,SessionId());
       
    72             }
       
    73 		else	
       
    74 			{
       
    75 			ServiceQueryL(aMessage);
       
    76 			}	
       
    77 		}
       
    78 		break;
       
    79 		
       
    80 	case EMdnsServerRecieveMessages:
       
    81 		{
       
    82 		HBufC8* buffer = HBufC8::NewLC(KDnsBufferlength);
       
    83 		TPtr8 bufferPointer(buffer->Des());
       
    84 		iResponseBundle.Store(bufferPointer);	
       
    85 		aMessage.Write(0,bufferPointer);	
       
    86 		CleanupStack::PopAndDestroy();//delete buffer
       
    87 		aMessage.Complete(KErrNone);
       
    88 		iResponseBundle.Close();
       
    89 		}	
       
    90 		break;
       
    91 	
       
    92 	case EMndsServerPublishMessages:
       
    93 	    {
       
    94 	    if( iServer.IsHostProbing() || iServer.IsPublishingService())
       
    95 	        {
       
    96 	        iServer.MessageQueue()->AppendMessageL(EPublishMessage,aMessage,SessionId());
       
    97 	        }
       
    98 	    else
       
    99 	        {
       
   100 	        iServer.SetPublishingService(ETrue);
       
   101 	        PublishL(aMessage);
       
   102 	        }
       
   103 	    break;
       
   104 	    }
       
   105 	case EMdnsServerStartNotifyMessages:
       
   106 	    {
       
   107 	    RegisterNotifyL(aMessage);
       
   108 	    aMessage.Complete(KErrNone);
       
   109 	    break;
       
   110 	    }
       
   111 	    
       
   112 	case EMdnsServerStopNotifyMessages:
       
   113 	    {
       
   114 	    StopNotifyL(aMessage);
       
   115 	    aMessage.Complete(KErrNone);
       
   116 	    break;
       
   117 	    }
       
   118 	    
       
   119 	case EMdnsServerRecieveNotifyMessages:
       
   120 	    {
       
   121 	    iNotifyMessageRequest = aMessage;
       
   122 	    break;
       
   123 	    }
       
   124 	default:
       
   125 		User::Leave(KErrUnknown);
       
   126 		break;
       
   127 		}
       
   128 	
       
   129 	__FLOG(_L8("CMdnsServerSession::ServiceL - Exit"));
       
   130 	}
       
   131 	
       
   132 void CMdnsServerSession::ServiceError(const RMessage2& aMessage, TInt aError)
       
   133 	{
       
   134 	__FLOG(_L8("CMdnsServerSession::ServiceError - Entry Exit"));
       
   135 	aMessage.Complete(aError);
       
   136 	}
       
   137 
       
   138 
       
   139 
       
   140 void CMdnsServerSession::CleanUp()
       
   141     {
       
   142     __FLOG(_L8("CMdnsServerSession::CleanUp - Entry"));
       
   143     // First thing is to send bye-bye packets to the services that we have published.
       
   144     
       
   145     RPointerArray <CCacheEntry> cacheEntries;
       
   146     iServer.MessageHandler().DnsCache().AuthoritativeEntriesL(cacheEntries);
       
   147     
       
   148     for(TInt index =0; index < cacheEntries.Count();index++)
       
   149         {               
       
   150         CCacheEntry* entry = cacheEntries[index];
       
   151         if(entry->SessionId()==iSessionId)
       
   152             {
       
   153             // To filter out address records.
       
   154             if(entry->ServiceRecord())
       
   155                 {
       
   156                 
       
   157                 // found the entry to be deleted
       
   158                 if(entry->ServiceRecord())
       
   159                     entry->ServiceRecord()->SetTtl(0);
       
   160                 if(entry->TxtRecord())
       
   161                     entry->TxtRecord()->SetTtl(0);
       
   162                 if(entry->PtrRecord())
       
   163                     entry->PtrRecord()->SetTtl(0);
       
   164                 
       
   165                 // delete the entry in the cache
       
   166                 
       
   167                 // !!!!!! Assuming that the entry will always contain a srv record.
       
   168                 iServer.MessageHandler().DnsCache().DeleteEntryL(entry->ServiceRecord()->Name());
       
   169                 
       
   170                 CDnsMessage* message = CDnsMessage::NewL(0,EFalse);
       
   171                 CleanupStack::PushL(message);    
       
   172                 
       
   173                 TDnsHeader header(message->Header());
       
   174                 header.SetAuthoritative(ETrue);
       
   175                 message->SetHeader(header);
       
   176                 
       
   177                 if(entry->ServiceRecord())
       
   178                 message->AppendAnswerL(entry->ServiceRecord()->CloneL());
       
   179                 if(entry->PtrRecord())
       
   180                 message->AppendAnswerL(entry->PtrRecord()->CloneL());
       
   181                 if(entry->TxtRecord())
       
   182                 message->AppendAnswerL(entry->TxtRecord()->CloneL());
       
   183     
       
   184                 // bye-bye packet on the way to the network !!!
       
   185                 iServer.MessageHandler().SendQueryL(message,iServer);
       
   186                 CleanupStack::Pop(); //message   
       
   187                 }
       
   188             
       
   189             }
       
   190         }       
       
   191     
       
   192     
       
   193     cacheEntries.ResetAndDestroy();
       
   194     cacheEntries.Close();   
       
   195     __FLOG(_L8("CMdnsServerSession::CleanUp - Exit"));
       
   196     }
       
   197 /*
       
   198  * Destructor
       
   199  */
       
   200 CMdnsServerSession::~CMdnsServerSession()
       
   201 	{
       
   202 	__FLOG(_L8("CMdnsServerSession::~CMdnsServerSession - Entry"));
       
   203 	CleanUp();
       
   204 	iQueryBundle.Close();
       
   205 	iResponseBundle.Close();
       
   206 	iServer.DropSession();
       
   207 	for(TInt i =0 ; i<iRegisterNotifyArray.Count();i++ )
       
   208 	    {
       
   209 	    iRegisterNotifyArray[i].Close();
       
   210 	    }
       
   211 	iRegisterNotifyArray.Close();
       
   212 	__FLOG(_L8("CMdnsServerSession::~CMdnsServerSession - Exit"));
       
   213 	__FLOG_CLOSE;
       
   214 	}
       
   215 /*
       
   216  * Constructor
       
   217  */
       
   218 CMdnsServerSession::CMdnsServerSession(const CMdnsServer& aServer)
       
   219 	: iServer(const_cast<CMdnsServer&>(aServer))
       
   220 	{
       
   221 	iSessionId = iServer.NewSession();
       
   222 	}
       
   223 	
       
   224 /*
       
   225  * Two phase constructor
       
   226  */
       
   227 void CMdnsServerSession::ConstructL()
       
   228 	{
       
   229 	__FLOG_OPEN(KMDNSSubsystem, KComponent);
       
   230 	}
       
   231 
       
   232 //TODO
       
   233 TInt CMdnsServerSession::CountResources()
       
   234 	{
       
   235 	return 3;
       
   236 	}
       
   237 
       
   238 void CMdnsServerSession::ServerVersionL(const RMessage2& aMessage)
       
   239 	{
       
   240 	__FLOG(_L8("CMdnsServerSession::ServerVersionL - Entry"));
       
   241 	TVersion mdnsServerVersion(0, 8, 0);
       
   242 	TPckgC<TVersion> pkg(mdnsServerVersion);
       
   243 	aMessage.WriteL(0, pkg);
       
   244 	aMessage.Complete(KErrNone);
       
   245 	__FLOG(_L8("CMdnsServerSession::ServerVersionL - Exit"));
       
   246 
       
   247 	}
       
   248 /*
       
   249  * Service any query rom the client
       
   250  */
       
   251 void CMdnsServerSession::ServiceQueryL(const RMessage2& aMessage)
       
   252 	{
       
   253 	__FLOG(_L8("CMdnsServerSession::ServiceQueryL - Entry"));
       
   254 	iQueryBundle.Close();
       
   255 	iClientQuery = aMessage;
       
   256 	TInt len = aMessage.GetDesLengthL(0);
       
   257 	HBufC8* query = HBufC8::NewLC(aMessage.GetDesLengthL(0));
       
   258 	TPtr8 loadPtr = query->Des();
       
   259 	aMessage.ReadL(0,loadPtr);
       
   260 	iQueryBundle.CreateL();
       
   261 	TInt retOnLoad = iQueryBundle.Load(loadPtr);
       
   262 	User::LeaveIfError(retOnLoad);
       
   263 	RParameterFamily pnpFamily = iQueryBundle.GetFamilyAtIndex(0);
       
   264 	TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   265 	CDnsMessage* message = CDnsMessage::NewL(0,ETrue );
       
   266 	CleanupStack::PushL(message);
       
   267 	for ( TInt paramIndex = count - 1; paramIndex >= 0; paramIndex-- )
       
   268 		{ 
       
   269 		CMDnsQueryRequestParamSet* queryParam = static_cast<CMDnsQueryRequestParamSet*> (pnpFamily.GetParameterSetAtIndex ( paramIndex, RParameterFamily::ERequested ));
       
   270 		HBufC8* name = HBufC8::NewL(256);
       
   271 		CleanupStack::PushL(name);
       
   272 		TPtr8 ptrName(name->Des());
       
   273 		ptrName.Append(queryParam->InstanceName());
       
   274 		if(queryParam->InstanceName().Length() > 0)
       
   275 			{
       
   276 			ptrName.Append(_L8("."));	
       
   277 			}
       
   278 		ptrName.Append(queryParam->ServiceType());
       
   279 		if(queryParam->QueryType() != EDnsType_A)
       
   280 			{
       
   281 			ptrName.Append(1 == queryParam->Protocol() ? KTcpProtocolType : KUdpProtocolType);	
       
   282 			}
       
   283 		ptrName.Append(KLocalTld);
       
   284 		ptrName.Append(_L8("."));
       
   285 		CDnsQuestion* question = CDnsQuestion::NewL();
       
   286 		CleanupStack::PushL(question);
       
   287 		question->SetNameL(ptrName);
       
   288 		question->SetClass(EDnsClass_IN);
       
   289 		question->SetType(queryParam->QueryType());
       
   290 		question->SetUnicast(EFalse);
       
   291 		message->AppendQueryL(question);
       
   292 		CleanupStack::Pop();
       
   293 		CleanupStack::PopAndDestroy();//name
       
   294 		}
       
   295 	iServer.MessageHandler().ServiceClientQueryL(message,aMessage.Handle());	
       
   296 	CleanupStack::Pop();//message
       
   297 	CleanupStack::PopAndDestroy();//query
       
   298 	__FLOG(_L8("CMdnsServerSession::ServiceQueryL - Exit"));
       
   299 	}
       
   300 
       
   301 TInt CMdnsServerSession::OutStandQueryClientHandle()const
       
   302 	{
       
   303 	return iClientQuery.Handle();	
       
   304 	}
       
   305 	
       
   306 void CMdnsServerSession::SendResponseL()
       
   307 	{
       
   308 	__FLOG(_L8("CMdnsServerSession::SendResponseL - Entry"));
       
   309 	RParameterFamily pnpFamily = iQueryBundle.GetFamilyAtIndex(0);
       
   310 	TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   311 	//Open a new reference to ResponseBundle 
       
   312 	iResponseBundle.Open ();
       
   313 	CleanupClosePushL( iResponseBundle );
       
   314 	for(TInt index =0 ;index <count ; index++)
       
   315 		{
       
   316 		CMDnsQueryRequestParamSet* queryParam = static_cast<CMDnsQueryRequestParamSet*> (pnpFamily.GetParameterSetAtIndex ( index, RParameterFamily::ERequested ));
       
   317 		HBufC8* name = HBufC8::NewL(KDnsBufferlength);
       
   318 		CleanupStack::PushL(name);
       
   319 		TPtr8 ptrName(name->Des());
       
   320 		ptrName.Append(queryParam->InstanceName());
       
   321 		if(queryParam->InstanceName().Size()>0)
       
   322 		    ptrName.Append(_L8("."));
       
   323 		ptrName.Append(queryParam->ServiceType());
       
   324 		if(queryParam->QueryType() != EDnsType_A)
       
   325 			{
       
   326 			ptrName.Append(1 == queryParam->Protocol() ? KTcpProtocolType : KUdpProtocolType);	
       
   327 			}
       
   328 		ptrName.Append(KLocalTld);
       
   329 		ptrName.Append(_L8("."));	
       
   330 		RPointerArray<CCacheEntry> records;
       
   331 		iServer.MessageHandler().DnsCache().FindServiceL(records,ptrName,(TDnsType)queryParam->QueryType());
       
   332 		TInt count = records.Count();
       
   333 		switch((TDnsType)queryParam->QueryType())	
       
   334 			{
       
   335 				case EDnsType_PTR:
       
   336 					{
       
   337 					RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsPtrParamset);
       
   338 					while(count -- > 0 )
       
   339 						{
       
   340 						iResponseBundle.SetPnPObserver((MPnPObserver*)NULL);
       
   341 						CMDnsPtrParamSet* responseParam = CMDnsPtrParamSet::NewL(pnpFamily);
       
   342 						responseParam->SetInstanceNameL(records[count]->PtrRecord()->Name());
       
   343 						responseParam->SetDomainNameL(records[count]->PtrRecord()->DomainName());
       
   344 						//responseParam->SetTtlL(records[count]->PtrRecord()->Ttl());
       
   345 						}
       
   346 					break;
       
   347 					}
       
   348 				case EDnsType_SRV:
       
   349 					{
       
   350 					RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsSrvParamset);
       
   351 					while(count -- > 0 )
       
   352 						{
       
   353 						iResponseBundle.SetPnPObserver((MPnPObserver*)NULL);
       
   354 						CMDnsSrvParamSet* responseParam = CMDnsSrvParamSet::NewL(pnpFamily);
       
   355 						responseParam->SetDomainNameL(records[count]->ServiceRecord()->Name());
       
   356 						responseParam->SetTargetL(records[count]->ServiceRecord()->Target());
       
   357 						responseParam->SetPriority(records[count]->ServiceRecord()->Priority());
       
   358 						responseParam->SetWeight(records[count]->ServiceRecord()->Weight());
       
   359 						responseParam->SetPort(records[count]->ServiceRecord()->Port());	
       
   360 						}
       
   361 					break;	
       
   362 					}
       
   363 				case EDnsType_TXT:
       
   364 					{
       
   365 					RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsTxtParamset);
       
   366 					while(count -- > 0 )
       
   367 						{
       
   368 						iResponseBundle.SetPnPObserver((MPnPObserver*)NULL);
       
   369 						CMDnsTxtParamSet* responseParam = CMDnsTxtParamSet::NewL(pnpFamily);
       
   370 						responseParam->SetDomainNameL(records[count]->TxtRecord()->Name());
       
   371 						RArray<RBuf8> txtData = records[count]->TxtRecord()->Text();
       
   372 						
       
   373 						for(TInt j=0;j<txtData.Count();j++)
       
   374 						    {
       
   375 						    responseParam->AppendTxtData(txtData[j]);
       
   376 						    }
       
   377 						}
       
   378 					break;
       
   379 					}
       
   380 				case EDnsType_A:
       
   381 					{
       
   382 					RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsAddrParamset);
       
   383 					while(count -- > 0 )
       
   384 						{
       
   385 						iResponseBundle.SetPnPObserver((MPnPObserver*)NULL);
       
   386 						CMDnsAddrParamSet* responseParam = CMDnsAddrParamSet::NewL(pnpFamily);
       
   387 						responseParam->SetDomainNameL(records[count]->AddressRecord()->Name());	
       
   388 						responseParam->SetAddress(records[count]->AddressRecord()->Address());
       
   389 						}
       
   390 					break;
       
   391 					}
       
   392 				case EDnsQType_Any:
       
   393 				    {
       
   394 				    iResponseBundle.SetPnPObserver((MPnPObserver*)NULL);
       
   395                     while(count -- > 0 )
       
   396                          {
       
   397                          CreateAnyQueryResponseL(*records[count]);
       
   398                          }
       
   399 				    break;
       
   400 				    }
       
   401 					
       
   402 			}
       
   403 		records.ResetAndDestroy();
       
   404 		records.Close();	
       
   405 		CleanupStack::PopAndDestroy();//name	
       
   406 		}//end of for loop
       
   407 		
       
   408 		HBufC8* buffer = HBufC8::NewLC(KDnsBufferlength);	
       
   409 		TPtr8 bufferPointer(buffer->Des());
       
   410 		iResponseBundle.Store(bufferPointer);
       
   411 		TInt len = bufferPointer.Length();
       
   412 		TPckgC<TInt> lenbuf(len); 
       
   413 		iClientQuery.Write(1,lenbuf);
       
   414 		CleanupStack::PopAndDestroy();//buffer
       
   415 		iClientQuery.Complete(KErrNone);
       
   416 		CleanupStack::Pop();//iResponseBundle
       
   417 		__FLOG(_L8("CMdnsServerSession::SendResponseL - Exit"));	
       
   418 	}
       
   419 
       
   420 void CMdnsServerSession::PublishL(const RMessage2& aMessage)
       
   421     {
       
   422     __FLOG(_L8("CMdnsServerSession::PublishL - Entry"));
       
   423     TBool isUpdate = aMessage.Int2();
       
   424     iPublishRequest = aMessage;
       
   425     TInt len = aMessage.GetDesLengthL(0);
       
   426     HBufC8* query = HBufC8::NewLC(aMessage.GetDesLengthL(0));
       
   427     TPtr8 loadPtr = query->Des();
       
   428     aMessage.ReadL(0,loadPtr);
       
   429     iPublishBundle.CreateL();
       
   430     TInt retOnLoad = iPublishBundle.Load(loadPtr);
       
   431     TInt familyCount = iPublishBundle.CountParameterFamilies();
       
   432     RPointerArray<CDnsResourceData> publishRecordArray;
       
   433     for(TInt i =0 ; i< familyCount; i++)
       
   434         {
       
   435         RParameterFamily pnpFamily = iPublishBundle.GetFamilyAtIndex(i);
       
   436         switch (pnpFamily.Id())
       
   437             {
       
   438             case EMdnsSrvParamset:
       
   439                 {
       
   440                 TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   441                 for (TInt index= 0; index < count ; index++ )
       
   442                     {
       
   443                     CMDnsSrvParamSet* srvParamSet = static_cast<CMDnsSrvParamSet*> (pnpFamily.GetParameterSetAtIndex ( index, RParameterFamily::ERequested ));
       
   444                     CRdTypeSrv* srvRecord = CRdTypeSrv::NewL();
       
   445                     CleanupStack::PushL(srvRecord);
       
   446                     srvRecord->SetNameL(srvParamSet->DomainName());
       
   447                     srvRecord->SetClass(EDnsClass_IN);
       
   448                     srvRecord->SetFlushBit(EFalse);
       
   449                     srvRecord->SetPort(srvParamSet->Port()); 
       
   450                     srvRecord->SetPriority(srvParamSet->Priority() );
       
   451                     srvRecord->SetTargetL(iServer.HostName());
       
   452                     srvRecord->SetTtl(120);
       
   453                     srvRecord->SetType(EDnsType_SRV);
       
   454                     srvRecord->SetWeight(srvParamSet->Weight());
       
   455                     publishRecordArray.AppendL(srvRecord);
       
   456                     CleanupStack::Pop();//CRdtypeSrv
       
   457                     //Ptr Record
       
   458                     /*
       
   459                     CRdTypePtr* ptrRecord = CRdTypePtr::NewL();
       
   460                     CleanupStack::PushL(ptrRecord);
       
   461                     TInt pos = srvParamSet->DomainName().Locate('.');
       
   462                     ptrRecord->SetNameL(srvParamSet->DomainName().Mid(pos+1));
       
   463                     ptrRecord->SetClass(EDnsClass_IN);
       
   464                     ptrRecord->SetFlushBit(EFalse);
       
   465                     ptrRecord->SetTtl(120);
       
   466                     ptrRecord->SetType(EDnsType_PTR);
       
   467                     ptrRecord->SetDomainNameL(srvParamSet->DomainName());
       
   468                     publishRecordArray.AppendL(ptrRecord);
       
   469                     CleanupStack::Pop();
       
   470                     */
       
   471                     }
       
   472                 break;
       
   473                 }
       
   474             case EMdnsPtrParamset:
       
   475                 {
       
   476                 //do nothing
       
   477                 TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   478                 for (TInt index= 0; index < count ; index++ )
       
   479                      {
       
   480                      CMDnsPtrParamSet* ptrParamSet = static_cast<CMDnsPtrParamSet*>(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested ));
       
   481                      CRdTypePtr* ptrRecord = CRdTypePtr::NewL();
       
   482                      CleanupStack::PushL(ptrRecord);
       
   483                      ptrRecord->SetNameL(ptrParamSet->InstanceName());
       
   484                      ptrRecord->SetClass(EDnsClass_IN);
       
   485                      ptrRecord->SetFlushBit(EFalse);
       
   486                      ptrRecord->SetTtl(120);
       
   487                      ptrRecord->SetType(EDnsType_PTR);
       
   488                      ptrRecord->SetDomainNameL(ptrParamSet->DomainName());
       
   489                      publishRecordArray.AppendL(ptrRecord);
       
   490                      CleanupStack::Pop();//Remove Ptr Record from the queue..
       
   491                      }
       
   492                 break;
       
   493                 }
       
   494             case EMdnsAddrParamset:
       
   495                 {
       
   496                 TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   497                 for (TInt index= 0; index < count ; index++ )
       
   498                      {
       
   499                      CMDnsAddrParamSet* addrParamSet = static_cast<CMDnsAddrParamSet*>(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested ));
       
   500                      CRdTypeA* addrRecord = CRdTypeA::NewL();
       
   501                      CleanupStack::PushL(addrRecord);
       
   502                      addrRecord->SetAddr(addrParamSet->Address());
       
   503                      addrRecord->SetNameL(addrParamSet->DomainName());
       
   504                      addrRecord->SetClass(EDnsClass_IN);
       
   505                      addrRecord->SetFlushBit(EFalse);
       
   506                      addrRecord->SetTtl(120);
       
   507                      addrRecord->SetType(EDnsType_A);
       
   508                      publishRecordArray.AppendL(addrRecord);
       
   509                      CleanupStack::Pop();//remove addrecord from the queue
       
   510                      }
       
   511                 break;
       
   512                 }
       
   513             case EMdnsTxtParamset:
       
   514                 {
       
   515                 TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   516                 for (TInt index= 0; index < count ; index++ )
       
   517                      {
       
   518                      CMDnsTxtParamSet* txtParamSet = static_cast<CMDnsTxtParamSet*>(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested ));
       
   519                      CRdTypeTxt* txtRecord = CRdTypeTxt::NewL();
       
   520                      CleanupStack::PushL(txtRecord);
       
   521                      txtRecord->SetNameL(txtParamSet->DomainName());
       
   522                      txtRecord->SetClass(EDnsClass_IN);
       
   523                      txtRecord->SetFlushBit(EFalse);
       
   524                      txtRecord->SetTtl(120);
       
   525                      txtRecord->SetType(EDnsType_TXT);
       
   526                      RArray<RBuf8> txtArray ;
       
   527                      txtParamSet->TxtDataL(txtArray);
       
   528                      TInt txtCnt = txtArray.Count();
       
   529                      for(TInt count = 0; count < txtCnt ; count ++ )
       
   530                          {
       
   531                          txtRecord->AppendTextDataL(txtArray[count]);
       
   532                          }
       
   533                      txtArray.Close();
       
   534                      publishRecordArray.AppendL(txtRecord);
       
   535                      CleanupStack::Pop();//remove txtRecord from the queue..
       
   536                      }
       
   537                 break;
       
   538                 }
       
   539             }
       
   540         
       
   541         }
       
   542     TRAPD(publishError ,iServer.MessageHandler().AdvertizePacketL(publishRecordArray,iSessionId , isUpdate));
       
   543     if(publishError == KErrNotFound)
       
   544         {
       
   545         aMessage.Complete(KErrNotFound);
       
   546         }
       
   547     publishRecordArray.Close();
       
   548     iPublishBundle.Close();
       
   549     CleanupStack::PopAndDestroy(query);
       
   550     __FLOG(_L8("CMdnsServerSession::PublishL - Exit"));
       
   551     }
       
   552     
       
   553 void CMdnsServerSession::HandleServiceNameConflictL(const RBuf8& aName,TInt aError)
       
   554     {
       
   555     __FLOG(_L8("CMdnsServerSession::HandleServiceNameConflictL - Entry"));
       
   556     iResponseBundle.Open ();
       
   557     CleanupClosePushL( iResponseBundle );
       
   558     
       
   559     RParameterFamily pnpFamily = iResponseBundle.CreateFamilyL (EMdnsPublishResponseParamset);
       
   560     iResponseBundle.SetPnPObserver((MPnPObserver*)NULL);
       
   561     
       
   562     CMDnsPublishResponseParamSet* responseParam = CMDnsPublishResponseParamSet::NewL(pnpFamily);
       
   563     responseParam->SetDomainNameL(aName);
       
   564     responseParam->SetError(aError);
       
   565 
       
   566     
       
   567     TInt len = iResponseBundle.Length();
       
   568     TPckgC<TInt> lenbuf(len); 
       
   569     iPublishRequest.Write(1,lenbuf);
       
   570     
       
   571     iPublishRequest.Complete(KErrNone);
       
   572     CleanupStack::Pop();//iResponseBundle
       
   573     __FLOG(_L8("CMdnsServerSession::HandleServiceNameConflictL - Exit"));
       
   574     }
       
   575    
       
   576 void CMdnsServerSession::RegisterNotifyL(const RMessage2& aMessage)
       
   577     {
       
   578     __FLOG(_L8("CMdnsServerSession::RegisterNotifyL - Entry"));
       
   579     iIsNotifyRequested = ETrue;
       
   580     RPnPParameterBundle registerBundle;
       
   581     TInt size = aMessage.GetDesLength(0);
       
   582     HBufC8* registerbuf = HBufC8::NewLC(aMessage.GetDesLengthL(0));
       
   583     TPtr8 loadPtr = registerbuf->Des();
       
   584     aMessage.ReadL(0,loadPtr);
       
   585     registerBundle.CreateL();
       
   586     registerBundle.Load(loadPtr);
       
   587     RParameterFamily pnpFamily = registerBundle.GetFamilyAtIndex(0);
       
   588     TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   589     for(TInt index =0 ; index<count ; index++)
       
   590         {
       
   591         CMDnsRegisterNotifyParamSet* registerParamSet = static_cast<CMDnsRegisterNotifyParamSet*>(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested ));
       
   592         RBuf8 instanceName;
       
   593         instanceName.CreateL(registerParamSet->InstanceName());
       
   594         iRegisterNotifyArray.AppendL(instanceName);
       
   595         }
       
   596     registerBundle.Close();
       
   597     CleanupStack::PopAndDestroy();//registerbuffer
       
   598     __FLOG(_L8("CMdnsServerSession::RegisterNotifyL - Exit"));
       
   599     }
       
   600 
       
   601 void CMdnsServerSession::StopNotifyL(const RMessage2& aMessage)
       
   602     {
       
   603     __FLOG(_L8("CMdnsServerSession::StopNotifyL - Entry"));
       
   604     RPnPParameterBundle registerBundle;
       
   605     TInt size = aMessage.GetDesLength(0);
       
   606     HBufC8* registerbuf = HBufC8::NewLC(aMessage.GetDesLengthL(0));
       
   607     TPtr8 loadPtr = registerbuf->Des();
       
   608     aMessage.ReadL(0,loadPtr);
       
   609     registerBundle.CreateL();
       
   610     registerBundle.Load(loadPtr);
       
   611     RParameterFamily pnpFamily = registerBundle.GetFamilyAtIndex(0);
       
   612     TUint count = pnpFamily.CountParameterSets ( RParameterFamily::ERequested ) ;
       
   613     for(TInt index =0 ; index< count; index++)
       
   614         {
       
   615         CMDnsRegisterNotifyParamSet* registerParamSet = static_cast<CMDnsRegisterNotifyParamSet*>(pnpFamily.GetParameterSetAtIndex( index, RParameterFamily::ERequested ));
       
   616         RBuf8 instanceName;
       
   617         instanceName.CreateL(registerParamSet->InstanceName());
       
   618         for(TInt i =0 ; i< iRegisterNotifyArray.Count();i++)
       
   619                 {
       
   620                 if(instanceName.Compare(iRegisterNotifyArray[i]) == 0)
       
   621                     {
       
   622                     RBuf8& temp = iRegisterNotifyArray[i];
       
   623                     iRegisterNotifyArray.Remove(i);
       
   624                     temp.Close();
       
   625                     }
       
   626                 }
       
   627         instanceName.Close();
       
   628         }
       
   629     if(iRegisterNotifyArray.Count() == 0 )
       
   630         {
       
   631         iIsNotifyRequested =EFalse;
       
   632         }
       
   633     registerBundle.Close();
       
   634     CleanupStack::PopAndDestroy();//registerbuffer
       
   635     __FLOG(_L8("CMdnsServerSession::StopNotifyL - Exit"));
       
   636     }
       
   637 
       
   638 TInt CMdnsServerSession::SessionId()
       
   639     {
       
   640     __FLOG(_L8("CMdnsServerSession::SessionId - Exit"));
       
   641     return iSessionId;
       
   642     }
       
   643 void CMdnsServerSession::NewServiceL(const RArray<RBuf8>& aName)
       
   644     {
       
   645     __FLOG(_L8("CMdnsServerSession::NewServiceL - Entry"));
       
   646     if(iIsNotifyRequested && iNotifyMessageRequest.Handle())
       
   647         {
       
   648         RPnPParameterBundle publishBundle;
       
   649         publishBundle.CreateL();
       
   650         RParameterFamily pnpFamily = publishBundle.CreateFamilyL (EMdnsPtrParamset);
       
   651         publishBundle.SetPnPObserver((MPnPObserver*)NULL);
       
   652         for(TInt i =0 ; i < aName.Count();i++)
       
   653             {
       
   654             for(TInt j= 0 ; j< iRegisterNotifyArray.Count(); j++)
       
   655                 {
       
   656                 TInt pos = aName[i].Find(iRegisterNotifyArray[j]);
       
   657                 if(pos != KErrNotFound)
       
   658                     {
       
   659                     CMDnsPtrParamSet* responseParam = CMDnsPtrParamSet::NewL(pnpFamily);
       
   660                     responseParam->SetInstanceNameL(iRegisterNotifyArray[j]);
       
   661                     responseParam->SetDomainNameL(aName[i]); 
       
   662                     // have to fill up the ttl field, query the cache
       
   663                     RPointerArray <CCacheEntry>  aEntries;
       
   664                     iServer.MessageHandler().DnsCache().FindServiceL(aEntries,aName[i],EDnsType_SRV);
       
   665                     responseParam->SetTtlL(0);
       
   666                     if(aEntries.Count()==0)
       
   667                         {
       
   668                         // already deleted from cache
       
   669                         responseParam->SetTtlL(0);
       
   670                         }
       
   671                     else if(aEntries[0]->PtrRecord()!=NULL)
       
   672                         {
       
   673                         responseParam->SetTtlL(aEntries[0]->PtrRecord()->Ttl());
       
   674                         }
       
   675                     aEntries.ResetAndDestroy();
       
   676                     aEntries.Close();    
       
   677                     break;
       
   678                     }
       
   679                 }
       
   680             }
       
   681         HBufC8* buffer = HBufC8::NewLC(KDnsBufferlength);   
       
   682         TPtr8 bufferPointer(buffer->Des());
       
   683         publishBundle.Store(bufferPointer);
       
   684         iNotifyMessageRequest.Write(0,bufferPointer);
       
   685         iNotifyMessageRequest.Complete(KErrNone);
       
   686         CleanupStack::PopAndDestroy(buffer);//buffer
       
   687         publishBundle.Close();
       
   688         }
       
   689     __FLOG(_L8("CMdnsServerSession::NewServiceL - Exit"));
       
   690     }
       
   691 
       
   692 
       
   693 void CMdnsServerSession::CreateAnyQueryResponseL(CCacheEntry& aEntry)
       
   694     {
       
   695     RParameterFamily ptrFamily = iResponseBundle.CreateFamilyL (EMdnsPtrParamset);
       
   696     RParameterFamily srvFamily = iResponseBundle.CreateFamilyL (EMdnsSrvParamset);
       
   697     RParameterFamily txtFamily = iResponseBundle.CreateFamilyL (EMdnsTxtParamset);
       
   698     RParameterFamily AFamily = iResponseBundle.CreateFamilyL (EMdnsAddrParamset);
       
   699     if(aEntry.AddressRecord()!= NULL)
       
   700         {
       
   701         CMDnsAddrParamSet* responseParam = CMDnsAddrParamSet::NewL(AFamily);
       
   702         responseParam->SetDomainNameL(aEntry.AddressRecord()->Name()); 
       
   703         responseParam->SetAddress(aEntry.AddressRecord()->Address());
       
   704         }
       
   705     if(aEntry.ServiceRecord()!= NULL)
       
   706         {
       
   707         CMDnsSrvParamSet* responseParam = CMDnsSrvParamSet::NewL(srvFamily);
       
   708         responseParam->SetDomainNameL(aEntry.ServiceRecord()->Name());
       
   709         responseParam->SetTargetL(aEntry.ServiceRecord()->Target());
       
   710         responseParam->SetPriority(aEntry.ServiceRecord()->Priority());
       
   711         responseParam->SetWeight(aEntry.ServiceRecord()->Weight());
       
   712         responseParam->SetPort(aEntry.ServiceRecord()->Port());
       
   713         }
       
   714     if(aEntry.PtrRecord()!= NULL)
       
   715         {
       
   716         CMDnsPtrParamSet* responseParam = CMDnsPtrParamSet::NewL(ptrFamily);
       
   717         responseParam->SetInstanceNameL(aEntry.PtrRecord()->Name());
       
   718         responseParam->SetDomainNameL(aEntry.PtrRecord()->DomainName());
       
   719         //responseParam->SetTtlL(aEntry.PtrRecord()->Ttl());
       
   720         }
       
   721     if(aEntry.TxtRecord()!= NULL)
       
   722         {
       
   723         CMDnsTxtParamSet* responseParam = CMDnsTxtParamSet::NewL(txtFamily);
       
   724         responseParam->SetDomainNameL(aEntry.TxtRecord()->Name());
       
   725         RArray<RBuf8> txtData = aEntry.TxtRecord()->Text();
       
   726         for(TInt txtCount = 0 ;txtCount < txtData.Count();txtCount++)
       
   727             {
       
   728             responseParam->AppendTxtData(txtData[txtCount]);
       
   729             }
       
   730         }
       
   731     
       
   732     }