コード例 #1
0
void VHTMLSyntax::SwapComment( ICodeEditorDocument* inDocument, VString& ioString, bool inComment )
{
	if ( inComment )
	{
		ioString.Insert( CVSTR( "<!--" ), 1 );
		ioString += CVSTR( "-->" );
	}
	else
	{
		if ( ioString.BeginsWith( CVSTR( "<!--" ) ) )
			ioString.Remove( 1, 4 );

		if ( ioString.EndsWith( CVSTR( "-->" ) ) )
			ioString.Truncate( ioString.GetLength() - 3 );
	}
}
コード例 #2
0
void VSpanHandler::SetFontSize(const VString& inValue, float inDPI)
{
	Real size = 0;
	VTextStyle* TheStyle = fStyles->GetData();
	if(!TheStyle)
		return;
	if(inValue.EndsWith("pt", true))
	{
		VString textsize = inValue;
		textsize.Truncate( inValue.GetLength()-2);
		size = textsize.GetReal();
		//we need convert from format dpi to 72 dpi
#if VERSIONWIN
		TheStyle->SetFontSize(floor(size*(inDPI ? inDPI : VSpanTextParser::Get()->GetDPI())/72.0f+0.5f));
#else
		TheStyle->SetFontSize(size);
#endif
	}
}
コード例 #3
0
bool VFolder::Contains( const XBOX::VString& inExtension) const
{
	bool found = false;

	VArrayString* files = GetContents(FF_NO_FOLDERS);
	if (files)
	{
		VString name;
		for (sLONG i = 1; i <= files->GetCount(); ++i)
		{
			files->GetString(name, i);
			if (name.EndsWith(inExtension))
			{
				found = true;
				break;
			}

		}
		delete files;
	}
	
	return found;
}
コード例 #4
0
VError VServiceDiscoveryServer::_HandlePacket (VUDPEndPoint *inEndPoint, uBYTE *inPacket, uLONG inPacketSize, uLONG inBufferSize)
{
	xbox_assert(inEndPoint != NULL);
	xbox_assert(inPacket != NULL);
		
	uLONG									numberQuestions, size, i, offset;
	VError									error;
	const uBYTE								*p;
	VString									vString;
	std::list<VServiceRecord>::iterator		j;
	std::map<VString, bool>					queriedServices, queriedAddresses;
	std::map<VString, bool>::iterator		k;		
		
	if (inPacketSize < 12) 
		
		return VE_SRVR_BONJOUR_MALFORMED_PACKET;
	
	if ((inPacket[2] & 0x80)
	|| (inPacket[3] & 0x0f)
	|| !(numberQuestions = Bonjour::Read2Bytes(&inPacket[4])))
		
		return VE_OK;
	
	p = &inPacket[12];
	for (i = 0; i < numberQuestions; i++) {
		
		uWORD	questionType, questionClass;
		
		size = inPacketSize;
		if ((error = Bonjour::ParseDNSName(inPacket, &size, p - inPacket, &vString)) != VE_OK) 

			return error;

		p += size;	
		questionType = Bonjour::Read2Bytes(p);
		questionClass = Bonjour::Read2Bytes(p + 2);		
		p += 4;
		
		if (questionClass != 1)
			
			continue;
		
		if (questionType == Bonjour::kTypePTR) {

			if (vString.EndsWith(".local", true)) {
			
				vString.Truncate(vString.GetLength() - 6);
				
				for (j = fServiceRecords.begin(); j != fServiceRecords.end(); j++)

					if (j->fServiceName.EqualToString(vString, true)) {

						queriedServices[vString] = true;
						break;

					} else if (vString.EqualToString("_services._dns-sd._udp", true)) {
						
						queriedServices[vString] = true;
						break;
				
					}
				
			}
			
		} else if (questionType == Bonjour::kTypeA) 
			
			queriedAddresses[vString] = true;

		// Ignore all other types of queries.

	}	
	
	error = VE_OK;
	offset = p - inPacket;
	for (k = queriedServices.begin(); k != queriedServices.end(); k++) 

		if (k->first.EqualToString("_services._dns-sd._udp", true))

			error = _SendServiceList(inEndPoint, inPacket, inBufferSize, offset);

		else
		
			error = _AnswerQuery(inEndPoint, inPacket, inBufferSize, offset, k->first);

	// Note that a hostname can have several network address(es).

	for (k = queriedAddresses.begin(); k != queriedAddresses.end(); k++) 
		
		for (j = fServiceRecords.begin(); j != fServiceRecords.end(); j++)
		
			if (j->fHostName.EqualToString(k->first, false)) 
				
				error = _SendAddressAnswer(inEndPoint, inPacket, inBufferSize, offset, *j);

	return error;
}
コード例 #5
0
VError VServiceDiscoveryClient::_ParsePacket (const uBYTE *inPacket, uLONG inPacketSize, 
													std::vector<VServiceRecord> *outServiceRecord, 
													const std::vector<VString> &inServiceNames,
													sLONG inIdentifier)
{
	xbox_assert(inPacket != NULL && outServiceRecord != NULL);
	
	VError			error;
	uLONG			numberQuestions, numberResourceRecords, size;
	const uBYTE		*p, *q;
	VString			vString;
	
	if (inPacketSize < 12)
	
		return VE_SRVR_BONJOUR_MALFORMED_PACKET;
			
	if (inPacket[3] & 0x0f)
		
		return VE_OK;		// Ignore.
	
	// If identifier isn't used, allow service detection from any "captured" packets.
	
	if ((inIdentifier >= 0 && (Bonjour::Read2Bytes(inPacket) != inIdentifier)) || !(inPacket[2] & 0x80)) 
		
		return VE_OK;		// Ignore.

	numberQuestions = Bonjour::Read2Bytes(&inPacket[4]);
	numberResourceRecords = Bonjour::Read2Bytes(&inPacket[6]);
	numberResourceRecords += Bonjour::Read2Bytes(&inPacket[8]);
	numberResourceRecords += Bonjour::Read2Bytes(&inPacket[10]); 

	// Skip questions.
	
	p = &inPacket[12];
	q = inPacket + inPacketSize;
	for (uLONG i = 0; i < numberQuestions; i++) {

		size = inPacketSize;
		if ((error = Bonjour::ParseDNSName(inPacket, &size, p - inPacket, &vString)) != VE_OK)
			
			return error;
				
		if ((p += size + 4) > q) 
		
			return VE_SRVR_BONJOUR_MALFORMED_PACKET;
		
	}
	
	std::vector<PendingRecord>	pendingRecords;
	uLONG						i, j;
	
	// Parse all resource records.
	
	error = VE_OK;
	for (i = 0; i < numberResourceRecords && error == VE_OK; i++) {
		
		VString	name;
		uWORD			type;
		uLONG			dataSize, timeToLive;
		const uBYTE		*data;
		
		size = inPacketSize;
		if ((error = Bonjour::ParseResourceRecord(inPacket, &size, p - inPacket, 
												  &name, &type, &dataSize, &data, &timeToLive)) != VE_OK)
			
			break;
		
		p += size;	
		
		switch (type) {

			case Bonjour::kTypeA: {

				if (dataSize != 4) {
				
					error = VE_SRVR_BONJOUR_MALFORMED_PACKET;
					break;
					
				}
			
				for (j = 0; j < pendingRecords.size(); j++)
				
					if (pendingRecords[j].fHasSRV
					&& pendingRecords[j].fTarget.EqualToString(name, true)) {

						VNetAddress	address(*((IP4 *) data));
					
						pendingRecords[j].fServiceRecord.fIPv4Address = address.GetIP(NULL);
						pendingRecords[j].fHasA = true;
						
					}
				
				break;
				
			}

			case Bonjour::kTypeAAAA: {

				if (dataSize != 16) {
				
					error = VE_SRVR_BONJOUR_MALFORMED_PACKET;
					break;
					
				}

				for (j = 0; j < pendingRecords.size(); j++)
				
					if (pendingRecords[j].fHasSRV
					&& pendingRecords[j].fTarget.EqualToString(name, true)) {
						
						VNetAddress	address(*((IP6 *) data));
					
						pendingRecords[j].fServiceRecord.fIPv6Address = address.GetIP(NULL);
						pendingRecords[j].fHasAAAA = true;
						
					}
				
				break;

			}
				
			case Bonjour::kTypePTR: {

				VString	notSuffixedName;

				notSuffixedName = name;
				if (notSuffixedName.EndsWith(".local", true))

					notSuffixedName.Truncate(notSuffixedName .GetLength() - 6);

				for (j = 0; j < inServiceNames.size(); j++)
					
					if (inServiceNames[j].EqualToString(notSuffixedName, true)) 
						
						break;
				
				if (j == inServiceNames.size())
					
					break;

				size = inPacketSize;
				if ((error = Bonjour::ParseDNSName(inPacket, &size , data - inPacket, &vString)) != VE_OK)
					
					break;
					
				if (size != dataSize) { 
				
					error = VE_SRVR_BONJOUR_MALFORMED_PACKET;
					break;
					
				}
						
				for (j = 0; j < pendingRecords.size(); j++)
					
					if (pendingRecords[j].fServiceRecord.fServiceName.EqualToString(name, true) 
					&& pendingRecords[j].fServiceRecord.fProviderName.EqualToString(vString, true))
						
						break;
						
				if (j == pendingRecords.size()) {

					PendingRecord	record;
						
					record.fServiceRecord.fServiceName = name;
					record.fServiceRecord.fProviderName = vString;
					record.fHasSRV = record.fHasA = record.fHasAAAA = false;
					record.fTarget.Clear();
					
					pendingRecords.push_back(record);
						
				}
				
				break;
				
			}
				
			case Bonjour::kTypeTXT: {
			
				for (j = 0; j < pendingRecords.size(); j++)
					
					if (pendingRecords[j].fServiceRecord.fProviderName.EqualToString(name, true)) {
						
						size = dataSize;
						if ((error = Bonjour::TXTToValueBag(data, &size, &pendingRecords[j].fServiceRecord.fValueBag)) != VE_OK)
							
							break;
							
						if (size != dataSize) 
								
							error = VE_SRVR_BONJOUR_MALFORMED_PACKET;
						
						break;
						
					}
				
				break;
				
			}

			case Bonjour::kTypeSRV: {
				
				for (j = 0; j < pendingRecords.size(); j++)
					
					if (pendingRecords[j].fServiceRecord.fProviderName.EqualToString(name, true)) {

						size = inPacketSize;
						if ((error = Bonjour::ParseDNSName(inPacket, &size, data - inPacket + 6, &vString)) != VE_OK)
							
							break;
						
						if (size != dataSize - 6) {
							
							error = VE_SRVR_BONJOUR_MALFORMED_PACKET;
							break;
							
						}
						
						pendingRecords[j].fServiceRecord.fPort = Bonjour::Read2Bytes(data + 4);	// Ignore priority and weight.
						pendingRecords[j].fTarget = vString;
						pendingRecords[j].fHasSRV = true;
											
						break;					
						
					}
											
				break;	
		
			}
								
			default:	break;	// Ignore.
				
		}
				
	}	
	
	if (error != VE_OK)
		
		return error;
	
	// Find out detected records.
	
	for (i = 0; i < pendingRecords.size(); i++)
		
		if (pendingRecords[i].fHasSRV && (pendingRecords[i].fHasA || pendingRecords[i].fHasAAAA)) {
			
			if (pendingRecords[i].fServiceRecord.fProviderName.EndsWith(pendingRecords[i].fServiceRecord.fServiceName))

				pendingRecords[i].fServiceRecord.fProviderName.Truncate(
					pendingRecords[i].fServiceRecord.fProviderName.GetLength() 
					- pendingRecords[i].fServiceRecord.fServiceName.GetLength() 
					- 1);															// Remove "." dot.

			if (pendingRecords[i].fServiceRecord.fServiceName.EndsWith(".local"))

				pendingRecords[i].fServiceRecord.fServiceName.Truncate(
					pendingRecords[i].fServiceRecord.fServiceName.GetLength() 
					- 6);

			pendingRecords[i].fServiceRecord.fHostName = pendingRecords[i].fTarget;
			outServiceRecord->push_back(pendingRecords[i].fServiceRecord);

		}

	return VE_OK;
}
コード例 #6
0
bool VHTMLSyntax::IsComment( ICodeEditorDocument* inDocument, const VString& inString )
{
	return inString.BeginsWith( CVSTR( "<!--" ) ) && inString.EndsWith( CVSTR( "-->" ) );
}