Ejemplo n.º 1
0
HRESULT DatenBasisObjekt::DelPBDDataIdent (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());

// Tabelle liegt in einer Datenquelle 
	if (HACTPROJECT != hPr) {
	ErrCode RC = DB(GetIdentDBHandle (pData -> pbdCode, hPr)).DelPBDDataIdent (pData);

		if (EC_OKAY != RC)
			return HRESULT_FROM_ERRCODE(RC);

	// Notifikation rumschicken
		DEXN_FeatureSetModified(pData -> pbdCode);
	} 
	else {
	// KurzText muß gegeben sein
		TX_ASSERT(pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText);

	// übergreifende Objektmenge löschen
	WTRiASObjectsCollection ObjsDefs;

		RETURN_FAILED_HRESULT(m_Prj -> get_ObjectsDefs (ObjsDefs.ppi()));
		RETURN_FAILED_HRESULT(ObjsDefs -> Remove (CComVariant(pData -> pbdKText)));
	}
	return S_OK;
}
Ejemplo n.º 2
0
HRESULT DatenBasisObjekt::ModPBDDataIdent (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());

HRESULT hr = S_OK;

	USES_CONVERSION;
	{
	// wiederauffinden des Objects-Objektes
	WTRiASObjects Objs;

		if (FAILED(GetObjectsFromMap (pData -> pbdCode, Objs))) {
		// Objektklasse existiert nicht, also neu erzeugen
			TX_ASSERT(pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText);	// KurzText muß gegeben sein

		// Objektmenge (Tabelle) muß neu angelegt werden
			if (HACTPROJECT != hPr)	{	// neue Tabelle in einer Datenquelle anlegen
			ErrCode RC = DB(hPr).ModPBDDataIdent (pData);

				return (EC_OKAY == RC) ? S_OK : HRESULT_FROM_ERRCODE(RC);
			}

		// neue übergreifende Objektmenge ggf. erzeugen
			RETURN_FAILED_HRESULT(m_Prj -> get_ObjectsDef (CComVariant(pData -> pbdKText), VARIANT_TRUE, CComBSTR(g_cbNil), Objs.ppi()));

		// das neue Objekt wenigstens von seinem Handle informieren
			if (0 != pData -> pbdCode)
			{
				RETURN_FAILED_HRESULT(Objs -> put_Handle (pData -> pbdCode));
			} 

		// reales, vergebenes Handle zurückliefern
		INT_PTR lHandle = 0;

			RETURN_FAILED_HRESULT(Objs -> get_Handle (&lHandle));
			if (lHandle != pData -> pbdCode) {
				TX_TRACE2("TRiAS: ModPbdDataIdent: Changed IdentHandle %lx -> %lx !", pData -> pbdCode, lHandle);
				pData -> pbdCode = lHandle;

			// Notifikation rumschicken
				DEXN_FeatureSetModified(lHandle);
				return S_FALSE;
			}

		// Notifikation rumschicken
			DEXN_FeatureSetModified(pData -> pbdCode);
		} 
		else {
		// Testen, ob der gegebene Ident zur geforderten Datenquelle paßt
#if defined(_DEBUG)
			if (HACTCONNECTION != hPr) {
			HPROJECT hPrTarget = NULL;

				RETURN_FAILED_HRESULT(GetDatabaseOrProjectHandle (Objs, &hPrTarget));
				TX_ASSERT(hPrTarget == hPr);		// Ident aus anderer Datenquelle ?
			}
#endif // defined(_DEBUG)

		// hier nur neuen KurzText (Namen) einstellen
			if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText)
				RETURN_FAILED_HRESULT(Objs -> put_Name (CComBSTR(pData -> pbdKText)));
		}
	
	// LangText (BeschreibungsInfo) einstellen
		if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) {
			RETURN_FAILED_HRESULT(Objs -> put_Description (CComBSTR(pData -> pbdLText)));
		} else {
			RETURN_FAILED_HRESULT(Objs -> put_Description (CComBSTR(g_cbNil)));
		}
	}
	return hr;
}
Ejemplo n.º 3
0
// Lesen der Metadaten für eine Objektmenge
HRESULT DatenBasisObjekt::GetPBDDataIdent (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());

