bool MDAL::DriverGdal::canRead( const std::string &uri ) { try { registerDriver(); parseDatasetNames( uri ); } catch ( MDAL_Status ) { return false; } return true; }
int main(int argc, char *argv[]) { if (argc != 2 || _stricmp(INSTALL_COMMAND, argv[1]) != 0 && _stricmp(UNINSTALL_COMMAND, argv[1]) != 0) { MessageBoxA(NULL, USAGE_MSG, INFORMATION_TITLE, MB_OK | MB_ICONINFORMATION); return 1; } if (_stricmp(UNINSTALL_COMMAND, argv[1]) == 0) { char pathName[MAX_PATH + 1]; constructDriverPathName(pathName); deleteFileReliably(pathName); unregisterDriver(); return 0; } int setupPathLen = strrchr(argv[0], '\\') - argv[0]; if (setupPathLen > MAX_PATH - sizeof(MT32EMU_DRIVER_NAME) - 2) { MessageBoxA(NULL, CANNOT_INSTALL_PATH_TOO_LONG_ERR, ERROR_TITLE, MB_OK | MB_ICONEXCLAMATION); return 2; } bool installMode = true; if (!registerDriver(installMode)) { return 3; } char driverPathName[MAX_PATH + 1]; constructDriverPathName(driverPathName); deleteFileReliably(driverPathName); char setupPathName[MAX_PATH + 1]; strncpy(setupPathName, argv[0], setupPathLen); setupPathName[setupPathLen] = 0; strncat(setupPathName, PATH_SEPARATOR, MAX_PATH - strlen(setupPathName)); strncat(setupPathName, MT32EMU_DRIVER_NAME, MAX_PATH - strlen(setupPathName)); if (!CopyFileA(setupPathName, driverPathName, FALSE)) { MessageBoxA(NULL, CANNOT_INSTALL_FILE_COPY_ERR, FILE_ERROR_TITLE, MB_OK | MB_ICONEXCLAMATION); return 4; } MessageBoxA(NULL, installMode ? SUCCESSFULLY_INSTALLED_MSG : SUCCESSFULLY_UPDATED_MSG, INFORMATION_TITLE, MB_OK | MB_ICONINFORMATION); return 0; }
std::unique_ptr<MDAL::Mesh> MDAL::LoaderGdal::load( MDAL_Status *status ) { if ( status ) *status = MDAL_Status::None ; mPafScanline = nullptr; mMesh.reset(); try { registerDriver(); // some formats like NETCFD has data stored in subdatasets std::vector<std::string> subdatasets = parseDatasetNames( mFileName ); // First parse ALL datasets/bands to gather vector quantities // if case they are splitted in different subdatasets for ( auto iter = subdatasets.begin(); iter != subdatasets.end(); ++iter ) { std::string gdal_dataset_name = *iter; // Parse dataset parameters and projection MDAL::GdalDataset *cfGDALDataset = new MDAL::GdalDataset; cfGDALDataset->init( gdal_dataset_name ); if ( !mMesh ) { // If it is first dataset, create mesh from it gdal_datasets.push_back( cfGDALDataset ); // Init memory for data reader mPafScanline = new double [cfGDALDataset->mXSize]; // Create mMesh createMesh(); // Parse bands parseRasterBands( cfGDALDataset ); } else if ( meshes_equals( meshGDALDataset(), cfGDALDataset ) ) { gdal_datasets.push_back( cfGDALDataset ); // Parse bands parseRasterBands( cfGDALDataset ); } else { // Do not use delete cfGDALDataset; } } // Create MDAL datasets addDatasetGroups(); } catch ( MDAL_Status error ) { if ( status ) *status = ( error ); mMesh.reset(); } for ( auto it = gdal_datasets.begin(); it != gdal_datasets.end(); ++it ) { delete ( *it ); } gdal_datasets.clear(); if ( mPafScanline ) delete[] mPafScanline; // do not allow mesh without any valid datasets if ( mMesh && ( mMesh->datasetGroups.empty() ) ) { if ( status ) *status = MDAL_Status::Err_InvalidData; mMesh.reset(); } return std::unique_ptr<Mesh>( mMesh.release() ); }
std::unique_ptr<MDAL::Mesh> MDAL::DriverGdal::load( const std::string &fileName, MDAL_Status *status ) { mFileName = fileName; if ( status ) *status = MDAL_Status::None ; mPafScanline = nullptr; mMesh.reset(); try { registerDriver(); // some formats like NETCFD has data stored in subdatasets std::vector<std::string> subdatasets = parseDatasetNames( mFileName ); // First parse ALL datasets/bands to gather vector quantities // if case they are splitted in different subdatasets for ( auto iter = subdatasets.begin(); iter != subdatasets.end(); ++iter ) { std::string gdal_dataset_name = *iter; // Parse dataset parameters and projection std::shared_ptr<MDAL::GdalDataset> cfGDALDataset = std::make_shared<MDAL::GdalDataset>(); cfGDALDataset->init( gdal_dataset_name ); if ( !mMesh ) { // If it is first dataset, create mesh from it gdal_datasets.push_back( cfGDALDataset ); // Init memory for data reader mPafScanline = new double [cfGDALDataset->mXSize]; // Create mMesh createMesh(); // Parse bands parseRasterBands( cfGDALDataset.get() ); } else if ( meshes_equals( meshGDALDataset(), cfGDALDataset.get() ) ) { gdal_datasets.push_back( cfGDALDataset ); // Parse bands parseRasterBands( cfGDALDataset.get() ); } } // Fix consistency of groups // It can happen that we thought that the // group is vector based on name, but it could be just coicidence // or clash in naming fixRasterBands(); // Create MDAL datasets addDatasetGroups(); } catch ( MDAL_Status error ) { if ( status ) *status = ( error ); mMesh.reset(); } gdal_datasets.clear(); if ( mPafScanline ) delete[] mPafScanline; // do not allow mesh without any valid datasets if ( mMesh && ( mMesh->datasetGroups.empty() ) ) { if ( status ) *status = MDAL_Status::Err_InvalidData; mMesh.reset(); } return std::unique_ptr<Mesh>( mMesh.release() ); }