RFC 7:对VSI*L函数使用VSILFILE

作者:甚至鲁奥(埃里克多恩格斯是原作者)

联系人:even dot rouault,邮箱:spatialys.com,Eric.Doenges@gmx.net

状态:通过

目的

将VSI*L函数族的API更改为使用新的数据类型VSI L FILE而不是当前文件。

背景、理由

目前,GDAL提供了两个api来抽象文件访问函数(称为VSI * 和VSI我在这份文件中)。两个api都声称对文件指针进行操作;但是,VSI L函数只能对VSIFOpenL函数创建的文件指针进行操作。这是因为VsifOpenl返回指向一个内部C++类类型的指针,而不是一个实际的文件指针。这使得编译器无法在VSI * 和VSI*L函数混合不恰当。

建议的修复

应声明新的不透明数据类型VSILFILE。所有VSIL函数应更改为使用这种新类型而不是文件。另外,任何使用VSI的GDAL代码 L函数也必须更改才能使用此数据类型。

RawRasterBand变化

  • 两个构造函数被更改为接受一个void * fpRaw而不是文件 *

  • 新成员VSILFILE * 添加了fpRawL。现有成员文件 * 保留fpRaw。构造函数将根据bIsVSIL参数的值设置足够的成员。

  • 一种新方法VSILFILE * 已添加GetFPL()。

  • 旧文件 * GetFP()被调整为具有与以前相同的行为(可以返回标准文件句柄或VSI*L句柄,具体取决于传递给构造函数的句柄)

这些改变是为了在使用RawRasterBand时最小化对casting的需求。保留向后API兼容性。

兼容性问题,转换时间线

为了允许编译器检测传递给任何VSI*L函数的不适当的参数,VSILFILE将通过一个空的forward声明来声明,即。

typedef struct _VSILFILE VSILFILE

结构VSILFILE本身未定义。

但是,这将破坏使用VSI*L API的任何现有代码的源代码兼容性。因此,目前,VSIL FILE被定义为FILE的别名,除非定义了VSIL_STRICT_ENFORCE宏。

#ifdef VSIL_STRICT_ENFORCE
typedef struct _VSILFILE VSILFILE;
#else
typedef FILE VSILFILE;
#endif

未来版本(GDA 2.0?),将更改行为以强制新的强类型。

在处理VSIF*lapi时,自采用此RFC以来所做的任何未来开发都应该使用VSILFILE。

问题

  • 在定义调试时,是否应该默认定义VSIL_STRICT_ENFORCE?

这将使GDAL开发人员更容易使用适当的类型,但在使用发布模式时不会影响API/ABI。

实施

整个源树(port、gcore、frmts、ogr、swig/include)将被适当地修改,以便在VSIL_STRICT_ENFORCE模式下编译。Ticket#3799包含实现的修补程序。编译没有添加任何新的警告。更改后自动测试套件仍然有效。

GeoRaster和JPIPKAK驱动程序在转换过程中已被修改,但我无法编译它们。感谢测试。在转换过程中更改的所有其他驱动程序都已编译。

在转换过程中,在ceos2驱动程序中发现了POSIX文件API与大型文件处理程序的误用,但函数碰巧未被使用。

投票历史

* Frank Warmerdam +1
* Tamas Szekeres +1
* Daniel Morissette +1
* Howard Butler +1
* Even Rouault +1