mibuso.com

Microsoft Business Solutions online community
It is currently Sun Aug 01, 2010 4:48 am

All times are UTC + 1 hour [ DST ]




Post new topic Reply to topic  [ 22 posts ]  Go to page 1, 2  Next
Author Message
 Post subject: Navision COM interfaces
PostPosted: Wed Feb 18, 2009 10:48 pm 
Offline

Joined: Wed Feb 18, 2009 10:11 pm
Posts: 7
Hi Folks,

I'm currently investigating the Navision COM interfaces which can be accessed from outside Navision.
Søren Nielsen found some interesting information and blogged it on his blog: http://gotcal.com/

His test programs are a bit messy and programmed in C#, I couldn't see what was actually happening in his GotCAL.CSIDEInstaller class. Although most of the functions called are imported from C(++) DLLs C# does some strange magic on them.

I will publish my findings in this forum thread hoping some people find it usefull and maybe provide me with more information.

It seems Navision is advertising an object in the COM running object table. The running object table must fetched by the following API call:
Code: Select all
GetRunningObjectTable(0, &rot);

The rot object contains a method to get an enumerator to enumerate the monikers to the running objects:
Code: Select all
rot->EnumRunning(&enumMoniker);

When Navision is running you'll see three instances with different names but it seems it doesn't matter which one you choose. Weird. You can find the displayname of the moniker by calling:
Code: Select all
CreateBindCtx(0, &bc);
moniker->GetDisplayName(bc, 0, &displayname);

When you've choosen the moniker which you would like to use you can get the object.
Code: Select all
rot->GetObject(moniker, &iunknown);

This object has multiple interfaces:
  • IUnknown
  • IMarshal
  • {00000020-0000-0000-C000-000000000046}
  • {0000013D-0000-0000-C000-000000000046}
  • INSHyperlink
  • INSObjectDesigner
  • INSApplication
  • INSAppBase
  • IConnectionPointContainer
  • ISupportErrorInfo
(I found these by calling QueryInterface and using the interfaces found in the registry)

Now I really hope to find all declarations of these interfaces but for now I've only used the INSObjectDesigner from Søren. The IDL seems to be:
Code: Select all
[object, uuid (50000004-0000-1000-0001-0000836BD2D2)]
interface INSObjectDesigner : IUnknown {
     HRESULT ReadObject([in] int objectType, [in] int objectId, [in] IStream *destination);
     HRESULT ReadObjects([in] LPOLESTR filter, [in] IStream *destination);
     HRESULT WriteObjects([in] IStream *source);
     HRESULT CompileObject([in] int objectType, [in] int objectId);
     HRESULT CompileObjects([in] LPOLESTR filter);
     HRESULT GetServerName([out] LPOLESTR *serverName);
     HRESULT GetDatabaseName([out] LPOLESTR *databaseName);
     HRESULT GetServerType([out] int *serverType);
     HRESULT GetCSIDEVersion([out] LPOLESTR *csideVersion);
     HRESULT GetApplicationVersion([out] LPOLESTR *applicationVersion);
     HRESULT GetCompanyName([out] LPOLESTR *companyName);
}


You can use this class by calling:
Code: Select all
INSObjectDesignerPtr insobjectdesigner;
iunknown->QueryInterface(IID_INSObjectDesigner, (void**)&insobjectdesigner);


When you are using the methods with IStream parameters please note I'll have to rewind (Seek to 0) the IStream. Oh, the IStream can by constructed by calling an API.
Code: Select all
CreateStreamOnHGlobal(NULL, TRUE, &strm);
insobjectdesigner->ReadObject(5, 1, strm);
LARGE_INTEGER li = {0};
strm->Seek(li, STREAM_SEEK_SET, 0);
strm->Read(buf, 100, &cbRead);


As I wrote, I hope this is usefull for someone and if someone has more information please tell me! Especially about the other interfaces.


Top
 Profile E-mail  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Sat Feb 21, 2009 9:23 pm 
Offline

Joined: Wed Feb 18, 2009 10:11 pm
Posts: 7
Update!

