void OGRGTMDataSource::WriteWaypointStyles() { if( fpOutput != NULL ) { // We have waypoints, thus we need to write the default // waypoint style as defined by the specification if ( numWaypoints != 0) { void* pBuffer = CPLMalloc(35); void* pBufferAux = pBuffer; for (int i = 0; i < 4; ++i) { // height appendInt(pBufferAux, -11); pBufferAux = ((char*)pBufferAux) + 4; // facename size appendUShort(pBufferAux, 5); pBufferAux = ((char*)pBufferAux) + 2; // facename strncpy((char*)pBufferAux, "Arial", 5); pBufferAux = ((char*)pBufferAux) + 5; // dspl appendUChar(pBufferAux, (unsigned char) i); pBufferAux = ((char*)pBufferAux) + 1; // color appendInt(pBufferAux, 0); pBufferAux = ((char*)pBufferAux) + 4; // weight appendInt(pBufferAux, 400); pBufferAux = ((char*)pBufferAux) + 4; // scale1 appendInt(pBufferAux, 0); pBufferAux = ((char*)pBufferAux) + 4; // border appendUChar(pBufferAux, (i != 3) ? 0 : 139); pBufferAux = ((char*)pBufferAux) + 1; // background appendUShort(pBufferAux, (i != 3) ? 0 : 0xFF); pBufferAux = ((char*)pBufferAux) + 2; // backcolor appendInt(pBufferAux, (i != 3) ? 0 : 0xFFFF); pBufferAux = ((char*)pBufferAux) + 4; // italic, underline, strikeout appendInt(pBufferAux, 0); pBufferAux = ((char*)pBufferAux) + 3; // alignment appendUChar(pBufferAux, (i != 3) ? 0 : 1); pBufferAux = pBuffer; VSIFWriteL(pBuffer, 35, 1, fpOutput); } CPLFree(pBuffer); } } }
void GTMTrackLayer::WriteFeatureAttributes( OGRFeature *poFeature ) { char* psztrackname = nullptr; int type = 1; unsigned int color = 0; for (int i = 0; i < poFeatureDefn->GetFieldCount(); ++i) { OGRFieldDefn *poFieldDefn = poFeatureDefn->GetFieldDefn( i ); if( poFeature->IsFieldSetAndNotNull( i ) ) { const char* l_pszName = poFieldDefn->GetNameRef(); /* track name */ if (STARTS_WITH(l_pszName, "name")) { CPLFree(psztrackname); psztrackname = CPLStrdup( poFeature->GetFieldAsString( i ) ); } /* track type */ else if (STARTS_WITH(l_pszName, "type")) { type = poFeature->GetFieldAsInteger( i ); // Check if it is a valid type if (type < 1 || type > 30) type = 1; } /* track color */ else if (STARTS_WITH(l_pszName, "color")) { color = (unsigned int) poFeature->GetFieldAsInteger( i ); if (color > 0xFFFFFF) color = 0xFFFFFFF; } } } if (psztrackname == nullptr) psztrackname = CPLStrdup( "" ); const size_t trackNameLength = strlen(psztrackname); const size_t bufferSize = 14 + trackNameLength; void* pBuffer = CPLMalloc(bufferSize); void* pBufferAux = pBuffer; /* Write track string name size to buffer */ appendUShort(pBufferAux, (unsigned short) trackNameLength); pBufferAux = (char*)pBufferAux + 2; /* Write track name */ memcpy((char*)pBufferAux, psztrackname, trackNameLength); pBufferAux = (char*)pBufferAux + trackNameLength; /* Write track type */ appendUChar(pBufferAux, (unsigned char) type); pBufferAux = (char*)pBufferAux + 1; /* Write track color */ appendInt(pBufferAux, color); pBufferAux = (char*)pBufferAux + 4; /* Write track scale */ appendFloat(pBufferAux, 0); pBufferAux = (char*)pBufferAux + 4; /* Write track label */ appendUChar(pBufferAux, 0); pBufferAux = (char*)pBufferAux + 1; /* Write track layer */ appendUShort(pBufferAux, 0); VSIFWriteL(pBuffer, bufferSize, 1, poDS->getTmpTracksFP()); poDS->incNumTracks(); CPLFree(psztrackname); CPLFree(pBuffer); }
void GTMWaypointLayer::WriteFeatureAttributes( OGRFeature *poFeature, float altitude ) { char psNameField[] = " "; // 10 spaces char* pszcomment = nullptr; int icon = 48; int date = 0; for (int i = 0; i < poFeatureDefn->GetFieldCount(); ++i) { OGRFieldDefn *poFieldDefn = poFeatureDefn->GetFieldDefn( i ); if( poFeature->IsFieldSetAndNotNull( i ) ) { const char* l_pszName = poFieldDefn->GetNameRef(); /* Waypoint name */ if (STARTS_WITH(l_pszName, "name")) { strncpy (psNameField, poFeature->GetFieldAsString( i ), 10); CPLStrlcat (psNameField, " ", sizeof(psNameField)); } /* Waypoint comment */ else if (STARTS_WITH(l_pszName, "comment")) { CPLFree(pszcomment); pszcomment = CPLStrdup( poFeature->GetFieldAsString( i ) ); } /* Waypoint icon */ else if (STARTS_WITH(l_pszName, "icon")) { icon = poFeature->GetFieldAsInteger( i ); // Check if it is a valid icon if (icon < 1 || icon > 220) icon = 48; } /* Waypoint date */ else if (EQUAL(l_pszName, "time")) { struct tm brokendowndate; int year, month, day, hour, min, sec, TZFlag; if (poFeature->GetFieldAsDateTime( i, &year, &month, &day, &hour, &min, &sec, &TZFlag)) { brokendowndate.tm_year = year - 1900; brokendowndate.tm_mon = month - 1; brokendowndate.tm_mday = day; brokendowndate.tm_hour = hour; brokendowndate.tm_min = min; brokendowndate.tm_sec = sec; GIntBig unixTime = CPLYMDHMSToUnixTime(&brokendowndate); if (TZFlag != 0) unixTime -= (TZFlag - 100) * 15; if (unixTime <= GTM_EPOCH || (unixTime - GTM_EPOCH) != (int)(unixTime - GTM_EPOCH)) { CPLError(CE_Warning, CPLE_AppDefined, "%04d/%02d/%02d %02d:%02d:%02d is not a valid datetime for GTM", year, month, day, hour, min, sec); } else { date = (int)(unixTime - GTM_EPOCH); } } } } } if (pszcomment == nullptr) pszcomment = CPLStrdup( "" ); const size_t commentLength = strlen(pszcomment); const size_t bufferSize = 27 + commentLength; void* pBuffer = CPLMalloc(bufferSize); void* pBufferAux = pBuffer; /* Write waypoint name to buffer */ memcpy((char*)pBufferAux, psNameField, 10); /* Write waypoint string comment size to buffer */ pBufferAux = (char*)pBuffer+10; appendUShort(pBufferAux, (unsigned short) commentLength); /* Write waypoint string comment to buffer */ memcpy((char*)pBuffer+12, pszcomment, commentLength); /* Write icon to buffer */ pBufferAux = (char*)pBuffer+12+commentLength; appendUShort(pBufferAux, (unsigned short) icon); /* Write dslp to buffer */ pBufferAux = (char*)pBufferAux + 2; appendUChar(pBufferAux, 3); /* Date */ pBufferAux = (char*)pBufferAux + 1; appendInt(pBufferAux, date); /* wrot */ pBufferAux = (char*)pBufferAux + 4; appendUShort(pBufferAux, 0); /* walt */ pBufferAux = (char*)pBufferAux + 2; appendFloat(pBufferAux, altitude); /* wlayer */ pBufferAux = (char*)pBufferAux + 4; appendUShort(pBufferAux, 0); VSIFWriteL(pBuffer, bufferSize, 1, poDS->getOutputFP()); poDS->incNumWaypoints(); CPLFree(pszcomment); CPLFree(pBuffer); }
void BlrFromMessage::buildBlr(IMessageMetadata* metadata) { if (!metadata) return; LocalStatus st; expectedMessageLength = metadata->getMessageLength(&st); checkStatus(&st); getBlrData().clear(); const unsigned count = metadata->getCount(&st); fb_assert(count < MAX_USHORT / 2); if (count == 0) return; // If there isn't an SQLDA, don't bother with anything else. appendVersion(); appendUChar(blr_begin); appendUChar(blr_message); appendUChar(0); appendUShort(count * 2); unsigned msgLen = 0; for (unsigned i = 0; i < count; ++i) { unsigned dtype = metadata->getType(&st, i) & ~1; checkStatus(&st); unsigned len = metadata->getLength(&st, i); checkStatus(&st); unsigned scale = metadata->getScale(&st, i); checkStatus(&st); unsigned charSet = metadata->getCharSet(&st, i); checkStatus(&st); switch (dtype) { case SQL_VARYING: appendUChar(blr_varying2); appendUShort(charSet); appendUShort(len); dtype = dtype_varying; len += sizeof(USHORT); break; case SQL_TEXT: appendUChar(blr_text2); appendUShort(charSet); appendUShort(len); dtype = dtype_text; break; case SQL_DOUBLE: appendUChar(blr_double); dtype = dtype_double; break; case SQL_FLOAT: appendUChar(blr_float); dtype = dtype_real; break; case SQL_D_FLOAT: appendUChar(blr_d_float); dtype = dtype_d_float; break; case SQL_TYPE_DATE: appendUChar(blr_sql_date); dtype = dtype_sql_date; break; case SQL_TYPE_TIME: appendUChar(blr_sql_time); dtype = dtype_sql_time; break; case SQL_TIMESTAMP: appendUChar(blr_timestamp); dtype = dtype_timestamp; break; case SQL_BLOB: appendUChar(blr_blob2); appendUShort(metadata->getSubType(&st, i)); appendUShort(charSet); dtype = dtype_blob; break; case SQL_ARRAY: appendUChar(blr_quad); appendUChar(0); dtype = dtype_array; break; case SQL_LONG: appendUChar(blr_long); appendUChar(scale); dtype = dtype_long; break; case SQL_SHORT: appendUChar(blr_short); appendUChar(scale); dtype = dtype_short; break; case SQL_INT64: appendUChar(blr_int64); appendUChar(scale); dtype = dtype_int64; break; case SQL_QUAD: appendUChar(blr_quad); appendUChar(scale); dtype = dtype_quad; break; case SQL_BOOLEAN: appendUChar(blr_bool); dtype = dtype_boolean; break; case SQL_NULL: appendUChar(blr_text); appendUShort(len); dtype = dtype_text; break; default: Arg::Gds(isc_dsql_sqlda_value_err).raise(); break; } appendUChar(blr_short); appendUChar(0); unsigned align = type_alignments[dtype]; if (align) msgLen = FB_ALIGN(msgLen, align); msgLen += len; align = type_alignments[dtype_short]; if (align) msgLen = FB_ALIGN(msgLen, align); msgLen += sizeof(SSHORT); } appendUChar(blr_end); appendUChar(blr_eoc); if (expectedMessageLength && msgLen && (expectedMessageLength != msgLen)) { Arg::Gds(isc_wrong_message_length).raise(); } }
int OGRGTMDataSource::Create( const char* pszFilename, CPL_UNUSED char** papszOptions ) { CPLAssert( NULL != pszFilename ); if( fpOutput != NULL ) { CPLAssert( FALSE ); return FALSE; } /* -------------------------------------------------------------------- */ /* Do not override exiting file. */ /* -------------------------------------------------------------------- */ VSIStatBufL sStatBuf; if( VSIStatL( pszFilename, &sStatBuf ) == 0 ) { CPLError(CE_Failure, CPLE_NotSupported, "You have to delete %s before being able to create it with the GTM driver", pszFilename); return FALSE; } /* -------------------------------------------------------------------- */ /* Create the output file. */ /* -------------------------------------------------------------------- */ pszName = CPLStrdup( pszFilename ); fpOutput = VSIFOpenL( pszFilename, "w" ); if( fpOutput == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to create GTM file %s.", pszFilename ); return FALSE; } // Generate a temporary file for Trackpoints const char* pszTmpName = CPLGenerateTempFilename(NULL); pszTmpTrackpoints = CPLStrdup( pszTmpName ); fpTmpTrackpoints = VSIFOpenL(pszTmpName , "w" ); if( fpTmpTrackpoints == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to create temporary file %s.", pszTmpName ); return FALSE; } // Generate a temporary file for Tracks pszTmpName = CPLGenerateTempFilename(NULL); pszTmpTracks = CPLStrdup( pszTmpName ); fpTmpTracks = VSIFOpenL(pszTmpName , "w" ); if( fpTmpTracks == NULL ) { CPLError( CE_Failure, CPLE_OpenFailed, "Failed to create temporary file %s.", pszTmpName ); return FALSE; } /* -------------------------------------------------------------------- */ /* Output header of GTM file. */ /* -------------------------------------------------------------------- */ char* pszBaseFileName = CPLStrdup( CPLGetBasename(pszFilename) ); size_t sizeBuffer = 175 + strlen(pszBaseFileName); void* pBuffer = CPLCalloc(1, sizeBuffer); void* pCurrentPos = pBuffer; // Write version number appendUShort(pCurrentPos, 211); pCurrentPos = ((char*)pCurrentPos) + 2; // Write code strcpy((char*)pCurrentPos, "TrackMaker"); // gradnum pCurrentPos = (char*) pBuffer + 14; appendUChar(pCurrentPos, 8); // bcolor pCurrentPos = (char*) pBuffer + 23; appendInt(pCurrentPos, 0xffffff); // nwptstyles -- We just create the defaults, so four pCurrentPos = (char*) pBuffer + 27; appendInt(pCurrentPos, 4); // gradfont, labelfont pCurrentPos = (char*) pBuffer + 99; for (int i = 0; i < 2; i++) { appendUShort(pCurrentPos, 5); pCurrentPos = ((char*)pCurrentPos) + 2; strcpy((char*)pCurrentPos, "Arial"); pCurrentPos = ((char*)pCurrentPos) + 5; } appendUShort(pCurrentPos, (unsigned short) strlen(pszBaseFileName)); pCurrentPos = ((char*)pCurrentPos) + 2; strcpy((char*)pCurrentPos, pszBaseFileName); // Write ndatum. We are implementing just WGS84, so write the // corresponding value for WGS84. pCurrentPos = ((char*) pBuffer) + 151 + strlen(pszBaseFileName); appendInt(pCurrentPos, 217); VSIFWriteL(pBuffer, sizeBuffer, 1, fpOutput); CPLFree(pszBaseFileName); CPLFree(pBuffer); return TRUE; }