Difference between revisions of "Researching XPIDL and IDL Technologies"
(→Built In Types) |
(→Built In Types) |
||
Line 64: | Line 64: | ||
string char* | string char* | ||
wstring PRUnichar* | wstring PRUnichar* | ||
+ | |||
+ | ==== Native Types ==== | ||
+ | |||
+ | It is possible to use native types in XPIDL by declaring then using the native declaration syntax which works similar to a typedef in C++. | ||
+ | A native type can be given a name using the following syntax: | ||
+ | native name(native_type); | ||
+ | Reference and pointer types can be defined by combining [ref] or [ptr] with native languages | ||
+ | |||
+ | XPIDL code Generated C++ | ||
+ | |||
+ | [ref] native nsNativeFileRef(nsFileSpec); | ||
+ | [ptr] native nsNativeFilePtr(nsFileSpec); | ||
+ | |||
+ | interface foo { | ||
+ | void openByRef(in nsNativeFileRef aFileSpecRef); | ||
+ | void openByPtr(in nsNativeFilePtr aFileSpecPtr); | ||
+ | }; | ||
+ | |||
+ | |||
+ | |||
+ | /* starting interface: foo */ | ||
+ | class foo { | ||
+ | public: | ||
+ | |||
+ | /* void openByRef (in nsNativeFileRef aFileSpecRef); */ | ||
+ | NS_IMETHOD OpenByRef(nsFileSpec & aFileSpecRef) = 0; | ||
+ | |||
+ | /* void openByPtr (in nsNativeFilePtr aFileSpecPtr); */ | ||
+ | NS_IMETHOD OpenByPtr(nsFileSpec * aFileSpecPtr) = 0; | ||
+ | }; | ||
+ | |||
+ | Native types in your code can be a good way to migrate existing interfaces. However, using | ||
+ | native types in a method will mean that method is not scriptable. | ||
+ | === Include Terminology === | ||
+ | #include |
Revision as of 12:24, 4 October 2006
Contents
Introduction
XPIDL stands for XP Interface Description Language. It is a specification for XPCOM which is a cross platform adapter description language. An adapter description language is used to describe an adapter which unrelated with its machine language. The description of the adapter can use specialized tools to handle automatoc generation of language that is unrelated to the adapter's specifications. Typically XPIDL is frequently used to generate C++ header files and typelib information.
Language
Interfaces
An interface is declared with the interface keyword, and the simplest possible interface is interface nsToolbar { };
To specify an interface's parent, follow the interface name with a colon and the parent name
interface nsIToolbar : nsIParent { };
Methods
An interface can have both methods and attributes. Attributes are properties of interface objects that can be read and optionally set. The following example - Attributes, properties of interface objects, can be read and optionally set. - This is an example of an interface with one method (no return value, no parameters) named fun and an integer-valued attribute named attr
interface nsIFoo { attribute long attr; void fun(); };
Methods can have any number of in, out or inout parameters, with a variety of types.
In this example many parameters of different types and in an out specifications are seen
interface nsIStringStuff { void findStringLength(in string str, out long l); void concatenateStrings(in string str1, in string str2, out string result); void replaceChar(inout string str, in char from, in char to, in boolean foldCase); };
Attributes can be made read-only, by placing the read-only keyword infront of the the definition
interface nsIThing { readonly attribute string lookButDontTouch; }; C++ get and set methods for attributes are automatically declared for attributes in the interface. For example attribute name foo generates accessor methods GetFoo and SetFoo.
Compiler
The compiler capitalizes method names when generating C++ headers. It supports existing C++ convention in Mozilla, used the InterCaps method naming style. The method name used in XPIDL will appear with the same capitalization to JavaScript, so the best practice is to match JavaScript convention by declaring attributes and method names in InterCaps.
Built In Types
Type C++
void void boolean PRBool octet PRUint8 short PRInt16 long PRInt32 long long PRInt64 unsigned short PRUint16 unsigned long PRUint32 unsigned long long PRUint64 float float double double char char wchar PRUnichar string char* wstring PRUnichar*
Native Types
It is possible to use native types in XPIDL by declaring then using the native declaration syntax which works similar to a typedef in C++. A native type can be given a name using the following syntax: native name(native_type);
Reference and pointer types can be defined by combining [ref] or [ptr] with native languages
XPIDL code Generated C++
[ref] native nsNativeFileRef(nsFileSpec); [ptr] native nsNativeFilePtr(nsFileSpec);
interface foo { void openByRef(in nsNativeFileRef aFileSpecRef); void openByPtr(in nsNativeFilePtr aFileSpecPtr); };
/* starting interface: foo */ class foo { public:
/* void openByRef (in nsNativeFileRef aFileSpecRef); */ NS_IMETHOD OpenByRef(nsFileSpec & aFileSpecRef) = 0;
/* void openByPtr (in nsNativeFilePtr aFileSpecPtr); */ NS_IMETHOD OpenByPtr(nsFileSpec * aFileSpecPtr) = 0; };
Native types in your code can be a good way to migrate existing interfaces. However, using native types in a method will mean that method is not scriptable.
Include Terminology
- include