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 ); } }
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 } }
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; }
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; }
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; }
bool VHTMLSyntax::IsComment( ICodeEditorDocument* inDocument, const VString& inString ) { return inString.BeginsWith( CVSTR( "<!--" ) ) && inString.EndsWith( CVSTR( "-->" ) ); }