I've found a great tool called NDR INSPECTOR (by Vito Plantamura) which extracts the definition of the navision interfaces!
It can be downloaded here: http://www.vitoplantamura.com/index.asp ... rinspector

This is the IDL as far as I know it:
Code: Select all
import "objidl.idl";
[object, uuid (50000004-0000-1000-0001-0000836BD2D2)]
interface INSObjectDesigner : IUnknown {
     HRESULT ReadObject([in] int objectType, [in] int objectId, [in] IStream *destination);
     HRESULT ReadObjects([in] LPOLESTR filter, [in] IStream *destination);
     HRESULT WriteObjects([in] IStream *source);
     HRESULT CompileObject([in] int objectType, [in] int objectId);
     HRESULT CompileObjects([in] LPOLESTR filter);
     HRESULT GetServerName([out] LPOLESTR *serverName);
     HRESULT GetDatabaseName([out] LPOLESTR *databaseName);
     HRESULT GetServerType([out] int *serverType);
     HRESULT GetCSIDEVersion([out] LPOLESTR *csideVersion);
     HRESULT GetApplicationVersion([out] LPOLESTR *applicationVersion);
     HRESULT GetCompanyName([out] LPOLESTR *companyName);
}
interface INSRec;
[object, uuid (50000004-0000-1000-0011-0000836BD2D2)]
interface INSCallbackEnum : IUnknown {
     HRESULT proc3([in] INSRec *a);
     HRESULT proc4([in] int a, [in] LPOLESTR b, [in] LPOLESTR c);
     HRESULT proc5([in] int a, [in] LPOLESTR b);
     HRESULT proc6([in] int a, [in] LPOLESTR b);
     HRESULT proc7([in] int a, [in] LPOLESTR b, [in] LPOLESTR c, [in] LPOLESTR d, [in] int e, [in] int f);
}
[object, uuid (50000004-0000-1000-0007-0000836BD2D2)]
interface INSRec : IUnknown {
     HRESULT proc3([in] int a, [in] LPOLESTR b, [in] int c);
     HRESULT proc4([in] int a, [out] LPOLESTR *b);
     HRESULT proc5([in] INSCallbackEnum *a);
}
[object, uuid (50000004-0000-1000-0006-0000836BD2D2)]
interface INSTable : IUnknown {
     HRESULT proc3([in] INSRec *a);
     HRESULT proc4([in] INSRec *a);
     HRESULT proc5([in] INSRec *a);
     HRESULT proc6([out] INSRec **a);
     HRESULT proc7([in] int a, [in] LPOLESTR *b);
     HRESULT proc8([in] INSCallbackEnum *a);
     HRESULT proc9([in] INSCallbackEnum *a);
     HRESULT proc10([in] INSCallbackEnum *a, [in] int b);
     HRESULT proc11([in] INSRec *a);
     HRESULT GetID([out] int *a);
     HRESULT proc13([out] int *a);
}
[object, uuid (50000004-0000-1000-0010-0000836BD2D2)]
interface INSAppBase : IUnknown {
     HRESULT GetTable([in] int a, [out] INSTable **b);
     HRESULT GetInfo([out] LPOLESTR *a, [out] LPOLESTR *databasename, [out] LPOLESTR *company, [out] LPOLESTR *d);
     HRESULT proc5(void);
     HRESULT proc6([in] int a);
     HRESULT proc7([in] INSCallbackEnum *a, [in] int b);
}
[object, uuid (50000004-0000-1000-0000-0000836BD2D2)]
interface INSHyperlink : IUnknown {
     HRESULT Open([in] LPOLESTR link);
     HRESULT proc4([out] int *a);
}
[object, uuid (50000004-0000-1000-0008-0000836BD2D2)]
interface INSMenuButton : IUnknown {
     HRESULT proc3([in] LPOLESTR a);
     HRESULT proc4([in] int a, [in] LPOLESTR b, [in] LPOLESTR c);
}
[object, uuid (50000004-0000-1000-0003-0000836BD2D2)]
interface INSForm : IUnknown {
     HRESULT proc3([out] LPOLESTR *a);
     HRESULT proc4([out] LPOLESTR *a);
     HRESULT proc5([out] INSRec **a);
     HRESULT proc6([out] INSTable **a);
     HRESULT proc7([out] int **a);
     HRESULT proc8([out] INSMenuButton **a);
     HRESULT proc9(void);
}
[object, uuid (50000004-0000-1000-0002-0000836BD2D2)]
interface INSApplication : IUnknown {
     HRESULT GetForm([out] INSForm **form);
}


