Exemplo n.º 1
0
HRESULT CFastdbFeature::OnChangedName()
{
	USES_CONVERSION;
	COM_TRY {
	// neuen Namen vom Bezugsobjekt besorgen
	CComBSTR bstrName;
	WTRiASFeature BaseFeat;

		THROW_FAILED_HRESULT(m_BaseUnk -> QueryInterface (BaseFeat.ppi()));
		THROW_FAILED_HRESULT(BaseFeat -> get_Name(CLEARED(&bstrName)))

	// zugehöriges DB-Objekt referenzieren
	LONG lCursor (GetPropertyFrom (BaseFeat, g_cbFeatureCursor, 0L));

		if (0 != lCursor) {	// Objekt fertig initialisiert
		dbCursor<CDBFeatureDesc> cursor (GetRelatedDatabase(GetUnknown()), dbCursorForUpdate);
		CDBFeatureDesc *pFeatDesc = cursor.at (dbReference<CDBFeatureDesc>(oid_t(lCursor)));

			if (NULL == pFeatDesc || cursor.isEmpty())
				THROW_FAILED_HRESULT(FASTDB_E_FEATURE_BADREFERENCE);

			cursor -> m_pName = OLE2A(bstrName);
			cursor.update();
		}

	} COM_CATCH;
	return S_OK;
}
Exemplo n.º 2
0
HRESULT DatenBasisObjekt::DelPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());
	TX_ASSERT(NULL == pData -> pbdKText || TIsValidString(pData -> pbdKText));	

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

	TX_ASSERT(sizeof(PBDMERKMALEX) == pData -> dwSize && 0 != ((PBDMERKMALEX *)pData) -> lIdent);							// Ident muß gegeben sein

// Feature entweder über Code oder Namen löschen
CComVariant v;

	if (NULL == pData -> pbdKText) 
		v = pData -> pbdCode;
	else 
		v = pData -> pbdKText;

// Wiederauffinden des Objects-Objektes
WTRiASFeatures Feats;
WTRiASObjects Objs;
INT_PTR lIdent = ((PBDMERKMALEX *)pData) -> lIdent;

	RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs));	// Objektmenge muß existieren
	RETURN_FAILED_HRESULT(Objs -> get_Features (Feats.ppi()));

