Skip to content

Commit

Permalink
Now using file encoding for saving attributes and values in new shape…
Browse files Browse the repository at this point in the history
…files.

The file encoding is selected in the Save As dialog.


git-svn-id: http://svn.osgeo.org/qgis/trunk@6323 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
homann committed Dec 28, 2006
1 parent ee45e2c commit f0de54d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 15 deletions.
8 changes: 4 additions & 4 deletions src/gui/qgisapp.cpp
Expand Up @@ -2570,22 +2570,22 @@ void QgisApp::newVectorLayer()
#ifdef QGISDEBUG
qWarning("ogr provider loaded");
#endif
typedef bool (*createEmptyDataSourceProc)(const QString&, const QString&, QGis::WKBTYPE, \
typedef bool (*createEmptyDataSourceProc)(const QString&, const QString&, const QString&, QGis::WKBTYPE, \
const std::list<std::pair<QString, QString> >&);
createEmptyDataSourceProc createEmptyDataSource=(createEmptyDataSourceProc)myLib->resolve("createEmptyDataSource");
if(createEmptyDataSource)
{
if(geometrytype == QGis::WKBPoint)
{
createEmptyDataSource(filename,fileformat,QGis::WKBPoint, attributes);
createEmptyDataSource(filename,fileformat, enc, QGis::WKBPoint, attributes);
}
else if (geometrytype == QGis::WKBLineString)
{
createEmptyDataSource(filename,fileformat,QGis::WKBLineString, attributes);
createEmptyDataSource(filename,fileformat, enc, QGis::WKBLineString, attributes);
}
else if(geometrytype == QGis::WKBPolygon)
{
createEmptyDataSource(filename,fileformat,QGis::WKBPolygon, attributes);
createEmptyDataSource(filename,fileformat, enc, QGis::WKBPolygon, attributes);
}
else
{
Expand Down
29 changes: 18 additions & 11 deletions src/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -1048,7 +1048,7 @@ bool QgsOgrProvider::addFeature(QgsFeature* f)

//find a matching field for the new attribute
QString newAttribute = (f->attributeMap())[i].fieldName();
int targetAttributeId = fdef->GetFieldIndex(newAttribute);
int targetAttributeId = fdef->GetFieldIndex(mEncoding->fromUnicode(newAttribute).constData());
if(targetAttributeId == -1)
{
continue;
Expand All @@ -1066,7 +1066,11 @@ bool QgsOgrProvider::addFeature(QgsFeature* f)
}
else if(fdef->GetFieldDefn(targetAttributeId)->GetType()==OFTString)
{
feature->SetField(targetAttributeId,s.ascii());
#ifdef QGISDEBUG
std::cerr << "Writing string attribute " << newAttribute.toLocal8Bit().data() <<
" with " << s.toLocal8Bit().data() << ", encoding " << mEncoding->name().data() << "\n";
#endif
feature->SetField(targetAttributeId,mEncoding->fromUnicode(s).constData());
}
else
{
Expand Down Expand Up @@ -1107,7 +1111,7 @@ bool QgsOgrProvider::addAttributes(std::map<QString,QString> const & name)
{
if(iter->second=="OFTInteger")
{
OGRFieldDefn fielddefn(iter->first,OFTInteger);
OGRFieldDefn fielddefn(mEncoding->fromUnicode(iter->first).data(),OFTInteger);
if(ogrLayer->CreateField(&fielddefn)!=OGRERR_NONE)
{
QgsLogger::warning("QgsOgrProvider.cpp: writing of OFTInteger field failed");
Expand All @@ -1116,7 +1120,7 @@ bool QgsOgrProvider::addAttributes(std::map<QString,QString> const & name)
}
else if(iter->second=="OFTReal")
{
OGRFieldDefn fielddefn(iter->first,OFTReal);
OGRFieldDefn fielddefn(mEncoding->fromUnicode(iter->first).data(),OFTReal);
if(ogrLayer->CreateField(&fielddefn)!=OGRERR_NONE)
{
QgsLogger::warning("QgsOgrProvider.cpp: writing of OFTReal field failed");
Expand All @@ -1125,7 +1129,7 @@ bool QgsOgrProvider::addAttributes(std::map<QString,QString> const & name)
}
else if(iter->second=="OFTString")
{
OGRFieldDefn fielddefn(iter->first,OFTString);
OGRFieldDefn fielddefn(mEncoding->fromUnicode(iter->first).data(),OFTString);
if(ogrLayer->CreateField(&fielddefn)!=OGRERR_NONE)
{
QgsLogger::warning("QgsOgrProvider.cpp: writing of OFTString field failed");
Expand Down Expand Up @@ -1176,7 +1180,7 @@ bool QgsOgrProvider::changeAttributeValues(std::map<int,std::map<QString,QString
of->SetField ( f, value.toDouble() );
break;
case OFTString:
of->SetField ( f, value.ascii() );
of->SetField ( f, mEncoding->fromUnicode(value).constData());
break;
default:
QgsLogger::warning("QgsOgrProvider::changeAttributeValues, Unknown field type,\
Expand Down Expand Up @@ -1646,8 +1650,8 @@ QGISEXTERN bool isProvider()
@param vectortype point/line/polygon or multitypes
@param attributes a list of name/type pairs for the initial attributes
@return true in case of success*/
QGISEXTERN bool createEmptyDataSource(const QString& uri,const QString& format, QGis::WKBTYPE vectortype, \
const std::list<std::pair<QString, QString> >& attributes)
QGISEXTERN bool createEmptyDataSource(const QString& uri,const QString& format, const QString& encoding,\
QGis::WKBTYPE vectortype, const std::list<std::pair<QString, QString> >& attributes)
{
OGRSFDriver* driver;
OGRRegisterAll();
Expand Down Expand Up @@ -1706,11 +1710,14 @@ const std::list<std::pair<QString, QString> >& attributes)
}

//create the attribute fields

QTextCodec* codec=QTextCodec::codecForName(encoding.toLocal8Bit().data());

for(std::list<std::pair<QString, QString> >::const_iterator it= attributes.begin(); it != attributes.end(); ++it)
{
if(it->second == "Real")
{
OGRFieldDefn field(it->first, OFTReal);
OGRFieldDefn field(codec->fromUnicode(it->first).data(), OFTReal);
field.SetPrecision(3);
field.SetWidth(32);
if(layer->CreateField(&field) != OGRERR_NONE)
Expand All @@ -1720,15 +1727,15 @@ const std::list<std::pair<QString, QString> >& attributes)
}
else if(it->second == "Integer")
{
OGRFieldDefn field(it->first, OFTInteger);
OGRFieldDefn field(codec->fromUnicode(it->first).data(), OFTInteger);
if(layer->CreateField(&field) != OGRERR_NONE)
{
QgsLogger::warning("creation of OFTInteger field failed");
}
}
else if(it->second == "String")
{
OGRFieldDefn field(it->first, OFTString);
OGRFieldDefn field(codec->fromUnicode(it->first).data(), OFTString);
if(layer->CreateField(&field) != OGRERR_NONE)
{
QgsLogger::warning("creation of OFTString field failed");
Expand Down

0 comments on commit f0de54d

Please sign in to comment.