notes:
- GetForm returns a null pointer in form
- I haven't made an implementation of INSCallbackEnum yet so I couldn't test it
- INSHyperlink->proc4 returns a large (constant) number, I don't know what it is.
- The first and last parameter of INSAppBase are empty in my current setup


Top
 Profile E-mail  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Mon Mar 02, 2009 6:26 am 
Offline

Joined: Fri Nov 17, 2000 8:01 am
Posts: 20
Location: California, USA
Country: United States (us)
Great news. Love the tool from VitoPlantamura's site. Thanks for the update.


Top
 Profile E-mail WWW  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Sun Mar 08, 2009 8:19 am 
Offline

Joined: Sun Dec 10, 2006 9:21 am
Posts: 76
Location: Bayreuth
Country: Germany (de)
meeuw wrote:
When Navision is running you'll see three instances with different names but it seems it doesn't matter which one you choose. Weird.

Each of the three instances belongs to the application, the database and the company respectively. Try to start the client without opening a company or a database, respectively and you will find only 2 or 1 instance, respectively. You can also guess that from the DisplayName of the moniker.


Top
 Profile  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Thu Mar 19, 2009 4:08 pm 
Offline

Joined: Sun Dec 10, 2006 9:21 am
Posts: 76
Location: Bayreuth
Country: Germany (de)
Recently I investigated the INSApplication interface and discovered some nice possiblities. Through the INSRec interface you can retrieve the value of any field of the record, which is shown in the client's currently active form (may be with INSEnumCallback it is possible to step through all open forms, but I 've got no idea how...). As there is no typelib information available, you have to implement the interfaces in the usual way (be aware that the names of the methods are not official in any way) - here is the declaration for C#:
Code: Select all
    [ComImport, Guid("50000004-0000-1000-0001-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface INSObjectDesigner
    {
        int ReadObject([In] int objectType, [In] int objectId, [In] IStream destination);
        int ReadObjects([In] String filter, [In] IStream destination);
        int WriteObjects([In] IStream source);
        int CompileObject([In] int objectType, [In] int objectId);
        int CompileObjects([In] String filter);
        int GetServerName(out String serverName);
        int GetDatabaseName(out String databaseName);  // gets database folder and name
        int GetServerType(out int serverType);   // 1=SQL, 2=Classic
        int GetCSIDEVersion(out String csideVersion);  // "DE 5.0 SP1", "DE 6.00", etc.
        int GetApplicationVersion(out String applicationVersion);  // "DE Dynamics NAV 5.0 SP1", "DE Dynamics NAV 6.0", etc.
        int GetCompanyName(out String companyName);
    }
   
    [ComImport, Guid("50000004-0000-1000-0011-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSCallbackEnum
    {
        int proc3([In,MarshalAs(UnmanagedType.Interface)] INSRec a);
        int proc4([In] int a, [In] string b, [In] string c);
        int proc5([In] int a, [In] string b);
        int proc6([In] int a, [In] string b);
        int proc7([In] int a, [In] string b, [In] string c, [In] string d, [In] int e, [In] int f);
    }

    [ComImport, Guid("50000004-0000-1000-0007-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSRec
    {
        int proc3([In] int a, [In] String b, [In] int c);
        int GetFieldValue([In] int a, out String b);
        int proc5([In,MarshalAs(UnmanagedType.Interface)] INSCallbackEnum a);
    }

    [ComImport, Guid("50000004-0000-1000-0006-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSTable
    {
        int proc3([In, MarshalAs(UnmanagedType.Interface)] INSRec a);
        int proc4([In, MarshalAs(UnmanagedType.Interface)] INSRec a);
        int proc5([In, MarshalAs(UnmanagedType.Interface)] INSRec a);
        int proc6([Out, MarshalAs(UnmanagedType.Interface)] out INSRec a);
        int proc7([In] int a, [In] string b);
        int proc8([In,MarshalAs(UnmanagedType.Interface)] INSCallbackEnum a);
        int proc9([In,MarshalAs(UnmanagedType.Interface)] INSCallbackEnum a);
        int proc10([In,MarshalAs(UnmanagedType.Interface)] INSCallbackEnum a, [In] int b);
        int proc11([In,MarshalAs(UnmanagedType.Interface)] INSRec a);
        int GetID(out int a);
        int proc13(out int a);
    }

    [ComImport, Guid("50000004-0000-1000-0010-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSAppBase
    {
        int GetTable([In] int a, [Out,MarshalAs(UnmanagedType.Interface)] out INSTable b);
        int GetInfos(out string a, out string databasename, out string company, out string d);
        int proc5();
        int proc6([In] int a);
        int proc7([In] string a);
        int proc8([In, MarshalAs(UnmanagedType.Interface)] INSCallbackEnum a, [In] int b);
    }

    [ComImport, Guid("50000004-0000-1000-0000-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSHyperlink
    {
        int Open([In] string link);
        int proc4(out int a);
    }

    [ComImport, Guid("50000004-0000-1000-0008-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSMenuButton
    {
        int proc3([In] string a);
        int proc4([In] int a, [In] string b, [In] string c);
    }

    [ComImport, Guid("50000004-0000-1000-0003-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSForm
    {
        int GetHyperlink(out String a);        // gets Hyperlink with Fieldcaptions
        int GetID(out String a);               // gets active object's type (Form) and ID
        int GetRec([Out,MarshalAs(UnmanagedType.Interface)] out INSRec a);
        int GetTable([Out, MarshalAs(UnmanagedType.Interface)] out INSTable a);
        int GetLanguageID(out int a);          // gets Language ID of application (1033, etc.)
        int proc8([Out, MarshalAs(UnmanagedType.Interface)] out INSMenuButton a);
        int proc9();
    }

    [ComImport, Guid("50000004-0000-1000-0002-0000836BD2D2"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    internal interface INSApplication
    {
        int GetForm([Out,MarshalAs(UnmanagedType.Interface)] out INSForm form);
    }


A new concept in the whole discussion is the MarshalAs directive, which permits the use of complex data types within COM Interop.
Note also that the declaration of the interfaces is sufficient. We don't have to declare any COM coclasses because we are not creating new objects (NAV client must be already running).
Here is a (minimal) sample C#-code-snippet which retrieves the value of field no. 2 (Name) for the open Customer Card. Note that the customer card has to be opened and should be activated.
Code: Select all
INSApplication IA = (INSApplication)RunningObjectTable.GetRunningCOMObjectByName("!C/SIDE!navision://client/run?");
INSForm IF;
IA.GetForm(out IF);
INSRec IR;
IF.GetRec(out IR);
String str;
IR.GetFieldValue(2, out str);
System.Console.WriteLine(str);

The RunningObjectTable.GetRunnigCOMObjectByName function can be found here:
http://www.mycsharp.de/wbb2/thread.php?threadid=36340
During my tests, I had a problem that every now and then the customer card was not the active form. In this case IF == null is returned and you will encounter a System.NullReferenceExeption in the above code. To get the customer card the active form, just switch to the NAV client and move the customer card around (do not work in full screen modus) in order to make it the active form (it is not sufficient to just click into the card form).


Last edited by gerdhuebner on Fri Mar 20, 2009 10:33 am, edited 1 time in total.

Top
 Profile  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Thu Mar 19, 2009 9:40 pm 
Offline

Joined: Wed Feb 18, 2009 10:11 pm
Posts: 7
great work gerdhuebner thanks a lot for sharing!

INSApplication.GetForm returned only 0 for me, did you do something special in Navision (open a certain form or something like that?)


Top
 Profile E-mail  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Fri Mar 20, 2009 10:14 am 
Offline

Joined: Sun Dec 10, 2006 9:21 am
Posts: 76
Location: Bayreuth
Country: Germany (de)
meeuw wrote:
INSApplication.GetForm returned only 0 for me, did you do something special in Navision (open a certain form or something like that?)

Well, as I mentioned above, in certain cases IF == null (in the sample code above), but meanwhile I think that this method is mainly useful, if you have opened the form before with the INSHyperlink.Open method.
The following code worked for me in all cases. All you have to do is to start NAV Client and open a company (not even a form).
Code: Select all
INSApplication IA = (INSApplication)RunningObjectTable.GetRunningCOMObjectByName("!C/SIDE!navision://client/run?");
INSHyperlink IH = (INSHyperlink)IA; 
IH.Open("navision://client/run?target=Form%2021");    // open Form21, Customer Card
INSForm IF;
IA.GetForm(out IF);
INSRec IR;
IF.GetRec(out IR);
String str;
IR.GetFieldValue(2, out str);         // get value of Field2, Name
System.Console.WriteLine(str);

With the INSHyperlink.Open method you can open an arbitrary form showing an arbitrary record (just create a Link for an open form with the Edit, "Copy Link" from the main menu of NAV, paste this link into a texteditor and customize it - for some reason the direct paste into the visual studio editor doesn't work for me).
With that method you can draw arbitrary data from NAV Client (supposed you have got a form in NAV Client).
It would be nice however, if there would be a possibility to close the form again after use... - as a workaround one can use OnTimer trigger with Currform.Close to close the form automatically after 1 sec, e. g.

Note that the data retrieved with the INSRec.GetFieldValue method can be manipulated within the form. It seems to be that the Rec variable of the form is used to get the field data. But the fields of Rec can be set manually in the OnAfterGetCurrRecord trigger of the form, e. g.
So unfortunately this method cannot be used to retrieve for example the license no. of the NAV license from the virtual "License Information" table 2000000040 in a safe way...


Top
 Profile  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Mon May 11, 2009 12:25 pm 
Offline

Joined: Fri Feb 28, 2003 5:53 pm
Posts: 264
Location: Dordrecht
Country: Netherlands (nl)
Argh! great topic!

I'm trying to make an alternative object designer.

Anyone knows how to implement the new/design/run buttons maybe using one of these interfaces? If we would now that we could build a much better object designer with many more functions.

_________________
In a world without Borders or Fences, who needs Windows and Gates?


Top
 Profile E-mail  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Mon May 11, 2009 12:38 pm 
Offline
MVP Microsoft Dynamics NAV
mibuso.conference Attendee

Joined: Thu Oct 16, 2003 8:50 am
Posts: 10313
Location: Brno
Country: Czech Republic (cz)
And why you want to do that, when the current designer is going to be changed? ;-)

_________________
Kamil Sacek
MVP - Dynamics NAV
My BLOG


Top
 Profile E-mail WWW  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Mon May 11, 2009 12:44 pm 
Offline

Joined: Fri Feb 28, 2003 5:53 pm
Posts: 264
Location: Dordrecht
Country: Netherlands (nl)
gerdhuebner wrote:
It would be nice however, if there would be a possibility to close the form again after use... - as a workaround one can use OnTimer trigger with Currform.Close to close the form automatically after 1 sec, e. g.


The INSHyperlink interface Open returns an integer value.
What happens if you pass this returned value into the Proc4 function of the same inteface? The first parameter also accepts an integer.

_________________
In a world without Borders or Fences, who needs Windows and Gates?


Top
 Profile E-mail  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Mon May 11, 2009 5:24 pm 
Offline

Joined: Sun Dec 10, 2006 9:21 am
Posts: 76
Location: Bayreuth
Country: Germany (de)
janpieter wrote:
...What happens if you pass this returned value into the Proc4 function of the same inteface? ...

Well, I never tried it out... - but, by the way, if you are developing a new object designer, don't forget a function to filter out only the objects that are different (newer/older) than already existing objects. This is, I think, the most urgent issue to be improved.
Concerning the COM Interface for objects, etc. I would be mainly interested in a way to retrieve the actual NAV license no. from a running client (like the info that is displayed, if one clicks Extra/License Information), because this would allow something like a copy protection for addon components like COM automation servers, or OCXs, etc.) - this information cannot in general be found in the license file of the client, because the NAV license file (fin.flf) need only to be on the NAV server or in the SQL database, respectively, so the information can only be retrieved from a running NAV client process...


Top
 Profile  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Mon May 11, 2009 5:38 pm 
Offline

Joined: Fri Feb 28, 2003 5:53 pm
Posts: 264
Location: Dordrecht
Country: Netherlands (nl)
gerdhuebner wrote:
Well, I never tried it out... - but, by the way, if you are developing a new object designer, don't forget a function to filter out only the objects that are different (newer/older) than already existing objects. This is, I think, the most urgent issue to be improved.


The system will connect to a kind of 'source safe' environment. Will be much more advanced then this. And what to think of extra long version list codes?? ;) A lot more features then you can currently imagine.

gerdhuebner wrote:
Concerning the COM Interface for objects, etc. I would be mainly interested in a way to retrieve the actual NAV license no. from a running client (like the info that is displayed, if one clicks Extra/License Information), because this would allow something like a copy protection for addon components like COM automation servers, or OCXs, etc.) - this information cannot in general be found in the license file of the client, because the NAV license file (fin.flf) need only to be on the NAV server or in the SQL database, respectively, so the information can only be retrieved from a running NAV client process...


I gues the SERIALNUMBER C/AL instruction isn't good enough :). Maybe C/Front has a function? The function might be hidden somewhere in those interfaces.

Maybe it is a good idea to create a DLL that supports the interface we have now with just the Proc functions, put it in downloads of Mibuso so everyone interested can start testing those functions and see what they do and post there findings in the download topic?? With all gathered knowledge we can create a more programmer friendly DLL. Who knows what extra possibilities come available.

Has someone created something like this already??

_________________
In a world without Borders or Fences, who needs Windows and Gates?


Top
 Profile E-mail  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Thu Jul 09, 2009 10:13 pm 
Offline

Joined: Fri Jul 18, 2008 12:44 pm
Posts: 4
Location: Varna, Bulgaria
Country: Bulgaria (bg)
INSHyperlink.proc4(out int a) returns the handle of the main Navision window.
so proc4 could be renamed to GetNavWindow, GetNavWindowHandle or something like that.

by the way, great investigation!


Top
 Profile  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Tue Jul 14, 2009 10:52 am 
Offline

Joined: Fri Feb 28, 2003 5:53 pm
Posts: 264
Location: Dordrecht
Country: Netherlands (nl)
roumenf wrote:
INSHyperlink.proc4(out int a) returns the handle of the main Navision window.
so proc4 could be renamed to GetNavWindow, GetNavWindowHandle or something like that.


Nice work. :thumbsup: =D> I already had my own function for this, although i have had an ocasion where this function did not prove relaible. So i think i'm going to replace the function with this one in the future.


More functions please !! :)

_________________
In a world without Borders or Fences, who needs Windows and Gates?


Top
 Profile E-mail  
 
 Post subject: Re: Navision COM interfaces
PostPosted: Thu Jul 16, 2009 3:33 pm 
Offline

Joined: Fri Jul 18, 2008 12:44 pm
Posts: 4
Location: Varna, Bulgaria
Country: Bulgaria (bg)
on the next page..


Last edited by roumenf on Mon Jul 27, 2009 10:27 am, edited 1 time in total.

Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 22 posts ]  Go to page 1, 2  Next

All times are UTC + 1 hour [ DST ]


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum


Search for:
Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group