// erstmal nachsehen, ob das Merkmal existiert
bool fExists = false;

	{
	WTRiASFeature Feat;

		fExists = SUCCEEDED(Feats -> Item(v, Feat.ppi())) ? true : false;
	}
	if (fExists) {
	// nur löschen, wenns wirklich (noch) existiert)	
		RETURN_FAILED_HRESULT(Feats -> Remove (v));

	// Notifikation rumschicken
		DEXN_FeatureSetModified(lIdent);
	}
	return fExists ? S_OK : S_FALSE;	// S_FALSE heißt 'existiert nicht'
}
Exemplo n.º 3
0
HRESULT DatenBasisObjekt::ModPBDDataMerkmal (HPROJECT hPr, PBDDATA *pData)
{
	TX_ASSERT(IsTRiASDBBased());

	USES_CONVERSION;
	{
	bool fForceTypeChange = (MPForceForTRiASDBs & ((PBDMERKMAL *)pData) -> ipbdMTyp) ? true : false;

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

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

		if (FAILED(GetFeatureFromMap (pData -> pbdCode, Feat))) {
			TX_ASSERT(sizeof(PBDMERKMALEX) == pData -> dwSize);		// Ident muß gegeben sein

		// Objekteigenschaft existiert nicht, also neu erzeugen
			TX_ASSERT(pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText);	// KurzText muß gegeben sein

		// wiederauffinden des Objects-Objektes
		WTRiASObjects Objs;
		INT_PTR lIdent = ((PBDMERKMALEX *)pData) -> lIdent;

			if (-1 == lIdent) {
			// wenn Ident nicht gegeben ist dann muß DataSource eine GeoDB sein
				TX_ASSERT(DB(hPr).IsTRiASDataSource());
				lIdent = DEX_GetUnknownIdentEx(hPr);		// den erstbesten verwenden
			}

			RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs));	// Objektmenge muß existieren
			RETURN_FAILED_HRESULT(Objs -> get_Feature (CComVariant(pData -> pbdCode), VARIANT_TRUE, CComBSTR(g_cbNil), Feat.ppi()));

			if (!fForceTypeChange) {
				RETURN_FAILED_HRESULT(Feat -> put_Name (CComBSTR(pData -> pbdKText)));

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

				RETURN_FAILED_HRESULT(Feat -> get_Handle (&lHandle));
				if (lHandle != pData -> pbdCode) {
					TX_TRACE2("TRiAS: ModPbdDataMerkmal: Changed FeatureHandle %lx -> %lx !", pData -> pbdCode, lHandle);
					pData -> pbdCode = lHandle;
				}

			// Notifikation rumschicken
				DEXN_FeatureSetModified(lIdent);
			}
		} 
		else if (!fForceTypeChange || (MPObjectFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))) {
#if defined(_DEBUG)
		// Testen, ob der gegebene MCode zur geforderten Datenquelle paßt
			if (HACTCONNECTION != hPr) {
			HPROJECT hPrTarget = NULL;

				RETURN_FAILED_HRESULT(GetDatabaseOrProjectHandle (Feat, &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(Feat -> put_Name (CComBSTR(pData -> pbdKText)));

		// Notifikation rumschicken
		INT_PTR lIdent = -1L;

			if (sizeof(PBDMERKMALEX) == pData -> dwSize) {
				lIdent = ((PBDMERKMALEX *)pData) -> lIdent;

			// sicherstellen, daß dieser MCode schon zu dem Ident gehört (#HK030111)
				if (-1 != lIdent) {
				// schlimmstenfalls liefert _Add S_FALSE (wenns schon dazugehört)
				WTRiASObjects Objs;
				WTRiASFeatures Feats;
				WTRiASFeature TestFeat;

					RETURN_FAILED_HRESULT(GetObjectsFromMap (lIdent, Objs));	// Objektmenge muß existieren
					RETURN_FAILED_HRESULT(Objs -> get_Features (Feats.ppi()));

					if (pData -> pbdKTextLen > 0 && NULL != pData -> pbdKText) {
					// über den Namen gehts schneller
						if (S_OK != Feats -> Item (CComVariant(pData -> pbdKText), TestFeat.ppi()))
						{
							RETURN_FAILED_HRESULT(Feats -> _Add(Feat));
						}
					}
					else {
					// kein Name gegeben, also Handle verwenden
						if (S_OK != Feats -> Item (CComVariant(pData -> pbdCode), TestFeat.ppi()))
						{
							RETURN_FAILED_HRESULT(Feats -> _Add(Feat));
						}
					}
				}
			}
			DEXN_FeatureSetModified(lIdent);
		}
		
		if (!fForceTypeChange || (MPObjectFeature == (((PBDMERKMAL *)pData) -> ipbdMTyp & 0x7F))) {
		// LangText (BeschreibungsInfo) einstellen
			if (pData -> pbdLTextLen > 0 && NULL != pData -> pbdLText) {
				RETURN_FAILED_HRESULT(Feat -> put_Description (CComBSTR(pData -> pbdLText)));
			} else {
				RETURN_FAILED_HRESULT(Feat -> put_Description (CComBSTR(g_cbNil)));
			}
		}

	// evtl. zusätzliche Infos speichern
		if (sizeof(PBDMERKMAL) == pData -> dwSize || sizeof(PBDMERKMALEX) == pData -> dwSize) {
		PBDMERKMAL *pPbdM = (PBDMERKMAL *)pData;
		FEATURETYPE rgType = FEATURETYPE_Object;	// Objektmerkmal
		
			if (fForceTypeChange) 
				rgType = FEATURETYPE(pPbdM -> ipbdMTyp & 0x7f);	// ggf. neuer Typ

			if (pPbdM -> ipbdMTyp & PBDMERKMAL_SYSTEMFLAG) 
				rgType = FEATURETYPE(rgType | FEATURETYPE_System);
			if (pPbdM -> ipbdMTyp & PBDMERKMAL_READONLY) 
				rgType = FEATURETYPE(rgType | FEATURETYPE_ReadOnly);

			RETURN_FAILED_HRESULT(Feat -> put_Type (rgType));
		}
	}
	return S_OK;
}