/* AR-930907 CH LC_ErrorHandler Feilmelding CD ========================================================================== CD Formål: CD Feilmelding. CD CD Parametre: CD Type Navn I/U Forklaring CD -------------------------------------------------------------------------- CD short feil_nr i Feilmeldingsnummer CD char *logtx u Peker til feilmeldingstekst avslutta med '\0'. CD char *vartx u Peker til feilmeldingstekst avslutta med '\0'. CD CD Bruk: CD LC_SetErrorHandler(LC_ErrorHandler); ========================================================================== */ void LC_ErrorHandler (short feil_nr, const char logtx[], const char vartx[]) { short strategi; char *feilmelding; /* Hent feilmeldingstekst og strategi */ strategi = LC_StrError(feil_nr,&feilmelding); /* Meldingen skrives */ if (strategi > 0) { printf("\n%s %s\n",feilmelding,vartx); switch(strategi) { /* Velg strategi */ case 1: case 2: break; case 3: printf("\aTrykk [Enter] for å fortsette:"); if (getchar() == 0) getchar(); break; case 4: printf("\aTrykk [Enter] for å avbryte programmet:"); if (getchar() == 0) getchar(); exit(2); break; } } }
void LC_Error(short feil_nr, const char *logtx, const char *vartx) { char szErrMsg[260]; short strategi; char *pszFeilmelding; // Translate all to English. // Egen enkel implementasjon av feilhandtering /* Hent feilmeldingstekst og strategi */ strategi = LC_StrError(feil_nr,&pszFeilmelding); switch(strategi) { case 2: sprintf(szErrMsg,"%s","Observer følgende! \n\n");break; case 3: sprintf(szErrMsg,"%s","Det er oppstått en feil! \n\n");break; case 4: sprintf(szErrMsg,"%s","Alvorlig feil avslutt programmet! \n\n");break; default: szErrMsg[0]='\0'; } }
int OGRSOSIDataSource::Open( const char *pszFilename, int bUpdate ) { papoBuiltGeometries = NULL; poFileadm = NULL; poBaseadm = NULL; char *pszPos; if ( bUpdate ) { CPLError( CE_Failure, CPLE_OpenFailed, "Update access not supported by the SOSI driver." ); return FALSE; } /* Check that the file exists otherwise HO_TestSOSI() emits an error */ VSIStatBuf sStat; if( VSIStat(pszFilename, &sStat) != 0 ) return FALSE; pszName = CPLStrdup( pszFilename ); /* We ignore any layer parameters for now. */ pszPos = strchr(pszName, ','); if (pszPos != NULL) { pszPos[0] = '\0'; } /* Confirm that we are dealing with a SOSI file. Used also by data * format auto-detection in some ogr utilities. */ UT_INT64 nEnd = 0; int bIsSosi = HO_TestSOSI ( pszName, &nEnd ); if ( bIsSosi == UT_FALSE ) { return FALSE; /* No error message: This is used by file format auto-detection */ } short nStatus = 0, nDetStatus = 0; /* immediate status, detailed status */ /* open index base and sosi file */ poBaseadm = LC_OpenBase(LC_BASE); nStatus = LC_OpenSos(pszName, LC_BASE_FRAMGR, LC_GML_IDX, LC_INGEN_STATUS, &poFileadm, &nDetStatus); if ( nStatus == UT_FALSE ) { char *pszErrorMessage; LC_StrError(nDetStatus, &pszErrorMessage); CPLError( CE_Failure, CPLE_OpenFailed, "File %s could not be opened by SOSI Driver: %s", pszName, pszErrorMessage ); return FALSE; } /* --------------------------------------------------------------------* * Prefetch all the information needed to determine layers * * and prebuild LineString features for later assembly. * * --------------------------------------------------------------------*/ /* allocate room for one pointer per feature */ nNumFeatures = static_cast<unsigned int>(poFileadm->lAntGr); void* mem = VSI_MALLOC2_VERBOSE(nNumFeatures, sizeof(void*)); if (mem == NULL) { return FALSE; } else { papoBuiltGeometries = (OGRGeometry**)mem; } for (unsigned int i=0; i<nNumFeatures; i++) papoBuiltGeometries[i] = NULL; /* Various iterators and return values used to iterate through SOSI features */ short nName, nNumLines; long nNumCoo; unsigned short nInfo; LC_SNR_ADM oSnradm; LC_BGR oNextSerial; LC_BGR *poNextSerial; poNextSerial =&oNextSerial; bool bPointLayer = FALSE; /* Initialize four layers for the different geometry types */ bool bCurveLayer = FALSE; bool bPolyLayer = FALSE; bool bTextLayer = FALSE; poPolyHeaders = new S2I(); poPointHeaders = new S2I(); poCurveHeaders = new S2I(); poTextHeaders = new S2I(); LC_SBSn(&oSnradm, poFileadm, 0, nNumFeatures); /* Set FYBA search limits */ LC_InitNextBgr(poNextSerial); /* Prebuilding simple features and extracting layer information. */ while (LC_NextBgr(poNextSerial,LC_FRAMGR)) { /* Fetch next group information */ nName = LC_RxGr(poNextSerial, LES_OPTIMALT, &nNumLines, &nNumCoo, &nInfo); S2S oHeaders; S2S::iterator iHeaders; int iH; /* Extract all strings from group header. */ for (short i=1; i<=nNumLines; i++) { char *pszLine = LC_GetGi(i); /* Get one header line */ if ((pszLine[0] == ':')||(pszLine[0] == '(')) continue; /* If we have a continued REF line, skip it. */ if (pszLine[0] == '!') continue; /* If we have a comment line, skip it. */ char *pszUTFLine = CPLRecode(pszLine, pszEncoding, CPL_ENC_UTF8); /* switch to UTF encoding here, if it is known. */ char *pszUTFLineIter = pszUTFLine; while (pszUTFLineIter[0] == '.') pszUTFLineIter++; /* Skipping the dots at the beginning of a SOSI line */ char *pszPos2 = strstr(pszUTFLineIter, " "); /* Split header and value */ if (pszPos2 != NULL) { CPLString osKey = CPLString(std::string(pszUTFLineIter,pszPos2)); /* FIXME: clean instantiation of CPLString? */ CPLString osValue = CPLString(pszPos2+1); oHeaders[osKey]=osValue; /* Add to header map */ switch (nName) { /* Add to header list for the corresponding layer, if it is not */ case L_FLATE: { /* in there already */ if (poPolyHeaders->find(osKey) == poPolyHeaders->end()) { iH = static_cast<int>(poPolyHeaders->size()); (*poPolyHeaders)[osKey] = iH; } break; } case L_KURVE: case L_LINJE: case L_BUEP: { /* FIXME: maybe not use the same headers for both */ if (poCurveHeaders->find(osKey) == poCurveHeaders->end()) { iH = static_cast<int>(poCurveHeaders->size()); (*poCurveHeaders)[osKey] = iH; } break; } case L_PUNKT: case L_SYMBOL: { if (poPointHeaders->find(osKey) == poPointHeaders->end()) { iH = static_cast<int>(poPointHeaders->size()); (*poPointHeaders)[osKey] = iH; } break; } case L_TEKST: { if (poTextHeaders->find(osKey) == poTextHeaders->end()) { iH = static_cast<int>(poTextHeaders->size()); (*poTextHeaders)[osKey] = iH; } break; } } } CPLFree(pszUTFLine); } /* Feature-specific tasks */ switch (nName) { case L_PUNKT: { /* Pre-build a point feature. Activate point layer. */ bPointLayer = TRUE; buildOGRPoint(oNextSerial.lNr); break; } case L_FLATE: { /* Activate polygon layer. */ bPolyLayer = TRUE; /* cannot build geometries that reference others yet */ break; } case L_KURVE: case L_LINJE: { /* Pre-build a line feature. Activate line/curve layer. */ bCurveLayer = TRUE; buildOGRLineString(static_cast<int>(nNumCoo), oNextSerial.lNr); break; } case L_BUEP: { /* Pre-build a line feature as interpolation from an arc. Activate line/curve layer. */ bCurveLayer = TRUE; buildOGRLineStringFromArc(oNextSerial.lNr); break; } case L_TEKST: { /* Pre-build a text line contour feature. Activate text layer. */ /* Todo: observe only points 2ff if more than one point is given for follow mode */ bTextLayer = TRUE; buildOGRMultiPoint(static_cast<int>(nNumCoo), oNextSerial.lNr); break; } case L_HODE: { /* Get SRS from SOSI header. */ unsigned short nMask = LC_TR_ALLT; LC_TRANSPAR oTrans; if (LC_GetTransEx(&nMask,&oTrans) == UT_FALSE) { CPLError( CE_Failure, CPLE_OpenFailed, "TRANSPAR section not found - No reference system information available."); return FALSE; } poSRS = new OGRSpatialReference(); /* Get coordinate system from SOSI header. */ int nEPSG = sosi2epsg(oTrans.sKoordsys); if (poSRS->importFromEPSG(nEPSG) != OGRERR_NONE) { CPLError( CE_Failure, CPLE_OpenFailed, "OGR could not load coordinate system definition EPSG:%i.", nEPSG); return FALSE; } /* Get character encoding from SOSI header. */ iHeaders = oHeaders.find("TEGNSETT"); if (iHeaders != oHeaders.end()) { CPLString osLine = iHeaders->second; if (osLine.compare("ISO8859-1")==0) { pszEncoding = CPL_ENC_ISO8859_1; } else if (osLine.compare("ISO8859-10")==0) { pszEncoding = CPL_ENC_ISO8859_10; } else if (osLine.compare("UTF-8")==0) { pszEncoding = CPL_ENC_UTF8; } } break; } default: { break; } } } /* -------------------------------------------------------------------- * * Create a corresponding layers. One per geometry type * * -------------------------------------------------------------------- */ int l_nLayers = 0; if (bPolyLayer) l_nLayers++; if (bCurveLayer) l_nLayers++; if (bPointLayer) l_nLayers++; if (bTextLayer) l_nLayers++; this->nLayers = l_nLayers; /* allocate some memory for up to three layers */ papoLayers = (OGRSOSILayer **) VSI_MALLOC2_VERBOSE(sizeof(void*), l_nLayers); if( papoLayers == NULL ) { this->nLayers = 0; return FALSE; } /* Define each layer, using a proper feature definition, geometry type, * and adding every SOSI header encountered in the file as field. */ S2I::iterator i; if (bPolyLayer) { S2I * poHeadersNew = new S2I(); OGRFeatureDefn *poFeatureDefn = defineLayer("polygons", wkbPolygon, poPolyHeaders, &poHeadersNew); delete poPolyHeaders; poPolyHeaders = poHeadersNew; poFeatureDefn->Reference(); papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poPolyHeaders ); } else { delete poPolyHeaders; poPolyHeaders = NULL; } if (bCurveLayer) { S2I * poHeadersNew = new S2I(); OGRFeatureDefn *poFeatureDefn = defineLayer("lines", wkbLineString, poCurveHeaders, &poHeadersNew); delete poCurveHeaders; poCurveHeaders = poHeadersNew; poFeatureDefn->Reference(); papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poCurveHeaders ); } else { delete poCurveHeaders; poCurveHeaders = NULL; } if (bPointLayer) { S2I * poHeadersNew = new S2I(); OGRFeatureDefn *poFeatureDefn = defineLayer("points", wkbPoint, poPointHeaders, &poHeadersNew); delete poPointHeaders; poPointHeaders = poHeadersNew; poFeatureDefn->Reference(); papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poPointHeaders ); } else { delete poPointHeaders; poPointHeaders = NULL; } if (bTextLayer) { S2I * poHeadersNew = new S2I(); OGRFeatureDefn *poFeatureDefn = defineLayer("text", wkbMultiPoint, poTextHeaders, &poHeadersNew); delete poTextHeaders; poTextHeaders = poHeadersNew; poFeatureDefn->Reference(); papoLayers[--l_nLayers] = new OGRSOSILayer( this, poFeatureDefn, poFileadm, poTextHeaders ); } else { delete poTextHeaders; poTextHeaders = NULL; } return TRUE; }