00001
00096 #ifndef INC_MI32_GEOCAT_H
00097 #define INC_MI32_GEOCAT_H
00098
00099 #ifndef INC_RVC_DBTABLE_H
00100 #include <rvc/dbtable.h>
00101 #endif
00102
00103 #ifndef INC_MI32_FILEPATHLIST_H
00104 #include <mi32/filepathlist.h>
00105 #endif
00106
00107 #ifndef INC_MI32_REGION2D_H
00108 #include <mi32/region2d.h>
00109 #endif
00110
00111 #ifndef INC_MI32_FILETEXT_H
00112 #include <mi32/filetext.h>
00113 #endif
00114
00115 #ifndef GENERATING_DOXYGEN_OUTPUT
00116 class STATUSCONTEXT;
00117 namespace RVC {
00118 class OBJITEM;
00119 }
00120 #endif
00121
00122
00126 class GEOCAT {
00127 public:
00128
00130 class RECORD {
00131 public:
00132
00134 RECORD (
00135 );
00136
00138 RECORD (
00139 const RECORD& rhs
00140 );
00141
00143 ~RECORD (
00144 );
00145
00147 RECORD& operator= (
00148 const RECORD& rhs
00149 );
00150
00152 UINT32 GetID (
00153 ) const {
00154 return (m_ID);
00155 }
00156
00158 double GetAccuracy (
00159 ) const {
00160 return (m_Accuracy);
00161 }
00162
00164 const MISTRING& GetCRS (
00165 ) const {
00166 return (m_CRS);
00167 }
00168
00170 const MISTRING& GetDataType (
00171 ) const {
00172 return (m_DataType);
00173 }
00174
00176 const MISTRING& GetDescription (
00177 ) const {
00178 return (m_Description);
00179 }
00180
00182 const MISTRING& GetFormat (
00183 ) const {
00184 return (m_Format);
00185 }
00186
00188 void GetLatLonExtents (
00189 DRECT2D& extents
00190 ) const;
00191
00193 double GetLatitudeNorth (
00194 ) const {
00195 return (m_LatitudeNorth);
00196 }
00197
00199 double GetLatitudeSouth (
00200 ) const {
00201 return (m_LatitudeSouth);
00202 }
00203
00205 const MISTRING& GetLocation (
00206 ) const {
00207 return (m_Location);
00208 }
00209
00211 double GetLongitudeEast (
00212 ) const {
00213 return (m_LongitudeEast);
00214 }
00215
00217 double GetLongitudeWest (
00218 ) const {
00219 return (m_LongitudeWest);
00220 }
00221
00223 UINT32 GetNumCols (
00224 ) const {
00225 return (m_NumCols);
00226 }
00227
00229 UINT32 GetNumLins (
00230 ) const {
00231 return (m_NumLins);
00232 }
00233
00235 RVC::OBJTYPE GetObjectType (
00236 ) const {
00237 return (m_objtype);
00238 }
00239
00241 void GetProjectionExtents (
00242 DRECT2D& extents
00243 ) const;
00244
00246 double GetProjectionMinX (
00247 ) const {
00248 return (m_ProjectionMinX);
00249 }
00250
00252 double GetProjectionMaxX (
00253 ) const {
00254 return (m_ProjectionMaxX);
00255 }
00256
00258 double GetProjectionMinY (
00259 ) const {
00260 return (m_ProjectionMinY);
00261 }
00262
00264 double GetProjectionMaxY (
00265 ) const {
00266 return (m_ProjectionMaxY);
00267 }
00268
00270 const DATETIME& GetTimeObjModified (
00271 ) const {
00272 return (m_TimeObjModified);
00273 }
00274
00276 const DATETIME& GetTimeRecCreated (
00277 ) const {
00278 return (m_TimeRecCreated);
00279 }
00280
00282 const DATETIME& GetTimeRecModified (
00283 ) const {
00284 return (m_TimeRecModified);
00285 }
00286
00288 const MISTRING& GetTitle (
00289 ) const {
00290 return (m_Title);
00291 }
00292
00294 double GetXScale (
00295 ) const {
00296 return (m_XScale);
00297 }
00298
00300 double GetYScale (
00301 ) const {
00302 return (m_YScale);
00303 }
00304
00306 void SetAccuracy (
00307 double accuracy
00308 ) { m_Accuracy = accuracy; }
00309
00311 void SetCRS (
00312 const MISTRING& crs
00313 ) { m_CRS = crs; }
00314
00316 void SetDataType (
00317 const MISTRING& datatype
00318 ) { m_DataType = datatype; }
00319
00321 void SetDescription (
00322 const MISTRING& desc
00323 ) { m_Description = desc; }
00324
00326 void SetFormat (
00327 const MISTRING& format
00328 ) { m_Format = format; }
00329
00331 void SetLatitudeNorth (
00332 double val
00333 ) { m_LatitudeNorth = val; }
00334
00336 void SetLatitudeSouth (
00337 double val
00338 ) { m_LatitudeSouth = val; }
00339
00341 void SetLocation (
00342 const MISTRING& location
00343 ) { m_Location = location; }
00344
00346 void SetLongitudeEast (
00347 double val
00348 ) { m_LongitudeEast = val; }
00349
00351 void SetLongitudeWest (
00352 double val
00353 ) { m_LongitudeWest = val; }
00354
00356 void SetNumCols (
00357 UINT32 NumCols
00358 ) { m_NumCols = NumCols; }
00359
00361 void SetNumLins (
00362 UINT32 NumLins
00363 ) { m_NumLins = NumLins; }
00364
00366 void SetObjectType (
00367 RVC::OBJTYPE objtype
00368 ) { m_objtype = objtype; }
00369
00371 void SetProjectionMinX (
00372 double val
00373 ) { m_ProjectionMinX = val; }
00374
00376 void SetProjectionMaxX (
00377 double val
00378 ) { m_ProjectionMaxX = val; }
00379
00381 void SetProjectionMinY (
00382 double val
00383 ) { m_ProjectionMinY = val; }
00384
00386 void SetProjectionMaxY (
00387 double val
00388 ) { m_ProjectionMaxY = val; }
00389
00391 void SetTitle (
00392 const MISTRING& title
00393 ) { m_Title = title; }
00394
00396 void SetXScale (
00397 double xscale
00398 ) { m_XScale = xscale; }
00399
00401 void SetYScale (
00402 double yscale
00403 ) { m_YScale = yscale; }
00404
00405 private:
00406 #ifndef GENERATING_DOXYGEN_OUTPUT
00408 void SetID (
00409 UINT32 id
00410 ) {
00411 m_ID = id;
00412 return;
00413 }
00414
00416 void SetTimeObjModified (
00417 ) {
00418 time_t modtime;
00419 RVC::OBJITEM objitem;
00420 objitem.SetCombinedPath(m_Location);
00421 objitem.GetFilePath().GetTimeModified(&modtime);
00422 m_TimeObjModified = modtime;
00423 return;
00424 }
00425
00426 UINT32 m_ID;
00427 MISTRING m_Location;
00428 MISTRING m_Format;
00429 RVC::OBJTYPE m_objtype;
00430 MISTRING m_Title;
00431 MISTRING m_Description;
00432 DATETIME m_TimeRecCreated;
00433 DATETIME m_TimeRecModified;
00434 DATETIME m_TimeObjModified;
00435 double m_LongitudeWest;
00436 double m_LongitudeEast;
00437 double m_LatitudeSouth;
00438 double m_LatitudeNorth;
00439 MISTRING m_CRS;
00440 double m_ProjectionMinX;
00441 double m_ProjectionMaxX;
00442 double m_ProjectionMinY;
00443 double m_ProjectionMaxY;
00444 double m_Accuracy;
00445 UINT32 m_NumCols;
00446 UINT32 m_NumLins;
00447 double m_XScale;
00448 double m_YScale;
00449 MISTRING m_DataType;
00450
00451 friend class GEOCAT;
00452 #endif // GENERATING_DOXYGEN_OUTPUT
00453 };
00454
00456 class CONST_ITERATOR {
00457 public:
00459 explicit CONST_ITERATOR (
00460 const GEOCAT *cat = 0
00461 ):
00462 m_cat(cat)
00463 { }
00464
00466 ~CONST_ITERATOR (
00467 );
00468
00470 const RECORD& operator* (
00471 ) const {
00472 return (m_record);
00473 }
00474
00476 const RECORD* operator-> (
00477 ) const {
00478 return (&m_record);
00479 }
00480
00482 CONST_ITERATOR& operator++ (
00483 );
00484
00486 bool operator== (
00487 const CONST_ITERATOR& rhs
00488 ) const {
00489 return (m_cat == rhs.m_cat && (m_itRecObject.Done() == rhs.m_itRecObject.Done() || m_record.GetID() == rhs.m_record.GetID()));
00490 }
00491
00493 bool operator!= (
00494 const CONST_ITERATOR& rhs
00495 ) const {
00496 return (!operator==(rhs));
00497 }
00498
00500 ERRVALUE GetObject (
00501 RVC::OBJITEM& objitem,
00502 bool findnow = false
00503 ) const;
00504
00505 bool IsDone (
00506 ) const { return (m_itRecObject.Done()); }
00507
00510 ERRVALUE ShowProgress (
00511 STATUSCONTEXT& scontext,
00512 UINT16 line = 0
00513 );
00514
00515 private:
00516 #ifndef GENERATING_DOXYGEN_OUTPUT
00517
00518 const GEOCAT* m_cat;
00519 RVC::DBTABLE::CONST_RECORDITERATOR m_itRecObject;
00520 RECORD m_record;
00521
00522 friend class GEOCAT;
00523 #endif // GENERATING_DOXYGEN_OUTPUT
00524 };
00525
00526
00527
00529 static const SPATREF::COORDREFSYS& GetCoordRefSys (
00530 );
00531
00534 GEOCAT (
00535 );
00536
00538 ~GEOCAT (
00539 );
00540
00542 ERRVALUE AddMedia (
00543 const MISTRING& desc
00544 );
00545
00547 ERRVALUE BuildIndex (
00548 );
00549
00551 ERRVALUE Close (
00552 );
00553
00555 ERRVALUE ExcludeFolders (
00556 const FILEPATHLIST& list,
00557 bool AddExcludeFile
00558 );
00559
00561 void GetExcludeFolders (
00562 FILEPATHLIST& list
00563 ) {
00564 list = m_ExcludeList;
00565 }
00566
00568 void GetExcludeAllFolders (
00569 FILEPATHLIST& list
00570 ) {
00571 list = m_ExcludeAllList;
00572 }
00573
00575 const FILEPATH& GetFilePath (
00576 ) const {
00577 return (m_filepath);
00578 }
00579
00580 ERRVALUE GetMediaList (
00581 MISTRINGLIST& list
00582 );
00583
00586 ERRVALUE GetRecord (
00587 UINT32 id,
00588 RECORD& FileRecord
00589 ) const;
00590
00593 ERRVALUE GetRecord (
00594 const MISTRING& filepath,
00595 RECORD& record
00596 ) const;
00597
00598 void GetScanFolders (
00599 FILEPATHLIST& list
00600 ) {
00601 list = m_ScanList;
00602 }
00603
00605 void IteratorBegin (
00606 CONST_ITERATOR& iterator
00607 ) const;
00608
00610 ERRVALUE Make (
00611 const FILEPATH& catalog
00612 );
00613
00618 ERRVALUE Open (
00619 const FILEPATH& catalog,
00620 bool bCreateIfNotFound = false,
00621 bool bOpenForWrite = false
00622 );
00623
00625 ERRVALUE PrescanDirectory (
00626 const FILEPATH& dir,
00627 STATUSCONTEXT& StatusContext,
00628 bool bScanSubDirs = true
00629 ) const;
00630
00634 ERRVALUE Remove (
00635 const FILEPATH& file
00636 );
00637
00639 ERRVALUE Remove (
00640 const RECORD& record
00641 );
00642
00649 ERRVALUE ScanDirectory (
00650 const FILEPATH& dir,
00651 STATUSCONTEXT* StatusContext = 0,
00652 bool bScanSubDirs = true
00653 );
00654
00657 ERRVALUE ScanFile (
00658 const FILEPATH& file
00659 );
00660
00661 ERRVALUE SetScanFolders (
00662 const FILEPATHLIST& list
00663 );
00664
00669 ERRVALUE Write (
00670 RECORD& record
00671 );
00672
00673 private:
00674 #ifndef GENERATING_DOXYGEN_OUTPUT
00675
00676 ERRVALUE ExtractRecord (
00677 const RVC::DBTABLE::RECORD& RecObject,
00678 RECORD& record
00679 ) const;
00680
00681 ERRVALUE Read (
00682 INT32 RecNum,
00683 RECORD& record
00684 ) const;
00685
00686 ERRVALUE Read (
00687 CONST_ITERATOR& it,
00688 RECORD& record
00689 ) const;
00690
00691 ERRVALUE ScanFolder (
00692 RVC::OBJECT& ObjParent
00693 );
00694
00695 ERRVALUE ScanObject (
00696 RVC::OBJECT& Object
00697 );
00698
00699 UINT32 m_OpenCount;
00700 FILE_TEXT m_errorlog;
00701 FILE_TEXT m_scanlog;
00702 FILEPATH m_filepath;
00703 FILEPATH m_lastfilepath;
00704 FILEPATHLIST m_ExcludeList;
00705 FILEPATHLIST m_ExcludeAllList;
00706 FILEPATHLIST m_ScanList;
00707 RVC::DBASE m_ObjDb;
00708 RVC::DBTABLE m_Table;
00709 RVC::DBTABLE m_MediaTable;
00710 RVC::DBTABLE m_ExcludeTable;
00711 RVC::DBTABLE m_ExcludeAllTable;
00712 RVC::DBTABLE m_ScanTable;
00713 bool m_HasNewFields;
00714 bool m_HasError;
00715 mutable RVC::DBTABLE::RECORD m_Record;
00716 mutable RVC::DBTABLE::RECORD m_ExcludeRecord;
00717 mutable RVC::DBTABLE::RECORD m_ExcludeAllRecord;
00718 mutable RVC::DBTABLE::RECORD m_ScanRecord;
00719
00720
00721 GEOCAT (const GEOCAT&);
00722 GEOCAT& operator= (const GEOCAT&);
00723
00725 friend class CONST_ITERATOR;
00726 #endif // GENERATING_DOXYGEN_OUTPUT
00727 };
00728
00729
00730 #endif