| 114 | |
| 115 | |
| 116 | size_t DirectLinkSearch::validateDirectLink(size_t currentPosition) |
| 117 | { |
| 118 | TCHAR searchString[] = TEXT("href=\"http://"); |
| 119 | TCHAR searchString2[] = TEXT("href=\"https://"); |
| 120 | TCHAR validUriChars[] = TEXT(":@&=+$,;/?:"); |
| 121 | |
| 122 | size_t charListLen = _tcslen(validUriChars); |
| 123 | const int LINKOFFSET = 6; |
| 124 | |
| 125 | size_t lastNonDomain = currentPosition; |
| 126 | size_t minPosition = currentPosition - MAX_RESULT_SIZE; |
| 127 | |
| 128 | size_t startSearchPos = _tcslen(searchString) - 1; |
| 129 | size_t startSearchPos2 = _tcslen(searchString2) - 1; |
| 130 | size_t searchPos = startSearchPos; |
| 131 | size_t searchPos2 = startSearchPos2; |
| 132 | |
| 133 | while(currentPosition >= minPosition) |
| 134 | { |
| 135 | TCHAR currentChar = _file.getCharAt(currentPosition); |
| 136 | if (currentChar != TEXT('.') |
| 137 | && currentChar != TEXT('-') |
| 138 | && !(currentChar >= TEXT('a') && currentChar <= TEXT('z')) |
| 139 | && !(currentChar >= TEXT('A') && currentChar <= TEXT('Z')) |
| 140 | && !(currentChar >= TEXT('0') && currentChar <= TEXT('9'))) |
| 141 | { |
| 142 | lastNonDomain = currentPosition; |
| 143 | |
| 144 | |
| 145 | if (!findChar(currentChar, validUriChars, charListLen) |
| 146 | && !(currentChar == TEXT('\"') && (searchString[searchPos] == TEXT('\"') || searchString2[searchPos2] == TEXT('\"')))) |
| 147 | break; |
| 148 | } |
| 149 | |
| 150 | |
| 151 | if (searchString[searchPos] == currentChar) |
| 152 | { |
| 153 | if (searchPos == 0) |
| 154 | { |
| 155 | return currentPosition + LINKOFFSET; |
| 156 | } |
| 157 | --searchPos; |
| 158 | } |
| 159 | else |
| 160 | searchPos = startSearchPos; |
| 161 | |
| 162 | if (searchString2[searchPos2] == currentChar) |
| 163 | { |
| 164 | if (searchPos2 == 0) |
| 165 | { |
| 166 | return currentPosition + LINKOFFSET; |
| 167 | } |
| 168 | --searchPos2; |
| 169 | } |
| 170 | else |
| 171 | searchPos2 = startSearchPos2; |
| 172 | |
| 173 | --currentPosition; |