Ticket #8634: cleandetector.patch

File cleandetector.patch, 5.1 KB (added by jvprat, 15 years ago)

Don't add trailing dots

  • common/advancedDetector.cpp

     
    254254        IntMap filesSize;
    255255        IntMap allFiles;
    256256
    257         String tstr, tstr2;
     257        String tstr;
    258258       
    259259        uint i;
    260260        char md5str[32+1];
     
    273273                for (fileDesc = g->filesDescriptions; fileDesc->fileName; fileDesc++) {
    274274                        tstr = String(fileDesc->fileName);
    275275                        tstr.toLowercase();
    276                         tstr2 = tstr + ".";
    277276                        filesList[tstr] = true;
    278                         filesList[tstr2] = true;
    279277                }
    280278        }
    281        
     279
    282280        if (fslist != 0) {
     281                // Get the information of the existing files
    283282                for (FSList::const_iterator file = fslist->begin(); file != fslist->end(); ++file) {
    284283                        Common::File f;
    285284
    286285                        if (file->isDirectory()) continue;
    287286                        tstr = file->name();
    288287                        tstr.toLowercase();
    289                         tstr2 = tstr + ".";
    290288
    291                         allFiles[tstr] = allFiles[tstr2] = 1;
     289                        // Strip the trailing dot
     290                        if (tstr.lastChar() == '.')
     291                                tstr.deleteLastChar();
    292292
     293                        allFiles[tstr] = 1;
     294
    293295                        debug(3, "+ %s", tstr.c_str());
    294296
    295                         if (!filesList.contains(tstr) && !filesList.contains(tstr2)) continue;
     297                        if (!filesList.contains(tstr)) continue;
    296298
    297299                        if (!md5_file_string(*file, md5str, params.md5Bytes))
    298300                                continue;
    299                         filesMD5[tstr] = filesMD5[tstr2] = md5str;
     301                        filesMD5[tstr] = md5str;
    300302
    301303                        debug(3, "> %s: %s", tstr.c_str(), md5str);
    302304
    303305                        if (f.open(file->path())) {
    304                                 filesSize[tstr] = filesSize[tstr2] = (int32)f.size();
     306                                filesSize[tstr] = (int32)f.size();
    305307                                f.close();
    306308                        }
    307309                }
    308310        } else {
     311                // Get the information of the requested files
    309312                File testFile;
    310313
    311314                for (StringSet::const_iterator file = filesList.begin(); file != filesList.end(); ++file) {
    312315                        tstr = file->_key;
    313                         tstr.toLowercase();
    314316
    315317                        debug(3, "+ %s", tstr.c_str());
    316318                        if (!filesMD5.contains(tstr)) {
    317                                 if (testFile.open(file->_key)) {
    318                                         filesSize[tstr] = filesSize[tstr2] = (int32)testFile.size();
     319                                if (testFile.open(tstr) || testFile.open(tstr + ".")) {
     320                                        filesSize[tstr] = (int32)testFile.size();
    319321                                        testFile.close();
    320322
    321323                                        if (md5_file_string(file->_key.c_str(), md5str, params.md5Bytes)) {
     
    330332        ADGameDescList matched;
    331333        int maxFilesMatched = 0;
    332334
     335        // MD5 based matching
    333336        for (i = 0, descPtr = params.descs; ((const ADGameDescription *)descPtr)->gameid != 0; descPtr += params.descItemSize, ++i) {
    334337                g = (const ADGameDescription *)descPtr;
    335338                fileMissing = false;
     
    341344                        continue;
    342345                }
    343346
    344                 // Try to open all files for this game
     347                // Try to match all files for this game
    345348                for (fileDesc = g->filesDescriptions; fileDesc->fileName; fileDesc++) {
    346349                        tstr = fileDesc->fileName;
    347350                        tstr.toLowercase();
    348                         tstr2 = tstr + ".";
    349351
    350                         if (!filesMD5.contains(tstr) && !filesMD5.contains(tstr2)) {
     352                        if (!filesMD5.contains(tstr)) {
    351353                                fileMissing = true;
    352354                                break;
    353355                        }
    354356                        if (fileDesc->md5 != NULL) {
    355                                 if (strcmp(fileDesc->md5, filesMD5[tstr].c_str()) && strcmp(fileDesc->md5, filesMD5[tstr2].c_str())) {
     357                                if (strcmp(fileDesc->md5, filesMD5[tstr].c_str())) {
    356358                                        debug(3, "MD5 Mismatch. Skipping (%s) (%s)", fileDesc->md5, filesMD5[tstr].c_str());
    357359                                        fileMissing = true;
    358360                                        break;
     
    360362                        }
    361363
    362364                        if (fileDesc->fileSize != -1) {
    363                                 if (fileDesc->fileSize != filesSize[tstr] && fileDesc->fileSize != filesSize[tstr2]) {
     365                                if (fileDesc->fileSize != filesSize[tstr]) {
    364366                                        debug(3, "Size Mismatch. Skipping");
    365367                                        fileMissing = true;
    366368                                        break;
     
    378380                        int curFilesMatched = 0;
    379381                        for (fileDesc = g->filesDescriptions; fileDesc->fileName; fileDesc++)
    380382                                curFilesMatched++;
    381                        
     383
    382384                        if (curFilesMatched > maxFilesMatched) {
    383385                                debug(2, " ... new best match, removing all previous candidates");
    384386                                maxFilesMatched = curFilesMatched;
     
    416418                printf("\n");
    417419        }
    418420
     421        // Filename based fallback
    419422        if (params.fileBasedFallback != 0) {
    420423                const ADFileBasedFallback *ptr = params.fileBasedFallback;
    421424                const char* const* filenames = 0;
    422425
    423426                // First we create list of files required for detection.
    424                 if (allFiles.empty()) {
    425                         File testFile;
     427                // The filenames can be different than the MD5 based match ones.
     428                File testFile;
    426429
    427                         for (; ptr->desc; ptr++) {
    428                                 filenames = ptr->filenames;
    429                                 for (; *filenames; filenames++) {
    430                                         tstr = String(*filenames);
    431                                         tstr.toLowercase();
     430                for (; ptr->desc; ptr++) {
     431                        filenames = ptr->filenames;
     432                        for (; *filenames; filenames++) {
     433                                tstr = String(*filenames);
     434                                tstr.toLowercase();
    432435
    433                                         if (!allFiles.contains(tstr)) {
    434                                                 if (testFile.open(tstr)) {
    435                                                         tstr2 = tstr + ".";
    436                                                         allFiles[tstr] = allFiles[tstr2] = 1;
    437                                                         testFile.close();
    438                                                 }
     436                                if (!allFiles.contains(tstr)) {
     437                                        if (testFile.open(tstr) || testFile.open(tstr + ".")) {
     438                                                allFiles[tstr] = 1;
     439                                                testFile.close();
    439440                                        }
    440441                                }
    441442                        }
     
    461462                                }
    462463
    463464                                tstr = String(*filenames);
    464 
    465465                                tstr.toLowercase();
    466                                 tstr2 = tstr + ".";
    467466
    468467                                debug(3, "++ %s", *filenames);
    469                                 if (!allFiles.contains(tstr) && !allFiles.contains(tstr2)) {
     468                                if (!allFiles.contains(tstr)) {
    470469                                        fileMissing = true;
    471470                                        continue;
    472471                                }