// ********************************************************************** // // Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #ifndef ICEPY_TYPES_H #define ICEPY_TYPES_H #include #include #include #include namespace IcePy { class ExceptionInfo; typedef IceUtil::Handle ExceptionInfoPtr; typedef std::vector ExceptionInfoList; class ClassInfo; typedef IceUtil::Handle ClassInfoPtr; typedef std::vector ClassInfoList; // // This class is raised as an exception when object marshaling needs to be aborted. // class AbortMarshaling { }; typedef std::map ObjectMap; struct PrintObjectHistory { int index; std::map objects; }; // // The delayed nature of class unmarshaling in the Ice protocol requires us to // handle unmarshaling using a callback strategy. An instance of UnmarshalCallback // is supplied to each type's unmarshal() member function. For all types except // classes, the callback is invoked with the unmarshaled value before unmarshal() // returns. For class instances, however, the callback may not be invoked until // the stream's finished() function is called. // class UnmarshalCallback : public IceUtil::Shared { public: virtual ~UnmarshalCallback(); // // The unmarshaled() member function receives the unmarshaled value. The // last two arguments are the values passed to unmarshal() for use by // UnmarshalCallback implementations. // virtual void unmarshaled(PyObject*, PyObject*, void*) = 0; }; typedef IceUtil::Handle UnmarshalCallbackPtr; // // Base class for type information. // class TypeInfo : public UnmarshalCallback { public: virtual std::string getId() const = 0; virtual bool validate(PyObject*) = 0; virtual bool usesClasses(); // Default implementation returns false. virtual void unmarshaled(PyObject*, PyObject*, void*); // Default implementation is assert(false). virtual void destroy(); protected: TypeInfo(); public: // // The marshal and unmarshal functions can raise Ice exceptions, and may raise // AbortMarshaling if an error occurs. // virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0) = 0; virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0) = 0; virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*) = 0; }; typedef IceUtil::Handle TypeInfoPtr; // // Primitive type information. // class PrimitiveInfo : public TypeInfo { public: virtual std::string getId() const; virtual bool validate(PyObject*); virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0); virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*); enum Kind { KindBool, KindByte, KindShort, KindInt, KindLong, KindFloat, KindDouble, KindString }; Kind kind; }; typedef IceUtil::Handle PrimitiveInfoPtr; // // Enum information. // typedef std::vector EnumeratorList; class EnumInfo : public TypeInfo { public: virtual std::string getId() const; virtual bool validate(PyObject*); virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0); virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*); std::string id; EnumeratorList enumerators; PyObjectHandle pythonType; }; typedef IceUtil::Handle EnumInfoPtr; class DataMember : public UnmarshalCallback { public: virtual void unmarshaled(PyObject*, PyObject*, void*); std::string name; std::vector metaData; TypeInfoPtr type; }; typedef IceUtil::Handle DataMemberPtr; typedef std::vector DataMemberList; // // Struct information. // class StructInfo : public TypeInfo { public: virtual std::string getId() const; virtual bool validate(PyObject*); virtual bool usesClasses(); virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0); virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*); virtual void destroy(); std::string id; DataMemberList members; PyObjectHandle pythonType; }; typedef IceUtil::Handle StructInfoPtr; // // Sequence information. // class SequenceInfo : public TypeInfo { public: virtual std::string getId() const; virtual bool validate(PyObject*); virtual bool usesClasses(); virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0); virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*); virtual void destroy(); struct SequenceMapping : public UnmarshalCallback { enum Type { SEQ_DEFAULT, SEQ_TUPLE, SEQ_LIST }; SequenceMapping(Type); SequenceMapping(const Ice::StringSeq&); static bool getType(const Ice::StringSeq&, Type&); virtual void unmarshaled(PyObject*, PyObject*, void*); PyObject* createContainer(int) const; void setItem(PyObject*, int, PyObject*) const; Type type; }; typedef IceUtil::Handle SequenceMappingPtr; std::string id; SequenceMappingPtr mapping; TypeInfoPtr elementType; private: void marshalPrimitiveSequence(const PrimitiveInfoPtr&, PyObject*, const Ice::OutputStreamPtr&); void unmarshalPrimitiveSequence(const PrimitiveInfoPtr&, const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const SequenceMappingPtr&); }; typedef IceUtil::Handle SequenceInfoPtr; // // Dictionary information. // class DictionaryInfo : public TypeInfo { public: virtual std::string getId() const; virtual bool validate(PyObject*); virtual bool usesClasses(); virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0); virtual void unmarshaled(PyObject*, PyObject*, void*); virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*); virtual void destroy(); class KeyCallback : public UnmarshalCallback { public: virtual void unmarshaled(PyObject*, PyObject*, void*); PyObjectHandle key; }; typedef IceUtil::Handle KeyCallbackPtr; std::string id; TypeInfoPtr keyType; TypeInfoPtr valueType; }; typedef IceUtil::Handle DictionaryInfoPtr; typedef std::vector TypeInfoList; class ClassInfo : public TypeInfo { public: virtual std::string getId() const; virtual bool validate(PyObject*); virtual bool usesClasses(); virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0); virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*); virtual void destroy(); void printMembers(PyObject*, IceUtil::Output&, PrintObjectHistory*); std::string id; bool isAbstract; ClassInfoPtr base; ClassInfoList interfaces; DataMemberList members; PyObjectHandle pythonType; PyObjectHandle typeObj; bool defined; }; // // Proxy information. // class ProxyInfo : public TypeInfo { public: virtual std::string getId() const; virtual bool validate(PyObject*); virtual void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*, const Ice::StringSeq* = 0); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, PyObject*, void*, const Ice::StringSeq* = 0); virtual void print(PyObject*, IceUtil::Output&, PrintObjectHistory*); virtual void destroy(); std::string id; PyObjectHandle pythonType; PyObjectHandle typeObj; }; typedef IceUtil::Handle ProxyInfoPtr; // // Exception information. // class ExceptionInfo : public IceUtil::Shared { public: void marshal(PyObject*, const Ice::OutputStreamPtr&, ObjectMap*); PyObject* unmarshal(const Ice::InputStreamPtr&); void print(PyObject*, IceUtil::Output&); void printMembers(PyObject*, IceUtil::Output&, PrintObjectHistory*); std::string id; ExceptionInfoPtr base; DataMemberList members; bool usesClasses; PyObjectHandle pythonType; }; // // ObjectWriter wraps a Python object for marshaling. // class ObjectWriter : public Ice::ObjectWriter { public: ObjectWriter(const ClassInfoPtr&, PyObject*, ObjectMap*); ~ObjectWriter(); virtual void ice_preMarshal(); virtual void write(const Ice::OutputStreamPtr&) const; private: ClassInfoPtr _info; PyObject* _object; ObjectMap* _map; }; // // ObjectReader unmarshals the state of an Ice object. // class ObjectReader : public Ice::ObjectReader { public: ObjectReader(PyObject*, const ClassInfoPtr&); ~ObjectReader(); virtual void ice_postUnmarshal(); virtual void read(const Ice::InputStreamPtr&, bool); virtual ClassInfoPtr getInfo() const; PyObject* getObject() const; // Borrowed reference. private: PyObject* _object; ClassInfoPtr _info; }; typedef IceUtil::Handle ObjectReaderPtr; ClassInfoPtr lookupClassInfo(const std::string&); ExceptionInfoPtr lookupExceptionInfo(const std::string&); bool initTypes(PyObject*); PyObject* createType(const TypeInfoPtr&); TypeInfoPtr getType(PyObject*); PyObject* createException(const ExceptionInfoPtr&); ExceptionInfoPtr getException(PyObject*); } extern "C" PyObject* IcePy_defineEnum(PyObject*, PyObject*); extern "C" PyObject* IcePy_defineStruct(PyObject*, PyObject*); extern "C" PyObject* IcePy_defineSequence(PyObject*, PyObject*); extern "C" PyObject* IcePy_defineDictionary(PyObject*, PyObject*); extern "C" PyObject* IcePy_declareProxy(PyObject*, PyObject*); extern "C" PyObject* IcePy_defineProxy(PyObject*, PyObject*); extern "C" PyObject* IcePy_declareClass(PyObject*, PyObject*); extern "C" PyObject* IcePy_defineClass(PyObject*, PyObject*); extern "C" PyObject* IcePy_defineException(PyObject*, PyObject*); extern "C" PyObject* IcePy_stringify(PyObject*, PyObject*); extern "C" PyObject* IcePy_stringifyException(PyObject*, PyObject*); #endif