VARIANT_BOOL fNameIsDefault = VARIANT_TRUE;

	USES_CONVERSION;
	{
	// Objektmenge aus globaler Tabelle lesen
	WTRiASObjects Objs;
	HRESULT hr = S_OK;

		if (FAILED(hr = GetObjectsFromMap (pData -> pbdCode, Objs)))
			return hr;

	// Testen, ob das gefundene Objektmenge zur geforderten Datenquelle paßt
		if (HACTCONNECTION != hPr) {
		HPROJECT hPrTarget = NULL;

			RETURN_FAILED_HRESULT(GetDatabaseOrProjectHandle (Objs, &hPrTarget));
			if (hPrTarget != hPr)			// Ident aus anderer Datenquelle
				return HRESULT_FROM_ERRCODE(WC_NOTFOUND);
		}

	// Namen lesen und in Rückgabestruktur setzen
	CComBSTR bstr;

		RETURN_FAILED_HRESULT(Objs -> get_Name (CLEARED(&bstr)));
		fNameIsDefault = GetPropertyFrom (Objs, g_cbNameIsDefault, VARIANT_TRUE);

	char *pStr = OLE2A(bstr);

		if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) {
			if (pStr) {
			int iLen = strlen (pStr);
			
				iLen = min(iLen, pData -> pbdKTextLen-1);
				strncpy (pData -> pbdKText, pStr, iLen);
				pData -> pbdKText[iLen] = '\0';
				pData -> pbdKTextLen = iLen;
			} else {
				*pData -> pbdKText = '\0';
				pData -> pbdKTextLen = 0;
			}
		} else 
			pData -> pbdKTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern

	// BeschreibungsInfo lesen und in Rückgabestruktur setzen
	CComBSTR bstrLT;

		if (SUCCEEDED(Objs -> get_Description (CLEARED(&bstrLT)))) {
		// möglicherweise wird 'get_Description' nicht unterstützt
		char *pStr = OLE2A(bstrLT);

			if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) {
				if (pStr) {
				int iLen = strlen (pStr);

					iLen = min(iLen, pData -> pbdLTextLen-1);
					strncpy (pData -> pbdLText, pStr, iLen);
					pData -> pbdLText[iLen] = '\0';
					pData -> pbdLTextLen = iLen;
				} else {
					*pData -> pbdLText = '\0';
					pData -> pbdLTextLen = 0;
				}
			} else 
				pData -> pbdLTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern
		} else
			pData -> pbdLTextLen = 0;

	}
	return fNameIsDefault ? S_FALSE : S_OK;
}
Ejemplo n.º 4
0
// Lesen der Metadaten für eine Objektmenge
HRESULT DatenBasisObjekt::GetPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());

