// enumerate all plugins that had valid DatabasePluginInfo() static int FindDbPluginForProfile(const char*, DATABASELINK * dblink, LPARAM lParam) { TCHAR* tszProfile = ( TCHAR* )lParam; int res = DBPE_CONT; if ( dblink && dblink->cbSize == sizeof(DATABASELINK)) { char* szProfile = makeFileName(tszProfile); // liked the profile? int err = 0; if (dblink->grokHeader(szProfile, &err) == 0) { // added APIs? if ( !dblink->Load(szProfile, &pluginCoreLink)) { fillProfileName( tszProfile ); res = DBPE_DONE; } else res = DBPE_HALT; } else { res = DBPE_HALT; switch ( err ) { case EGROKPRF_CANTREAD: case EGROKPRF_UNKHEADER: // just not supported. res = DBPE_CONT; case EGROKPRF_VERNEWER: case EGROKPRF_DAMAGED: break; } } //if mir_free(szProfile); } return res; }
// enumerate all plugins that had valid DatabasePluginInfo() int tryOpenDatabase(const TCHAR *tszProfile) { bool bWasOpened = false; for (int i=arDbPlugins.getCount()-1; i >= 0; i--) { DATABASELINK *p = arDbPlugins[i]; // liked the profile? int err = p->grokHeader(tszProfile); if (err != ERROR_SUCCESS) { // smth went wrong switch (err) { case EGROKPRF_CANTREAD: case EGROKPRF_UNKHEADER: // just not supported. continue; } return err; } bWasOpened = true; // try to load database MIDatabase *pDb = p->Load(tszProfile); if (pDb) { fillProfileName(tszProfile); currDblink = p; db_setCurrent(currDb = pDb); return 0; } } return (bWasOpened) ? -1 : EGROKPRF_CANTREAD; }
// enumerate all plugins that had valid DatabasePluginInfo() static int FindDbPluginAutoCreate(const char*, DATABASELINK * dblink, LPARAM lParam) { TCHAR* tszProfile = ( TCHAR* )lParam; int res = DBPE_CONT; if (dblink && dblink->cbSize == sizeof(DATABASELINK)) { CreatePathToFileT( tszProfile ); int err; char *szProfile = makeFileName( tszProfile ); if (dblink->makeDatabase(szProfile, &err) == 0) { dbCreated = true; if ( !dblink->Load(szProfile, &pluginCoreLink)) { fillProfileName( tszProfile ); res = DBPE_DONE; } else res = DBPE_HALT; } mir_free(szProfile); } return res; }
// enumerate all plugins that had valid DatabasePluginInfo() static int tryCreateDatabase(const TCHAR* ptszProfile) { TCHAR* tszProfile = NEWTSTR_ALLOCA(ptszProfile); CreatePathToFileT(tszProfile); for (int i=0; i < arDbPlugins.getCount(); i++) { DATABASELINK* p = arDbPlugins[i]; int err = p->makeDatabase(tszProfile); if (err == ERROR_SUCCESS) { g_bDbCreated = true; MIDatabase *pDb = p->Load(tszProfile); if (pDb != NULL) { fillProfileName(tszProfile); currDblink = p; db_setCurrent(currDb = pDb); return 0; } return 1; } } return 1; }