vcl4php-developers Mailing List for VCL for PHP (Page 5)
Brought to you by:
ttm
You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
(63) |
May
(29) |
Jun
(135) |
Jul
(36) |
Aug
(15) |
Sep
(30) |
Oct
|
Nov
(6) |
Dec
(2) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
|
Feb
(1) |
Mar
(3) |
Apr
|
May
(2) |
Jun
(3) |
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
(9) |
Dec
(15) |
2009 |
Jan
(2) |
Feb
(4) |
Mar
(2) |
Apr
|
May
(8) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
From: Jonathan B. <co...@jo...> - 2007-08-03 14:05:51
|
In the latest revision (not sure about any earlier, haven't tested), there seems to be a bug with streaming. See the attached bug example 7z file to demonstrate the problem. (I'm using 7z because SF doesn't like zip files) Judging from debugging logs, what happens is that the Query1 located on unit2.php stores its Database property as "Database1", when in actual fact, the database component is located on Unit19, a DBModule. My fix for the issue was as follows: classes.inc.php, lines 756 to 769: if (is_object($propvalue)) { if ($propvalue->inheritsFrom('Component')) { if( $propvalue->owner ) $propvalue = $propvalue->owner->_name . '.' . $propvalue->_name; else $propvalue = $propvalue->_name; } else if ($propvalue->inheritsFrom('Persistent')) { $propvalue->serialize(); } } Basically it stores the name of the component's owner as well, so that when reading the session, the correct component will be determined by fixupProperty. Jon |
From: qadram s. <su...@qa...> - 2007-08-01 10:29:33
|
Hello, We are going to start the process of polishing all the components of the VCL for PHP as I told you on a previous message, you can find more info here: http://www.qadram.com/vcl4php/wiki/index.php/Development You can freely modify those pages, but if possible, please, comment here first. Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: qadram s. <su...@qa...> - 2007-07-31 10:50:27
|
Hello, We have finally finished the test framework, of course, many things still can be tested, so I invite you run the test framework and post here any questions you have so we complete the documentation for it: http://www.qadram.com/vcl4php/wiki/index.php/Contributors_guide#Steps_needed_to_run_the_VCL_for_PHP_tests Now is time to start addressing open issues and as we have several sources for them, this is the process we are going to follow for each and every component on the library, suggestions are welcome: *Fix existing issues: --------------------- -Check reports on SourceForge http://sourceforge.net/tracker/?group_id=189419&atid=929250 -Check reports on QC http://qc.codegear.com/wc/qcmain.aspx?da=5283 -Check reports on RAID (CodeGear internal system) And fix every open report for that component. *Complete missing functionality: -------------------------------- -Check the Delphi for Windows component to get a list of existing features on Windows that can be ported to the web and add such functionalities -Get your suggestions on SourceForge/QC/RAID/Forum to add such functionalities to the component *Ensure the design-time interface is complete -Check all properties are properly handled by the IDE and all property editors are assigned and working well -Add new property editors when required *Check deployment ----------------- -Check all RegisterAssets to ensure component deploys correctly: http://www.qadram.com/vcl4php/wiki/index.php/CWG:Deployment We are going to automate also this part *Write samples -------------- -Write, at least, one sample for each component, to be used not only as sample, but for testing *Write tests ------------ -New features will require new tests on the test framework, so write them *Document --------- -Document every property/method/event using the following schema Short description (1 line) Long Description (2 lines minimum) Sample code (if it's worth) See also (if it's worth) Links (if it's worth) So you can help us in a lot of ways: -You can be assigned to be responsible for an specific component -You can comment on this message and suggest tools we can use to automate testing, stress tests, etc -You can comment on documentation format (we are going to follow Delphi 7 for Windows schema) -You can write tests, or send test cases to be included on the test framework -You can report features you want to get implemented -You can send patches for fixing issues And in any way you can think of, all the work is going to be coordinated through the mailing list, that is, all the communication will be done through this list, so you will get what is going on. Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: Jonathan B. <co...@jo...> - 2007-07-25 22:35:14
|
> But we still need to make more tests, for example, with float > properties, as the formatting and casting to string maybe is a problem. Found a place where the casting to string does not work: Arrays. For example, the default value for the ComboBox::Items is an array, and the cast to string breaks the Items storage. It seems like we need to come up with a powerful and fast comparison routine. Jon |
From: Jonathan B. <co...@jo...> - 2007-07-25 22:20:40
|
I've just noticed that in Rev 76 of the VCL, my optimized version of readNamePath was reverted to the slower version, to fix a problem with inherited pages. Can I get a test-case for this inherited page problem so I can fix the optimized version, and re-submit? readNamePath was definitely a slow part of the VCL, so going back to this old design is not a good idea IMO. Jon |
From: qadram s. <su...@qa...> - 2007-07-20 07:08:30
|
Jonathan Benedicto escribió: > There is a problem with streaming the Layer property of components in > the VCL. Basically, when the VCL is serializing, it only serializes > properties that are different to the default property value. This is > handled by a simple if ($defvalue == $propvalue) statement. However, the > comparison seems to fail for the Layer property because when PHP > compares the default Layer value of 0 (an integer) to a string value, it > casts the string value to an integer, which generally results in 0. This > means that the Layer property does not get streamed. > > This patch fixes this bug by casting both values to the string type. That problem was reported on sourceforge: http://sourceforge.net/tracker/index.php?func=detail&aid=1751754&group_id=189419&atid=929250 But we still need to make more tests, for example, with float properties, as the formatting and casting to string maybe is a problem. Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: Jonathan B. <co...@jo...> - 2007-07-19 23:26:38
|
There is a problem with streaming the Layer property of components in the VCL. Basically, when the VCL is serializing, it only serializes properties that are different to the default property value. This is handled by a simple if ($defvalue == $propvalue) statement. However, the comparison seems to fail for the Layer property because when PHP compares the default Layer value of 0 (an integer) to a string value, it casts the string value to an integer, which generally results in 0. This means that the Layer property does not get streamed. This patch fixes this bug by casting both values to the string type. Jon |
From: Jonathan B. <co...@jo...> - 2007-07-11 15:33:56
|
There is a bug in the latest VCL, my fault, it is part of the optimized code, that causes some problems in the Delphi For PHP IDE if components require another component to render. Basically, the insertcomponent function in Component was not updating the _childnames array to reflect the new component. I've attached a fix for this bug. Jon |
From: Jonathan B. <co...@jo...> - 2007-07-11 15:29:11
|
Because, IMO, the EPropertyNotFound exception message was not very clear and the callstack sometimes does not give the line # and file where the error originated from, I've made some changes. It now looks like: Application raised an exception class EPropertyNotFound with message 'Trying to access non-existant property Unit176->JTScrollBox1 in unit176.php, line 15.' I also changed the "." to "->" because PHP uses the -> operator, so the period was just confusing. Jon |
From: Jonathan B. <co...@jo...> - 2007-07-07 19:03:01
|
This patch fixes some serialization problems with named components that do not have a parent. For example: - A Query is a named component but does not have a parent. 1. Create a new page, drop a Query and a button on the form, and in the button's OnClick event add: $this->Query1->Close(); 2. Run the app, and click the button. 3. Wait for the page to reload, and click the button again. You'll get: Fatal error: Call to a member function Close() on a non-object in C:\Users\Jonathan\Documents\Delphi for PHP Projects\unit165.php on line 17 This patch fixes this problem. Jon |
From: qadram s. <su...@qa...> - 2007-07-06 23:31:55
|
FrozenDice escribió: > Well the problem isn't really objects as of now. For example on the > onBody I have an echo that echos some html, since I can't find any > other way to manually insert some html that I need. The problem is > that when I do an ajax query I get back <div style="...>ajax response. > Obviously this makes a bad response so it can't be processed. See > why I'm having a problem with this implementation? If that's the case, any implementation will work for you, that is, what you need is to call a different script, not this one, as the ajax response will always contain extra code you don't need, so the solution for you right now is to use xajax in the traditional way and call another .php script. Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: FrozenDice <fro...@gm...> - 2007-07-05 16:16:42
|
> Message: 3 > Date: Wed, 04 Jul 2007 10:39:38 +0200 > From: qadram support <su...@qa...> > Subject: Re: [vcl4php-developers] Bad Ajax Response - getting page > To: vcl...@li... > Message-ID: <468...@qa...> > Content-Type: text/plain; charset=ISO-8859-1; format=flowed > > FrozenDice escribi?: > > My problem is I have an application that uses the onCreate of the > > form, and lots of other server side events, unfortunately these ALL > > GET CALLED. What was CodeGear thinking when they implemented xajax > > like this? > We where thinking in making things as simple as possible. > > Why are all events called and objects created? Because if the working > code in your ajax procedure needs to use these objects, all of them must > be available to the application, in the same state they were left, > that's the way it should be done. > > On the other hand, if you want a faster ajax call and you are not going > to need any of these objects and you just want a basic procedure called, > you can use the xajax library included and craft the call by yourself, > but that is PHP coding. > > > Workarounds? Ideas? > What we can do is to add another parameter to the ajaxCall method, which > doesn't perform this, that is, when is true, then it just calls an > specific method of the class, but objects won't be created, nor events > called. What do you think? > > Regards > -- > Jos? Le?n > qadram software Well the problem isn't really objects as of now. For example on the onBody I have an echo that echos some html, since I can't find any other way to manually insert some html that I need. The problem is that when I do an ajax query I get back <div style="...>ajax response. Obviously this makes a bad response so it can't be processed. See why I'm having a problem with this implementation? - Dan |
From: qadram s. <su...@qa...> - 2007-07-05 08:58:25
|
Tiago Lima Trinidad escribió: > Hi, > Glad to see that you and your company are having success, specially with > such a good project. > begin;// self promotion > BTW, aren't you interested in hiring Delphi/D4PHP programming people > here in Brazil with fluent Spanish?! > end; // self promotion The goal is first to expand the group of people here dedicated to the project and after that, if we see contributors that send nice contributions, promote the finishing of certain features by contracting them per-feature, that is, a closed quote to perform specific tasks. By the way, I was talking two weeks ago with Andreano Lanusse from CodeGear about the great PHP developers in Brazil ;-) Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: Tiago L. T. <ti...@la...> - 2007-07-04 19:49:58
|
Hi, Glad to see that you and your company are having success, specially with such a good project. begin;// self promotion BTW, aren't you interested in hiring Delphi/D4PHP programming people here in Brazil with fluent Spanish?! end; // self promotion qadram support escreveu: > Hello, > I send this mail to let you know about what happened in the last two > weeks and to introduce you two new qadram software members that will be > focused in the VCL for PHP development from now on. > > The last two weeks I have been really busy getting ready for the > expansion of the company to add enough resources to work towards version > 2.0, that's why I have not answered some of the emails on the mailing > list, those will be answered asap. > > The new qadram software members are: > > Juan José Durán <jua...@qa...> > Miguel González <mig...@qa...> > > And they will start their VCL for PHP work by completing the missing > test cases for the test framework. > > You can help us also on this task, by sending tests to be integrated and > added and, of course, applications or small test apps we can use to test > the integrity of the library against changes. > > Even we are in the same physical office, all discussions regarding this > project will take place through the mailing list, so you can > participate. And any additions/changes we plan to make, will be first > discussed on the list with you. > > If you have any questions, please, don't hesitate to ask. -- Tiago Lima Trinidad |
From: <ti...@la...> - 2007-07-04 15:49:31
|
Hi José, Yes you got it right, that's what I pretended to propose (and maybe I wasn't clear enough). I think that this beginJS() method could be called before outputting the JS method (and giving the programmer the possibility to endJS() if needed) thus making it easier for new people trying to use the framework. One shortcomming I foresee is that maybe people start placing loops (for, while) in PHP and expect them to become JavaScript code... I'd like more people to look at this idea and collaborate to come together with a nice thing. Regards, Tiago Trinidad > Your idea is very interesting, my thinking was to create some js > wrappers with js properties named in the same way as PHP ones, but your > idea is far better, if I understand correctly is to: > > $component->beginJS; > $component->Caption="test"; (this will generate js code on the browser > like: > > var component=findObj("component"); > component.value="test"; > ) > > $component->endJS; > > Is that? I like it *very* much. > > Regards > -- > José León > qadram software > C/Juan Ramón Jiménez, 15 Entlo. 2 > 03203 Elche ALICANTE (SPAIN) > T: +34 965 45 48 48 > F: +34 965 45 48 48 > M: +34 618 28 13 69 > http://www.qadram.com |
From: qadram s. <su...@qa...> - 2007-07-04 14:48:13
|
Jonathan Benedicto escribió: > This might be a solution, but it still has problems, for example if someone > wanted to get the name of the control, $query->Name would return the wrong > value. The same problem is when you create an SQL sentence and use reserved SQL keywords as fieldnames, you have to allow the parser to distinguish them or you will get an error. >> Yes, that's possible, I have always hated the length of the FieldByName >> method ;-) > > lol, yeah, is long. But it won't hurt to add it ;-) >> On the other hand, there must not be a single-correct solution and we >> can implement several ways to give more options. What do you think? > > Personally, I think that the ability to access the fields using > $query->FieldName is bad, and should be eliminated. Other than that, I don't > really care - I learn the new ways fast :-) I don't like to *eliminate* things, and in this case, it allows to write a lot of beauty code like $product->price But we can provide more ways without hurting each other ;-) > Actually most of my components now use AssociativeFieldValues, and I intend > to move them all over ASAP. So please don't remove AssociativeFieldValues > ;-) No, never remove useful stuff ;-) Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: Jonathan B. <co...@jo...> - 2007-07-04 14:40:28
|
> Yes, I saw it, but that will slow the data accessing, as first it will > need to check if the request is a property or not, and after that, get > the value from the table. I see, ok. > A solution can be set the componentstate in csLoading/csStoring and > don't get info from the fields when this state is set. After that, when > serializing-unserializing, set the component in this state. This might be a solution, but it still has problems, for example if someone wanted to get the name of the control, $query->Name would return the wrong value. > Yes, that's possible, I have always hated the length of the FieldByName > method ;-) lol, yeah, is long. > No, because field would be a basic class, that is, it won't descend from > Object nor Persistent, and won't be a getField/setField method, so it > won't be persisted at all and the syntax will be clearer and easier. Ok, I see, didn't catch that before, sorry. > On the other hand, there must not be a single-correct solution and we > can implement several ways to give more options. What do you think? Personally, I think that the ability to access the fields using $query->FieldName is bad, and should be eliminated. Other than that, I don't really care - I learn the new ways fast :-) Actually most of my components now use AssociativeFieldValues, and I intend to move them all over ASAP. So please don't remove AssociativeFieldValues ;-) Jon |
From: qadram s. <su...@qa...> - 2007-07-04 14:25:08
|
Jonathan Benedicto escribió: > I've done the coding for this - if you want, I can submit the patch. Yes, I saw it, but that will slow the data accessing, as first it will need to check if the request is a property or not, and after that, get the value from the table. > However, people may already have databases they want to re-use, with field > names such as "Name" and "State", both of which break the serialization > process. A solution can be set the componentstate in csLoading/csStoring and don't get info from the fields when this state is set. After that, when serializing-unserializing, set the component in this state. >> -Use _rs->fields directly >> -Use AssociativeFieldValues > > Probably the best idea. I think so. >> or: >> -We can add a _ function to datasets: >> >> $query->_("Name") > > What about $query->FieldByName("Name") ? Returns the value of the field > passed as the param, plus brings the VCL closer to the Win32 TDataSet. Yes, that's possible, I have always hated the length of the FieldByName method ;-) >> or: >> -We can add an object property to datasets >> >> $query->field->Name >> >> To be processed by the __get and __set of a field basic object, which >> would be a property of object type. > > This would still break the serialization process, because ->Name and ->State > are both used as component properties. No, because field would be a basic class, that is, it won't descend from Object nor Persistent, and won't be a getField/setField method, so it won't be persisted at all and the syntax will be clearer and easier. On the other hand, there must not be a single-correct solution and we can implement several ways to give more options. What do you think? Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: Jonathan B. <co...@jo...> - 2007-07-04 14:19:13
|
> The solution would be to change the priority on this method, that is, > first check for a property, and if not exists, then, search for the > field, it wasn't coded that way because the existing is faster when > working with data. I've done the coding for this - if you want, I can submit the patch. > So, concluding, if you want to use this calling way ($dataset->fieldname): > -When you design your database tables, always qualify your field names > -When you design your database tables, don't use dataset properties as > field names However, people may already have databases they want to re-use, with field names such as "Name" and "State", both of which break the serialization process. > -Use _rs->fields directly > -Use AssociativeFieldValues Probably the best idea. > or: > -We can add a _ function to datasets: > > $query->_("Name") What about $query->FieldByName("Name") ? Returns the value of the field passed as the param, plus brings the VCL closer to the Win32 TDataSet. > or: > -We can add an object property to datasets > > $query->field->Name > > To be processed by the __get and __set of a field basic object, which > would be a property of object type. This would still break the serialization process, because ->Name and ->State are both used as component properties. Jon |
From: Jonathan B. <co...@jo...> - 2007-07-04 14:15:37
|
> Do you mean the revision number of the repository? Yes Jon |
From: Jonathan B. <co...@jo...> - 2007-07-04 14:15:19
|
> The goal for that setting is to update it with *stable* releases, that is: > -Stable release is out (i.e. 1.0) > -Just after that, the release must be changed to 1.1 on the repository > > It's not useful to develop a component or an application targeting a > non-stable release. I see, however many people are upgrading to unstable releases, so I need to be able to handle that. Jon |
From: Jonathan B. <co...@jo...> - 2007-07-04 14:13:49
|
Hi Jose, > I have checked the patch and it looks good to me, have you tested your > e-commerce application to see if it works ok with the patch applied? > > We are right now working on the testing framework and once we get it > right (2 days at most), I will check to apply your patch. Thanks, no I didn't test on the E-Commerce, I'll do so. Jon |
From: Rob W. <rob...@gm...> - 2007-07-04 12:16:25
|
Congrats Jose, I look forward to seeing your company grow. -Rob On 7/4/07, qadram support <su...@qa...> wrote: > Hello, > I send this mail to let you know about what happened in the last two > weeks and to introduce you two new qadram software members that will be > focused in the VCL for PHP development from now on. > > The last two weeks I have been really busy getting ready for the > expansion of the company to add enough resources to work towards version > 2.0, that's why I have not answered some of the emails on the mailing > list, those will be answered asap. > > The new qadram software members are: > > Juan Jos=E9 Dur=E1n <jua...@qa...> > Miguel Gonz=E1lez <mig...@qa...> > > And they will start their VCL for PHP work by completing the missing > test cases for the test framework. > > You can help us also on this task, by sending tests to be integrated and > added and, of course, applications or small test apps we can use to test > the integrity of the library against changes. > > Even we are in the same physical office, all discussions regarding this > project will take place through the mailing list, so you can > participate. And any additions/changes we plan to make, will be first > discussed on the list with you. > > If you have any questions, please, don't hesitate to ask. > -- > Jos=E9 Le=F3n > qadram software > C/Juan Ram=F3n Jim=E9nez, 15 Entlo. 2 > 03203 Elche ALICANTE (SPAIN) > T: +34 965 45 48 48 > F: +34 965 45 48 48 > M: +34 618 28 13 69 > http://www.qadram.com > > > -- > Jos=E9 Le=F3n > qadram software > C/Juan Ram=F3n Jim=E9nez, 15 Entlo. 2 > 03203 Elche ALICANTE (SPAIN) > T: +34 965 45 48 48 > F: +34 965 45 48 48 > M: +34 618 28 13 69 > http://www.qadram.com > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > vcl4php-developers mailing list > vcl...@li... > https://lists.sourceforge.net/lists/listinfo/vcl4php-developers > --=20 Rob Wilkens |
From: qadram s. <su...@qa...> - 2007-07-04 09:25:59
|
Tiago Lima Trinidad escribió: > Hi Rob > That's not the point. > The question is that using vcl4php you could use the same methods to do > something wich if done in JavaScript will require specific knowledge of > the underlying APIs (qooxdoo, dynapi, jquery and so on). > I think this could be a nice approach as the component writer could > provide this knowledge wrapped in "JS aware" methods. > Thanks :) Your idea is very interesting, my thinking was to create some js wrappers with js properties named in the same way as PHP ones, but your idea is far better, if I understand correctly is to: $component->beginJS; $component->Caption="test"; (this will generate js code on the browser like: var component=findObj("component"); component.value="test"; ) $component->endJS; Is that? I like it *very* much. Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |
From: qadram s. <su...@qa...> - 2007-07-04 09:20:36
|
FrozenDice escribió: > Worked like a charm, I just pasted it in and it now renders. The only > problem I'm seeing still is that in the object inspector there's very > few properties, for example there is no Items property. This is kind > of important, although I can set it with setItems(), but that's not > really practical if I'm making this a component for others too. How > do I get it publish properties from the class it inherited? Here's a > screencap to show the difference: http://uomu.com/public/mega.jpg . > > I know I could go through and copy and paste all the statements to > publish the properties but that's not too reliable if the VCL changes, > there must be some way to include published properties of something > you extend by default. To *publish* properties found in a Custom class, which are *public*, you should create get/set equivalents, those are the ones shown on the object inspector. You can find more info here: http://www.qadram.com/vcl4php/wiki/index.php/CWG:Adding_properties#Adding_Properties_to_your_Component Regards -- José León qadram software C/Juan Ramón Jiménez, 15 Entlo. 2 03203 Elche ALICANTE (SPAIN) T: +34 965 45 48 48 F: +34 965 45 48 48 M: +34 618 28 13 69 http://www.qadram.com |