VARIANT_BOOL fNameIsDefault = VARIANT_TRUE;

	USES_CONVERSION;
	{
	// wenns ein Ansichtsmerkmal sein soll, dann einfach wieder raus
		if ((sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) &&
			MPViewFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))
		{
			return HRESULT_FROM_ERRCODE(WC_NOTFOUND);
		}

	// Objekteigenschaft aus globaler Tabelle lesen
	WTRiASFeature Feat;
	HRESULT hr = S_OK;

		if (FAILED(hr = GetFeatureFromMap (pData -> pbdCode, Feat)))
			return hr;

	// Testen, ob das gefundene Feature zur geforderten Datenquelle paßt
		if (HACTCONNECTION != hPr) {
		HPROJECT hPrTarget = NULL;

			RETURN_FAILED_HRESULT(GetDatabaseHandle (Feat, &hPrTarget));
			if (hPrTarget != hPr)		// MCode aus anderer Datenquelle
				return HRESULT_FROM_ERRCODE(WC_NOTFOUND);
		}

	// Namen lesen und in Rückgabestruktur setzen
	CComBSTR bstr;

		RETURN_FAILED_HRESULT(Feat -> get_Name (CLEARED(&bstr)));
		fNameIsDefault = GetPropertyFrom (Feat, g_cbNameIsDefault, VARIANT_FALSE);

	char *pStr = OLE2A(bstr);

		if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) {
			if (pStr) {
			int iLen = strlen (pStr);
			
				iLen = min(iLen, pData -> pbdKTextLen-1);
				strncpy (pData -> pbdKText, pStr, iLen);
				pData -> pbdKText[iLen] = '\0';
				pData -> pbdKTextLen = iLen;
			} else {
				*pData -> pbdKText = '\0';
				pData -> pbdKTextLen = 0;
			}
		} else 
			pData -> pbdKTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern

	// BeschreibungsInfo lesen und in Rückgabestruktur setzen
	CComBSTR bstrLT;

		if (SUCCEEDED(Feat -> get_Description (CLEARED(&bstrLT)))) {
		// möglicherweise wird 'get_Description' nicht unterstützt
		char *pStr = OLE2A(bstrLT);

			if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) {
				if (pStr) {
				int iLen = strlen (pStr);

					iLen = min(iLen, pData -> pbdLTextLen-1);
					strncpy (pData -> pbdLText, pStr, iLen);
					pData -> pbdLText[iLen] = '\0';
					pData -> pbdLTextLen = iLen;
				} else {
					*pData -> pbdLText = '\0';
					pData -> pbdLTextLen = 0;
				}
			} else 
				pData -> pbdLTextLen = (NULL != pStr) ? strlen(pStr)+1 : 0;	// benötigte Buffergröße liefern
		} else
			pData -> pbdLTextLen = 0;

	// evtl. zusätzliche Infos liefern
		if (sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) {
		PBDMERKMAL *pPbdM = (PBDMERKMAL *)pData;
		FEATURETYPE rgType = FEATURETYPE_Unknown;

			pPbdM -> ipbdMTyp = 'a';	// Objektmerkmal
			if (SUCCEEDED(Feat -> get_Type (&rgType))) {
			// Typ der Objekteigenschaft festellen
				switch (VT_FROM_DATATYPE(rgType)) {
				case VT_I4:
				case VT_I2:
				case VT_I1:
				case VT_INT:
				case VT_UI4:
				case VT_UI2:
				case VT_UI1:
				case VT_UINT:
				case VT_BOOL:
				case VT_ERROR:
					pPbdM -> ipbdMTyp = 'i';
					break;

				case VT_R4:
				case VT_R8:
				case VT_DATE:
					pPbdM -> ipbdMTyp = 'f';
					break;

				default:
					break;		// VT_BSTR --> 'a'
				}

			// zusätzliche 
				if (rgType & FEATURETYPE_System)
					pPbdM -> ipbdMTyp |= PBDMERKMAL_SYSTEMFLAG;
				if (rgType & FEATURETYPE_ReadOnly)
					pPbdM -> ipbdMTyp |= PBDMERKMAL_READONLY;
			}

		// Platzbedarf der Objekteigenschaft feststellen
		long lLen = 0;

			if (SUCCEEDED(Feat -> get_Length (&lLen))) 
				pPbdM -> ipbdMLen = lLen;
			else
				pPbdM -> ipbdMLen = _MAX_PATH;	// doch recht willkürlich
		}

	} 
	return fNameIsDefault ? S_FALSE : S_OK;
}
Ejemplo n.º 5
0
/////////////////////////////////////////////////////////////////////////////
// Liest ein TextMerkmal für das vorgegebene Objekt
HRESULT GetTextMerkmal (HPROJECT hPr, long lMCode, long lFirst, short iTyp, char **ppMText) 
{
struct vom VOMSatz;
struct mkl MKLSatz;
DB_ADDR dbaVOM(hPr);
DB_ADDR dbaMKL(hPr);
long iLen = 0;
long VOMPrev = 0;       // vorhergehender VOMSatz
long VOMNext;           // nächster Satz
long zvommi = 0;        // Zeiger auf MISatz
long RC;
bool fText = false;

// sicherheitshalber NULL setzen
	VOMNext = 0L;

// TextPointer ausnullen
	*ppMText = NULL;

	if (lFirst == -1L) return S_OK;

	switch (iTyp) {
	case OBL_OLD:		// normales ObjektMerkmal
		{
		struct obl OBLSatz;
		DB_ADDR_OBL dbaOBL(hPr);

		// Objektsatz einlesen
			dbaOBL.rec_no = lFirst;
			__ReadHR (dbaOBL, OBLSatz);

			if (LocGetDBVersion(hPr) < VERSION05000008 && OBLSatz.status & SB_TEXTOBJ)
			// alte DB und Textobjekt
				return S_FALSE;

			if (OBLSatz.status & SB_TEXTOBJIND)
				fText = true;
			VOMNext = OBLSatz.zovom;        // erster Satz
		}
		break;

	case IDL_OLD:		// IdentifikatorMerkmal
		{
			if (LocGetDBVersion(hPr) < VERSION05000007)
				return S_FALSE;		// noch nicht implementiert

		struct idl IDLSatz;
		DB_ADDR_IDL dbaIDL(hPr);

//			dbaIDL.file_no = IDL;
			dbaIDL.rec_no = lFirst;
			__ReadHR (dbaIDL, IDLSatz);

			VOMNext = IDLSatz.zmerki;
		}
		break;

	case SICHT:		// SichtMerkmal
		{
			if (LocGetDBVersion(hPr) < VERSION05000007)
				return S_FALSE;		// noch nicht implementiert

		struct sicht SICHTSatz;
		DB_ADDR dbaSICHT(hPr);

			dbaSICHT.file_no = SICHT;
			dbaSICHT.rec_no = lFirst;
			__ReadHR (dbaSICHT, SICHTSatz);

			VOMNext = SICHTSatz.zmerkm;			
		}
		break;

	default:
		return E_INVALIDARG;
	}

// Verbindungsdatei zu Merkmalen (VOM) lesen und entspr. Satz suchen
	dbaVOM.file_no = VOM;
	dbaMKL.file_no = MKL;
	dbaVOM.rec_no = 0;
	MKLSatz.mk = 0;

	do {
	// VOMSatz lesen
		VOMPrev = dbaVOM.rec_no;
		if ((dbaVOM.rec_no = VOMNext) == 0)
			break;	// Ende der Kette: MCode nicht vorhanden
		__ReadHR (dbaVOM, VOMSatz);

	// MKLSatz lesen
		dbaMKL.rec_no = VOMSatz.zvommk;
		__ReadHR (dbaMKL, MKLSatz);

	// nächster VOMSatz
		VOMNext = VOMSatz.znmk;
	} while (MKLSatz.mk != lMCode);          // bis lMCode gefunden

// wenn für dieses Objekt MCode nicht exitiert: wieder raus mit Warnung
	if (MKLSatz.mk != lMCode)
		return HRESULT_FROM_ERRCODE(WC_NOTFOUND);

// Prüfen, ob MerkmalsTyp stimmt
	if (MKLSatz.typ != 0)	// kein TextMerkmal
		return HRESULT_FROM_ERRCODE(WC_BADMKTYP);

// TextInfo einlesen
	DBASSERTHR (GetTextMerkmalLen (hPr, VOMSatz.zvommi, &iLen));
	if (iLen == 0 || iLen == -1) {
	// entweder kein Text oder Text aus Bezugsobjekt
		if (iTyp != OBL_OLD && SICHT != iTyp && IDL_OLD != iTyp)	// kein ObjektMerkmal
			return HRESULT_FROM_ERRCODE(WC_BADMKTYP);

		ATLTRY(*ppMText = new char [1]);
		if (*ppMText == NULL) 
			return E_OUTOFMEMORY;

		**ppMText = '\0';
		return S_OK;		// leerer TextString gegeben
	} else if (iLen < 0)
		iLen = -iLen;		// indirektes Textobjekt

	iLen = ((iLen + 3) / 4) * 4;	// auf long Grenze aufrunden
	ATLTRY(*ppMText = new char[iLen+1]);
	if (NULL == *ppMText) 
		return E_OUTOFMEMORY;

	memset (*ppMText, '\0', (size_t)(iLen+1));
	DBASSERTHR (GetTextFromDBT (hPr, VOMSatz.zvommi, *ppMText, iLen, fText));
	OemToAnsi (*ppMText, *ppMText);
	return S_OK;
}