/** Convert a TValue from the Delphi RTTI system to a PyObject*. * \param V: The value to convert. * \return New reference to a converted object. * \throw EPyVclError if the conversion fails. */ PyObject* ToPyObject(const Rtti::TValue &V) { Rtti::TValue &Value = const_cast<Rtti::TValue&>(V); if(Value.IsEmpty) Py_RETURN_NONE; switch(Value.Kind) { case tkInteger: return ToPyObject(Value.AsInteger()); case tkUString: case tkString: case tkLString: case tkWString: return ToPyObject(Value.AsString()); case tkEnumeration: { if(AnsiString(Value.TypeInfo->Name) == "Boolean") return ToPyObject(static_cast<bool>(Value.AsOrdinal())); TRttiEnumerationType *Type = static_cast<TRttiEnumerationType*>(Context.GetType(Value.TypeInfo)); int Ordinal = Value.AsOrdinal(); if(Ordinal >= Type->MinValue && Ordinal <= Type->MaxValue) //GetEnumName() lacks range check return ToPyObject(GetEnumName(Value.TypeInfo, Ordinal)); return ToPyObject("0x" + IntToHex(Ordinal, 2)); } case tkClass: return VclObject_Create(Value.AsObject(), false); case tkSet: return ToPyObject(SetToString(Value.TypeInfo, *static_cast<int*>(Value.GetReferenceToRawData()), false)); case tkChar: return ToPyObject(Value.AsType<char>()); case tkWChar: return ToPyObject(Value.AsType<wchar_t>()); case tkFloat: return ToPyObject(Value.AsExtended()); case tkRecord: { void *Data = Value.GetReferenceToRawData(); TRttiType *Type = Context.GetType(Value.TypeInfo); DynamicArray<TRttiField*> Fields = Type->GetFields(); PyObject *Tuple = PyTuple_New(Fields.Length); for(int I = 0; I < Fields.Length; I++) PyTuple_SET_ITEM(Tuple, I, ToPyObject(Fields[I]->GetValue(Data))); return Tuple; } case tkMethod: //Event { TMethod Method; Value.ExtractRawDataNoCopy(&Method); if(Method.Code == NULL) Py_RETURN_NONE; TObject *Object = static_cast<TObject*>(Method.Data); if(TMethodImplementation *Impl = dynamic_cast<TMethodImplementation*>(Object)) { PyObject *Result = static_cast<PyObject*>(Impl->FUserData); Py_IncRef(Result); return Result; } String Name = Object->MethodName(Method.Code); TRttiType *Type = Context.GetType(Object->ClassType()); return VclMethod_Create(NULL, Object, Type->GetMethods(Name)); } case tkInt64: return PyLong_FromLongLong(Value.AsInt64()); case tkVariant: case tkArray: case tkInterface: case tkDynArray: case tkClassRef: case tkPointer: case tkProcedure: case tkUnknown: default: throw EPyVclError("Unable to convert type '" + AnsiString(Value.TypeInfo->Name) + "'"); } }
const CHXCFURL& CHXCFURL::operator =(const CHXString& str) { SetToString((const char *) str); return *this; }
CHXCFURL::CHXCFURL(const CHXString& str) { mCFURLRef = NULL; SetToString((const char *) str); }
const CHXCFURL& CHXCFURL::operator =(const char *pCString) { SetToString(pCString); return *this; }
CHXCFURL::CHXCFURL(const char *pCString) { mCFURLRef = NULL; SetToString(pCString); }