Added add project files to repository
This commit is contained in:
commit
d8753fcbe0
|
@ -0,0 +1,3 @@
|
|||
Alejandro Tomas Colombini Gomez
|
||||
Juan Ferrer Toribio
|
||||
Javier Gallego Ferris
|
|
@ -0,0 +1,674 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
@ -0,0 +1,370 @@
|
|||
Installation Instructions
|
||||
*************************
|
||||
|
||||
Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
Copying and distribution of this file, with or without modification,
|
||||
are permitted in any medium without royalty provided the copyright
|
||||
notice and this notice are preserved. This file is offered as-is,
|
||||
without warranty of any kind.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
Briefly, the shell commands `./configure; make; make install' should
|
||||
configure, build, and install this package. The following
|
||||
more-detailed instructions are generic; see the `README' file for
|
||||
instructions specific to this package. Some packages provide this
|
||||
`INSTALL' file but do not implement all of the features documented
|
||||
below. The lack of an optional feature in a given package is not
|
||||
necessarily a bug. More recommendations for GNU packages can be found
|
||||
in *note Makefile Conventions: (standards)Makefile Conventions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You need `configure.ac' if
|
||||
you want to change it or regenerate `configure' using a newer version
|
||||
of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system.
|
||||
|
||||
Running `configure' might take a while. While running, it prints
|
||||
some messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package, generally using the just-built uninstalled binaries.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation. When installing into a prefix owned by root, it is
|
||||
recommended that the package be configured and built as a regular
|
||||
user, and only the `make install' phase executed with root
|
||||
privileges.
|
||||
|
||||
5. Optionally, type `make installcheck' to repeat any self-tests, but
|
||||
this time using the binaries in their final installed location.
|
||||
This target does not install anything. Running this target as a
|
||||
regular user, particularly if the prior `make install' required
|
||||
root privileges, verifies that the installation completed
|
||||
correctly.
|
||||
|
||||
6. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
7. Often, you can also type `make uninstall' to remove the installed
|
||||
files again. In practice, not all packages have tested that
|
||||
uninstallation works correctly, even though it is required by the
|
||||
GNU Coding Standards.
|
||||
|
||||
8. Some packages, particularly those that use Automake, provide `make
|
||||
distcheck', which can by used by developers to test that all other
|
||||
targets like `make install' and `make uninstall' work correctly.
|
||||
This target is generally not run by end users.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for configuration parameters
|
||||
by setting variables in the command line or in the environment. Here
|
||||
is an example:
|
||||
|
||||
./configure CC=c99 CFLAGS=-g LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you can use GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'. This
|
||||
is known as a "VPATH" build.
|
||||
|
||||
With a non-GNU `make', it is safer to compile the package for one
|
||||
architecture at a time in the source code directory. After you have
|
||||
installed the package for one architecture, use `make distclean' before
|
||||
reconfiguring for another architecture.
|
||||
|
||||
On MacOS X 10.5 and later systems, you can create libraries and
|
||||
executables that work on multiple system types--known as "fat" or
|
||||
"universal" binaries--by specifying multiple `-arch' options to the
|
||||
compiler but only a single `-arch' option to the preprocessor. Like
|
||||
this:
|
||||
|
||||
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
|
||||
CPP="gcc -E" CXXCPP="g++ -E"
|
||||
|
||||
This is not guaranteed to produce working output in all cases, you
|
||||
may have to build one architecture at a time and combine the results
|
||||
using the `lipo' tool if you have problems.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', etc. You
|
||||
can specify an installation prefix other than `/usr/local' by giving
|
||||
`configure' the option `--prefix=PREFIX', where PREFIX must be an
|
||||
absolute file name.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=DIR' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them. In general, the
|
||||
default for these options is expressed in terms of `${prefix}', so that
|
||||
specifying just `--prefix' will affect all of the other directory
|
||||
specifications that were not explicitly provided.
|
||||
|
||||
The most portable way to affect installation locations is to pass the
|
||||
correct locations to `configure'; however, many packages provide one or
|
||||
both of the following shortcuts of passing variable assignments to the
|
||||
`make install' command line to change installation locations without
|
||||
having to reconfigure or recompile.
|
||||
|
||||
The first method involves providing an override variable for each
|
||||
affected directory. For example, `make install
|
||||
prefix=/alternate/directory' will choose an alternate location for all
|
||||
directory configuration variables that were expressed in terms of
|
||||
`${prefix}'. Any directories that were specified during `configure',
|
||||
but not in terms of `${prefix}', must each be overridden at install
|
||||
time for the entire installation to be relocated. The approach of
|
||||
makefile variable overrides for each directory variable is required by
|
||||
the GNU Coding Standards, and ideally causes no recompilation.
|
||||
However, some platforms have known limitations with the semantics of
|
||||
shared libraries that end up requiring recompilation when using this
|
||||
method, particularly noticeable in packages that use GNU Libtool.
|
||||
|
||||
The second method involves providing the `DESTDIR' variable. For
|
||||
example, `make install DESTDIR=/alternate/directory' will prepend
|
||||
`/alternate/directory' before all installation names. The approach of
|
||||
`DESTDIR' overrides is not required by the GNU Coding Standards, and
|
||||
does not work on platforms that have drive letters. On the other hand,
|
||||
it does better at avoiding recompilation issues, and works well even
|
||||
when some directory options were not specified in terms of `${prefix}'
|
||||
at `configure' time.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Some packages offer the ability to configure how verbose the
|
||||
execution of `make' will be. For these packages, running `./configure
|
||||
--enable-silent-rules' sets the default to minimal output, which can be
|
||||
overridden with `make V=1'; while running `./configure
|
||||
--disable-silent-rules' sets the default to verbose, which can be
|
||||
overridden with `make V=0'.
|
||||
|
||||
Particular systems
|
||||
==================
|
||||
|
||||
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
|
||||
CC is not installed, it is recommended to use the following options in
|
||||
order to use an ANSI C compiler:
|
||||
|
||||
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
|
||||
|
||||
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
|
||||
|
||||
HP-UX `make' updates targets which have the same time stamps as
|
||||
their prerequisites, which makes it generally unusable when shipped
|
||||
generated files such as `configure' are involved. Use GNU `make'
|
||||
instead.
|
||||
|
||||
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
|
||||
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
|
||||
a workaround. If GNU CC is not installed, it is therefore recommended
|
||||
to try
|
||||
|
||||
./configure CC="cc"
|
||||
|
||||
and if that doesn't work, try
|
||||
|
||||
./configure CC="cc -nodtk"
|
||||
|
||||
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
|
||||
directory contains several dysfunctional programs; working variants of
|
||||
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
|
||||
in your `PATH', put it _after_ `/usr/bin'.
|
||||
|
||||
On Haiku, software installed for all users goes in `/boot/common',
|
||||
not `/usr/local'. It is recommended to use the following options:
|
||||
|
||||
./configure --prefix=/boot/common
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of machine the package
|
||||
will run on. Usually, assuming the package is built to be run on the
|
||||
_same_ architectures, `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the machine type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS
|
||||
KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the machine type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the option `--target=TYPE' to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the
|
||||
"host" platform (i.e., that on which the generated programs will
|
||||
eventually be run) with `--host=TYPE'.
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
causes the specified `gcc' to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
|
||||
an Autoconf limitation. Until the limitation is lifted, you can use
|
||||
this workaround:
|
||||
|
||||
CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of all of the options to `configure', and exit.
|
||||
|
||||
`--help=short'
|
||||
`--help=recursive'
|
||||
Print a summary of the options unique to this package's
|
||||
`configure', and exit. The `short' variant lists options used
|
||||
only in the top level, while the `recursive' variant lists options
|
||||
also present in any nested packages.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`--prefix=DIR'
|
||||
Use DIR as the installation prefix. *note Installation Names::
|
||||
for more details, including other options available for fine-tuning
|
||||
the installation locations.
|
||||
|
||||
`--no-create'
|
||||
`-n'
|
||||
Run the configure checks, but stop before creating any output
|
||||
files.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
|
@ -0,0 +1,21 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
ACLOCAL_AMFLAGS = -I build/m4
|
||||
DISTCHECK_CONFIGURE_FLAGS = --enable-vala --enable-gtk-doc
|
||||
|
||||
SUBDIRS = \
|
||||
gvn \
|
||||
sql \
|
||||
db \
|
||||
plugin \
|
||||
vn \
|
||||
module \
|
||||
main \
|
||||
po \
|
||||
vapi \
|
||||
glade \
|
||||
docs
|
||||
|
||||
EXTRA_DIST = \
|
||||
autogen.sh \
|
||||
Makefile.decl
|
|
@ -0,0 +1,74 @@
|
|||
# Definition of the install directories
|
||||
# Libraries
|
||||
if ENABLE_INSTALL
|
||||
hedera_libdir = $(libdir)/$(PACKAGE)
|
||||
hedera_datadir = $(datadir)/$(PACKAGE)
|
||||
else
|
||||
hedera_libdir = $(abs_top_builddir)
|
||||
hedera_datadir = $(abs_top_srcdir)
|
||||
endif
|
||||
|
||||
gvn_libdir = $(hedera_libdir)
|
||||
sql_libdir = $(hedera_libdir)
|
||||
vn_libdir = $(hedera_libdir)
|
||||
field_libdir = $(vn_libdir)
|
||||
column_libdir = $(vn_libdir)
|
||||
plugin_libdir = $(hedera_libdir)/plugin
|
||||
|
||||
if ENABLE_INSTALL
|
||||
db_libdir = $(hedera_libdir)
|
||||
module_libdir = $(hedera_libdir)/module
|
||||
else
|
||||
db_libdir = $(hedera_libdir)/db
|
||||
module_libdir = $(hedera_libdir)/module/src/.libs
|
||||
endif
|
||||
|
||||
mysql_libdir = $(plugin_libdir)/mysql
|
||||
pg_libdir = $(plugin_libdir)/pg
|
||||
|
||||
# Binaries (programs)
|
||||
hedera_bindir = $(bindir)
|
||||
|
||||
# Headers and development files
|
||||
hedera_includedir = $(includedir)/$(PACKAGE)
|
||||
|
||||
gvn_includedir = $(hedera_includedir)/gvn
|
||||
sql_includedir = $(hedera_includedir)/sql
|
||||
db_includedir = $(hedera_includedir)/db
|
||||
vn_includedir = $(hedera_includedir)/vn
|
||||
field_includedir = $(vn_includedir)/field
|
||||
column_includedir = $(vn_includedir)/column
|
||||
|
||||
pkgconfigdir = $(datadir)/pkgconfig
|
||||
|
||||
if ENABLE_VALA
|
||||
girdir = $(datadir)/gir-1.0
|
||||
typelibdir = $(libdir)/girepository-1.0
|
||||
vapidata = $(top_srcdir)/vapi
|
||||
vapis = $(top_builddir)/vapi
|
||||
vapidir = $(datadir)/vala-$(VALA_VERSION)/vapi
|
||||
endif
|
||||
|
||||
gladevn_libdir = $(libdir)/glade/modules
|
||||
gladevn_datadir = $(datadir)/glade/catalogs
|
||||
|
||||
# Data
|
||||
vn_datadir = $(hedera_datadir)/vn
|
||||
vn_imagedir = $(vn_datadir)/image
|
||||
vn_guidir = $(vn_datadir)/gui
|
||||
|
||||
if ENABLE_INSTALL
|
||||
vn_xmldir = $(datadir)/xml/$(PACKAGE)
|
||||
module_querydir = $(hedera_datadir)/module/sql
|
||||
module_datadir = $(hedera_datadir)/module
|
||||
else
|
||||
vn_xmldir = $(vn_datadir)/schema
|
||||
module_querydir = $(hedera_datadir)/module/sql
|
||||
module_datadir = $(hedera_datadir)/module/data
|
||||
endif
|
||||
|
||||
desktopdir = $(datadir)/applications
|
||||
|
||||
vapigen_v = $(vapigen_v_@AM_V@)
|
||||
vapigen_v_ = $(vapigen_v_@AM_DEFAULT_V@)
|
||||
vapigen_v_0 = @echo " VAPIGEN $(subst $(vapis)/,,$@)";
|
|
@ -0,0 +1,110 @@
|
|||
En sistemas Debian, para configurar la biblioteca para instalarla en una ruta
|
||||
estándar y con bindings de Vala, partiendo del paquete sin modificar o la copia
|
||||
del repositorio descargada por primera vez, se deben ejecutar los siguientes
|
||||
comandos:
|
||||
$ ./autogen.sh
|
||||
$ cd build
|
||||
$ ./configure --enable-vala --prefix='/usr'
|
||||
$ make
|
||||
$ make install
|
||||
|
||||
En otras distribuciones o SOs es posible que el valor de la opcion --prefix
|
||||
deba ser distinto (por defecto es /usr/local). En cualquier caso, para instalar
|
||||
en la ruta por defecto del sistema se requieren permisos de administrador.
|
||||
|
||||
A continuación se listan las opciones de configuración específicas del paquete,
|
||||
su valor por defecto y una breve descripción de su efecto. Estas opciones se
|
||||
emplearán del mismo modo que se ha utilizado la opcion '--enable-vala' en el
|
||||
ejemplo de instalación anterior.
|
||||
|
||||
--prefix(=/usr/local)
|
||||
Configura la ruta de instalación. En Debian es recomendable configurar
|
||||
la biblioteca usando el prefijo '/usr' para evitar el uso explícito de
|
||||
variables de entorno. En caso de instalar la biblioteca en una ruta distinta
|
||||
a '/usr', antes de compilar aplicaciones que usen la biblioteca, se deberá dar
|
||||
el valor '*prefix*/share/pkgconfig' a la variable PKG_CONFIG_PATH y a la
|
||||
variable LD_RUN_PATH el valor '*prefix*/lib'. Para más información
|
||||
diríjase a la documentación de la biblioteca.
|
||||
|
||||
--enable-install(=yes)
|
||||
Desactivando esta opción se configura el paquete para que se ejecute
|
||||
sin ser instalado. Si por el contrario se deja su valor por defecto, se
|
||||
producirá un error al ejecutar las aplicaciones que usen de la biblioteca
|
||||
sin haberla instalado, pero funcionará correctamente tras instalarla.
|
||||
|
||||
--enable-vala(=no)
|
||||
Con esta opción activa se generarán todos los archivos necesarios para
|
||||
compilar código Vala que emplee la biblioteca Hedera, al hacer esto se
|
||||
generan también datos intermedios de GObject Introspection, útiles para
|
||||
ser usados por enlaces de la biblioteca a otros lenguajes.
|
||||
|
||||
--enable-gtk-doc(=no)
|
||||
Generar la documentación de la biblioteca al compilar.
|
||||
|
||||
--enable-debug(=no)
|
||||
Añadir información de debug a la compilación.
|
||||
|
||||
Para mantenimiento, si se cambia la versión de la biblioteca, el cambio debe
|
||||
reflejarse en los siguientes lugares:
|
||||
configure.ac en la macro AC_INIT.
|
||||
La llamada a la macro AC_SUBS que sigue a AC_INIT, indicando la versión con
|
||||
un subrayado en lugar del punto.
|
||||
Todos los vapi/*.metadata y vapi/*.deps (tanto en los nombres de fichero
|
||||
como en el contenido de los .deps).
|
||||
Los nombres de los ficheros *.pc.in.
|
||||
|
||||
Si se ha obtenido la copia del proyecto desde el repositorio Subversion, también
|
||||
se contará con el directorio ./debian, que contiene lo necesario para construir
|
||||
los paquetes .deb para instalar y desinstalar limpiamente la biblioteca en
|
||||
sistemas que los soporten. Para construir el paquete sin firmarlo (para pruebas
|
||||
o instalaciones propias mediante este método), se deberá ejecutar
|
||||
en el directorio raíz del proyecto:
|
||||
$ debuild -uc -us
|
||||
|
||||
Se debe tener en cuenta que los paquetes y otros ficheros generados se crean en
|
||||
el directorio padre del raíz.
|
||||
________________________________________________________________________________
|
||||
________________________________________________________________________________
|
||||
|
||||
To configure the library for install under a standard path on Debian systems
|
||||
and generate the Vala bindings to it, from the fresh package or on the first
|
||||
configuration of the repository copy, the next commands must be used:
|
||||
$ ./autogen.sh
|
||||
$ cd build
|
||||
$ ./configure --enable-vala --prefix='/usr'
|
||||
$ make
|
||||
$ make install
|
||||
|
||||
In other distributions or OSs the value for the --prefix option may be different
|
||||
(it defaults to /usr/local). In any case, to install on this path you must have
|
||||
root access.
|
||||
|
||||
A list of the configuration options of the package is presented below, with
|
||||
the default values and a brief description of each one. These options will be
|
||||
used the same way it was done in the installation example above.
|
||||
|
||||
--prefix(=/usr/local)
|
||||
Configures the installation path. As said before, on Debian it's
|
||||
recommended to configure the library using the prefix '/usr' to avoid the
|
||||
additional setting of environment variables. In case you want to install
|
||||
the library in another path, before compiling some application against the
|
||||
library you'll have to set the variables PKG_CONFIG_PATH to
|
||||
'your_prefix/share/pkgconfig' and LD_RUN_PATH to 'your_prefix/lib'. For
|
||||
more information on that look at the library's documentation.
|
||||
|
||||
--enable-install(=yes)
|
||||
Disabling this option, the package configures to be executed without
|
||||
being installed. If the it's left to its default value, an error will be
|
||||
prompted while trying to execute applications using the library without
|
||||
installing, but it will work after installation.
|
||||
|
||||
--enable-vala(=no)
|
||||
With this option enabled all needed files to compile Vala code using the
|
||||
Hedera library will be generated, doing so will also produce intermediate
|
||||
GObject Introspection files useful to use for bindings to other languages.
|
||||
|
||||
--enable-gtk-doc(=no)
|
||||
Whether or not to generate the library's documentation on compile time.
|
||||
|
||||
--enable-debug(=no)
|
||||
Add debug information to the compilation.
|
|
@ -0,0 +1,5 @@
|
|||
gtkdocize --copy
|
||||
autoreconf -fi
|
||||
glib-gettextize --force --copy
|
||||
intltoolize --copy --force --automake
|
||||
automake --add-missing --copy
|
|
@ -0,0 +1,133 @@
|
|||
|
||||
AC_INIT([hedera], [1.0])
|
||||
|
||||
AC_CONFIG_AUX_DIR([build])
|
||||
AC_CONFIG_MACRO_DIR([build/m4])
|
||||
AC_CONFIG_HEADERS([build/config.h])
|
||||
LT_INIT([dlopen])
|
||||
AC_PREREQ([2.69])
|
||||
AM_SILENT_RULES([yes])
|
||||
|
||||
# Checks for programs
|
||||
AC_PROG_CC
|
||||
|
||||
PKG_CHECK_MODULES([glib], [glib-2.0])
|
||||
PKG_CHECK_MODULES([gdome], [gdome2])
|
||||
PKG_CHECK_MODULES([gtk], [gtk+-3.0])
|
||||
PKG_CHECK_MODULES([gladeui], gladeui-2.0)
|
||||
|
||||
GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
|
||||
IT_PROG_INTLTOOL([0.40.1], [no-xml])
|
||||
|
||||
# Checks for Ragel State Machine Compiler
|
||||
AC_PATH_PROG(RAGEL, [ragel], [no])
|
||||
if test x"$RAGEL" = x"no" ; then
|
||||
AC_MSG_ERROR([Ragel State Machine Compiler (ragel) not found.])
|
||||
fi
|
||||
|
||||
# Checks if Vala bindings should be generated
|
||||
dnl TODO: Use AC_ARG_WITH to pick the Vala version?
|
||||
AC_MSG_CHECKING([wether to generate Vala bindings...])
|
||||
AC_ARG_ENABLE([vala],
|
||||
[AS_HELP_STRING([--enable-vala],
|
||||
[Enable vala bindings generation [default = no]])],
|
||||
[ENABLE_VALA="$enableval"],
|
||||
[ENABLE_VALA=no])
|
||||
AC_MSG_RESULT([$ENABLE_VALA])
|
||||
|
||||
AM_CONDITIONAL(HAVE_INTROSPECTION, [test FALSE])
|
||||
|
||||
if test x"$ENABLE_VALA" = x"yes" ; then
|
||||
GOBJECT_INTROSPECTION_CHECK([1.30.0])
|
||||
AC_SUBST([GIR_SCANNER_ARGS], [--warn-all])
|
||||
if $HAVE_INTROSPECTION; then
|
||||
AC_SUBST([VALA_VERSION], [0.20])
|
||||
AM_PROG_VALAC([$VALA_VERSION])
|
||||
AC_PATH_PROG(VAPIGEN, [vapigen], ["no"])
|
||||
fi
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(ENABLE_VALA, [test x"$ENABLE_VALA" = x"yes" -a x"$VAPIGEN" != x"no"])
|
||||
|
||||
# Internationalization
|
||||
GETTEXT_PACKAGE=hedera
|
||||
AC_SUBST([GETTEXT_PACKAGE])
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [GETTEXT package name])
|
||||
ALL_LINGUAS="es ca nl"
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
AM_XGETTEXT_OPTION([-k_ -kQ_:1g -kN_ -kC_:1c,2 -kNC_:1c,2])
|
||||
|
||||
# GSettings configuration
|
||||
GLIB_GSETTINGS
|
||||
|
||||
CFLAGS=" -Wall"
|
||||
|
||||
# Check for debug mode
|
||||
AC_MSG_CHECKING([whether to build with debug information...])
|
||||
AC_ARG_ENABLE([debug],
|
||||
[AS_HELP_STRING([--enable-debug],
|
||||
[Enable debug data generation [default = no]])],
|
||||
[ENABLE_DEBUG="$enableval"],
|
||||
[ENABLE_DEBUG=no])
|
||||
AC_MSG_RESULT([$ENABLE_DEBUG])
|
||||
|
||||
if test x"$ENABLE_DEBUG" = x"yes"; then
|
||||
CFLAGS+=" -ggdb"
|
||||
fi
|
||||
|
||||
# Check if it will be installed
|
||||
AC_MSG_CHECKING([whether to configure to install...])
|
||||
AC_ARG_ENABLE([install],
|
||||
[AS_HELP_STRING([--enable-install],
|
||||
[Enable install configuration [default = yes]])],
|
||||
[ENABLE_INSTALL="$enableval"],
|
||||
[ENABLE_INSTALL=yes])
|
||||
AC_MSG_RESULT([$installit])
|
||||
AM_CONDITIONAL(ENABLE_INSTALL, [test x"$ENABLE_INSTALL" = x"yes"])
|
||||
|
||||
if test x"$ENABLE_INSTALL" = x"yes"; then
|
||||
CFLAGS+=" -O3"
|
||||
else
|
||||
CFLAGS+=" -O0"
|
||||
fi
|
||||
|
||||
AC_SUBST([CPPFLAGS])
|
||||
AC_SUBST([CFLAGS])
|
||||
AC_SUBST([LDFLAGS])
|
||||
|
||||
# Portability check disabled for GTK-DOC (can be changed if needed)
|
||||
AM_INIT_AUTOMAKE([-Wno-portability])
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
gvn/gvn.pc
|
||||
sql/sql.pc
|
||||
db/db.pc
|
||||
vn/vn.pc
|
||||
main/hedera.pc
|
||||
gvn/Makefile
|
||||
sql/Makefile
|
||||
sql/parser/Makefile
|
||||
db/Makefile
|
||||
plugin/Makefile
|
||||
plugin/pg/Makefile
|
||||
plugin/mysql/Makefile
|
||||
vn/Makefile
|
||||
vn/field/Makefile
|
||||
vn/column/Makefile
|
||||
module/Makefile
|
||||
module/src/Makefile
|
||||
module/data/Makefile
|
||||
module/sql/Makefile
|
||||
main/Makefile
|
||||
main/vn-hedera.desktop
|
||||
vapi/Makefile
|
||||
glade/Makefile
|
||||
docs/Makefile
|
||||
docs/reference/Makefile
|
||||
docs/reference/hedera/Makefile
|
||||
po/Makefile.in
|
||||
])
|
||||
|
||||
AC_SUBST([uVERSION], [${VERSION//./_}])
|
||||
|
||||
AC_OUTPUT
|
|
@ -0,0 +1,100 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
db_lib_LTLIBRARIES = libdb.la
|
||||
db_include_HEADERS = \
|
||||
db.h \
|
||||
db-iter.h \
|
||||
db-calc.h \
|
||||
db-iterator.h \
|
||||
db-param.h \
|
||||
db-request.h \
|
||||
db-conn.h \
|
||||
db-row.h \
|
||||
db-result.h \
|
||||
db-result-set.h \
|
||||
db-model.h \
|
||||
db-model-holder.h \
|
||||
db-file-loader.h \
|
||||
db-plugin.h
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
$(DEFINES) \
|
||||
$(glib_CFLAGS)
|
||||
libdb_la_LIBADD = \
|
||||
$(glib_LIBS) \
|
||||
$(top_builddir)/sql/libsql.la
|
||||
libdb_la_SOURCES = \
|
||||
$(db_include_HEADERS) \
|
||||
db-iter.c \
|
||||
db-calc.c \
|
||||
db-iterator.c \
|
||||
db-param.c \
|
||||
db-request.c \
|
||||
db-conn.c \
|
||||
db-row.c \
|
||||
db-result.c \
|
||||
db-result-set.c \
|
||||
db-model.c \
|
||||
db-model-holder.c \
|
||||
db-file-loader.c \
|
||||
db-plugin.c
|
||||
|
||||
if ENABLE_INSTALL
|
||||
DEFINES = \
|
||||
-D_PLUGIN_DIR=\"$(plugin_libdir)/%s\"
|
||||
else
|
||||
DEFINES = \
|
||||
-D_PLUGIN_DIR=\"$(plugin_libdir)/%s/.libs\"
|
||||
endif
|
||||
|
||||
pkgconfig_DATA = db.pc
|
||||
|
||||
EXTRA_DIST = db.pc.in
|
||||
|
||||
DISTCLEANFILES = db.pc
|
||||
|
||||
if ENABLE_VALA
|
||||
if HAVE_INTROSPECTION
|
||||
|
||||
-include $(INTROSPECTION_MAKEFILE)
|
||||
|
||||
INTROSPECTION_SCANNER_ARGS = $(GIR_SCANNER_ARGS)
|
||||
|
||||
INTROSPECTION_COMPILER_ARGS = \
|
||||
--includedir=$(top_builddir)/gvn \
|
||||
--includedir=$(top_builddir)/sql
|
||||
|
||||
introspection_sources = $(filter-out db-row.*,$(libdb_la_SOURCES))
|
||||
|
||||
Db-$(VERSION).gir: $(db_lib_LTLIBRARIES) $(top_builddir)/sql/Sql-$(VERSION).gir
|
||||
Db_@uVERSION@_gir_SCANNERFLAGS = \
|
||||
--include-uninstalled=$(top_builddir)/gvn/Gvn-$(VERSION).gir \
|
||||
--include-uninstalled=$(top_builddir)/sql/Sql-$(VERSION).gir
|
||||
Db_@uVERSION@_gir_CFLAGS = -I$(top_srcdir)
|
||||
Db_@uVERSION@_gir_LIBS = $(db_lib_LTLIBRARIES)
|
||||
Db_@uVERSION@_gir_FILES = $(introspection_sources)
|
||||
Db_@uVERSION@_gir_EXPORT_PACKAGES = db
|
||||
INTROSPECTION_GIRS = Db-$(VERSION).gir
|
||||
|
||||
gir_DATA = $(INTROSPECTION_GIRS)
|
||||
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
|
||||
|
||||
CLEANFILES = $(gir_DATA) $(typelib_DATA)
|
||||
|
||||
$(vapis)/db.vapi: $(INTROSPECTION_GIRS) $(vapidata)/Db-$(VERSION).metadata
|
||||
$(vapigen_v)$(VAPIGEN) -q \
|
||||
--directory $(vapis) \
|
||||
--vapidir $(vapis) \
|
||||
--girdir $(top_builddir)/gvn \
|
||||
--girdir $(top_builddir)/sql \
|
||||
--metadatadir $(vapidata) \
|
||||
--library db \
|
||||
Db-$(VERSION).gir
|
||||
|
||||
vapi_DATA = $(vapis)/db.vapi
|
||||
|
||||
CLEANFILES += $(vapis)/$(vapi_DATA)
|
||||
|
||||
endif
|
||||
endif
|
|
@ -0,0 +1,368 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-calc.h"
|
||||
#include "db-row.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-calc
|
||||
* @short_description: the result of an operation made over a column or between
|
||||
* columns
|
||||
* @title: DbCalc
|
||||
*
|
||||
* A #GvnParam that holds the result of the user-given operation applied over
|
||||
* a given column of a #DbModel. When any of these values is modified, #DbCalc
|
||||
* updates its value according to the changes.
|
||||
*
|
||||
* #DbCalc has as built-in operations the sumatory and average that can be
|
||||
* selected passing #DB_CALC_SUM OR #DB_CALC_AVG, respectively.
|
||||
*
|
||||
* While creating a #DbCalc it's possible to specify either a single column
|
||||
* number, to calculate using only this column and no additional operations, or
|
||||
* a #DbCalcFunc function, to use more than one column or do any operation
|
||||
* needed with the #DbModel fields, in the latter case, custom data can also be
|
||||
* passed.
|
||||
**/
|
||||
|
||||
G_DEFINE_TYPE (DbCalc, db_calc, GVN_TYPE_PARAM);
|
||||
|
||||
/**
|
||||
* db_calc_new:
|
||||
* @model: the #DbModel in which the operations will apply
|
||||
* @type: the #DbCalcOperationType
|
||||
* @col: the number of a column (starting with 0)
|
||||
*
|
||||
* Creates a new #DbCalc using @col to select the only column to be processed
|
||||
* in each row of @model.
|
||||
*
|
||||
* Return value: a new #DbCalc
|
||||
**/
|
||||
DbCalc * db_calc_new (DbModel * model, DbCalcOperationType type, gint col)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_MODEL (model), NULL);
|
||||
g_return_val_if_fail (0 <= col || col < db_model_get_ncols (model), NULL);
|
||||
|
||||
return g_object_new
|
||||
(DB_TYPE_CALC, "model", model, "type", type, "col", col, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_calc_new_with_func:
|
||||
* @model: the #DbModel in which the operations will apply
|
||||
* @type: the #DbCalcOperationType
|
||||
* @func: (scope call): a #DbCalcFunc
|
||||
* @data: additional data that will be passed to @func
|
||||
*
|
||||
* Creates a new #DbCalc using @func as the operation that will apply to each
|
||||
* row of @model.
|
||||
*
|
||||
* Return value: a new #DbCalc
|
||||
**/
|
||||
DbCalc * db_calc_new_with_func (DbModel * model, DbCalcOperationType type, DbCalcFunc func, gpointer data)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_MODEL (model), NULL);
|
||||
g_return_val_if_fail (func, NULL);
|
||||
|
||||
return g_object_new
|
||||
(DB_TYPE_CALC, "model", model, "type", type, "function", func, "data", data, NULL);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
|
||||
|
||||
static gdouble db_calc_value_to_double (const GValue * v)
|
||||
{
|
||||
switch (G_VALUE_TYPE (v))
|
||||
{
|
||||
case G_TYPE_UINT:
|
||||
return (gdouble) g_value_get_uint (v);
|
||||
case G_TYPE_UINT64:
|
||||
return (gdouble) g_value_get_uint64 (v);
|
||||
case G_TYPE_ULONG:
|
||||
return (gdouble) g_value_get_ulong (v);
|
||||
case G_TYPE_INT:
|
||||
return (gdouble) g_value_get_int (v);
|
||||
case G_TYPE_INT64:
|
||||
return (gdouble) g_value_get_int64 (v);
|
||||
case G_TYPE_LONG:
|
||||
return (gdouble) g_value_get_long (v);
|
||||
case G_TYPE_FLOAT:
|
||||
return (gdouble) g_value_get_float (v);
|
||||
case G_TYPE_DOUBLE:
|
||||
return g_value_get_double (v);
|
||||
case G_TYPE_STRING:
|
||||
return g_strtod (g_value_get_string (v), NULL);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void db_calc_internal_func
|
||||
(DbCalc * obj, DbIter * iter, GValue * out, gpointer data)
|
||||
{
|
||||
const GValue * value = db_model_get_value (obj->model, iter, obj->col, NULL);
|
||||
g_value_copy (value, g_value_init (out, G_VALUE_TYPE (value)));
|
||||
}
|
||||
|
||||
static void db_calc_before_unset (DbModel * model, DbIter * iter, DbCalc * obj)
|
||||
{
|
||||
GValue value = {0};
|
||||
|
||||
obj->func (obj, iter, &value, obj->data);
|
||||
|
||||
if (!gvn_value_is_null (&value))
|
||||
{
|
||||
gdouble current, old;
|
||||
|
||||
current = db_calc_value_to_double (gvn_param_get_value (GVN_PARAM (obj)));
|
||||
old = db_calc_value_to_double (&value);
|
||||
|
||||
if (obj->type == DB_CALC_AVG)
|
||||
{
|
||||
if (obj->count != 1)
|
||||
current = (current * (gdouble) obj->count - old) / (gdouble) (obj->count - 1);
|
||||
else
|
||||
current = 0;
|
||||
}
|
||||
else if (obj->type == DB_CALC_SUM)
|
||||
current -= old;
|
||||
|
||||
obj->count--;
|
||||
g_value_unset (&value);
|
||||
g_value_set_double (g_value_init (&value, G_TYPE_DOUBLE), current);
|
||||
GVN_PARAM_GET_CLASS (obj)->put_value (GVN_PARAM (obj), &value);
|
||||
}
|
||||
|
||||
g_value_unset (&value);
|
||||
}
|
||||
|
||||
static void db_calc_before_delete (DbModel * model, gint path, DbCalc * obj)
|
||||
{
|
||||
DbIter iter;
|
||||
db_model_get_iter (model, &iter, path);
|
||||
db_calc_before_unset (model, &iter, obj);
|
||||
}
|
||||
|
||||
static void db_calc_after_set (DbModel * model, DbIter * iter, DbCalc * obj)
|
||||
{
|
||||
GValue value = {0};
|
||||
|
||||
obj->func (obj, iter, &value, obj->data);
|
||||
|
||||
if (!gvn_value_is_null (&value))
|
||||
{
|
||||
gdouble current, new;
|
||||
|
||||
current = db_calc_value_to_double (gvn_param_get_value (GVN_PARAM (obj)));
|
||||
new = db_calc_value_to_double (&value);
|
||||
|
||||
if (obj->type == DB_CALC_AVG)
|
||||
current = (current * (gdouble) obj->count + new) / (gdouble) (obj->count + 1);
|
||||
else if (obj->type == DB_CALC_SUM)
|
||||
current += new;
|
||||
|
||||
obj->count++;
|
||||
g_value_unset (&value);
|
||||
g_value_set_double (g_value_init (&value, G_TYPE_DOUBLE), current);
|
||||
GVN_PARAM_GET_CLASS (obj)->put_value (GVN_PARAM (obj), &value);
|
||||
}
|
||||
|
||||
g_value_unset (&value);
|
||||
}
|
||||
|
||||
static void db_calc_refresh (DbModel * model, DbModelStatus status, DbCalc * obj)
|
||||
{
|
||||
DbIter iter;
|
||||
gdouble current = 0;
|
||||
GValue val = {0};
|
||||
|
||||
if (status != DB_MODEL_STATUS_READY) return;
|
||||
if (!db_model_get_iter_first (model, &iter)) return;
|
||||
|
||||
obj->count = 0;
|
||||
|
||||
do {
|
||||
obj->func (obj, &iter, &val, obj->data);
|
||||
|
||||
if (!gvn_value_is_null (&val))
|
||||
{
|
||||
current += db_calc_value_to_double (&val);
|
||||
obj->count++;
|
||||
}
|
||||
|
||||
g_value_unset (&val);
|
||||
}
|
||||
while (db_model_iter_next (model, &iter));
|
||||
|
||||
if (obj->type == DB_CALC_AVG)
|
||||
current = (obj->count > 0) ? current / (gdouble) obj->count : 0;
|
||||
|
||||
g_value_set_double (g_value_init (&val, G_TYPE_DOUBLE), current);
|
||||
GVN_PARAM_GET_CLASS (obj)->put_value (GVN_PARAM (obj), &val);
|
||||
g_value_unset (&val);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_MODEL = 1
|
||||
,PROP_TYPE
|
||||
,PROP_FUNC
|
||||
,PROP_DATA
|
||||
,PROP_COL
|
||||
};
|
||||
|
||||
static void db_calc_set_property (DbCalc * obj, guint id,
|
||||
const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case PROP_MODEL:
|
||||
obj->model = g_value_dup_object (value);
|
||||
g_object_connect (obj->model
|
||||
,"signal::line-updated", db_calc_before_unset, obj
|
||||
,"signal-after::line-updated", db_calc_after_set, obj
|
||||
,"signal::line-deleted", db_calc_before_delete, obj
|
||||
,"signal::status-changed", db_calc_refresh, obj
|
||||
, NULL
|
||||
);
|
||||
break;
|
||||
case PROP_TYPE:
|
||||
obj->type = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_FUNC:
|
||||
if (g_value_get_pointer (value))
|
||||
obj->func = g_value_get_pointer (value);
|
||||
break;
|
||||
case PROP_DATA:
|
||||
obj->data = g_value_get_pointer (value);
|
||||
break;
|
||||
case PROP_COL:
|
||||
obj->col = g_value_get_int (value);
|
||||
|
||||
if (!obj->func)
|
||||
obj->func = db_calc_internal_func;
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void db_calc_get_property (DbCalc * obj, guint id,
|
||||
GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case PROP_MODEL:
|
||||
g_value_set_object (value, obj->model);
|
||||
break;
|
||||
case PROP_TYPE:
|
||||
g_value_set_int (value, obj->type);
|
||||
break;
|
||||
case PROP_FUNC:
|
||||
g_value_set_pointer (value, obj->func);
|
||||
break;
|
||||
case PROP_DATA:
|
||||
g_value_set_pointer (value, obj->data);
|
||||
break;
|
||||
case PROP_COL:
|
||||
g_value_set_int (value, obj->col);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void db_calc_init (DbCalc * obj)
|
||||
{
|
||||
GvnParamSpec * spec;
|
||||
|
||||
obj->model = NULL;
|
||||
obj->type = 0;
|
||||
obj->func = NULL;
|
||||
obj->data = NULL;
|
||||
obj->col = 0;
|
||||
obj->count = 0;
|
||||
|
||||
spec = gvn_param_spec_new_with_attrs (G_TYPE_DOUBLE, FALSE, TRUE, NULL);
|
||||
GVN_PARAM_GET_CLASS (obj)->set_spec (GVN_PARAM (obj), spec);
|
||||
}
|
||||
|
||||
static void db_calc_finalize (DbCalc * obj)
|
||||
{
|
||||
if (obj->model)
|
||||
{
|
||||
g_object_disconnect (obj->model
|
||||
,"any_signal::line-updated", db_calc_before_unset, obj
|
||||
,"any_signal::line-updated", db_calc_after_set, obj
|
||||
,"any_signal::line-deleted", db_calc_before_delete, obj
|
||||
,"any_signal::status-changed", db_calc_refresh, obj
|
||||
,NULL
|
||||
);
|
||||
g_clear_object (&obj->model);
|
||||
}
|
||||
}
|
||||
|
||||
static void db_calc_class_init (DbCalcClass * k)
|
||||
{
|
||||
GObjectClass * klass = G_OBJECT_CLASS (k);
|
||||
klass->finalize = (GObjectFinalizeFunc) db_calc_finalize;
|
||||
klass->set_property = (GObjectSetPropertyFunc) db_calc_set_property;
|
||||
klass->get_property = (GObjectGetPropertyFunc) db_calc_get_property;
|
||||
|
||||
g_object_class_install_property (klass, PROP_MODEL
|
||||
,g_param_spec_object ("model"
|
||||
,_("Model")
|
||||
,_("The model where the operations will be applied")
|
||||
,DB_TYPE_MODEL
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)
|
||||
);
|
||||
|
||||
g_object_class_install_property (klass, PROP_TYPE
|
||||
,g_param_spec_int ("type"
|
||||
,_("Operation type")
|
||||
,_("The type of the operation applied over the function")
|
||||
,0
|
||||
,1
|
||||
,0
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)
|
||||
);
|
||||
|
||||
g_object_class_install_property (klass, PROP_FUNC
|
||||
,g_param_spec_pointer ("function"
|
||||
,_("Function")
|
||||
,_("The function to execute")
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)
|
||||
);
|
||||
|
||||
g_object_class_install_property (klass, PROP_DATA
|
||||
,g_param_spec_pointer ("data"
|
||||
,_("Data")
|
||||
,_("The user provided data for the function")
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)
|
||||
);
|
||||
|
||||
g_object_class_install_property (klass, PROP_COL
|
||||
,g_param_spec_int ("col"
|
||||
,_("Column")
|
||||
,_("A column to apply the operations over it")
|
||||
,0
|
||||
,G_MAXINT32
|
||||
,0
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)
|
||||
);
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this program; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA.
|
||||
*/
|
||||
|
||||
#ifndef DB_CALC_H
|
||||
#define DB_CALC_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include <gvn/gvn-param.h>
|
||||
#include "db-model.h"
|
||||
|
||||
#define DB_CALC_LOG_DOMAIN (g_quark_from_string ("DbCalc"))
|
||||
|
||||
#define DB_TYPE_CALC (db_calc_get_type ())
|
||||
#define DB_CALC(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, DB_TYPE_CALC, DbCalc))
|
||||
#define DB_IS_CALC(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, DB_TYPE_CALC))
|
||||
#define DB_CALC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((obj), DB_TYPE_CALC, DbCalcClass))
|
||||
#define DB_IS_CALC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_CLASS))
|
||||
#define DB_CALC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_CALC, DbCalcClass))
|
||||
|
||||
typedef struct _DbCalc DbCalc;
|
||||
typedef struct _DbCalcClass DbCalcClass;
|
||||
|
||||
/**
|
||||
* DbCalcFunc:
|
||||
* @obj: a #DbCalc
|
||||
* @iter: a #DbIter pointing to a row of the model
|
||||
* @out: the return position for the resulting value
|
||||
* @user_data: (closure): the data passed to the function
|
||||
*
|
||||
* The prototype of the functions used by the #DbCalc to perform operations
|
||||
* on more than one column or to perform additional operations to a column,
|
||||
* previously to add them to the calculations performed by the @DbCalc itself.
|
||||
**/
|
||||
typedef void (*DbCalcFunc) (DbCalc * obj, DbIter * iter, GValue * out, gpointer user_data);
|
||||
|
||||
/**
|
||||
* DbCalcOperationType:
|
||||
* @DB_CALC_SUM: sumatory of the values
|
||||
* @DB_CALC_AVG: average of the values
|
||||
*
|
||||
* Defines which type of operation will be performed over the column values.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_CALC_SUM,
|
||||
DB_CALC_AVG
|
||||
}
|
||||
DbCalcOperationType;
|
||||
|
||||
struct _DbCalc
|
||||
{
|
||||
GvnParam parent;
|
||||
|
||||
DbModel * model;
|
||||
DbCalcOperationType type;
|
||||
DbCalcFunc func;
|
||||
gpointer data;
|
||||
guint col;
|
||||
guint count;
|
||||
};
|
||||
|
||||
struct _DbCalcClass
|
||||
{
|
||||
/* <private> */
|
||||
GvnParamClass klass;
|
||||
};
|
||||
|
||||
GType db_calc_get_type ();
|
||||
DbCalc * db_calc_new (DbModel * model
|
||||
,DbCalcOperationType type
|
||||
,gint col);
|
||||
DbCalc * db_calc_new_with_func (DbModel * model
|
||||
,DbCalcOperationType type
|
||||
,DbCalcFunc func
|
||||
,gpointer data);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_CONN_H
|
||||
#define DB_CONN_H
|
||||
|
||||
#include <sql/sql.h>
|
||||
#include "db-plugin.h"
|
||||
|
||||
#define DB_CONN_LOG_DOMAIN (g_quark_from_string ("DbConn"))
|
||||
|
||||
#define DB_TYPE_CONN (db_conn_get_type ())
|
||||
#define DB_CONN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DB_TYPE_CONN, DbConn))
|
||||
#define DB_IS_CONN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DB_TYPE_CONN))
|
||||
#define DB_CONN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DB_TYPE_CONN, DbConnClass))
|
||||
#define DB_IS_CONN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_CONN))
|
||||
#define DB_CONN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_CONN, DbConnClass))
|
||||
|
||||
//#define PLUGIN_DIR "./plugin/%s/.libs"
|
||||
|
||||
typedef struct _DbConn DbConn;
|
||||
typedef struct _DbConnClass DbConnClass;
|
||||
|
||||
#include "db-request.h"
|
||||
|
||||
struct _DbConn
|
||||
{
|
||||
GObject parent;
|
||||
DbPlugin * plugin;
|
||||
gchar * plugin_name;
|
||||
gchar * query_path;
|
||||
gchar ** query_dirs;
|
||||
gchar * host;
|
||||
gchar * user;
|
||||
gchar * pass;
|
||||
gchar * schema;
|
||||
gint status; // DbConnStatus
|
||||
GMutex * mutex;
|
||||
GMutex * settings_mutex;
|
||||
GThread * thread;
|
||||
GCond * thread_cond;
|
||||
GQueue * requests;
|
||||
guint transaction;
|
||||
};
|
||||
|
||||
struct _DbConnClass
|
||||
{
|
||||
GObjectClass parent;
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DB_CONN_ERROR_LOST = 1
|
||||
,DB_CONN_ERROR_PLUGIN
|
||||
,DB_CONN_ERROR_OPENING
|
||||
,DB_CONN_ERROR_BAD_LOGIN
|
||||
,DB_CONN_ERROR_BAD_RESPONSE
|
||||
,DB_CONN_ERROR_QUERY_EMPTY
|
||||
,DB_CONN_ERROR_QUERY_NONFATAL
|
||||
,DB_CONN_ERROR_QUERY_FATAL
|
||||
,DB_CONN_ERROR_QUERY_FAILED
|
||||
,DB_CONN_ERROR_UNKNOW
|
||||
}
|
||||
DbConnError;
|
||||
|
||||
/**
|
||||
* DbConnStatus:
|
||||
* @DB_CONN_CLOSED: The connection is closed
|
||||
* @DB_CONN_OPENING: The connection is opening
|
||||
* @DB_CONN_IDLE: The connection is open but it's idle
|
||||
* @DB_CONN_TRANSACTION: A transatcion has been started
|
||||
* @DB_CONN_LOADING: The connection is making a query
|
||||
* @DB_CONN_CLOSE_REQUESTED: Waiting for a query to close the connection
|
||||
* @DB_CONN_CLOSING: The connection is closing
|
||||
* @DB_CONN_LOST: The connection is closed because it has been lost
|
||||
*
|
||||
* Identifies the status of the connection.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_CONN_CLOSED = 0
|
||||
,DB_CONN_OPEN = 1 << 0
|
||||
,DB_CONN_LOADING = 1 << 1
|
||||
,DB_CONN_LOST = 1 << 2
|
||||
,DB_CONN_TRANSACTION = 1 << 3
|
||||
,DB_CONN_CLOSING = 1 << 4
|
||||
,DB_CONN_OPENING = 1 << 5
|
||||
}
|
||||
DbConnStatus;
|
||||
|
||||
GType db_conn_get_type ();
|
||||
DbConn * db_conn_new ();
|
||||
gboolean db_conn_load_plugin (DbConn * obj, const gchar * plugin, GError ** err);
|
||||
void db_conn_set_query_path (DbConn * obj, const gchar * path);
|
||||
gchar * db_conn_get_query_path (DbConn * obj);
|
||||
gboolean db_conn_open (DbConn * obj
|
||||
,const gchar * host
|
||||
,const gchar * schema
|
||||
,const gchar * user
|
||||
,const gchar * pass
|
||||
,GError ** err);
|
||||
void db_conn_close (DbConn * obj, gboolean wait);
|
||||
void db_conn_set_ssl (DbConn * obj, const gchar * ca);
|
||||
gboolean db_conn_reconnect (DbConn * obj, GError ** err);
|
||||
|
||||
DbResultSet * db_conn_exec (DbConn * obj, const gchar * sql, GError ** err);
|
||||
|
||||
DbRequest * db_conn_query (DbConn * obj, const gchar * sql);
|
||||
DbRequest * db_conn_query_async (DbConn * obj
|
||||
,const gchar * sql
|
||||
,DbRequestDoneCallback callback
|
||||
,gpointer user_data
|
||||
,GDestroyNotify notify);
|
||||
|
||||
DbRequest * db_conn_query_with_stmt (DbConn * obj, SqlStmt * stmt);
|
||||
DbRequest * db_conn_query_with_stmt_async (DbConn * obj
|
||||
,SqlStmt * stmt
|
||||
,DbRequestDoneCallback callback
|
||||
,gpointer user_data
|
||||
,GDestroyNotify notify);
|
||||
|
||||
gboolean db_conn_query_value (DbConn * obj, const gchar * sql, GValue * value, GError ** err);
|
||||
|
||||
void db_conn_retry (DbConn * obj);
|
||||
void db_conn_kill_query (DbConn * obj);
|
||||
|
||||
SqlStmt * db_conn_parse (DbConn * obj, gchar * sql);
|
||||
gchar * db_conn_render (DbConn * obj, gpointer object, GError ** err);
|
||||
guchar * db_conn_escape_binary (DbConn * obj, const guchar * from, gsize from_size, gsize * to_size);
|
||||
|
||||
void db_conn_start_transaction (DbConn * obj);
|
||||
void db_conn_commit (DbConn * obj);
|
||||
void db_conn_rollback (DbConn * obj);
|
||||
|
||||
gchar * db_conn_get_user (DbConn * obj);
|
||||
gchar * db_conn_get_host (DbConn * obj);
|
||||
gchar * db_conn_get_schema (DbConn * obj);
|
||||
|
||||
SqlString * db_conn_create_stmt_from_file (DbConn * obj, const gchar * query_file);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,756 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-file-loader.h"
|
||||
#include "gio/gio.h"
|
||||
#include <stdlib.h>
|
||||
#include <glib/gstdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define CACHE_CLEAN_PERIOD 600
|
||||
#define CACHE_DEFAULT_SIZE 100000000
|
||||
#define CACHE_CLEAN_MARGIN (CACHE_DEFAULT_SIZE*20)/100
|
||||
|
||||
/**
|
||||
* SECTION: db-file-loader
|
||||
* @Short_description: utility to download/upload resources from an URL
|
||||
* @Title: DbFileLoader
|
||||
*
|
||||
* #DbFileLoader can download and upload files from a remote or local location by
|
||||
* its URL. Both operations will allways be made asynchronously, to retrieve the
|
||||
* results you must pass a #DbFileLoaderCallbackFunc.
|
||||
*
|
||||
* By default, #DbFileLoader uses a local cache on disk to store the downloaded
|
||||
* files. To avoid the use of this feature, create the #DbFileLoader using
|
||||
* db_file_loader_new_simple(). The default cache directory is 'hedera', under
|
||||
* g_get_user_cache_dir(). To use another directory as cache or set its size,
|
||||
* use g_object_set().
|
||||
*/
|
||||
|
||||
struct _DbFileLoaderPrivate
|
||||
{
|
||||
gchar * dir;
|
||||
gchar * cache;
|
||||
goffset size;
|
||||
gchar * host;
|
||||
gchar * path;
|
||||
GInetSocketAddress * addr;
|
||||
GThreadPool * pool;
|
||||
GMutex * mutex;
|
||||
GMutex * cache_mutex;
|
||||
GHashTable * downloading;
|
||||
guint src;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (DbFileLoader, db_file_loader, G_TYPE_OBJECT)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DbFileLoader * obj;
|
||||
gchar * name;
|
||||
GBytes * data;
|
||||
GError * error;
|
||||
DbFileLoaderCallbackFunc func;
|
||||
gpointer user_data;
|
||||
GCancellable * cancel;
|
||||
}
|
||||
File;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
guint64 atime;
|
||||
goffset size;
|
||||
gchar * path;
|
||||
}
|
||||
CacheFile;
|
||||
|
||||
static const gchar * WDAY[] = {"Err",
|
||||
"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"};
|
||||
|
||||
static const gchar * MONTH[] = {"Err",
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||
|
||||
static const gchar * format_request = {
|
||||
"GET /%s/%s HTTP/1.1\r\n" // Path to the file
|
||||
"Host: %s\r\n" // Hostname
|
||||
"%s" // If-modified-since: date\r\n
|
||||
"\r\n"
|
||||
};
|
||||
|
||||
/**
|
||||
* db_file_loader_new:
|
||||
* @host: the host where the files are stored
|
||||
* @path: the base directory to find the loaded resources
|
||||
*
|
||||
* Creates a new #DbFileLoader pointing to @path in @host. The cache is set
|
||||
* to default.
|
||||
*
|
||||
* Return value: a #DbFileLoader
|
||||
**/
|
||||
DbFileLoader * db_file_loader_new (const gchar * host, const gchar * path)
|
||||
{
|
||||
g_return_val_if_fail (host, NULL);
|
||||
g_return_val_if_fail (path, NULL);
|
||||
|
||||
return g_object_new
|
||||
(DB_TYPE_FILE_LOADER, "host", host, "path", path, "cache", NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_file_loader_new_simple:
|
||||
* @host: the host where the files are stored
|
||||
* @path: the base directory to find the loaded resources
|
||||
*
|
||||
* Creates a new #DbFileLoader pointing to @path in @host. To use a cache,
|
||||
* call db_file_loader_new().
|
||||
*
|
||||
* Return value: a #DbFileLoader
|
||||
**/
|
||||
DbFileLoader * db_file_loader_new_simple (const gchar * host, const gchar * path)
|
||||
{
|
||||
DbFileLoader * fl;
|
||||
|
||||
g_return_val_if_fail (host, NULL);
|
||||
g_return_val_if_fail (path, NULL);
|
||||
|
||||
fl = g_object_new (DB_TYPE_FILE_LOADER, "host", host, "path", path, NULL);
|
||||
|
||||
if (fl->priv->cache)
|
||||
{
|
||||
g_free (fl->priv->cache);
|
||||
fl->priv->cache = NULL;
|
||||
}
|
||||
|
||||
return fl;
|
||||
}
|
||||
|
||||
/*
|
||||
* db_file_loader_new_full:
|
||||
* @host: the host where the files are stored
|
||||
* @path: the base directory to find the loaded resources
|
||||
* @cache: (allow-none): the base directory for the local cache or %NULL
|
||||
* @size: maximal size for the cache
|
||||
*
|
||||
* Creates a new #DbFileLoader pointing to @path in @host. Note that the user
|
||||
* needs permission to read and write in @cache. If @cache is %NULL, it will be
|
||||
* set to default, if @max_cache is 0, the cache has no maximal size.
|
||||
*
|
||||
* Return value: a #DbFileLoader or %NULL if @cache is an invalid directory
|
||||
**/
|
||||
DbFileLoader * db_file_loader_new_full
|
||||
(const gchar * host, const gchar * path, const gchar * cache, goffset size)
|
||||
{
|
||||
g_return_val_if_fail (host, NULL);
|
||||
g_return_val_if_fail (path, NULL);
|
||||
|
||||
// Comprobar que cache existe y se puede escribir, comprobar tamaño disponible
|
||||
return g_object_new (DB_TYPE_FILE_LOADER,
|
||||
"host", host, "path", path,
|
||||
"cache", cache, "size", size, NULL);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Methods
|
||||
|
||||
static File * file_new (DbFileLoader * obj, const gchar * path, const GBytes * data,
|
||||
DbFileLoaderCallbackFunc func, gpointer user_data, gboolean async)
|
||||
{
|
||||
File * file = g_new (File, 1);
|
||||
|
||||
file->obj = g_object_ref (obj);
|
||||
file->name = g_strdup (path);
|
||||
file->data = data ? g_boxed_copy (G_TYPE_BYTES, data) : NULL;
|
||||
file->error = NULL;
|
||||
file->func = func;
|
||||
file-> user_data = user_data;
|
||||
file->cancel = async ? g_cancellable_new () : NULL;
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
static void file_free (File * file)
|
||||
{
|
||||
if (file)
|
||||
{
|
||||
g_free (file->name);
|
||||
|
||||
if (file->error)
|
||||
g_error_free (file->error);
|
||||
|
||||
if (file->data)
|
||||
g_bytes_unref (file->data);
|
||||
|
||||
g_object_unref (file->obj);
|
||||
g_free (file);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Connection management and usage
|
||||
*/
|
||||
static GFile * db_file_loader_get_cache_file (DbFileLoader * obj, const gchar * subpath)
|
||||
{
|
||||
gchar * path = g_strconcat (obj->priv->cache, "/", subpath, NULL);
|
||||
GFile * file = g_file_new_for_path (path);
|
||||
g_free (path);
|
||||
|
||||
return file;
|
||||
}
|
||||
|
||||
static gboolean db_file_loader_callback (File * file)
|
||||
{
|
||||
if (file->cancel && !g_cancellable_is_cancelled (file->cancel))
|
||||
file->func (file->obj, file->data, file->error, file->user_data);
|
||||
|
||||
g_hash_table_remove (file->obj->priv->downloading, file);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean db_file_loader_resolve_host (DbFileLoader * obj, GCancellable * cancel, GError ** error)
|
||||
{
|
||||
gboolean ret = FALSE;
|
||||
GResolver * r = g_resolver_get_default ();
|
||||
GList * ads = g_resolver_lookup_by_name (r, obj->priv->host, cancel, error);
|
||||
|
||||
if (ads)
|
||||
{
|
||||
GInetAddress * a = g_list_nth_data (ads, 0);// TODO? Use the entire list
|
||||
// TODO Add the option to set the connection port!!
|
||||
obj->priv->addr = G_INET_SOCKET_ADDRESS (g_inet_socket_address_new (a, 80));
|
||||
g_resolver_free_addresses (ads);
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
g_object_unref (r);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static GIOStream * db_file_loader_connect (DbFileLoader * obj, GCancellable * cancel, GError ** error)
|
||||
{
|
||||
GSocketClient * client = g_socket_client_new ();
|
||||
GIOStream * connection = G_IO_STREAM (g_socket_client_connect
|
||||
(client, G_SOCKET_CONNECTABLE (obj->priv->addr), cancel, error));
|
||||
|
||||
g_object_unref (client);
|
||||
return connection;
|
||||
}
|
||||
|
||||
static gchar * db_file_loader_create_request (DbFileLoader * obj, const gchar * subpath)
|
||||
{
|
||||
gchar * ifmod;
|
||||
gchar * request;
|
||||
gchar * date = NULL;
|
||||
|
||||
if (obj->priv->cache)
|
||||
{
|
||||
GFileInfo * info;
|
||||
GFile * file = db_file_loader_get_cache_file (obj, subpath);
|
||||
|
||||
info = g_file_query_info
|
||||
(file
|
||||
,G_FILE_ATTRIBUTE_TIME_CHANGED
|
||||
,G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS
|
||||
,NULL, NULL);
|
||||
|
||||
g_object_unref (file);
|
||||
|
||||
if (info)
|
||||
{
|
||||
guint64 date_attr = g_file_info_get_attribute_uint64
|
||||
(info, G_FILE_ATTRIBUTE_TIME_CHANGED);
|
||||
GDateTime * dt = g_date_time_new_from_unix_utc (date_attr);
|
||||
gchar * f_year_time = g_date_time_format (dt, "%Y %T GMT");
|
||||
gchar * f_month_day = g_date_time_format (dt, "%d");
|
||||
date = g_strdup_printf ("%s, %s %s %s"
|
||||
,WDAY[g_date_time_get_day_of_week (dt)]
|
||||
,f_month_day
|
||||
,MONTH[g_date_time_get_month (dt)]
|
||||
,f_year_time
|
||||
);
|
||||
|
||||
g_free (f_month_day);
|
||||
g_free (f_year_time);
|
||||
g_date_time_unref (dt);
|
||||
g_object_unref (info);
|
||||
}
|
||||
}
|
||||
|
||||
ifmod = date ? g_strconcat ("If-modified-since: ", date, "\r\n", NULL) : "";
|
||||
request = g_strdup_printf (format_request,
|
||||
obj->priv->path, subpath, obj->priv->host, ifmod);
|
||||
|
||||
if (date)
|
||||
{
|
||||
g_free (date);
|
||||
g_free (ifmod);
|
||||
}
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
static gboolean db_file_loader_store (DbFileLoader * obj
|
||||
,const gchar * subpath
|
||||
,const gchar * data
|
||||
,gsize len
|
||||
,GError ** error)
|
||||
{
|
||||
gsize dir_len;
|
||||
gboolean ret = FALSE;
|
||||
gchar * path = g_strconcat (obj->priv->cache, "/",subpath, NULL);
|
||||
GFile * file = g_file_new_for_path (path);
|
||||
gchar * name = g_file_get_basename (file);
|
||||
|
||||
dir_len = strlen (path) - strlen (name);
|
||||
gchar dir[dir_len];
|
||||
g_strlcpy (dir, path, dir_len);
|
||||
g_free (name);
|
||||
|
||||
g_mutex_lock (obj->priv->cache_mutex);
|
||||
|
||||
if (g_mkdir_with_parents (dir, 00700) >= 0)
|
||||
{
|
||||
if (!g_file_query_exists (file, NULL)
|
||||
&& g_file_set_contents (path, data, len, error))
|
||||
ret = TRUE;
|
||||
}
|
||||
else
|
||||
g_set_error (error, DB_FILE_LOADER_LOG_DOMAIN,
|
||||
g_file_error_from_errno (errno), _("%s not cached"), subpath);
|
||||
|
||||
g_mutex_unlock (obj->priv->cache_mutex);
|
||||
|
||||
g_free (path);
|
||||
g_object_unref (file);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static gchar * db_file_loader_load_from_cache (DbFileLoader * obj
|
||||
,const gchar * subpath
|
||||
,gsize * len
|
||||
,GError ** error)
|
||||
{
|
||||
gchar * data;
|
||||
GFile * file = db_file_loader_get_cache_file (obj, subpath);
|
||||
|
||||
g_file_load_contents (file, NULL, &data, len, NULL, error);
|
||||
g_object_unref (file);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
static void db_file_loader_job_download (File * file, DbFileLoader * obj)
|
||||
{
|
||||
gsize len;
|
||||
gchar ** split;
|
||||
gchar * status_line = NULL;
|
||||
gchar * request = NULL;
|
||||
gchar * data = NULL;
|
||||
GError * error = NULL;
|
||||
GCancellable * cancel = file->cancel;
|
||||
GIOStream * connection = NULL;
|
||||
GOutputStream * send_stream;
|
||||
GDataInputStream * receive_stream = NULL;
|
||||
|
||||
g_mutex_lock (obj->priv->mutex);
|
||||
|
||||
if (!obj->priv->addr && !db_file_loader_resolve_host (obj, cancel, &error))
|
||||
{
|
||||
g_mutex_unlock (obj->priv->mutex);
|
||||
goto final;
|
||||
}
|
||||
|
||||
g_mutex_unlock (obj->priv->mutex);
|
||||
|
||||
if (!(connection = db_file_loader_connect (obj, cancel, &error)))
|
||||
goto final;
|
||||
|
||||
request = db_file_loader_create_request (obj, file->name);
|
||||
send_stream = g_io_stream_get_output_stream (connection);
|
||||
|
||||
if (0 > g_output_stream_write (send_stream, request, strlen (request), cancel, &error)
|
||||
|| !g_output_stream_close (send_stream, cancel, &error))
|
||||
goto final;
|
||||
|
||||
receive_stream = g_data_input_stream_new (g_io_stream_get_input_stream (connection));
|
||||
g_data_input_stream_set_newline_type (receive_stream, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
|
||||
status_line = g_data_input_stream_read_line (receive_stream, &len, cancel, &error);
|
||||
|
||||
if (!status_line)
|
||||
goto final;
|
||||
|
||||
split = g_strsplit (status_line, " ", -1);
|
||||
guint status = g_strv_length (split) >= 2 ? atoi (split[1]) : 0;
|
||||
g_strfreev (split);
|
||||
|
||||
switch (status)
|
||||
{
|
||||
gchar * line;
|
||||
|
||||
case 200:
|
||||
{
|
||||
gboolean content_known;
|
||||
guint i, nbytes = 0;
|
||||
line = NULL;
|
||||
|
||||
do
|
||||
{// Read header fields
|
||||
g_free (line);
|
||||
line = g_data_input_stream_read_line
|
||||
(receive_stream, &len, cancel, &error);
|
||||
|
||||
if (g_str_has_prefix (line, "Content-Length: "))
|
||||
{
|
||||
nbytes = atoi (line + 16);
|
||||
content_known = TRUE;
|
||||
}
|
||||
}
|
||||
while (line && len && !error);
|
||||
|
||||
g_free (line);
|
||||
|
||||
if (!error)
|
||||
{
|
||||
if (!content_known)
|
||||
g_set_error (&error, DB_FILE_LOADER_LOG_DOMAIN, status,
|
||||
_("Unknown content length of file %s"), file->name);
|
||||
else
|
||||
{
|
||||
len = nbytes;
|
||||
data = g_new (gchar, len);
|
||||
|
||||
for (i = 0; !error && i < len; i++)
|
||||
data[i] = g_data_input_stream_read_byte
|
||||
(receive_stream, cancel, &error);
|
||||
|
||||
if (!error && data)
|
||||
db_file_loader_store (obj, file->name, data, len, &error);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case 304:
|
||||
{
|
||||
data = db_file_loader_load_from_cache (obj, file->name, &len, &error);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if (status_line && !error)
|
||||
g_set_error (&error, DB_FILE_LOADER_LOG_DOMAIN, status,
|
||||
"%s: '%s'", status_line, file->name);
|
||||
}
|
||||
|
||||
file->data = g_bytes_new_take (data, len);
|
||||
|
||||
final:
|
||||
g_free (request);
|
||||
g_free (status_line);
|
||||
|
||||
if (receive_stream)
|
||||
{
|
||||
g_input_stream_close (G_INPUT_STREAM (receive_stream), NULL,
|
||||
error ? NULL : &error);
|
||||
g_object_unref (receive_stream);
|
||||
}
|
||||
|
||||
if (connection)
|
||||
{
|
||||
g_io_stream_close (connection, NULL, error ? NULL : &error);
|
||||
g_object_unref (connection);
|
||||
}
|
||||
|
||||
file->error = error;
|
||||
|
||||
g_idle_add_full (G_PRIORITY_DEFAULT_IDLE
|
||||
,(GSourceFunc) db_file_loader_callback, file
|
||||
,(GDestroyNotify) file_free
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_file_loader_download:
|
||||
* @obj: a #DbFileLoader
|
||||
* @path: the path to the file from @obj's path
|
||||
* @func: (scope async): the #DbFileLoaderCallbackFunc to call after downloading
|
||||
* or in case of error
|
||||
* @user_data: (closure): data to pass to @func
|
||||
*
|
||||
* Downloads a file from @file, which is a relative path to the file from the
|
||||
* base URL of the #DbFileLoader. The result will be availble in @func.
|
||||
**/
|
||||
void db_file_loader_download (DbFileLoader * obj
|
||||
,const gchar * path
|
||||
,DbFileLoaderCallbackFunc func
|
||||
,gpointer user_data)
|
||||
{
|
||||
File * file;
|
||||
|
||||
g_return_if_fail (DB_IS_FILE_LOADER (obj));
|
||||
g_return_if_fail (path);
|
||||
|
||||
if (!obj->priv->pool)
|
||||
obj->priv->pool = g_thread_pool_new ((GFunc) db_file_loader_job_download,
|
||||
obj, -1, FALSE, NULL);
|
||||
|
||||
file = file_new (obj, path, NULL, func, user_data, TRUE);
|
||||
g_hash_table_add (obj->priv->downloading, file);
|
||||
|
||||
g_thread_pool_push (obj->priv->pool, file, NULL);
|
||||
}
|
||||
|
||||
static void db_file_loader_job_upload (DbFileLoader * obj, File * file)
|
||||
{
|
||||
g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
|
||||
(GSourceFunc) db_file_loader_callback, file,
|
||||
(GDestroyNotify) file_free);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_file_loader_upload:
|
||||
* @obj: a #DbFileLoader
|
||||
* @data: a #GBytes with the data to upload
|
||||
* @path: a string with the path to the file
|
||||
* @func: (scope async): the #DbFileLoaderCallbackFunc to call after uploading
|
||||
* or in case of error
|
||||
* @user_data: (closure): data to pass to @func
|
||||
*
|
||||
* Uploads @data to @file, which is a relative path to the file from the base
|
||||
* URL of the #DbFileLoader. To retrieve the result, connect to the
|
||||
* "downloaded" signal and to the "error" signal to manage errors.
|
||||
**/
|
||||
void db_file_loader_upload (DbFileLoader * obj
|
||||
,GBytes * data
|
||||
,const gchar * path
|
||||
,DbFileLoaderCallbackFunc func
|
||||
,gpointer user_data)
|
||||
{
|
||||
File * file;
|
||||
|
||||
g_return_if_fail (DB_IS_FILE_LOADER (obj));
|
||||
g_return_if_fail (data);
|
||||
g_return_if_fail (path);
|
||||
//TODO? create a pool only for uploads
|
||||
if (!obj->priv->pool)
|
||||
obj->priv->pool = g_thread_pool_new ((GFunc) db_file_loader_job_upload,
|
||||
obj, -1, TRUE, NULL);
|
||||
|
||||
file = file_new (obj, path, data, func, user_data, TRUE);
|
||||
|
||||
g_thread_pool_push (obj->priv->pool, file, NULL);
|
||||
}
|
||||
|
||||
static void db_file_loader_cancel (DbFileLoader * obj, const gchar * name)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
File * file;
|
||||
|
||||
g_return_if_fail (DB_IS_FILE_LOADER (obj));
|
||||
if (!obj->priv->downloading) return;
|
||||
|
||||
g_hash_table_iter_init (&iter, obj->priv->downloading);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, (gpointer*) &file, NULL))
|
||||
if (!name || !g_strcmp0 (file->name, name))
|
||||
{
|
||||
g_cancellable_cancel (file->cancel);
|
||||
g_hash_table_iter_steal (&iter);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* db_file_loader_cancel_all:
|
||||
* @obj: a #DbFileLoader
|
||||
*
|
||||
* Cancels all downloads pending or in progress. Note that after cancelling a
|
||||
* task it may delay until it returns to the main loop. For the cause of this,
|
||||
* see g_cancellable_cancel().
|
||||
**/
|
||||
void db_file_loader_cancel_all (DbFileLoader * obj)
|
||||
{
|
||||
db_file_loader_cancel (obj, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_file_loader_cancel_by_name:
|
||||
* @obj: a #DbFileLoader
|
||||
* @name: an string with a filename
|
||||
*
|
||||
* Cancels the download of the file with name @name, that may be pending or in
|
||||
* progress. See db_file_loader_cancel_all() for more information.
|
||||
**/
|
||||
void db_file_loader_cancel_by_name (DbFileLoader * obj, const gchar * name)
|
||||
{
|
||||
if (name)
|
||||
db_file_loader_cancel (obj, name);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
|
||||
|
||||
enum
|
||||
{
|
||||
HOST_PROP = 1
|
||||
,PATH_PROP
|
||||
,CACHE_PROP
|
||||
,SIZE_PROP
|
||||
};
|
||||
|
||||
static void db_file_loader_set_property (DbFileLoader * obj, guint id,
|
||||
const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case HOST_PROP:
|
||||
{
|
||||
g_free (obj->priv->host);
|
||||
obj->priv->host = g_value_dup_string (value);
|
||||
break;
|
||||
}
|
||||
case PATH_PROP:
|
||||
{
|
||||
g_free (obj->priv->path);
|
||||
obj->priv->path = g_value_dup_string (value);
|
||||
break;
|
||||
}
|
||||
case CACHE_PROP:
|
||||
{
|
||||
const gchar * cache = g_value_get_string (value);
|
||||
g_free (obj->priv->cache);
|
||||
obj->priv->cache = g_build_filename (
|
||||
(cache ? cache : g_get_user_cache_dir ())
|
||||
,"hedera"
|
||||
,obj->priv->host
|
||||
,obj->priv->path
|
||||
,NULL);
|
||||
break;
|
||||
}
|
||||
case SIZE_PROP:
|
||||
{
|
||||
obj->priv->size = g_value_get_int64 (value);
|
||||
obj->priv->size = obj->priv->size <= 0 ? 0 : obj->priv->size;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void db_file_loader_get_property (DbFileLoader * obj, guint id,
|
||||
GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case HOST_PROP:
|
||||
g_value_set_string (value, obj->priv->host);
|
||||
break;
|
||||
case PATH_PROP:
|
||||
g_value_set_string (value, obj->priv->path);
|
||||
break;
|
||||
case CACHE_PROP:
|
||||
g_value_set_string (value, obj->priv->cache);
|
||||
case SIZE_PROP:
|
||||
g_value_set_int64 (value, obj->priv->size);
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
||||
|
||||
static void db_file_loader_init (DbFileLoader * obj)
|
||||
{
|
||||
obj->priv = G_TYPE_INSTANCE_GET_PRIVATE
|
||||
(obj, DB_TYPE_FILE_LOADER, DbFileLoaderPrivate);
|
||||
obj->priv->host = NULL;
|
||||
obj->priv->path = NULL;
|
||||
obj->priv->cache = NULL;
|
||||
obj->priv->size = CACHE_DEFAULT_SIZE;
|
||||
obj->priv->addr = NULL;
|
||||
obj->priv->pool = NULL;
|
||||
obj->priv->mutex = g_new (GMutex, 1);
|
||||
g_mutex_init (obj->priv->mutex);
|
||||
obj->priv->cache_mutex = g_new (GMutex, 1);
|
||||
g_mutex_init (obj->priv->cache_mutex);
|
||||
obj->priv->downloading = g_hash_table_new_full
|
||||
((GHashFunc) g_direct_hash, (GEqualFunc) g_direct_equal, NULL, NULL);
|
||||
}
|
||||
|
||||
static void db_file_loader_finalize (DbFileLoader * obj)
|
||||
{
|
||||
G_OBJECT_CLASS (db_file_loader_parent_class)->finalize (G_OBJECT (obj));
|
||||
|
||||
g_free (obj->priv->host);
|
||||
g_free (obj->priv->path);
|
||||
g_free (obj->priv->cache);
|
||||
|
||||
g_clear_object (&obj->priv->addr);
|
||||
|
||||
if (obj->priv->pool)
|
||||
g_thread_pool_free (obj->priv->pool, TRUE, TRUE);
|
||||
|
||||
g_mutex_clear (obj->priv->cache_mutex);
|
||||
g_free (obj->priv->cache_mutex);
|
||||
g_mutex_clear (obj->priv->mutex);
|
||||
g_free (obj->priv->mutex);
|
||||
|
||||
g_hash_table_destroy (obj->priv->downloading);
|
||||
}
|
||||
|
||||
static void db_file_loader_class_init (DbFileLoaderClass * klass)
|
||||
{
|
||||
GObjectClass * k = G_OBJECT_CLASS (klass);
|
||||
k->finalize = (GObjectFinalizeFunc) db_file_loader_finalize;
|
||||
k->set_property = (GObjectSetPropertyFunc) db_file_loader_set_property;
|
||||
k->get_property = (GObjectGetPropertyFunc) db_file_loader_get_property;
|
||||
g_type_class_add_private (klass, sizeof (DbFileLoaderPrivate));
|
||||
|
||||
g_object_class_install_property (k, HOST_PROP,
|
||||
g_param_spec_string ("host"
|
||||
,_("Host")
|
||||
,_("The host web server name to get the images")
|
||||
,NULL
|
||||
,G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
|
||||
));
|
||||
|
||||
g_object_class_install_property (k, PATH_PROP,
|
||||
g_param_spec_string ("path"
|
||||
,_("Path")
|
||||
,_("The path of the directory to interact with")
|
||||
,NULL
|
||||
,G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
|
||||
));
|
||||
|
||||
g_object_class_install_property (k, CACHE_PROP,
|
||||
g_param_spec_string ("cache"
|
||||
,_("Cache directory")
|
||||
,_("The local directory where the downloaded files will be stored. "
|
||||
"The default cache directory is 'hedera', under g_get_user_cache_dir().")
|
||||
,NULL
|
||||
,G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
|
||||
));
|
||||
|
||||
g_object_class_install_property (k, SIZE_PROP,
|
||||
g_param_spec_int64 ("size"
|
||||
,_("Maximal cache size")
|
||||
,_("The maximal size for the contents of the cache directory")
|
||||
,0
|
||||
,G_MAXOFFSET
|
||||
,CACHE_DEFAULT_SIZE
|
||||
,G_PARAM_READWRITE
|
||||
));
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_FILE_LOADER_H
|
||||
#define DB_FILE_LOADER_H
|
||||
|
||||
#include <sql/sql.h>
|
||||
|
||||
#define DB_FILE_LOADER_LOG_DOMAIN g_quark_from_string ("DbFileLoader")
|
||||
|
||||
#define DB_TYPE_FILE_LOADER (db_file_loader_get_type ())
|
||||
#define DB_FILE_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, DB_TYPE_FILE_LOADER, DbFileLoader))
|
||||
#define DB_IS_FILE_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, DB_TYPE_FILE_LOADER))
|
||||
#define DB_FILE_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, DB_TYPE_FILE_LOADER, DbFileLoaderClass))
|
||||
#define DB_IS_FILE_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (klass, DB_TYPE_FILE_LOADER))
|
||||
#define DB_FILE_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, DB_TYPE_FILE_LOADER, DbFileLoaderClass))
|
||||
|
||||
typedef struct _DbFileLoader DbFileLoader;
|
||||
typedef struct _DbFileLoaderClass DbFileLoaderClass;
|
||||
typedef struct _DbFileLoaderPrivate DbFileLoaderPrivate;
|
||||
|
||||
/**
|
||||
* DbFileLoaderCallbackFunc:
|
||||
* @obj: a #DbFileLoader
|
||||
* @data: the data of a file
|
||||
* @error: a destination for a #GError
|
||||
* @user_data: (closure): pointer to user data
|
||||
*
|
||||
* Function to call after any operation, successful or not. If the operation was
|
||||
* cancelled, the error #G_IO_ERROR_CANCELLED will be returned.
|
||||
**/
|
||||
typedef void (* DbFileLoaderCallbackFunc) (DbFileLoader * obj
|
||||
,GBytes * data
|
||||
,const GError * error
|
||||
,gpointer user_data);
|
||||
|
||||
struct _DbFileLoader
|
||||
{
|
||||
GObject parent;
|
||||
DbFileLoaderPrivate * priv;
|
||||
};
|
||||
|
||||
struct _DbFileLoaderClass
|
||||
{
|
||||
/* <private> */
|
||||
GObjectClass parent;
|
||||
};
|
||||
|
||||
GType db_file_loader_get_type ();
|
||||
DbFileLoader * db_file_loader_new (const gchar * host
|
||||
,const gchar * path);
|
||||
DbFileLoader * db_file_loader_new_simple (const gchar * host
|
||||
,const gchar * path);
|
||||
void db_file_loader_download (DbFileLoader * obj
|
||||
,const gchar * path
|
||||
,DbFileLoaderCallbackFunc func
|
||||
,gpointer user_data);
|
||||
void db_file_loader_cancel_all (DbFileLoader * obj);
|
||||
void db_file_loader_cancel_by_name (DbFileLoader * obj
|
||||
,const gchar * name);
|
||||
void db_file_loader_upload (DbFileLoader * obj
|
||||
,GBytes * data
|
||||
,const gchar * path
|
||||
,DbFileLoaderCallbackFunc func
|
||||
,gpointer user_data);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-iter.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-iter
|
||||
* @Short_description: an iterator for the #DbModel
|
||||
* @Title: DbIter
|
||||
* @See_also: #DbModel
|
||||
*
|
||||
* The #DbIter is the structure used to navigate through a #DbModel. See #DbModel
|
||||
* for the methods required to do it.
|
||||
**/
|
||||
G_DEFINE_BOXED_TYPE (DbIter, db_iter, db_iter_copy, db_iter_free);
|
||||
|
||||
/**
|
||||
* db_model_iter_compare:
|
||||
* @a: a #DbIter
|
||||
* @b: a #DbIter
|
||||
*
|
||||
* Compares the two given iters for equality. The equality between two
|
||||
* #DbIter is determined by its stamp and the row of a #DbModel they are
|
||||
* pointing to.
|
||||
*
|
||||
* Return value: #TRUE if the two iters are the same
|
||||
**/
|
||||
gboolean db_iter_compare (DbIter * a, DbIter * b)
|
||||
{
|
||||
return (a->stamp == b->stamp && a->data == b->data);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_iter_copy:
|
||||
* @obj: the #DbIter to copy
|
||||
*
|
||||
* Copies a #DbIter. Note that this function copies only the reference to the
|
||||
* data in @obj. This is so due to the nature of #DbIter and it's use.
|
||||
*
|
||||
* Return value: a new #DbIter
|
||||
**/
|
||||
DbIter * db_iter_copy (DbIter * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
DbIter * dst = g_new (DbIter, 1);
|
||||
dst->stamp = obj->stamp;
|
||||
dst->data = obj->data;
|
||||
dst->data2 = obj->data2;
|
||||
dst->data3 = obj->data3;
|
||||
return dst;
|
||||
}
|
||||
|
||||
void db_iter_free (DbIter * obj)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
g_free (obj);
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_ITER_H
|
||||
#define DB_ITER_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#define DB_TYPE_ITER (db_iter_get_type())
|
||||
|
||||
typedef struct _DbIter DbIter;
|
||||
|
||||
/**
|
||||
* DbIter:
|
||||
* @stamp: a unique stamp to catch invalid iterators
|
||||
* @data: model-specific data
|
||||
* @data2: model-specific data
|
||||
* @data3: model-specific data
|
||||
*
|
||||
* The #DbIter is the primary structure for accessing a #DbModel. The #DbModel
|
||||
* puts a unique integer in the @stamp member, and model-specific data in
|
||||
* each of the three @data members.
|
||||
**/
|
||||
struct _DbIter
|
||||
{
|
||||
gint stamp;
|
||||
gpointer data;
|
||||
gpointer data2;
|
||||
gpointer data3;
|
||||
};
|
||||
|
||||
GType db_iter_get_type ();
|
||||
|
||||
gboolean db_iter_compare (DbIter * a, DbIter * b);
|
||||
DbIter * db_iter_copy (DbIter * obj);
|
||||
void db_iter_free (DbIter * obj);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,137 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_ITERATOR_H
|
||||
#define DB_ITERATOR_H
|
||||
|
||||
#include "db-model.h"
|
||||
|
||||
#define DB_TYPE_ITERATOR (db_iterator_get_type ())
|
||||
#define DB_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, DB_TYPE_ITERATOR, DbIterator))
|
||||
#define DB_IS_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, DB_TYPE_ITERATOR))
|
||||
#define DB_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST (klass, DB_TYPE_ITERATOR, DbIteratorClass))
|
||||
#define DB_IS_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE (klass, DB_TYPE_ITERATOR))
|
||||
#define DB_ITERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, DB_TYPE_ITERATOR, DbIteratorClass))
|
||||
|
||||
#define DB_TYPE_ITERATOR_MODE (db_iterator_mode_get_type ())
|
||||
|
||||
typedef struct _DbIterator DbIterator;
|
||||
typedef struct _DbIteratorClass DbIteratorClass;
|
||||
|
||||
#include "db-param.h"
|
||||
|
||||
/**
|
||||
* DbIteratorMode:
|
||||
* @DB_ITERATOR_MODE_ON_CHANGE: every change made in a cell will be sent to the
|
||||
* database instantly.
|
||||
* @DB_ITERATOR_MODE_ON_ITER: every change made in a row will be sent to the
|
||||
* database when iter changes.
|
||||
* @DB_ITERATOR_MODE_ON_DEMAND: nothing will be sent to the database since it's
|
||||
* demanded.
|
||||
*
|
||||
* The working mode of a Iterator.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_ITERATOR_MODE_ON_CHANGE
|
||||
,DB_ITERATOR_MODE_ON_ITER
|
||||
,DB_ITERATOR_MODE_ON_DEMAND
|
||||
}
|
||||
DbIteratorMode;
|
||||
|
||||
/**
|
||||
* DbIteratorMove:
|
||||
* @DB_ITERATOR_MOVE_FIRST: Moves to the first position.
|
||||
* @DB_ITERATOR_MOVE_PREVIOUS: Moves previous.
|
||||
* @DB_ITERATOR_MOVE_NEXT: Moves next.
|
||||
* @DB_ITERATOR_MOVE_LAST: Moves to the last position.
|
||||
*
|
||||
* Indicates the movement.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_ITERATOR_MOVE_FIRST
|
||||
,DB_ITERATOR_MOVE_PREVIOUS
|
||||
,DB_ITERATOR_MOVE_NEXT
|
||||
,DB_ITERATOR_MOVE_LAST
|
||||
}
|
||||
DbIteratorMove;
|
||||
|
||||
struct _DbIterator
|
||||
{
|
||||
GObject parent;
|
||||
DbModel * model;
|
||||
GList * params;
|
||||
DbIteratorMode mode;
|
||||
DbIter iter;
|
||||
gint row;
|
||||
gboolean row_selected;
|
||||
gboolean remember_selection;
|
||||
|
||||
DbConn * conn;
|
||||
SqlStmt * stmt;
|
||||
gchar * sql;
|
||||
gboolean use_file;
|
||||
};
|
||||
|
||||
struct _DbIteratorClass
|
||||
{
|
||||
/* <private> */
|
||||
GObjectClass parent;
|
||||
};
|
||||
|
||||
GType db_iterator_get_type ();
|
||||
GType db_iterator_mode_get_type () G_GNUC_CONST;
|
||||
|
||||
DbIterator * db_iterator_new (DbModel * model);
|
||||
DbIterator * db_iterator_new_with_stmt (DbConn * conn, SqlStmt * stmt);
|
||||
DbIterator * db_iterator_new_with_sql (DbConn * conn, const gchar * sql);
|
||||
DbModel * db_iterator_get_model (DbIterator * obj);
|
||||
DbConn * db_iterator_get_conn (DbIterator * obj);
|
||||
void db_iterator_set_conn (DbIterator * obj, DbConn * conn);
|
||||
gboolean db_iterator_is_ready (DbIterator * obj);
|
||||
DbIteratorMode db_iterator_get_mode (DbIterator * obj);
|
||||
void db_iterator_set_mode (DbIterator * obj, DbIteratorMode mode);
|
||||
gint db_iterator_get_row (DbIterator * obj);
|
||||
gboolean db_iterator_get_iter (DbIterator * obj, DbIter * iter);
|
||||
void db_iterator_move_iter (DbIterator * obj, DbIter * iter);
|
||||
void db_iterator_move_first (DbIterator * obj);
|
||||
void db_iterator_move_last (DbIterator * obj);
|
||||
void db_iterator_move_previous (DbIterator * obj);
|
||||
void db_iterator_move_next (DbIterator * obj);
|
||||
void db_iterator_move_to (DbIterator * obj, DbIteratorMove move);
|
||||
void db_iterator_refresh (DbIterator * obj);
|
||||
const GvnParamSpec * db_iterator_get_spec (DbIterator * obj, gint column);
|
||||
const GValue * db_iterator_get_value (DbIterator * obj, gint column);
|
||||
gint db_iterator_get_column_index (DbIterator * obj, const gchar * name);
|
||||
void db_iterator_set_value (DbIterator * obj, gint column, const GValue * value, GError ** err);
|
||||
void db_iterator_delete (DbIterator * obj);
|
||||
void db_iterator_insert (DbIterator * obj);
|
||||
void db_iterator_add_param (DbIterator * obj, DbParam * param);
|
||||
GvnParam * db_iterator_get_param (DbIterator * obj, const gchar * column);
|
||||
GList * db_iterator_get_params (DbIterator * obj);
|
||||
void db_iterator_bind_param (DbIterator * obj, const gchar * column, GvnParam * param);
|
||||
void db_iterator_link (DbIterator * obj, const gchar * field, DbIterator * src, const gchar * column);
|
||||
void db_iterator_link_with_param (DbIterator * obj, const gchar * field, GvnParam * param);
|
||||
gint db_iterator_get_nrows (DbIterator * obj);
|
||||
DbModelUpdateFlags db_iterator_get_update_flags (DbIterator * obj);
|
||||
void db_iterator_reverse_operations (DbIterator * obj);
|
||||
void db_iterator_perform_operations (DbIterator * obj);
|
||||
DbModelRowOp db_iterator_get_pending_operations (DbIterator * obj);
|
||||
gboolean db_iterator_has_pending_operations (DbIterator * obj);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* Copyright (C) 2013 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-model-holder.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-model-holder
|
||||
* @Short_description:
|
||||
* @Title: DbModelHolder
|
||||
* @See_also: #DbModel
|
||||
*
|
||||
* This interface should be implemented from any class that uses a #DbModel as
|
||||
* datasource.
|
||||
**/
|
||||
|
||||
G_DEFINE_INTERFACE (DbModelHolder, db_model_holder, G_TYPE_INTERFACE);
|
||||
|
||||
/**
|
||||
* db_model_holder_get_model:
|
||||
* @obj: a #DbModelHolder
|
||||
*
|
||||
* Gets the model used by holder.
|
||||
*
|
||||
* Return value: the #DbModel
|
||||
**/
|
||||
DbModel * db_model_holder_get_model (DbModelHolder * obj)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_MODEL_HOLDER (obj), NULL);
|
||||
|
||||
return DB_MODEL_HOLDER_GET_INTERFACE (obj)->get_model (obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_model_holder_get_model:
|
||||
* @obj: a #DbModelHolder
|
||||
* @model: the #DbModel
|
||||
*
|
||||
* Sets the model used by holder.
|
||||
**/
|
||||
void db_model_holder_set_model (DbModelHolder * obj, DbModel * model)
|
||||
{
|
||||
g_return_if_fail (DB_IS_MODEL_HOLDER (obj));
|
||||
|
||||
DB_MODEL_HOLDER_GET_INTERFACE (obj)->set_model (obj, model);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
||||
|
||||
static void db_model_holder_default_init (DbModelHolderInterface * klass)
|
||||
{
|
||||
g_object_interface_install_property (klass,
|
||||
g_param_spec_object ("model"
|
||||
,"Model"
|
||||
,"The model used by the holder"
|
||||
,DB_TYPE_MODEL
|
||||
,G_PARAM_READWRITE
|
||||
));
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* Copyright (C) 2013 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_MODEL_HOLDER_H
|
||||
#define DB_MODEL_HOLDER_H
|
||||
|
||||
#include "db-model.h"
|
||||
|
||||
#define DB_TYPE_MODEL_HOLDER (db_model_holder_get_type ())
|
||||
#define DB_MODEL_HOLDER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DB_TYPE_MODEL_HOLDER, DbModelHolder))
|
||||
#define DB_IS_MODEL_HOLDER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DB_TYPE_MODEL_HOLDER))
|
||||
#define DB_MODEL_HOLDER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), DB_TYPE_MODEL_HOLDER, DbModelHolderInterface))
|
||||
|
||||
typedef struct _DbModelHolder DbModelHolder;
|
||||
typedef struct _DbModelHolderInterface DbModelHolderInterface;
|
||||
|
||||
typedef DbModel * (* DbModelHolderGetModelFunc) (DbModelHolder * obj);
|
||||
typedef void (* DbModelHolderSetModelFunc) (DbModelHolder * obj, DbModel * sql);
|
||||
|
||||
struct _DbModelHolder {};
|
||||
|
||||
struct _DbModelHolderInterface
|
||||
{
|
||||
/* <private> */
|
||||
GTypeInterface parent;
|
||||
DbModelHolderGetModelFunc get_model;
|
||||
DbModelHolderSetModelFunc set_model;
|
||||
};
|
||||
|
||||
GType db_model_holder_get_type ();
|
||||
DbModel * db_model_holder_get_model (DbModelHolder * obj);
|
||||
void db_model_holder_set_model (DbModelHolder * obj, DbModel * model);
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,292 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This file is part of Hedera.
|
||||
*
|
||||
* Hedera is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_MODEL_H
|
||||
#define DB_MODEL_H
|
||||
|
||||
#include <sql/sql.h>
|
||||
#include "db-conn.h"
|
||||
#include "db-iter.h"
|
||||
|
||||
#define DB_MODEL_LOG_DOMAIN (g_quark_from_string ("DbModel"))
|
||||
|
||||
#define DB_TYPE_MODEL (db_model_get_type())
|
||||
#define DB_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DB_TYPE_MODEL, DbModel))
|
||||
#define DB_IS_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DB_TYPE_MODEL))
|
||||
#define DB_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DB_TYPE_MODEL, DbModelClass))
|
||||
#define DB_IS_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_MODEL))
|
||||
#define DB_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_MODEL, DbModelClass))
|
||||
|
||||
#define DB_TYPE_MODEL_UPDATE_FLAGS (db_model_update_flags_get_type())
|
||||
|
||||
typedef struct _DbModel DbModel;
|
||||
typedef struct _DbModelClass DbModelClass;
|
||||
typedef struct _DbModelPrivate DbModelPrivate;
|
||||
|
||||
/**
|
||||
* DbModelRowOp:
|
||||
* @DB_MODEL_ROW_OP_INSERT: an INSERT operation
|
||||
* @DB_MODEL_ROW_OP_DELETE: a DELETE operation
|
||||
* @DB_MODEL_ROW_OP_UPDATE: an UPDATE operation
|
||||
*
|
||||
* Flags stating the changes made over a row.
|
||||
*
|
||||
* If a DELETE is taking place on a row at the same time of another operation,
|
||||
* the changes won't be performed and the row will be deleted. Every INSERT
|
||||
* operation must have an UPDATE operation to add data, otherwise all data will
|
||||
* get filled with the values set by default by the DB. Each UPDATE operation
|
||||
* will merge with the previous ones and substitute the values already set by
|
||||
* these.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_MODEL_ROW_OP_INSERT = 1 << 0
|
||||
,DB_MODEL_ROW_OP_DELETE = 1 << 1
|
||||
,DB_MODEL_ROW_OP_UPDATE = 1 << 2
|
||||
}
|
||||
DbModelRowOp;
|
||||
|
||||
/**
|
||||
* DbModelError:
|
||||
* @DB_MODEL_ERROR_NOT_READY: the model data is not completely loaded yet
|
||||
* @DB_MODEL_ERROR_NOT_UPDATABLE: a changed model column cannot be updated
|
||||
* @DB_MODEL_ERROR_OUT_OF_RANGE: an index is out of the column range
|
||||
*
|
||||
* Error codes of a #DbModel.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_MODEL_ERROR_NOT_READY
|
||||
,DB_MODEL_ERROR_NOT_UPDATABLE
|
||||
,DB_MODEL_ERROR_OUT_OF_RANGE
|
||||
}
|
||||
DbModelError;
|
||||
|
||||
/**
|
||||
* DbModelUpdateFlags:
|
||||
* @DB_MODEL_INSERT: rows can be inserted into the model
|
||||
* @DB_MODEL_DELETE: it's possible to delete rows from the model
|
||||
* @DB_MODEL_UPDATE: the values of the model can be changed
|
||||
*
|
||||
* Indicates which operations are allowed for the user in a #DbModel.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_MODEL_INSERT = 1 << 0
|
||||
,DB_MODEL_DELETE = 1 << 1
|
||||
,DB_MODEL_UPDATE = 1 << 2
|
||||
/* <private> */
|
||||
,DB_MODEL_ALL = DB_MODEL_INSERT | DB_MODEL_DELETE | DB_MODEL_UPDATE
|
||||
}
|
||||
DbModelUpdateFlags;
|
||||
|
||||
/**
|
||||
* DbModelStatus:
|
||||
* @DB_MODEL_STATUS_ERROR: there has been an error while executing the main
|
||||
* statement of a #DbModel
|
||||
* @DB_MODEL_STATUS_LOADING: the statement is being executed
|
||||
* @DB_MODEL_STATUS_READY: the statement execution is over and the data is
|
||||
* available on the #DbModel
|
||||
* @DB_MODEL_STATUS_CLEAN: the #DbModel is created but the statement has not
|
||||
* been executed yet
|
||||
*
|
||||
* These constants indicate the status of the model. This status depends on the
|
||||
* execution of the stamtement (@stmt property)of a #DbModel. They are returned
|
||||
* by db_model_get_status().
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_MODEL_STATUS_ERROR
|
||||
,DB_MODEL_STATUS_LOADING
|
||||
,DB_MODEL_STATUS_READY
|
||||
,DB_MODEL_STATUS_CLEAN
|
||||
}
|
||||
DbModelStatus;
|
||||
|
||||
/**
|
||||
* DbModelMode:
|
||||
* @DB_MODEL_MODE_ON_CHANGE: every change made in the model will be inmediatelly
|
||||
* sent to the database
|
||||
* @DB_MODEL_MODE_ON_DEMAND: nothing will be sent to the database since demanded
|
||||
* by calling db_model_perform_operations()
|
||||
*
|
||||
* The working mode of a #DbModel, depending on which the changes made on it
|
||||
* will be sent to the database or will be made only locally.
|
||||
* The same methods are used to modify the model in both modes
|
||||
* (db_model_set_value(), db_model_insert() and db_model_delete()).
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_MODEL_MODE_ON_CHANGE
|
||||
,DB_MODEL_MODE_ON_DEMAND
|
||||
}
|
||||
DbModelMode;
|
||||
|
||||
/**
|
||||
* DbSortType:
|
||||
* @DB_SORT_ASCENDING: Ascending sort order
|
||||
* @DB_SORT_DESCENDING: Descending sort order
|
||||
*
|
||||
* Determines the direction of a sort.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_SORT_ASCENDING
|
||||
,DB_SORT_DESCENDING
|
||||
}
|
||||
DbSortType;
|
||||
|
||||
/**
|
||||
* DbIterCompareFunc:
|
||||
* @model: a #DbModel
|
||||
* @a: a #DbIter
|
||||
* @b: a #DbIter
|
||||
* @user_data: (closure): user-provided data to use while comparing two #DbIter
|
||||
*
|
||||
* Prototype of a function used to search some in a model using
|
||||
* #DbIter to iterate through it.
|
||||
**/
|
||||
typedef gint (*DbIterCompareFunc) (DbModel * model
|
||||
,DbIter * a
|
||||
,DbIter * b
|
||||
,gpointer user_data);
|
||||
|
||||
struct _DbModel
|
||||
{
|
||||
GObject parent;
|
||||
DbModelPrivate * priv;
|
||||
};
|
||||
|
||||
struct _DbModelClass
|
||||
{
|
||||
/* <private> */
|
||||
GObjectClass parent;
|
||||
};
|
||||
|
||||
GType db_model_get_type ();
|
||||
GType db_model_update_flags_get_type () G_GNUC_CONST;
|
||||
|
||||
DbModel * db_model_new (DbConn * conn, SqlStmt * stmt);
|
||||
DbModel * db_model_new_with_sql (DbConn * conn, const gchar * sql);
|
||||
DbModel * db_model_new_with_file (DbConn * conn, const gchar * file);
|
||||
DbConn * db_model_get_conn (DbModel * obj);
|
||||
void db_model_set_conn (DbModel * obj, DbConn * conn);
|
||||
const GvnParamSpec * db_model_get_spec (DbModel * obj, gint col);
|
||||
const gchar * db_model_get_column_name (DbModel * obj, gint col);
|
||||
gint db_model_get_column_index (DbModel * obj, const gchar * name);
|
||||
void db_model_refresh (DbModel * obj);
|
||||
const SqlStmt * db_model_get_stmt (DbModel * obj);
|
||||
void db_model_set_stmt (DbModel * obj, SqlStmt * stmt);
|
||||
void db_model_add_pre_stmt (DbModel * obj, SqlStmt * stmt);
|
||||
void db_model_add_post_stmt (DbModel * obj, SqlStmt * stmt);
|
||||
DbModelStatus db_model_get_status (DbModel * obj);
|
||||
const gchar * db_model_get_main_table (DbModel * obj);
|
||||
void db_model_request_main_table (DbModel * obj, const gchar * table);
|
||||
DbModelUpdateFlags db_model_get_update_flags (DbModel * obj);
|
||||
void db_model_request_update_flags (DbModel * obj
|
||||
,DbModelUpdateFlags flags);
|
||||
void db_model_unset_update_flags (DbModel * obj
|
||||
,DbModelUpdateFlags flags);
|
||||
void db_model_set_mode (DbModel * obj, DbModelMode mode);
|
||||
DbModelMode db_model_get_mode (DbModel * obj);
|
||||
void db_model_toggle_mode (DbModel * obj);
|
||||
gboolean db_model_get_last (DbModel * obj, DbIter * iter);
|
||||
void db_model_get (DbModel * obj
|
||||
,DbIter * iter
|
||||
,...);
|
||||
void db_model_set (DbModel * obj
|
||||
,DbIter * iter
|
||||
,...);
|
||||
const GValue * db_model_get_value (DbModel * obj,
|
||||
DbIter * iter,
|
||||
gint col,
|
||||
GError ** err);
|
||||
gboolean db_model_set_value (DbModel * obj,
|
||||
DbIter * iter,
|
||||
gint col,
|
||||
const GValue * value,
|
||||
GError ** err);
|
||||
gboolean db_model_insert (DbModel * obj, DbIter * iter);
|
||||
void db_model_delete (DbModel * obj, DbIter * iter);
|
||||
DbModelRowOp db_model_get_row_operations (DbModel * obj, DbIter * iter);
|
||||
gboolean db_model_has_pending_operations (DbModel * obj);
|
||||
void db_model_perform_operations (DbModel * obj, gboolean retry);
|
||||
void db_model_reverse_operations (DbModel * obj);
|
||||
void db_model_order_by (DbModel * obj,
|
||||
gint col,
|
||||
DbSortType order);
|
||||
gboolean db_model_search (DbModel * obj,
|
||||
gint col,
|
||||
DbIter * iter,
|
||||
gpointer content);
|
||||
gboolean db_model_search_value (DbModel * obj,
|
||||
gint col,
|
||||
DbIter * iter,
|
||||
const GValue * value);
|
||||
gint db_model_get_nrows (DbModel * obj);
|
||||
gboolean db_model_iter_is_valid (DbIter * iter
|
||||
,DbModel * model);
|
||||
void db_model_add_join_columns (DbModel * obj
|
||||
,const gchar * left
|
||||
,const gchar * right);
|
||||
void db_model_set_default_value_from_column (DbModel * obj
|
||||
,const gchar * dst_field
|
||||
,gint src_column);
|
||||
void db_model_set_default_value_from_param (DbModel * obj
|
||||
,const gchar * dst_field
|
||||
,GvnParam * param
|
||||
,const gchar * id);
|
||||
void db_model_add_param (DbModel * obj
|
||||
,const gchar * id
|
||||
,GvnParam * param);
|
||||
|
||||
//GtkTreeModel-like methods
|
||||
|
||||
gint db_model_get_ncols (DbModel * obj);
|
||||
GType db_model_get_column_type (DbModel * obj, gint index);
|
||||
gboolean db_model_get_iter_first (DbModel * obj, DbIter * iter);
|
||||
gboolean db_model_get_iter (DbModel * obj,
|
||||
DbIter * iter,
|
||||
gint path);
|
||||
gint db_model_get_path (DbModel * obj, DbIter * iter);
|
||||
gboolean db_model_iter_next (DbModel * obj, DbIter * iter);
|
||||
gboolean db_model_iter_prev (DbModel * obj, DbIter * iter);
|
||||
void db_model_ref_node (DbModel * obj, DbIter * iter);
|
||||
void db_model_unref_node (DbModel * obj, DbIter * iter);
|
||||
|
||||
//GtkTreeSortable-like methods
|
||||
|
||||
gboolean db_model_get_sort_column_id (DbModel * obj,
|
||||
gint * sort_column_id,
|
||||
DbSortType * order);
|
||||
void db_model_set_sort_column_id (DbModel * obj,
|
||||
gint sort_column_id,
|
||||
DbSortType order);
|
||||
void db_model_set_sort_func (DbModel * obj,
|
||||
gint sort_column_id,
|
||||
DbIterCompareFunc func,
|
||||
gpointer data,
|
||||
GDestroyNotify destroy);
|
||||
void db_model_set_default_sort_func (DbModel * obj,
|
||||
DbIterCompareFunc func,
|
||||
gpointer data,
|
||||
GDestroyNotify destroy);
|
||||
gboolean db_model_has_default_sort_func (DbModel * obj);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,262 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-param.h"
|
||||
|
||||
G_DEFINE_TYPE (DbParam, db_param, GVN_TYPE_PARAM);
|
||||
|
||||
/**
|
||||
* db_param_new:
|
||||
* @column_name: col name of #DbModel associated to param.
|
||||
*
|
||||
* Creates a new #DbParam.
|
||||
*
|
||||
* Return value: the new #DbParam
|
||||
**/
|
||||
GvnParam * db_param_new (const gchar * column_name)
|
||||
{
|
||||
return g_object_new (DB_TYPE_PARAM, "column-name", column_name, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_param_new_with_index:
|
||||
* @column_index: col index of #DbModel associated to param.
|
||||
*
|
||||
* Creates a new #DbParam.
|
||||
*
|
||||
* Return value: the new #DbParam
|
||||
**/
|
||||
GvnParam * db_param_new_with_index (guint column_index)
|
||||
{
|
||||
return g_object_new (DB_TYPE_PARAM, "column-index", column_index, NULL);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
|
||||
|
||||
static void db_param_on_value_changed (DbParam * obj, const GValue * value, gpointer data)
|
||||
{
|
||||
db_iterator_set_value (obj->iterator, obj->column_index, value, NULL);
|
||||
}
|
||||
|
||||
static void db_param_on_iterator_status_changed (DbIterator * iterator, gboolean ready, DbParam * obj)
|
||||
{
|
||||
GvnParamClass * klass = GVN_PARAM_GET_CLASS (obj);
|
||||
|
||||
if (ready)
|
||||
{
|
||||
if (obj->column_name)
|
||||
obj->column_index = db_iterator_get_column_index (obj->iterator, obj->column_name);
|
||||
|
||||
klass->set_spec (GVN_PARAM (obj),
|
||||
db_iterator_get_spec (obj->iterator, obj->column_index));
|
||||
}
|
||||
}
|
||||
|
||||
static void db_param_on_iterator_iter_changed (DbIterator * iterator, DbParam * obj)
|
||||
{
|
||||
const GValue * value;
|
||||
GvnParamClass * klass = GVN_PARAM_GET_CLASS (obj);
|
||||
|
||||
if (db_iterator_get_row (obj->iterator) != -1 && obj->column_index != -1)
|
||||
{
|
||||
klass->set_status (GVN_PARAM (obj), GVN_PARAM_STATUS_OK);
|
||||
value = db_iterator_get_value (obj->iterator, obj->column_index);
|
||||
}
|
||||
else
|
||||
{
|
||||
klass->set_status (GVN_PARAM (obj), GVN_PARAM_STATUS_BUSY);
|
||||
value = NULL;
|
||||
}
|
||||
|
||||
g_signal_handlers_block_by_func (obj, db_param_on_value_changed, NULL);
|
||||
|
||||
if (!value)
|
||||
{
|
||||
GValue tmp_value = {0};
|
||||
g_value_init (&tmp_value, GVN_TYPE_NULL);
|
||||
klass->put_value (GVN_PARAM (obj), &tmp_value);
|
||||
g_value_unset (&tmp_value);
|
||||
}
|
||||
else
|
||||
klass->put_value (GVN_PARAM (obj), value);
|
||||
|
||||
g_signal_handlers_unblock_by_func (obj, db_param_on_value_changed, NULL);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Public
|
||||
|
||||
/**
|
||||
* db_param_get_column_index:
|
||||
* @obj: a #DbParam
|
||||
*
|
||||
* Gets the iterator column referenced by the param.
|
||||
*
|
||||
* Return value: the column index.
|
||||
**/
|
||||
guint db_param_get_column_index (DbParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_PARAM (obj), 0);
|
||||
|
||||
return obj->column_index;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_param_get_column_name:
|
||||
* @obj: a #DbParam
|
||||
*
|
||||
* Gets the iterator column referenced by the param.
|
||||
*
|
||||
* Return value: the column name.
|
||||
**/
|
||||
const gchar * db_param_get_column_name (DbParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_PARAM (obj), 0);
|
||||
|
||||
return obj->column_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_param_set_iterator:
|
||||
* @obj: a #DbParam
|
||||
* @iterator: the #DbIterator
|
||||
*
|
||||
* Sets the iterator that updates the param value, this property can be set if
|
||||
* the parameter does not have a iterator associated yet.
|
||||
**/
|
||||
void db_param_set_iterator (DbParam * obj, DbIterator * iterator)
|
||||
{
|
||||
g_return_if_fail (DB_IS_PARAM (obj));
|
||||
g_return_if_fail (DB_IS_ITERATOR (iterator));
|
||||
g_return_if_fail (!obj->iterator);
|
||||
|
||||
obj->iterator = g_object_ref (iterator);
|
||||
g_object_connect (iterator
|
||||
,"signal::iter-changed", db_param_on_iterator_iter_changed, obj
|
||||
,"signal::status-changed", db_param_on_iterator_status_changed, obj
|
||||
,NULL
|
||||
);
|
||||
db_param_on_iterator_status_changed (obj->iterator,
|
||||
db_iterator_is_ready (iterator), obj);
|
||||
db_param_on_iterator_iter_changed (obj->iterator, obj);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_ITERATOR = 1
|
||||
,PROP_COLUMN_INDEX
|
||||
,PROP_COLUMN_NAME
|
||||
};
|
||||
|
||||
static void db_param_set_property (DbParam * obj, guint property_id,
|
||||
const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_ITERATOR:
|
||||
db_param_set_iterator (obj, g_value_get_object (value));
|
||||
break;
|
||||
case PROP_COLUMN_INDEX:
|
||||
obj->column_index = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_COLUMN_NAME:
|
||||
g_free (obj->column_name);
|
||||
obj->column_name = g_value_dup_string (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void db_param_get_property (DbParam * obj, guint property_id,
|
||||
GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_ITERATOR:
|
||||
g_value_set_object (value, obj->iterator);
|
||||
break;
|
||||
case PROP_COLUMN_INDEX:
|
||||
g_value_set_int (value, obj->column_index);
|
||||
break;
|
||||
case PROP_COLUMN_NAME:
|
||||
g_value_set_string (value, obj->column_name);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
||||
|
||||
static void db_param_init (DbParam * obj)
|
||||
{
|
||||
obj->column_index = -1;
|
||||
obj->column_name = NULL;
|
||||
obj->iterator = NULL;
|
||||
g_signal_connect (obj, "value-changed",
|
||||
G_CALLBACK (db_param_on_value_changed), NULL);
|
||||
}
|
||||
|
||||
static void db_param_finalize (DbParam * obj)
|
||||
{
|
||||
if (obj->iterator)
|
||||
{
|
||||
g_object_disconnect (obj->iterator
|
||||
,"any_signal", db_param_on_iterator_iter_changed, obj
|
||||
,"any_signal", db_param_on_iterator_status_changed, obj
|
||||
,NULL
|
||||
);
|
||||
g_clear_object (&obj->iterator);
|
||||
}
|
||||
|
||||
g_signal_handlers_disconnect_by_func (obj,
|
||||
db_param_on_value_changed, NULL);
|
||||
g_free (obj->column_name);
|
||||
G_OBJECT_CLASS (db_param_parent_class)->finalize (G_OBJECT (obj));
|
||||
}
|
||||
|
||||
static void db_param_class_init (DbParamClass * k)
|
||||
{
|
||||
GObjectClass * klass = G_OBJECT_CLASS (k);
|
||||
klass->finalize = (GObjectFinalizeFunc) db_param_finalize;
|
||||
klass->set_property = (GObjectSetPropertyFunc) db_param_set_property;
|
||||
klass->get_property = (GObjectGetPropertyFunc) db_param_get_property;
|
||||
|
||||
g_object_class_install_property (klass, PROP_ITERATOR,
|
||||
g_param_spec_object ("iterator"
|
||||
,_("Iterator")
|
||||
,_("The iterator owner of param")
|
||||
,DB_TYPE_ITERATOR
|
||||
,G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (klass, PROP_COLUMN_INDEX,
|
||||
g_param_spec_int ("column-index"
|
||||
,_("Column index")
|
||||
,_("The referenced column index")
|
||||
,-1 ,1024 ,-1
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (klass, PROP_COLUMN_NAME,
|
||||
g_param_spec_string ("column-name"
|
||||
,_("Column name")
|
||||
,_("The referenced column name")
|
||||
,NULL
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_PARAM_H
|
||||
#define DB_PARAM_H
|
||||
|
||||
#include <gvn/gvn-param.h>
|
||||
|
||||
#define DB_TYPE_PARAM (db_param_get_type ())
|
||||
#define DB_PARAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DB_TYPE_PARAM, DbParam))
|
||||
#define DB_IS_PARAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DB_TYPE_PARAM))
|
||||
#define DB_PARAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DB_TYPE_PARAM, DbParamClass))
|
||||
#define DB_IS_PARAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_PARAM))
|
||||
#define DB_PARAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_PARAM, DbParamClass))
|
||||
|
||||
typedef struct _DbParam DbParam;
|
||||
typedef struct _DbParamClass DbParamClass;
|
||||
|
||||
#include "db-iterator.h"
|
||||
|
||||
struct _DbParam
|
||||
{
|
||||
GvnParam parent;
|
||||
DbIterator * iterator;
|
||||
gint column_index;
|
||||
gchar * column_name;
|
||||
};
|
||||
|
||||
struct _DbParamClass
|
||||
{
|
||||
/* <private> */
|
||||
GvnParamClass parent;
|
||||
};
|
||||
|
||||
GType db_param_get_type ();
|
||||
GvnParam * db_param_new (const gchar * column_name);
|
||||
GvnParam * db_param_new_with_index (guint column_index);
|
||||
guint db_param_get_column_index (DbParam * obj);
|
||||
const gchar * db_param_get_column_name (DbParam * obj);
|
||||
void db_param_set_iterator (DbParam * obj, DbIterator * iterator);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,216 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-plugin.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-plugin
|
||||
* @Short_description: manages a connection to a database.
|
||||
* @Title: DbPlugin
|
||||
* @See_also: #DbConn
|
||||
*
|
||||
* This class manages a connection to a database internally. This
|
||||
* is accessed through the #DbConn class to internally connect, query and
|
||||
* disconnect the database.
|
||||
**/
|
||||
G_DEFINE_ABSTRACT_TYPE (DbPlugin, db_plugin, G_TYPE_OBJECT);
|
||||
|
||||
/**
|
||||
* db_plugin_close:
|
||||
* @obj: a #DbPlugin
|
||||
*
|
||||
* Closes de current connection to the database.
|
||||
**/
|
||||
void db_plugin_close (DbPlugin * obj)
|
||||
{
|
||||
g_return_if_fail (DB_IS_PLUGIN (obj));
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
g_mutex_lock (&obj->kill_mutex);
|
||||
|
||||
DB_PLUGIN_GET_CLASS (obj)->close (obj);
|
||||
|
||||
g_mutex_unlock (&obj->kill_mutex);
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_plugin_open:
|
||||
* @obj: a #DbPlugin
|
||||
* @host: the hostname
|
||||
* @schema: the database schema
|
||||
* @user: the user name
|
||||
* @pass: the password
|
||||
* @err: (out) (allow-none): destination of #GError, if you want to handle it.
|
||||
*
|
||||
* Opens a new connection to the database.
|
||||
*
|
||||
* Return value: Returns %TRUE if connection was made, %FALSE otherwise.
|
||||
**/
|
||||
gboolean db_plugin_open (DbPlugin * obj, const gchar * host,
|
||||
const gchar * schema, const gchar * user, const gchar * pass, GError ** err)
|
||||
{
|
||||
gboolean opened;
|
||||
|
||||
g_return_val_if_fail (DB_IS_PLUGIN (obj), FALSE);
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
g_mutex_lock (&obj->kill_mutex);
|
||||
|
||||
DB_PLUGIN_GET_CLASS (obj)->close (obj);
|
||||
|
||||
if (obj->ca)
|
||||
DB_PLUGIN_GET_CLASS (obj)->set_ssl (obj, obj->ca);
|
||||
|
||||
opened = DB_PLUGIN_GET_CLASS (obj)->open (obj,
|
||||
host, schema, user, pass, err);
|
||||
|
||||
g_mutex_unlock (&obj->kill_mutex);
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
|
||||
return opened;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_plugin_set_ssl:
|
||||
* @obj: a #DbPlugin
|
||||
* @ca: path to the certificate authority file
|
||||
*
|
||||
* Sets the certificate authority file needed to use SSL. If the secure
|
||||
* connection through SSL is not properly set, @db_plugin_open will fail.
|
||||
*/
|
||||
void db_plugin_set_ssl (DbPlugin * obj, const gchar * ca)
|
||||
{
|
||||
g_return_if_fail (DB_IS_PLUGIN (obj));
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
g_free (obj->ca);
|
||||
obj->ca = strdup (ca);
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_plugin_query:
|
||||
* @obj: a #DbPlugin
|
||||
* @sql: a #gchar string containing an sql query
|
||||
* @err: (out) (allow-none): destination of #GError, if you want to handle it.
|
||||
*
|
||||
* If everything was ok (i.e. the sql query wasn't empty, it was completed
|
||||
* successfully, etc.), it will return a #GList of #DbResult with the
|
||||
* database response, depending on the query or queries passed. Note that if
|
||||
* the input string @sql is a multi-query and any of the queries inside of it
|
||||
* fails the rest of the queries will fail.
|
||||
*
|
||||
* Refer to #DbError for the possible errors.
|
||||
*
|
||||
* Return value: (transfer full) (allow-none): a #DbResultSet containing the
|
||||
* results or %NULL if error
|
||||
**/
|
||||
DbResultSet * db_plugin_query (DbPlugin * obj, const gchar * sql, GError ** err)
|
||||
{
|
||||
DbResultSet * set;
|
||||
|
||||
g_return_val_if_fail (DB_IS_PLUGIN (obj), NULL);
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
set = DB_PLUGIN_GET_CLASS (obj)->query (obj, sql, err);
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_plugin_kill_query:
|
||||
* @obj: a #DbPlugin
|
||||
*
|
||||
* Tryes to kill the current query.
|
||||
**/
|
||||
void db_plugin_kill_query (DbPlugin * obj)
|
||||
{
|
||||
DbPluginClass * klass;
|
||||
|
||||
g_return_if_fail (DB_IS_PLUGIN (obj));
|
||||
|
||||
klass = DB_PLUGIN_GET_CLASS (obj);
|
||||
|
||||
if (klass->kill_query)
|
||||
{
|
||||
g_mutex_lock (&obj->kill_mutex);
|
||||
klass->kill_query (obj);
|
||||
g_mutex_unlock (&obj->kill_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* db_plugin_parse:
|
||||
* @obj: a #DbPlugin.
|
||||
* @sql: (transfer none): an SQL string.
|
||||
*
|
||||
* Parses a string and makes an #SqlStmt from it.
|
||||
*
|
||||
* Return value: (transfer none): a new #SqlStmt parsed from @sql.
|
||||
**/
|
||||
SqlStmt * db_plugin_parse (DbPlugin * obj, gchar * sql)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_PLUGIN (obj), NULL);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_plugin_render:
|
||||
* @obj: a #DbPlugin
|
||||
* @object: the #GObject to render
|
||||
* @err: (out) (allow-none): the return location for #GError
|
||||
*
|
||||
* Renders a #GObject object as a SQL string to send it in a database
|
||||
* query. It takes the plugin to know the codification in wich to escape
|
||||
* the data.
|
||||
*
|
||||
* Return value: (transfer full): the rendered string, or %NULL if error.
|
||||
**/
|
||||
gchar * db_plugin_render (DbPlugin * obj, gpointer object, GError ** err)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_PLUGIN (obj), NULL);
|
||||
g_return_val_if_fail (G_IS_OBJECT (object), NULL);
|
||||
|
||||
return sql_render_get_string (obj->render, object, obj, err);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
||||
|
||||
static void db_plugin_init (DbPlugin *obj)
|
||||
{
|
||||
obj->render = NULL;
|
||||
obj->ca = NULL;
|
||||
g_mutex_init (&obj->mutex);
|
||||
g_mutex_init (&obj->kill_mutex);
|
||||
}
|
||||
|
||||
static void db_plugin_finalize (DbPlugin * obj)
|
||||
{
|
||||
g_clear_object (&obj->render);
|
||||
g_free (obj->ca);
|
||||
g_mutex_clear (&obj->mutex);
|
||||
g_mutex_clear (&obj->kill_mutex);
|
||||
G_OBJECT_CLASS (db_plugin_parent_class)->finalize (G_OBJECT (obj));
|
||||
}
|
||||
|
||||
static void db_plugin_class_init (DbPluginClass * k)
|
||||
{
|
||||
G_OBJECT_CLASS (k)->finalize = (GObjectFinalizeFunc) db_plugin_finalize;
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_PLUGIN_H
|
||||
#define DB_PLUGIN_H
|
||||
|
||||
#include <sql/sql.h>
|
||||
#include "db-result-set.h"
|
||||
|
||||
#define DB_TYPE_PLUGIN (db_plugin_get_type ())
|
||||
#define DB_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DB_TYPE_PLUGIN, DbPlugin))
|
||||
#define DB_IS_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DB_TYPE_PLUGIN))
|
||||
#define DB_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DB_TYPE_PLUGIN, DbPluginClass))
|
||||
#define DB_IS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_PLUGIN))
|
||||
#define DB_PLUGIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_PLUGIN, DbPluginClass))
|
||||
|
||||
typedef struct _DbPlugin DbPlugin;
|
||||
typedef struct _DbPluginClass DbPluginClass;
|
||||
|
||||
typedef GType (* DbPluginGetTypeFunc) ();
|
||||
typedef gboolean (* DbPluginOpenFunc) (DbPlugin * obj
|
||||
,const gchar * host
|
||||
,const gchar * schema
|
||||
,const gchar * user
|
||||
,const gchar * pass
|
||||
,GError ** err);
|
||||
typedef void (* DbPluginCloseFunc) (DbPlugin * obj);
|
||||
typedef void (* DbPluginSetSSL) (DbPlugin * obj
|
||||
,const gchar * ca);
|
||||
typedef DbResultSet * (* DbPluginQueryFunc) (DbPlugin * obj, const gchar * sql, GError ** err);
|
||||
typedef void (* DbPluginKillQueryFunc) (DbPlugin * obj);
|
||||
typedef SqlStmt * (* DbPluginParseFunc) (DbPlugin * obj, const gchar * sql);
|
||||
|
||||
struct _DbPlugin
|
||||
{
|
||||
GObject parent;
|
||||
GMutex mutex;
|
||||
GMutex kill_mutex;
|
||||
SqlRender * render;
|
||||
gchar * ca;
|
||||
};
|
||||
|
||||
struct _DbPluginClass
|
||||
{
|
||||
/* <private> */
|
||||
GObjectClass parent;
|
||||
DbPluginOpenFunc open;
|
||||
DbPluginCloseFunc close;
|
||||
DbPluginSetSSL set_ssl;
|
||||
DbPluginQueryFunc query;
|
||||
DbPluginKillQueryFunc kill_query;
|
||||
DbPluginParseFunc parse;
|
||||
};
|
||||
|
||||
GType db_plugin_get_type ();
|
||||
gboolean db_plugin_open (DbPlugin * obj
|
||||
,const gchar * host
|
||||
,const gchar * schema
|
||||
,const gchar * user
|
||||
,const gchar * pass
|
||||
,GError ** err);
|
||||
void db_plugin_close (DbPlugin * obj);
|
||||
void db_plugin_set_ssl (DbPlugin * obj, const gchar * ca);
|
||||
DbResultSet * db_plugin_query (DbPlugin * obj, const gchar * sql, GError ** err);
|
||||
void db_plugin_kill_query (DbPlugin * obj);
|
||||
SqlStmt * db_plugin_parse (DbPlugin * obj, gchar * sql);
|
||||
gchar * db_plugin_render (DbPlugin * obj, gpointer object, GError ** err);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,487 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-request.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-request
|
||||
* @Short_description: a request to the database sent by the model
|
||||
* @Title: DbRequest
|
||||
* @See_also: #DbConn, #DbModel
|
||||
*
|
||||
* This class is used to send an SQL query to the database through a #DbConn,
|
||||
* and to retrieve any data or metadata obtained by it in the model.
|
||||
**/
|
||||
G_DEFINE_TYPE (DbRequest, db_request, G_TYPE_OBJECT);
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
|
||||
|
||||
static gboolean db_request_idle (DbRequest * obj)
|
||||
{
|
||||
if (obj->callback)
|
||||
obj->callback (obj, obj->user_data);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void db_request_idle_notify (DbRequest * obj)
|
||||
{
|
||||
if (obj->notify)
|
||||
obj->notify (obj->user_data);
|
||||
|
||||
g_object_unref (obj);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Methods
|
||||
|
||||
/**
|
||||
* db_request_new:
|
||||
* @conn: a #DbConn
|
||||
* @sql: SQL statement to execute
|
||||
*
|
||||
* Creates a new request to execute the %sql query.
|
||||
*
|
||||
* Return value: a new #DbRequest
|
||||
**/
|
||||
DbRequest * db_request_new (DbConn * conn, const gchar * sql)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_CONN (conn), NULL);
|
||||
|
||||
return g_object_new (DB_TYPE_REQUEST, "conn", conn, "sql", sql, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_new_with_stmt:
|
||||
* @conn: a #DbConn
|
||||
* @stmt: the #SqlStmt statement to execute.
|
||||
*
|
||||
* Creates a new request to execute the statement.
|
||||
*
|
||||
* Return value: a new #DbRequest
|
||||
**/
|
||||
DbRequest * db_request_new_with_stmt (DbConn * conn, SqlStmt * stmt)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_CONN (conn), NULL);
|
||||
g_return_val_if_fail (SQL_IS_STMT (stmt), NULL);
|
||||
|
||||
return g_object_new (DB_TYPE_REQUEST, "conn", conn, "stmt", stmt, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_fetch_result:
|
||||
* @obj: a #DbRequest
|
||||
* @err: (out) (allow-none): return location for a #GError or %NULL
|
||||
*
|
||||
* Obtains the first result of the query. The request must have been made to
|
||||
* call this method.
|
||||
*
|
||||
* Return value: (transfer full) (allow-none): the #DbResult
|
||||
**/
|
||||
DbResult * db_request_fetch_result (DbRequest * obj, GError ** err)
|
||||
{
|
||||
DbResult * result = NULL;
|
||||
|
||||
g_return_val_if_fail (DB_IS_REQUEST (obj), NULL);
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
|
||||
if (obj->result_set)
|
||||
{
|
||||
result = db_result_set_take_next (obj->result_set);
|
||||
}
|
||||
else if (err)
|
||||
{
|
||||
g_propagate_error (err, obj->error);
|
||||
obj->error = NULL;
|
||||
}
|
||||
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_fetch_non_select:
|
||||
* @obj: a #DbRequest
|
||||
* @err: (out) (allow-none): return location for a #GError or %NULL
|
||||
*
|
||||
* Fetchs the result of a non select statement.
|
||||
*
|
||||
* Return value: returns 0 or the number of affected rows on success, -1 on failure
|
||||
**/
|
||||
gint db_request_fetch_non_select (DbRequest * obj, GError ** err)
|
||||
{
|
||||
DbResult * result;
|
||||
|
||||
g_return_val_if_fail (DB_IS_REQUEST (obj), -1);
|
||||
|
||||
result = db_request_fetch_result (obj, err);
|
||||
|
||||
if (result)
|
||||
{
|
||||
gint affected_rows = result->nrows;
|
||||
db_result_free (result);
|
||||
return affected_rows;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_fetch_value:
|
||||
* @obj: a #DbRequest
|
||||
* @value: (out): return location for a #GValue
|
||||
* @err: (out) (allow-none): return location for a #GError or %NULL
|
||||
*
|
||||
* Obtains the first result of the query. The request must have been made to
|
||||
* call this method.
|
||||
*
|
||||
* Return value: %TRUE on success, %FALSE on failure
|
||||
**/
|
||||
gboolean db_request_fetch_value (DbRequest * obj, GValue * value, GError ** err)
|
||||
{
|
||||
DbResult * result;
|
||||
|
||||
g_return_val_if_fail (DB_IS_REQUEST (obj), FALSE);
|
||||
|
||||
result = db_request_fetch_result (obj, err);
|
||||
|
||||
if (result)
|
||||
{
|
||||
DbRow * row = db_result_get_row (result, 0);
|
||||
|
||||
if (row)
|
||||
{
|
||||
const GValue * row_value = db_row_get_value (row, 0);
|
||||
|
||||
if (row_value)
|
||||
{
|
||||
g_value_init (value, G_VALUE_TYPE (row_value));
|
||||
g_value_copy (row_value, value);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
db_result_free (result);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_exec:
|
||||
* @obj: a #DbRequest
|
||||
* @err: (out) (allow-none): return location for a #GError or %NULL
|
||||
*
|
||||
* Sends the request to the database.
|
||||
**/
|
||||
gboolean db_request_exec (DbRequest * obj, GError ** err)
|
||||
{
|
||||
gboolean ret;
|
||||
|
||||
g_return_val_if_fail (DB_IS_REQUEST (obj), FALSE);
|
||||
|
||||
ret = TRUE;
|
||||
g_mutex_lock (&obj->mutex);
|
||||
|
||||
switch ((gint) obj->status)
|
||||
{
|
||||
case DB_REQUEST_CLEAN:
|
||||
case DB_REQUEST_ERROR:
|
||||
{
|
||||
DbResultSet * set;
|
||||
GError * query_error = NULL;
|
||||
|
||||
obj->status = DB_REQUEST_LOADING;
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
|
||||
set = db_conn_exec (obj->conn, obj->sql, &query_error);
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
|
||||
if (obj->status != DB_REQUEST_CANCELED)
|
||||
{
|
||||
if (set)
|
||||
{
|
||||
obj->result_set = set;
|
||||
obj->status = DB_REQUEST_DONE;
|
||||
}
|
||||
else if (query_error)
|
||||
{
|
||||
g_clear_error (&obj->error);
|
||||
obj->error = g_error_copy (query_error);
|
||||
g_propagate_error (err, query_error);
|
||||
obj->status = DB_REQUEST_ERROR;
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (set)
|
||||
db_result_set_free (set);
|
||||
else
|
||||
g_clear_error (&query_error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_set_callback:
|
||||
* @obj: a #DbRequest
|
||||
* @callback:
|
||||
* @user_data:
|
||||
* @notify:
|
||||
*
|
||||
* Sends the request to the database.
|
||||
**/
|
||||
void db_request_set_callback (DbRequest * obj,
|
||||
DbRequestDoneCallback callback, gpointer user_data, GDestroyNotify notify)
|
||||
{
|
||||
g_return_if_fail (DB_IS_REQUEST (obj));
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
|
||||
obj->callback = callback;
|
||||
obj->user_data = user_data;
|
||||
obj->notify = notify;
|
||||
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_complete:
|
||||
* @obj: a #DbRequest
|
||||
*
|
||||
* Emits the ready or error signal of the object.
|
||||
**/
|
||||
void db_request_complete (DbRequest * obj)
|
||||
{
|
||||
g_return_if_fail (DB_IS_REQUEST (obj));
|
||||
|
||||
g_idle_add_full (G_PRIORITY_HIGH_IDLE,
|
||||
(GSourceFunc) db_request_idle, g_object_ref (obj), (GDestroyNotify) db_request_idle_notify);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_cancel:
|
||||
* @obj: a #DbRequest
|
||||
*
|
||||
* Attempts to cancel the request.
|
||||
*
|
||||
* Return value: %TRUE if request was canceled %FALSE otherwise.
|
||||
**/
|
||||
void db_request_cancel (DbRequest * obj)
|
||||
{
|
||||
g_return_if_fail (DB_IS_REQUEST (obj));
|
||||
|
||||
g_mutex_lock (&obj->mutex);
|
||||
|
||||
if (obj->status != DB_REQUEST_CANCELED)
|
||||
{
|
||||
if (obj->result_set)
|
||||
{
|
||||
db_result_set_free (obj->result_set);
|
||||
obj->result_set = NULL;
|
||||
}
|
||||
else
|
||||
g_clear_error (&obj->error);
|
||||
|
||||
obj->status = DB_REQUEST_CANCELED;
|
||||
obj->error = g_error_new (
|
||||
DB_REQUEST_LOG_DOMAIN
|
||||
,DB_REQUEST_ERROR_CANCELED
|
||||
,_("The request was canceled")
|
||||
);
|
||||
}
|
||||
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_get_conn:
|
||||
* @obj: a #DbRequest
|
||||
*
|
||||
* Gets the connection used by request.
|
||||
*
|
||||
* Return value: (transfer full): the #DbConn
|
||||
**/
|
||||
DbConn * db_request_get_conn (DbRequest * obj)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_REQUEST (obj), NULL);
|
||||
|
||||
return obj->conn;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_request_get_sql:
|
||||
* @obj: a #DbRequest
|
||||
*
|
||||
* Gets the SQL statement used by #DbRequest.
|
||||
*
|
||||
* Return value: the sql string, must be freed with g_free()
|
||||
**/
|
||||
gchar * db_request_get_sql (DbRequest * obj)
|
||||
{
|
||||
g_return_val_if_fail (DB_IS_REQUEST (obj), NULL);
|
||||
|
||||
return g_strdup (obj->sql);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PROP_CONN = 1
|
||||
,PROP_SQL
|
||||
,PROP_STMT
|
||||
,PROP_RESULT_SET
|
||||
,PROP_ERROR
|
||||
}
|
||||
DbRequestProp;
|
||||
|
||||
static void db_request_set_property (DbRequest * obj, guint property_id,
|
||||
const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
g_mutex_lock (&obj->mutex);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_CONN:
|
||||
obj->conn = g_value_dup_object (value);
|
||||
break;
|
||||
case PROP_SQL:
|
||||
{
|
||||
gchar * sql = g_value_dup_string (value);
|
||||
|
||||
if (sql)
|
||||
obj->sql = sql;
|
||||
|
||||
break;
|
||||
}
|
||||
case PROP_STMT:
|
||||
{
|
||||
SqlStmt * stmt = g_value_get_object (value);
|
||||
|
||||
if (obj->conn && stmt)
|
||||
obj->sql = db_conn_render (obj->conn, stmt, NULL);
|
||||
else if (!obj->conn)
|
||||
g_warning ("DbRequest: Can't render stmt, conn property not set");
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
|
||||
}
|
||||
|
||||
g_mutex_unlock (&obj->mutex);
|
||||
}
|
||||
|
||||
static void db_request_get_property (DbRequest * obj, guint property_id,
|
||||
GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_CONN:
|
||||
g_value_set_object (value, obj->conn);
|
||||
break;
|
||||
case PROP_SQL:
|
||||
g_value_set_string (value, obj->sql);
|
||||
break;
|
||||
case PROP_RESULT_SET:
|
||||
g_value_set_boxed (value, obj->result_set);
|
||||
break;
|
||||
case PROP_ERROR:
|
||||
g_value_set_boxed (value, obj->error);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
||||
|
||||
static void db_request_init (DbRequest * obj)
|
||||
{
|
||||
obj->sql = NULL;
|
||||
obj->error = NULL;
|
||||
obj->result_set = NULL;
|
||||
obj->conn = NULL;
|
||||
obj->callback = NULL;
|
||||
obj->notify = NULL;
|
||||
obj->status = DB_REQUEST_CLEAN;
|
||||
g_mutex_init (&obj->mutex);
|
||||
}
|
||||
|
||||
static void db_request_finalize (DbRequest * obj)
|
||||
{
|
||||
if (obj->result_set)
|
||||
db_result_set_free (obj->result_set);
|
||||
|
||||
g_clear_error (&obj->error);
|
||||
g_clear_object (&obj->conn);
|
||||
g_free (obj->sql);
|
||||
g_mutex_clear (&obj->mutex);
|
||||
G_OBJECT_CLASS (db_request_parent_class)->finalize (G_OBJECT (obj));
|
||||
}
|
||||
|
||||
static void db_request_class_init (DbRequestClass * k)
|
||||
{
|
||||
GObjectClass * klass = G_OBJECT_CLASS (k);
|
||||
klass->finalize = (GObjectFinalizeFunc) db_request_finalize;
|
||||
klass->set_property = (GObjectSetPropertyFunc) db_request_set_property;
|
||||
klass->get_property = (GObjectGetPropertyFunc) db_request_get_property;
|
||||
|
||||
g_object_class_install_property (klass, PROP_CONN,
|
||||
g_param_spec_object ("conn"
|
||||
,_("Connection")
|
||||
,_("The connection used to render and execute the query")
|
||||
,DB_TYPE_CONN
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (klass, PROP_SQL,
|
||||
g_param_spec_string ("sql"
|
||||
,_("SQL")
|
||||
,_("The SQL query to execute")
|
||||
,NULL
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (klass, PROP_STMT,
|
||||
g_param_spec_object ("stmt"
|
||||
,_("Statement")
|
||||
,_("The statement to execute")
|
||||
,SQL_TYPE_STMT
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE
|
||||
));
|
||||
g_object_class_install_property (klass, PROP_RESULT_SET,
|
||||
g_param_spec_boxed ("result-set"
|
||||
,_("Result")
|
||||
,_("The result data of the query")
|
||||
,DB_TYPE_RESULT_SET
|
||||
,G_PARAM_READABLE
|
||||
));
|
||||
g_object_class_install_property (klass, PROP_ERROR,
|
||||
g_param_spec_boxed ("error"
|
||||
,_("Error")
|
||||
,_("The GError, if an error ocurred")
|
||||
,G_TYPE_ERROR
|
||||
,G_PARAM_READABLE
|
||||
));
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_REQUEST_H
|
||||
#define DB_REQUEST_H
|
||||
|
||||
#include <sql/sql.h>
|
||||
#include "db-result-set.h"
|
||||
|
||||
#define DB_REQUEST_LOG_DOMAIN (g_quark_from_string ("DbRequest"))
|
||||
|
||||
#define DB_TYPE_REQUEST (db_request_get_type ())
|
||||
#define DB_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DB_TYPE_REQUEST, DbRequest))
|
||||
#define DB_IS_REQUEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DB_TYPE_REQUEST))
|
||||
#define DB_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DB_TYPE_REQUEST, DbRequestClass))
|
||||
#define DB_IS_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DB_TYPE_REQUEST))
|
||||
#define DB_REQUEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DB_TYPE_REQUEST, DbRequestClass))
|
||||
|
||||
typedef struct _DbRequest DbRequest;
|
||||
typedef struct _DbRequestClass DbRequestClass;
|
||||
|
||||
typedef void (*DbRequestDoneCallback) (DbRequest * obj, gpointer user_data);
|
||||
|
||||
#include "db-conn.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DB_REQUEST_CLEAN
|
||||
,DB_REQUEST_LOADING
|
||||
,DB_REQUEST_DONE
|
||||
,DB_REQUEST_CANCELED
|
||||
,DB_REQUEST_ERROR
|
||||
}
|
||||
DbRequestStatus;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DB_REQUEST_ERROR_CANCELED
|
||||
,DB_REQUEST_ERROR_NO_EXECUTED
|
||||
}
|
||||
DbRequestError;
|
||||
|
||||
struct _DbRequest
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
/* <private> */
|
||||
DbConn * conn;
|
||||
gchar * sql;
|
||||
DbResultSet * result_set;
|
||||
GError * error;
|
||||
DbRequestStatus status;
|
||||
GMutex mutex;
|
||||
DbRequestDoneCallback callback;
|
||||
gpointer user_data;
|
||||
GDestroyNotify notify;
|
||||
};
|
||||
|
||||
struct _DbRequestClass
|
||||
{
|
||||
/* <private> */
|
||||
GObjectClass parent;
|
||||
};
|
||||
|
||||
GType db_request_get_type ();
|
||||
DbRequest * db_request_new (DbConn * conn, const gchar * sql);
|
||||
DbRequest * db_request_new_with_stmt (DbConn * conn, SqlStmt * stmt);
|
||||
DbResult * db_request_fetch_result (DbRequest * obj, GError ** err);
|
||||
gint db_request_fetch_non_select (DbRequest * obj, GError ** err);
|
||||
gboolean db_request_fetch_value (DbRequest * obj, GValue * value, GError ** err);
|
||||
gboolean db_request_exec (DbRequest * obj, GError ** err);
|
||||
void db_request_set_callback (DbRequest * obj, DbRequestDoneCallback callback, gpointer user_data, GDestroyNotify notify);
|
||||
void db_request_complete (DbRequest * obj);
|
||||
void db_request_cancel (DbRequest * obj);
|
||||
gchar * db_request_get_sql (DbRequest * obj);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-result-set.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-result-set
|
||||
* @Short_description:
|
||||
* @Title: DbResultSet
|
||||
* @See_also: #DbResult
|
||||
**/
|
||||
G_DEFINE_BOXED_TYPE (DbResultSet, db_result_set, db_result_set_copy, db_result_set_free);
|
||||
|
||||
/**
|
||||
* db_result_set_new:
|
||||
*
|
||||
* Return value: the new #DbResultSet
|
||||
**/
|
||||
DbResultSet * db_result_set_new ()
|
||||
{
|
||||
DbResultSet * obj = g_new (DbResultSet, 1);
|
||||
obj->results = NULL;
|
||||
return obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_result_set_take_nth:
|
||||
* @obj: a #DbResultSet
|
||||
* @n: the position of the result, counting from 0
|
||||
*
|
||||
* Gets the nth result and removes it from the resultset. The user is
|
||||
* responsible for releasing the result with db_result_free().
|
||||
*
|
||||
* Return value: (transfer full): the #DbResult or %NULL if nth result doesn't exist
|
||||
**/
|
||||
DbResult * db_result_set_take_nth (DbResultSet * obj, guint n)
|
||||
{
|
||||
GSList * list;
|
||||
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
list = g_slist_nth (obj->results, n);
|
||||
|
||||
if (list)
|
||||
{
|
||||
DbResult * result = list->data;
|
||||
obj->results = g_slist_delete_link (obj->results, list);
|
||||
return result;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_result_set_take_next:
|
||||
* @obj: a #DbResultSet
|
||||
*
|
||||
* Gets the next result and removes it from the resultset. The user is
|
||||
* responsible for releasing the result with db_result_free().
|
||||
*
|
||||
* Return value: (transfer full): the #DbResult or %NULL if no more results
|
||||
**/
|
||||
DbResult * db_result_set_take_next (DbResultSet * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
return db_result_set_take_nth (obj, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_result_set_copy:
|
||||
* @obj: a #DbResultSet
|
||||
*
|
||||
* Makes a copy of a #DbResultSet.
|
||||
*
|
||||
* Return value: a newly allocated #DbResultSet, with the same contents
|
||||
**/
|
||||
DbResultSet * db_result_set_copy (const DbResultSet * obj)
|
||||
{
|
||||
GSList * n;
|
||||
DbResultSet * set;
|
||||
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
set = db_result_set_new ();
|
||||
|
||||
for (n = obj->results; n; n = n->next)
|
||||
set->results = g_slist_append (set->results, db_result_copy (n->data));
|
||||
|
||||
return set;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_result_set_free:
|
||||
* @obj: a #DbResultSet
|
||||
*
|
||||
* Frees a #DbResultSet.
|
||||
**/
|
||||
void db_result_set_free (DbResultSet * obj)
|
||||
{
|
||||
GSList * n;
|
||||
|
||||
g_return_if_fail (obj);
|
||||
|
||||
for (n = obj->results; n; n = n->next)
|
||||
db_result_free (n->data);
|
||||
|
||||
g_slist_free (obj->results);
|
||||
g_free (obj);
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_RESULT_SET_H
|
||||
#define DB_RESULT_SET_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "db-result.h"
|
||||
|
||||
#define DB_TYPE_RESULT_SET (db_result_set_get_type())
|
||||
|
||||
typedef struct _DbResultSet DbResultSet;
|
||||
|
||||
/**
|
||||
* DbResultSet: (skip)
|
||||
* @results: (element-type Db.Result):
|
||||
*
|
||||
* Has the information of a result.
|
||||
**/
|
||||
struct _DbResultSet
|
||||
{
|
||||
GSList * results;
|
||||
};
|
||||
|
||||
GType db_result_set_get_type ();
|
||||
DbResultSet * db_result_set_new ();
|
||||
DbResult * db_result_set_take_nth (DbResultSet * obj, guint n);
|
||||
DbResult * db_result_set_take_next (DbResultSet * obj);
|
||||
DbResultSet * db_result_set_copy (const DbResultSet * obj);
|
||||
void db_result_set_free (DbResultSet * obj);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,116 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-result.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-result
|
||||
* @Short_description:
|
||||
* @Title: DbResult
|
||||
* @See_also: #DbResultSet
|
||||
**/
|
||||
G_DEFINE_BOXED_TYPE (DbResult, db_result, db_result_copy, db_result_free);
|
||||
|
||||
DbResult * db_result_new ()
|
||||
{
|
||||
DbResult * obj = g_new (DbResult, 1);
|
||||
return obj;
|
||||
}
|
||||
|
||||
DbRow * db_result_get_row (const DbResult * obj, gint row_index)
|
||||
{
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
g_return_val_if_fail (row_index >= 0 && row_index < obj->nrows, NULL);
|
||||
|
||||
return g_ptr_array_index (obj->data, row_index);
|
||||
}
|
||||
|
||||
void db_result_remove_row (DbResult * obj, gint row_index)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
g_return_if_fail (row_index >= 0 && row_index < obj->nrows);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_result_copy:
|
||||
* @obj: a #DbResult
|
||||
*
|
||||
* Makes a copy of a #DbResult.
|
||||
*
|
||||
* Return value: a newly allocated #DbResult, with the same contents
|
||||
**/
|
||||
DbResult * db_result_copy (const DbResult * obj)
|
||||
{
|
||||
gint n;
|
||||
DbResult * result;
|
||||
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
result = g_new (DbResult, 1);
|
||||
result->nrows = obj->nrows;
|
||||
result->ncols = obj->ncols;
|
||||
result->column = g_new (DbColumn, obj->ncols);
|
||||
result->data = g_ptr_array_new_full (obj->nrows + 15,
|
||||
(GDestroyNotify) db_row_free);
|
||||
|
||||
for (n = 0; n < obj->ncols; n++)
|
||||
{
|
||||
result->column[n].info = obj->column[n].info;
|
||||
result->column[n].spec = gvn_param_spec_copy (obj->column[n].spec);
|
||||
result->column[n].table = g_strdup (obj->column[n].table);
|
||||
result->column[n].name = g_strdup (obj->column[n].name);
|
||||
result->column[n].display = g_strdup (obj->column[n].display);
|
||||
}
|
||||
|
||||
for (n = 0; n < obj->nrows; n++)
|
||||
g_ptr_array_add (result->data,
|
||||
db_row_copy (g_ptr_array_index (obj->data, n)));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_result_free:
|
||||
* @obj: a #DbResult
|
||||
*
|
||||
* Frees a #DbResult.
|
||||
**/
|
||||
void db_result_free (DbResult * obj)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
|
||||
if (obj->data)
|
||||
g_ptr_array_unref (obj->data);
|
||||
|
||||
if (obj->column)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < obj->ncols; i++)
|
||||
{
|
||||
DbColumn col = obj->column[i];
|
||||
gvn_param_spec_free (col.spec);
|
||||
g_free (col.name);
|
||||
g_free (col.display);
|
||||
g_free (col.table);
|
||||
}
|
||||
|
||||
g_free (obj->column);
|
||||
}
|
||||
|
||||
g_free (obj);
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_RESULT_H
|
||||
#define DB_RESULT_H
|
||||
|
||||
#include <gvn/gvn.h>
|
||||
#include "db-row.h"
|
||||
|
||||
#define DB_TYPE_RESULT (db_result_get_type())
|
||||
|
||||
typedef struct _DbResult DbResult;
|
||||
typedef struct _DbColumn DbColumn;
|
||||
|
||||
/**
|
||||
* DbResult:
|
||||
* @nrows: Number of rows.
|
||||
* @ncols: Number of columns.
|
||||
* @data: Has a #GList.
|
||||
* @column: Has a #DbColumn.
|
||||
*
|
||||
* Has the information of a row.
|
||||
**/
|
||||
struct _DbResult
|
||||
{
|
||||
gint nrows;
|
||||
gint ncols;
|
||||
GPtrArray * data;
|
||||
DbColumn * column;
|
||||
};
|
||||
|
||||
/**
|
||||
* DbColumnInfo:
|
||||
* @DB_COLUMN_PRI_KEY: Attribute primary Key.
|
||||
* @DB_COLUMN_UNIQUE: Attribute unique.
|
||||
*
|
||||
* Saves the information about if it is primary key or unique.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
DB_COLUMN_PRI_KEY = 1 << 0
|
||||
,DB_COLUMN_UNIQUE = 1 << 1
|
||||
}
|
||||
DbColumnInfo;
|
||||
|
||||
/**
|
||||
* DbColumn:
|
||||
* @info: A #DbColumnInfo
|
||||
* @spec: A #GvnParamSpec
|
||||
* @table: Name of the table
|
||||
* @name: Name of the column
|
||||
* @display: The name given to it in the query
|
||||
*
|
||||
* Has the information of a column.
|
||||
**/
|
||||
struct _DbColumn
|
||||
{
|
||||
DbColumnInfo info;
|
||||
GvnParamSpec * spec;
|
||||
gchar * table;
|
||||
gchar * name;
|
||||
gchar * display;
|
||||
};
|
||||
|
||||
GType db_result_get_type ();
|
||||
DbResult * db_result_new ();
|
||||
DbRow * db_result_get_row (const DbResult * obj, gint row_index);
|
||||
void db_result_remove_row (DbResult * obj, gint row_index);
|
||||
DbResult * db_result_copy (const DbResult * obj);
|
||||
void db_result_free (DbResult * obj);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "db-row.h"
|
||||
|
||||
/**
|
||||
* SECTION: db-row
|
||||
* @Short_description: a row from a #DbModel
|
||||
* @Title: DbRow
|
||||
* @See_also: #DbModel
|
||||
*
|
||||
* #DbRow represents a row in a #DbModel.
|
||||
**/
|
||||
G_DEFINE_BOXED_TYPE (DbRow, db_row, db_row_copy, db_row_free);
|
||||
|
||||
/**
|
||||
* db_row_new:
|
||||
* @len: the lenght of the #DbRow.
|
||||
* @position: the position where the returned #DbRow will be placed.
|
||||
*
|
||||
* Sets a newly allocated #DbRow of lenght @len with position @postition.
|
||||
* This new structure must be freed using db_row_free().
|
||||
*
|
||||
* Return value: a new #DbRow
|
||||
**/
|
||||
DbRow * db_row_new (gint len, gint position)
|
||||
{
|
||||
DbRow * row = g_slice_new (DbRow);
|
||||
row->value = g_new0 (GValue, len);
|
||||
row->position = position;
|
||||
row->len = len;
|
||||
return row;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_row_free:
|
||||
* @row: the row that you want to free.
|
||||
*
|
||||
* Frees a #DbRow of a #DbResult.
|
||||
**/
|
||||
void db_row_free (DbRow * row)
|
||||
{
|
||||
gint n;
|
||||
|
||||
for (n = 0; n < row->len; n++)
|
||||
g_value_unset (&row->value[n]);
|
||||
|
||||
g_free (row->value);
|
||||
g_slice_free (DbRow, row);
|
||||
}
|
||||
|
||||
/**
|
||||
* db_row_copy:
|
||||
* @row: a #DbRow
|
||||
*
|
||||
* Copies a #DbRow.
|
||||
*
|
||||
* Return value: a new copy of @row
|
||||
**/
|
||||
DbRow * db_row_copy (const DbRow * row)
|
||||
{
|
||||
gint n;
|
||||
DbRow * new;
|
||||
|
||||
g_return_val_if_fail (row, NULL);
|
||||
|
||||
new = g_new (DbRow, 1);
|
||||
new->len = row->len;
|
||||
new->position = row->position;
|
||||
new->value = g_new (GValue, new->len);
|
||||
|
||||
for (n = 0; n < new->len; n++)
|
||||
g_value_copy
|
||||
(g_value_init (&new->value[n], G_VALUE_TYPE (&row->value))
|
||||
,&row->value[n]);
|
||||
|
||||
return new;
|
||||
}
|
||||
|
||||
/**
|
||||
* db_row_get_value:
|
||||
* @row: a #DbRow
|
||||
* @index: the index of the value in @row
|
||||
*
|
||||
* Returns the value placed in the position @index of @row.
|
||||
*
|
||||
* Return value: a #GValue
|
||||
**/
|
||||
const GValue * db_row_get_value (const DbRow * row, gint index)
|
||||
{
|
||||
g_return_val_if_fail (row, NULL);
|
||||
g_return_val_if_fail (index >= 0 && index < row->len, NULL);
|
||||
|
||||
return &row->value[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* db_row_get_position:
|
||||
* @row: a #DbRow
|
||||
*
|
||||
* Returns the position where @row in the model it belongs to.
|
||||
*
|
||||
* Return value: the position of @row in its model or -1 if index is out of
|
||||
**/
|
||||
gint db_row_get_position (const DbRow * row)
|
||||
{
|
||||
g_return_val_if_fail (row, -1);
|
||||
|
||||
return row->position;
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_ROW_H
|
||||
#define DB_ROW_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#define DB_TYPE_ROW (db_row_get_type())
|
||||
|
||||
typedef struct _DbRow DbRow;
|
||||
|
||||
/**
|
||||
* DbRow:
|
||||
* @value: a #GValue
|
||||
* @position: the position of the row in the DbModel
|
||||
* @len: the number of fields
|
||||
*
|
||||
* Holds the data and information of a row.
|
||||
**/
|
||||
struct _DbRow
|
||||
{
|
||||
GValue * value;
|
||||
gint position;
|
||||
gint len;
|
||||
};
|
||||
|
||||
GType db_row_get_type ();
|
||||
DbRow * db_row_new (gint len, gint position);
|
||||
void db_row_free (DbRow * row);
|
||||
DbRow * db_row_copy (const DbRow * row);
|
||||
const GValue * db_row_get_value (const DbRow * row, gint index);
|
||||
gint db_row_get_position (const DbRow * row);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DB_H
|
||||
#define DB_H
|
||||
|
||||
#include <sql/sql.h>
|
||||
#include "db-iter.h"
|
||||
#include "db-model.h"
|
||||
#include "db-request.h"
|
||||
#include "db-conn.h"
|
||||
#include "db-row.h"
|
||||
#include "db-iterator.h"
|
||||
#include "db-param.h"
|
||||
#include "db-plugin.h"
|
||||
#include "db-calc.h"
|
||||
#include "db-file-loader.h"
|
||||
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@/hedera
|
||||
includedir=@includedir@/hedera
|
||||
|
||||
Name: Db
|
||||
Description: Database Access Module for Hedera Library
|
||||
Version: @VERSION@
|
||||
Requires: sql gvn glib-2.0 gobject-2.0
|
||||
Libs: -L${libdir} -ldb
|
||||
Cflags: -I${includedir}/db
|
|
@ -0,0 +1,5 @@
|
|||
libhedera (1.0-1) stable; urgency=low
|
||||
|
||||
* Initial Release.
|
||||
|
||||
-- Alejandro T. Colombini Gómez <hedera@verdnatura.es> Wed, 02 May 2012 10:20:21 +0200
|
|
@ -0,0 +1 @@
|
|||
8
|
|
@ -0,0 +1,73 @@
|
|||
Source: libhedera
|
||||
Priority: extra
|
||||
Maintainer: Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>
|
||||
Build-Depends: debhelper (>= 8.0.0), autotools-dev, libgtk-3-dev, gtk-doc-tools,
|
||||
valac, libgirepository1.0-dev, libgladeui-dev, libgdome2-dev,
|
||||
libpq-dev, libmysqlclient-dev, ragel
|
||||
Standards-Version: 3.9.3
|
||||
Section: libs
|
||||
Homepage: http://www.verdnatura.es
|
||||
Vcs-Svn: svn://www.verdnatura.es/hedera/trunk
|
||||
|
||||
Package: hedera
|
||||
Section: gnome
|
||||
Architecture: amd64
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libhedera1 (= ${binary:Version})
|
||||
Suggests: vn-updater (>= 1.0)
|
||||
Description: Database access and widget provider library (runtime)
|
||||
The hedera library provides and lets you create widgets bound to SQL queries
|
||||
and manages the different operations made over the data retrieved from these
|
||||
queries.
|
||||
.
|
||||
The library also has a modular system to add and remove the different widgets
|
||||
in run time.
|
||||
.
|
||||
This package contains the executable and data files.
|
||||
|
||||
Package: libhedera-dev
|
||||
Section: libdevel
|
||||
Architecture: amd64
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libhedera1 (= ${binary:Version})
|
||||
Suggests: libgtk-3-doc, libgtk-3-dbg, devhelp, valac (>= 0.16)
|
||||
Recommends: glade (>= 3.4), anjuta (>= 3.4)
|
||||
Description: Database access and widget provider library (development)
|
||||
The hedera library provides and lets you create widgets bound to SQL queries
|
||||
and manages the different operations made over the data retrieved from these
|
||||
queries.
|
||||
.
|
||||
The library also has a modular system to add and remove the different widgets
|
||||
in run time. And it includes Glade integration, to design the programs in an
|
||||
easiest, graphical way.
|
||||
.
|
||||
This package contains development files to compile C and Vala programs that
|
||||
use the hedera library. It also contains the documentation and introspection
|
||||
files.
|
||||
|
||||
Package: libhedera1
|
||||
Section: libs
|
||||
Architecture: amd64
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, libgtk-3-0, libgtk-3-dev
|
||||
Description: Database access and widget provider library (core)
|
||||
The hedera library provides and lets you create widgets bound to SQL queries
|
||||
and manages the different operations made over the data retrieved from these
|
||||
queries.
|
||||
.
|
||||
The library also has a modular system to add and remove the different widgets
|
||||
in run time.
|
||||
.
|
||||
This package contains the core of the library. It also provides the plugins to
|
||||
connect a PostgreSQL or MySQL database.
|
||||
|
||||
Package: libhedera-dbg
|
||||
Section: debug
|
||||
Architecture: amd64
|
||||
Depends: ${misc:Depends}, libhedera-dev (= ${binary:Version})
|
||||
Description: Database access and widget provider library (debug)
|
||||
The hedera library provides and lets you create widgets bound to SQL queries
|
||||
and manages the different operations made over the data retrieved from these
|
||||
queries.
|
||||
.
|
||||
The library also has a modular system to add and remove the different widgets
|
||||
in run time.
|
||||
.
|
||||
This package contains the debugging symbols for hedera.
|
|
@ -0,0 +1,29 @@
|
|||
Format: http://dep.debian.net/deps/dep5
|
||||
Upstream-Name: libhedera
|
||||
Source: svn://www.verdnatura.es/hedera
|
||||
|
||||
Files: *
|
||||
Copyright: 2011-2013 Juan Ferrer Toribio <juan@verdnatura.es>
|
||||
2013 The Hedera Team <hedera@verdnatura.es>
|
||||
License: GPL-3.0+
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2013 Alejandro T. Colombini Gómez <atcolombini@verdnatura.es>
|
||||
License: GPL-3.0+
|
||||
|
||||
License: GPL-3.0+
|
||||
This package is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
.
|
||||
On Debian systems, the complete text of the GNU General Public
|
||||
License can be found in "/usr/share/common-licenses/GPL-3".
|
|
@ -0,0 +1,2 @@
|
|||
NEWS
|
||||
README
|
|
@ -0,0 +1,8 @@
|
|||
usr/bin
|
||||
usr/lib/hedera/module
|
||||
usr/share/hedera/vn/image
|
||||
usr/share/hedera/vn
|
||||
usr/share/hedera/module
|
||||
usr/share/hedera/module/sql
|
||||
usr/share/applications
|
||||
usr/share/ca-certificates/verdnatura.es
|
|
@ -0,0 +1,7 @@
|
|||
usr/bin/*
|
||||
usr/lib/hedera/module/*.so
|
||||
usr/share/hedera/vn/image/*
|
||||
usr/share/hedera/vn/*
|
||||
usr/share/hedera/module/*
|
||||
usr/share/applications/*
|
||||
usr/share/ca-certificates/verdnatura.es/*
|
|
@ -0,0 +1 @@
|
|||
usr/share/ca-certificates/verdnatura.es/cacert.pem etc/ssl/certs/verdnatura.es.pem
|
|
@ -0,0 +1 @@
|
|||
main/hedera.1
|
|
@ -0,0 +1,15 @@
|
|||
usr/include/hedera
|
||||
usr/include/hedera/gvn
|
||||
usr/include/hedera/sql
|
||||
usr/include/hedera/db
|
||||
usr/include/hedera/vn
|
||||
usr/include/hedera/vn/field
|
||||
usr/include/hedera/vn/column
|
||||
usr/lib/hedera
|
||||
usr/lib/glade/modules
|
||||
usr/lib/girepository-1.0
|
||||
usr/share/gir-1.0
|
||||
usr/share/glade/catalogs
|
||||
usr/share/pkgconfig
|
||||
usr/share/vala-0.20/vapi
|
||||
usr/share/gtk-doc/html/hedera
|
|
@ -0,0 +1,25 @@
|
|||
usr/include/hedera/gvn/*
|
||||
usr/include/hedera/sql/*
|
||||
usr/include/hedera/db/*
|
||||
usr/include/hedera/vn/*
|
||||
usr/include/hedera/vn/field/*
|
||||
usr/include/hedera/vn/column/*
|
||||
usr/lib/hedera/libgvn.a
|
||||
usr/lib/hedera/libgvn.so
|
||||
usr/lib/hedera/libsql.a
|
||||
usr/lib/hedera/libsql.so
|
||||
usr/lib/hedera/libdb.a
|
||||
usr/lib/hedera/libdb.so
|
||||
usr/lib/hedera/libvn.a
|
||||
usr/lib/hedera/libvn.so
|
||||
usr/lib/hedera/libvnfield.a
|
||||
usr/lib/hedera/libvnfield.so
|
||||
usr/lib/hedera/libvncolumn.a
|
||||
usr/lib/hedera/libvncolumn.so
|
||||
usr/lib/glade/modules/libgladevn.so
|
||||
usr/lib/girepository-1.0/*
|
||||
usr/share/gir-1.0/*
|
||||
usr/share/glade/catalogs/*
|
||||
usr/share/pkgconfig/*
|
||||
usr/share/vala-0.20/vapi/*
|
||||
usr/share/gtk-doc/html/hedera/*
|
|
@ -0,0 +1,6 @@
|
|||
usr/lib/hedera
|
||||
usr/share/glib-2.0/schemas
|
||||
usr/share/locale/es/LC_MESSAGES
|
||||
usr/share/locale/ca/LC_MESSAGES
|
||||
usr/share/locale/nl/LC_MESSAGES
|
||||
usr/share/xml/hedera
|
|
@ -0,0 +1,13 @@
|
|||
usr/lib/hedera/libgvn.so.*
|
||||
usr/lib/hedera/libsql.so.*
|
||||
usr/lib/hedera/libdb.so.*
|
||||
usr/lib/hedera/plugin/pg/libdbpg.so
|
||||
usr/lib/hedera/plugin/mysql/libdbmysql.so
|
||||
usr/lib/hedera/libvn.so.*
|
||||
usr/lib/hedera/libvnfield.so.*
|
||||
usr/lib/hedera/libvncolumn.so.*
|
||||
usr/share/glib-2.0/schemas/*
|
||||
usr/share/locale/es/LC_MESSAGES/hedera.mo
|
||||
usr/share/locale/ca/LC_MESSAGES/hedera.mo
|
||||
usr/share/locale/nl/LC_MESSAGES/hedera.mo
|
||||
usr/share/xml/hedera/*
|
|
@ -0,0 +1,5 @@
|
|||
?package(hedera):needs="X11" \
|
||||
section="Applications/Office" \
|
||||
title="Hedera" command="hedera" \
|
||||
icon16x16="/usr/share/hedera/vn/image/hedera16x16.xpm" \
|
||||
icon32x32="/usr/share/hedera/vn/image/hedera32x32.xpm"
|
|
@ -0,0 +1,21 @@
|
|||
#!/usr/bin/make -f
|
||||
|
||||
#export DH_VERBOSE=1
|
||||
#export CFLAGS=" -O3 "
|
||||
|
||||
%:
|
||||
dh $@ --with autotools-dev --parallel --builddirectory=debian/build
|
||||
|
||||
.PHONY: override_dh_auto_configure
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- \
|
||||
--enable-vala --enable-gtk-doc --enable-debug --enable-install
|
||||
|
||||
.PHONY: override_dh_strip
|
||||
override_dh_strip:
|
||||
dh_strip --dbg-package=libhedera-dbg
|
||||
|
||||
# Overriden to avoid lintian warnings about postinst/postrm
|
||||
.PHONY: override_dh_makeshlibs
|
||||
override_dh_makeshlibs:
|
||||
dh_makeshlibs --noscripts
|
|
@ -0,0 +1 @@
|
|||
3.0 (native)
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
SUBDIRS = reference
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
SUBDIRS = hedera
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
|
||||
AUTOMAKE_OPTIONS = 1.6
|
||||
|
||||
DOC_MODULE = hedera
|
||||
|
||||
# The top-level SGML file. You can change this if you want to.
|
||||
DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml
|
||||
|
||||
# Directories containing the source code.
|
||||
# gtk-doc will search all .c and .h files beneath these paths
|
||||
# for inline comments documenting functions and macros.
|
||||
DOC_SOURCE_DIR = \
|
||||
$(top_srcdir)/gvn \
|
||||
$(top_srcdir)/sql \
|
||||
$(top_srcdir)/db \
|
||||
$(top_srcdir)/vn \
|
||||
$(top_srcdir)/vn/field \
|
||||
$(top_srcdir)/vn/column
|
||||
|
||||
MKDB_OPTIONS = --xml-mode --output-format=xml
|
||||
|
||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||
HFILE_GLOB = \
|
||||
$(top_srcdir)/gvn/*.h \
|
||||
$(top_srcdir)/sql/*.h \
|
||||
$(top_srcdir)/db/*.h \
|
||||
$(top_srcdir)/vn/*.h \
|
||||
$(top_srcdir)/vn/field/*.h \
|
||||
$(top_srcdir)/vn/column/*.h
|
||||
CFILE_GLOB = \
|
||||
$(top_srcdir)/gvn/*.c \
|
||||
$(top_srcdir)/sql/*.c \
|
||||
$(top_srcdir)/db/*.c \
|
||||
$(top_srcdir)/vn/*.c \
|
||||
$(top_srcdir)/vn/field/*.c \
|
||||
$(top_srcdir)/vn/column/*.c
|
||||
|
||||
# Header files or dirs to ignore when scanning. Use base file/dir names
|
||||
IGNORE_HFILES = \
|
||||
plugin module parser
|
||||
|
||||
# Images to copy into HTML directory.
|
||||
HTML_IMAGES = \
|
||||
$(srcdir)/image/vn-calendar.png
|
||||
|
||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||
content_files = \
|
||||
introduction.xml \
|
||||
configuring.xml \
|
||||
running.xml \
|
||||
adding-modules.xml \
|
||||
module-tutorial.xml \
|
||||
first-tutorial.xml
|
||||
|
||||
# Extra options to supply to gtkdoc-fixref
|
||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||
FIXXREF_OPTIONS =
|
||||
|
||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||
expand_content_files = #first-tutorial.xml
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||
GTKDOC_CFLAGS = -I$(top_srcdir) -I$(top_builddir) $(gtk_CFLAGS)
|
||||
GTKDOC_LIBS = \
|
||||
$(gtk_LIBS) \
|
||||
$(top_builddir)/gvn/libgvn.la \
|
||||
$(top_builddir)/sql/libsql.la \
|
||||
$(top_builddir)/db/libdb.la \
|
||||
$(top_builddir)/vn/libvn.la \
|
||||
$(top_builddir)/vn/field/libvnfield.la \
|
||||
$(top_builddir)/vn/column/libvncolumn.la
|
||||
|
||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||
include $(top_srcdir)/gtk-doc.make
|
||||
|
||||
# Comment this out if you want 'make check' to test you doc status
|
||||
# and run some sanity checks
|
||||
if ENABLE_GTK_DOC
|
||||
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||
DOC_MODULE = $(DOC_MODULE) DOC_MAIN_SGML_FILE = $(DOC_MAIN_SGML_FILE) \
|
||||
SRCDIR = $(abs_srcdir) BUILDDIR = $(abs_builddir)
|
||||
#TESTS = $(GTKDOC_CHECK)
|
||||
endif
|
||||
|
||||
EXTRA_DIST += \
|
||||
introduction.xml \
|
||||
configuring.xml \
|
||||
running.xml \
|
||||
adding-modules.xml \
|
||||
module-tutorial.xml \
|
||||
first-tutorial.xml
|
||||
|
||||
CLEANFILES += \
|
||||
hedera-scan.c \
|
||||
hedera.types \
|
||||
hedera-overrides.txt \
|
||||
hedera-sections.txt \
|
||||
hedera-decl-list.txt \
|
||||
hedera-decl.txt
|
|
@ -0,0 +1,69 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
|
||||
]>
|
||||
<refentry id="adding-modules">
|
||||
<refmeta>
|
||||
<refentrytitle>Adding modules</refentrytitle>
|
||||
<manvolnum>0</manvolnum>
|
||||
<refmiscinfo>Hedera Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>Adding modules</refname>
|
||||
<refpurpose>
|
||||
How to add your own modules
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsection id="first">
|
||||
<title>Previous stage</title>
|
||||
<para>
|
||||
Before you can add a module, you have to create it. To do so,
|
||||
the Hedera Library ships with an Anjuta IDE project wizzard
|
||||
that creates an empty module written in Vala, almost ready
|
||||
to build . If you won't be using the Anjuta IDE, you'll
|
||||
have to work your way to a built module. More on that will be
|
||||
covered in the section about the module creation on the Tutorials.
|
||||
</para>
|
||||
</refsection>
|
||||
|
||||
<refsection id="adding">
|
||||
<title>Adding the module</title>
|
||||
<para>
|
||||
At this point, you should have a compiled module, this consisting
|
||||
in a folder with the data (images, UI definitions, etc.) of the
|
||||
module along with the dynamic library (a .so file) that the
|
||||
Hedera execution environment (or Hedera application) will link
|
||||
in runtime to load the module. It can also be the single <filename>
|
||||
.so</filename>, due to that may be the module developer has coded
|
||||
the UI creation or may be beacuse both the module and its data were
|
||||
compiled in a single file.
|
||||
</para>
|
||||
<para>
|
||||
To run the module in the hedera runtime you must set the environment
|
||||
variable VN_MODULE_LIB_PATH to the full path to the module or
|
||||
modules <filename>.so</filename> files (separated by :), and
|
||||
VN_MODULE_DATA_PATH pointing to the <filename>.xml</filename>,
|
||||
<filename>.glade</filename>, <filename>.ui</filename> and any
|
||||
other data of the module, there is also an optional third variable,
|
||||
VN_MODULE_QUERY_PATH that points to <filename>.sql</filename>
|
||||
files. Once these variables are set you'll have to run
|
||||
the Hedera application normally, and it will look for the
|
||||
values on the variables and load the module. In the future there
|
||||
will be another variable that when set to "yes" the module will
|
||||
install and when set to "no" (or not set) the module will just be
|
||||
used as now in the hedera runtime. Note that if you use the Anjuta
|
||||
IDE with the project created by the wizzard, as you run in Anjuta
|
||||
the variables will be automatically set pointing to your project
|
||||
files.
|
||||
</para>
|
||||
<para>
|
||||
If you want to install the module you have to install the <filename>
|
||||
.so</filename> in <filename>/usr/lib/hedera/module</filename> and
|
||||
the <filename>.xml</filename> and any other data to <filename>
|
||||
/usr/share/hedera/module</filename>.
|
||||
</para>
|
||||
</refsection>
|
||||
|
||||
</refentry>
|
|
@ -0,0 +1,87 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
|
||||
]>
|
||||
<refentry id="configuring">
|
||||
<refmeta>
|
||||
<refentrytitle>Configuring</refentrytitle>
|
||||
<manvolnum>0</manvolnum>
|
||||
<refmiscinfo>Hedera Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>Configuring the Hedera Library</refname>
|
||||
<refpurpose>
|
||||
How to configure the Hedera library before start using it
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsection id="section-who">
|
||||
<para>
|
||||
This chapter covers how to configure the library from the tarball,
|
||||
if you have received it packed in any other form, like a .deb
|
||||
package, this section can be ignored, but you'll need to know how
|
||||
to use the package you received.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection id="needed">
|
||||
<title>What do you need?</title>
|
||||
<para>
|
||||
The Hedera library has some dependencies, so to compile it you'll
|
||||
need these to be satisfied. Depending on how many things you want
|
||||
the library to do, you'll need more or less things to start using
|
||||
it.
|
||||
</para>
|
||||
<para>
|
||||
The main and unavoidable dependencies for the Hedera library
|
||||
are GLib and GTK+. Also, depending of what type of database you will
|
||||
be using, you will also need the public API of this database. The
|
||||
goal of the library is to add more support for other free databases,
|
||||
but right now, the only supported databases are PostgreSQL and
|
||||
MySQL, so you will need to install the programming interface for at
|
||||
least of of these.
|
||||
</para>
|
||||
<para>
|
||||
If you want to generate this documentation with your own compilation
|
||||
of the library, you'll also need to install GTK-Doc to do so.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection id="compiling">
|
||||
<title>Compiling the library</title>
|
||||
<para>
|
||||
Supposing you've satisfied all of the existing dependencies, now
|
||||
you'll need to compile the Hedera library. To do it you just have
|
||||
to go to the root folder of the library and run the autogen.sh
|
||||
script with the configure options of your choice (listed in the
|
||||
README file of the distribution) e.g. './autogen.sh --enable-vala
|
||||
--prefix=~/installdir' and then run 'make' to compile the library.
|
||||
</para>
|
||||
<para>
|
||||
As we do, we highly recommend developers using the Hedera
|
||||
library and also GTK+ or GLib, to use the Anjuta IDE, a very
|
||||
useful and complete free developing environment with a great
|
||||
support and integration for the GObject system and the GNU
|
||||
build system.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection id="vala">
|
||||
<title>Vala</title>
|
||||
<para>
|
||||
The Hedera library supports Vala as programming language. If
|
||||
you will be programming in Vala, you must install the Vala
|
||||
compiler, valac. The only version of Vala supported right now is
|
||||
the 0.16, plans are to be also compatible with newer versions
|
||||
too. Note that to build the Vala bindings you'll also need the
|
||||
vapigen tool, which normally installs with the Vala compiler.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection id="installing">
|
||||
<title>Installing</title>
|
||||
<para>
|
||||
When you have the library configured according to your needs,
|
||||
you'll have to execute 'make install' with root privileges, and
|
||||
the library directory tree will install in the folder specified
|
||||
at configure time.
|
||||
</para>
|
||||
</refsection>
|
||||
</refentry>
|
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
|
||||
]>
|
||||
<refentry id="first-tutorial">
|
||||
<refmeta>
|
||||
<refentrytitle>First Tutorial</refentrytitle>
|
||||
<manvolnum>0</manvolnum>
|
||||
<refmiscinfo>Hedera Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>First simple tutorial</refname>
|
||||
<refpurpose>
|
||||
A simple tutorial to get started
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsection id="first-tutorial-intro">
|
||||
<title>The first tutorial</title>
|
||||
<para>
|
||||
In this first tutorial you will learn how to create a simple
|
||||
module with just one form using the Hedera library.
|
||||
</para>
|
||||
</refsection>
|
||||
|
||||
</refentry>
|
|
@ -0,0 +1,153 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||
[
|
||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||
]>
|
||||
<book id="index">
|
||||
<bookinfo>
|
||||
<title>Hedera Reference Manual</title>
|
||||
<releaseinfo>
|
||||
This document is for the Hedera library, version 1.0.
|
||||
The latest version of this documentation can be found on-line
|
||||
<ulink role="online-location" url="http://www.verdnatura.es/hederaDoc/index.html">here</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
<part id="hedera-overview">
|
||||
<title>Overview</title>
|
||||
<partintro>
|
||||
<para>
|
||||
This part exposes the features of the Hedera library and
|
||||
what you need to compile and use it the first time.
|
||||
</para>
|
||||
</partintro>
|
||||
<xi:include href="introduction.xml"/>
|
||||
<xi:include href="configuring.xml"/>
|
||||
<xi:include href="running.xml"/>
|
||||
<xi:include href="adding-modules.xml"/>
|
||||
<!--
|
||||
Pending chapters:
|
||||
Windows <xi:include href="windows.xml"/>
|
||||
OSX <xi:include href="osx.xml"/>
|
||||
-->
|
||||
</part>
|
||||
<part id="hedera-usage">
|
||||
<title>Using Hedera library</title>
|
||||
<partintro>
|
||||
<para>
|
||||
Once you've installed it, you'll need to get the hang of it.
|
||||
With this in mind, we've prepared some tutorials to do it.
|
||||
</para>
|
||||
</partintro>
|
||||
<xi:include href="module-tutorial.xml"/>
|
||||
<xi:include href="first-tutorial.xml"/>
|
||||
<!--
|
||||
Pending chapters:
|
||||
Advanced Tutorial. Customizing. <xi:include href="advanced-tutorial.xml">
|
||||
-->
|
||||
</part>
|
||||
<part id="hedera-reference">
|
||||
<title>Hedera Reference</title>
|
||||
<partintro>
|
||||
<para>
|
||||
A quick reference guide of the classes and functions found
|
||||
in each part of the Hedera library.
|
||||
</para>
|
||||
</partintro>
|
||||
<chapter id="object-tree">
|
||||
<title>Object Hierarchy</title>
|
||||
<xi:include href="xml/tree_index.sgml"/>
|
||||
</chapter>
|
||||
<chapter id="gvnlib">
|
||||
<title>GvnLib</title>
|
||||
<xi:include href="xml/gvn-misc.xml"/>
|
||||
<xi:include href="xml/gvn-value.xml"/>
|
||||
<xi:include href="xml/gvn-null.xml"/>
|
||||
<xi:include href="xml/gvn-time.xml"/>
|
||||
<xi:include href="xml/gvn-param.xml"/>
|
||||
<xi:include href="xml/gvn-param-spec.xml"/>
|
||||
</chapter>
|
||||
<chapter id="sqllib">
|
||||
<title>SqlLib</title>
|
||||
<xi:include href="xml/sql-parser.xml"/>
|
||||
<xi:include href="xml/sql-render.xml"/>
|
||||
<xi:include href="xml/sql-object.xml"/>
|
||||
<xi:include href="xml/sql-stmt.xml"/>
|
||||
<xi:include href="xml/sql-expr.xml"/>
|
||||
<xi:include href="xml/sql-target.xml"/>
|
||||
<xi:include href="xml/sql-dml.xml"/>
|
||||
<xi:include href="xml/sql-insert.xml"/>
|
||||
<xi:include href="xml/sql-multi-stmt.xml"/>
|
||||
<xi:include href="xml/sql-string.xml"/>
|
||||
<xi:include href="xml/sql-delete.xml"/>
|
||||
<xi:include href="xml/sql-select.xml"/>
|
||||
<xi:include href="xml/sql-update.xml"/>
|
||||
<xi:include href="xml/sql-field.xml"/>
|
||||
<xi:include href="xml/sql-function.xml"/>
|
||||
<xi:include href="xml/sql-operation.xml"/>
|
||||
<xi:include href="xml/sql-value.xml"/>
|
||||
<xi:include href="xml/sql-join.xml"/>
|
||||
<xi:include href="xml/sql-subquery.xml"/>
|
||||
<xi:include href="xml/sql-table.xml"/>
|
||||
</chapter>
|
||||
<chapter id="dblib">
|
||||
<title>DbLib</title>
|
||||
<xi:include href="xml/db-conn.xml"/>
|
||||
<xi:include href="xml/db-model.xml"/>
|
||||
<xi:include href="xml/db-iterator.xml"/>
|
||||
<xi:include href="xml/db-iter.xml"/>
|
||||
<xi:include href="xml/db-row.xml"/>
|
||||
<xi:include href="xml/db-param.xml"/>
|
||||
<xi:include href="xml/db-request.xml"/>
|
||||
<xi:include href="xml/db-calc.xml"/>
|
||||
<xi:include href="xml/db-file-loader.xml"/>
|
||||
<xi:include href="xml/db-plugin.xml"/>
|
||||
</chapter>
|
||||
<chapter id="vnlib">
|
||||
<title>VnLib</title>
|
||||
<xi:include href="xml/vn-gui.xml"/>
|
||||
<xi:include href="xml/vn-mod.xml"/>
|
||||
<xi:include href="xml/vn-form.xml"/>
|
||||
<xi:include href="xml/vn-model.xml"/>
|
||||
<xi:include href="xml/vn-grid.xml"/>
|
||||
<xi:include href="xml/vn-handler.xml"/>
|
||||
<xi:include href="xml/vn-builder.xml"/>
|
||||
<xi:include href="xml/vn-field.xml"/>
|
||||
<xi:include href="xml/vn-column.xml"/>
|
||||
</chapter>
|
||||
<chapter id="vnfield">
|
||||
<title>Fields</title>
|
||||
<xi:include href="xml/vn-entry.xml"/>
|
||||
<xi:include href="xml/vn-image.xml"/>
|
||||
<xi:include href="xml/vn-spin.xml"/>
|
||||
<xi:include href="xml/vn-calendar.xml"/>
|
||||
<xi:include href="xml/vn-check.xml"/>
|
||||
<xi:include href="xml/vn-combo.xml"/>
|
||||
<xi:include href="xml/vn-date-chooser.xml"/>
|
||||
<xi:include href="xml/vn-completion.xml"/>
|
||||
<xi:include href="xml/vn-http-image.xml"/>
|
||||
</chapter>
|
||||
<chapter id="vncolumn">
|
||||
<title>Columns</title>
|
||||
<xi:include href="xml/vn-column-check.xml"/>
|
||||
<xi:include href="xml/vn-column-combo.xml"/>
|
||||
<xi:include href="xml/vn-column-entry.xml"/>
|
||||
<xi:include href="xml/vn-column-image.xml"/>
|
||||
<xi:include href="xml/vn-column-spin.xml"/>
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<index id="api-index-full">
|
||||
<title>API Index</title>
|
||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<!--
|
||||
<index id="deprecated-api-index" role="deprecated">
|
||||
<title>Index of deprecated API</title>
|
||||
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
-->
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
|
||||
</book>
|
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
|
@ -0,0 +1,50 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
|
||||
]>
|
||||
<refentry id="introduction">
|
||||
<refmeta>
|
||||
<refentrytitle>Introduction</refentrytitle>
|
||||
<manvolnum>0</manvolnum>
|
||||
<refmiscinfo>Hedera Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>Introduction to the Hedera library</refname>
|
||||
<refpurpose>
|
||||
Presentation of the features of the Hedera Lib
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsection id="description">
|
||||
<title>The Hedera Library</title>
|
||||
<para>
|
||||
The Hedera library is a utility library that offers an easy
|
||||
way to connect to a database and link the retrieved data to
|
||||
GTK+ graphical interfaces.
|
||||
</para>
|
||||
<para>
|
||||
It features a modular system to easily add new functionalities
|
||||
to your applications with the minimum maintenance needed. This
|
||||
system offers the developer the chance to use either GObject/C
|
||||
or Vala to implement new modules and also comes with an easy
|
||||
integration method to add them to the existing application in no
|
||||
time.
|
||||
</para>
|
||||
<para>
|
||||
Althought you can write your own applications, the library is
|
||||
thought to use the shipped application and link the modules
|
||||
to it, in order to ease the process. The linking of the
|
||||
application and the modules will be described in the section
|
||||
about adding new modules and an example of the process will be
|
||||
shown in a tutorial.
|
||||
</para>
|
||||
<para>
|
||||
The hedera library also comes with an Anjuta IDE project
|
||||
wizzard to help on the creation of the Hedera Module project
|
||||
and integrate it with the GNU Build System. As the motivation
|
||||
of the Hedera Library Project was to use the library from Vala,
|
||||
this project wizzard generates a Vala project.
|
||||
</para>
|
||||
</refsection>
|
||||
</refentry>
|
|
@ -0,0 +1,76 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
|
||||
]>
|
||||
<refentry id="module-tutorial">
|
||||
<refmeta>
|
||||
<refentrytitle>Creating a module</refentrytitle>
|
||||
<manvolnum>0</manvolnum>
|
||||
<refmiscinfo>Hedera Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>Creating a module</refname>
|
||||
<refpurpose>
|
||||
Tutorial on how to create an Hedera Module
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
<refsection id="this-section">
|
||||
<para>
|
||||
This section is a tutorial on how to create a new Hedera Module,
|
||||
here you will learn about the basic programming to set up a
|
||||
module, then you'll need to add it to the rest of the Hedera
|
||||
execution environment, to know how to do it, read the chapter
|
||||
"Adding modules" of the Hedera manual.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection id="alternatives">
|
||||
<title>The alternatives</title>
|
||||
<para>
|
||||
Before starting you have to decide if you're going to use the
|
||||
Anjuta IDE or not. If you do so, you can use the project wizzard
|
||||
to generate the tamplate of the project and the build system. If
|
||||
you can't use the Anjuta IDE, you'll need to write your build
|
||||
scripts in your preferred build environment. In this tutorial
|
||||
you are supposed to use the Anjuta IDE, if you don't, the code
|
||||
will be the same, so you can follow the next tutorials either way.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection id="set-up-anjuta">
|
||||
<title>Setting up the Anjuta project</title>
|
||||
<para>
|
||||
As said before, the Hedera Library comes with an Anjuta project
|
||||
wizzard to help the easy creation of a new Hedera Module on Vala.
|
||||
To include this wizzard to Anjuta 2.31 or grater you can run
|
||||
Anjuta passing the path to the module file as an argument.
|
||||
For previous versions of Anjuta you'll need to unzip the
|
||||
hedera-mod.wiz.tgz file to the corresponding data directory named
|
||||
anjuta/project, placed under ~/.local on most distributions. With
|
||||
the former method Anjuta will do the same by itself. As the
|
||||
dependancies of the hedera library go beyond these versions, it's
|
||||
most likely that you have a version greater than the 2.31.
|
||||
</para>
|
||||
<para>
|
||||
When Anjuta starts, it will show the wizzard dialog that will
|
||||
guide you in the creation of the module.
|
||||
</para>
|
||||
<para>
|
||||
After following the wizzard, you'll have a clean Hedera Module,
|
||||
you can now verify you have everything you need to work by
|
||||
building the module. As you try to build the project, Anjuta will
|
||||
prompt you for the configuration options of the project, configure
|
||||
the project without options (you can add options like --enable-debug
|
||||
or others, that will be discussed later). If you can build you are
|
||||
good to go with the next tutorials. Else you'll need to check the
|
||||
errors prompted by the build system and fix them, probably
|
||||
installing missing packages on your system.
|
||||
</para>
|
||||
</refsection>
|
||||
<refsection id="set-up-alone">
|
||||
<title>Setting up a GNU make project</title>
|
||||
<para>
|
||||
To set up a project using a simple GNU make script you'll need to
|
||||
do some things that will be described here but are not written yet.
|
||||
</para>
|
||||
</refsection>
|
||||
</refentry>
|
|
@ -0,0 +1,53 @@
|
|||
<?xml version="1.0"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
|
||||
]>
|
||||
<refentry id="running">
|
||||
<refmeta>
|
||||
<refentrytitle>Running applications</refentrytitle>
|
||||
<manvolnum>0</manvolnum>
|
||||
<refmiscinfo>Hedera Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>Running Hedera applications</refname>
|
||||
<refpurpose>
|
||||
How to run an Hedera application
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsection id="description">
|
||||
<title>Custom modules</title>
|
||||
<para>
|
||||
To run your own modules you need to install them in the
|
||||
search directories of Hedera, these are ${libdir}/hedera/module
|
||||
for the binary objects (.so files) and ${datadir}/hedera/module
|
||||
for additional data, thus the GUI files and the configuration file
|
||||
and also, optionally any additional data you want to add to your
|
||||
module should be here.
|
||||
</para>
|
||||
<para>
|
||||
It is also possible to put your files in any other path and tell
|
||||
Hedera where to look for them. To do so, set the following
|
||||
environment variables before executing Hedera: VN_MODULE_LIB_PATH,
|
||||
the list of directories put in this variable will be used to look
|
||||
for the binary files of the module; VN_MODULE_DATA_PATH, this list
|
||||
of directories must hold the path to the data of the module.
|
||||
</para>
|
||||
<title>Example modules</title>
|
||||
<para>
|
||||
Once you've succesfully compiled the library you can try and
|
||||
run some of the provided modules (some of wich you can write
|
||||
by yourself following the tutorials included in this manual).
|
||||
If the installation went as expected you'll just need to
|
||||
run the Hedera executable. The executable will be in the
|
||||
"bin" directory of the installation tree. If you installed the
|
||||
library in a folder that is included in the PATH environment
|
||||
variable, you'll just need to write 'hedera' in the command
|
||||
line. The library will load the modules at runtime. The details
|
||||
on how to tell the hedera execution environment where to look
|
||||
for your modules are explained in <link linkend="adding-modules">
|
||||
Adding Modules</link>.
|
||||
</para>
|
||||
</refsection>
|
||||
</refentry>
|
|
@ -0,0 +1,23 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
gladevn_lib_LTLIBRARIES = libgladevn.la
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
$(gladeui_CFLAGS)
|
||||
libgladevn_la_LIBADD = \
|
||||
$(top_builddir)/vn/libvn.la \
|
||||
$(gladeui_LIBS)
|
||||
libgladevn_la_LDFLAGS = -avoid-version
|
||||
libgladevn_la_SOURCES = \
|
||||
glade-vn.h \
|
||||
glade-vn.c \
|
||||
glade-vn-batch.c
|
||||
|
||||
gladevn_data_DATA = vn.xml
|
||||
|
||||
EXTRA_DIST = $(gladevn_data_DATA)
|
||||
|
||||
install-data-hook:
|
||||
rm -f $(DESTDIR)$(gladevn_libdir)/libgladevn.la
|
||||
rm -f $(DESTDIR)$(gladevn_libdir)/libgladevn.a
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "glade-vn.h"
|
||||
|
||||
gboolean glade_vn_batch_add_verify (GladeWidgetAdaptor * adaptor,
|
||||
VnBatch * container, GObject * child, gboolean user_feedback)
|
||||
{
|
||||
if (G_IS_OBJECT (child))
|
||||
return TRUE;
|
||||
|
||||
if (user_feedback)
|
||||
{
|
||||
GladeWidgetAdaptor * object_adaptor =
|
||||
glade_widget_adaptor_get_by_type (G_TYPE_OBJECT);
|
||||
|
||||
glade_util_ui_message (glade_app_get_window ()
|
||||
,GLADE_UI_INFO
|
||||
,NULL
|
||||
,"Only objects of type %s can be added to objects of type %s."
|
||||
,glade_widget_adaptor_get_title (object_adaptor)
|
||||
,glade_widget_adaptor_get_title (adaptor)
|
||||
);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void glade_vn_batch_add_child (GladeWidgetAdaptor * adaptor,
|
||||
VnBatch * group, GObject * child)
|
||||
{
|
||||
if (G_IS_OBJECT (child))
|
||||
vn_batch_add (group, child);
|
||||
}
|
||||
|
||||
void glade_vn_batch_remove_child (GladeWidgetAdaptor * adaptor,
|
||||
VnBatch * group, GObject * child)
|
||||
{
|
||||
if (G_IS_OBJECT (child))
|
||||
vn_batch_remove (group, child);
|
||||
}
|
||||
|
||||
void glade_vn_batch_replace_child (GladeWidgetAdaptor * adaptor,
|
||||
GObject * container, GObject * current, GObject * new)
|
||||
{
|
||||
VnBatch * group = VN_BATCH (container);
|
||||
glade_vn_batch_remove_child (adaptor, group, current);
|
||||
glade_vn_batch_add_child (adaptor, group, new);
|
||||
}
|
||||
|
||||
GList * glade_vn_batch_get_children (GladeWidgetAdaptor * adaptor,
|
||||
VnBatch * group)
|
||||
{
|
||||
return vn_batch_get_objects (group);
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "glade-vn.h"
|
||||
|
||||
void glade_vn_init ()
|
||||
{
|
||||
g_message ("Hedera objects loaded!");
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GLADE_VN_H
|
||||
#define GLADE_VN_H
|
||||
|
||||
#include <gladeui/glade.h>
|
||||
#include <vn/vn.h>
|
||||
|
||||
void glade_vn_init ();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
MODULE_PATH=../build/glade/
|
||||
|
||||
export GLADE_MODULE_SEARCH_PATH="$MODULE_PATH/.libs"
|
||||
export GLADE_CATALOG_SEARCH_PATH=.
|
||||
glade
|
|
@ -0,0 +1,150 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<glade-catalog name="vn" library="gladevn" since="1.0" domain="glade3" depends="gtk+" book="hedera">
|
||||
|
||||
<init-function>glade_vn_init</init-function>
|
||||
|
||||
<glade-widget-classes>
|
||||
|
||||
<glade-widget-class name="GvnParam" generic-name="param" toplevel="True" title="Parameter" icon-name="widget-gtk-action">
|
||||
<properties>
|
||||
<property id="null" ignore="True"/>
|
||||
<property id="editable" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="DbModel" generic-name="model" title="Data Model" icon-name="widget-gtk-liststore">
|
||||
<properties>
|
||||
<property id="conn" ignore="True" disabled="True"/>
|
||||
<property id="sql" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="DbIterator" generic-name="iterator" title="Iterator" icon-name="widget-gtk-texttagtable">
|
||||
<properties>
|
||||
<property id="conn" ignore="True" disabled="True"/>
|
||||
<property id="sql" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="DbParam" generic-name="param" toplevel="True" title="Iterator Parameter" icon-name="widget-gtk-texttag">
|
||||
<properties>
|
||||
<property id="iterator" ignore="True"/>
|
||||
<property id="column" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="DbFileLoader" generic-name="file-loader" toplevel="True"
|
||||
title="HTTP File Loader" icon-name="widget-gtk-recentmanager">
|
||||
<properties>
|
||||
<property id="host" ignore="True"/>
|
||||
<property id="path" ignore="True"/>
|
||||
<property id="cache" ignore="True"/>
|
||||
<property id="size" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnGrid" generic-name="grid" title="Grid" icon-name="widget-gtk-treeview">
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnColumnCheck" generic-name="column-check" title="Column Check" icon-name="widget-gtk-checkbutton"/>
|
||||
<glade-widget-class name="VnColumnEntry" generic-name="column-entry" title="Column Entry" icon-name="widget-gtk-entry"/>
|
||||
|
||||
<glade-widget-class name="VnColumnSpin" generic-name="column-Spin" title="Column Spin" icon-name="widget-gtk-spinbutton">
|
||||
<properties>
|
||||
<property id="digits" ignore="True" disabled="True"/>
|
||||
<property id="climb-rate" ignore="True" disabled="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnColumnCombo" generic-name="column-combo" title="Column Combo" icon-name="widget-gtk-combobox">
|
||||
<properties>
|
||||
<property id="conn" ignore="True" disabled="True"/>
|
||||
<property id="sql" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnColumnImage" generic-name="column-image" title="Column Image" icon-name="widget-gtk-image">
|
||||
<properties>
|
||||
<property id="host" ignore="True" weight="0"/>
|
||||
<property id="path" ignore="True" weight="1"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnHandler" generic-name="handler" title="Handler" icon-name="widget-gtk-buttonbox">
|
||||
<properties>
|
||||
<property id="size" query="False" default="1"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnCombo" generic-name="combo" title="Combo Box Field" icon-name="widget-gtk-combobox">
|
||||
<properties>
|
||||
<property id="conn" ignore="True" disabled="True"/>
|
||||
<property id="sql" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnCompletion" generic-name="completion" title="Completion Field" icon-name="widget-gtk-entry">
|
||||
<properties>
|
||||
<property id="conn" ignore="True" disabled="True"/>
|
||||
<property id="sql" ignore="True"/>
|
||||
<property id="field" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnHttpImage" generic-name="http-image" title="Image retrieved by HTTP" icon-name="widget-gtk-image">
|
||||
<properties>
|
||||
<property id="path" ignore="True"/>
|
||||
<property id="loader" ignore="True"/>
|
||||
</properties>
|
||||
</glade-widget-class>
|
||||
|
||||
<glade-widget-class name="VnEntry" generic-name="entry" title="Text Field" icon-name="widget-gtk-entry"/>
|
||||
<glade-widget-class name="VnCheck" generic-name="check" title="Boolean Field" icon-name="widget-gtk-checkbutton"/>
|
||||
<glade-widget-class name="VnSpin" generic-name="spin" title="Numeric Field" icon-name="widget-gtk-spinbutton"/>
|
||||
<glade-widget-class name="VnImage" generic-name="image" title="Image Field" icon-name="widget-gtk-image"/>
|
||||
<glade-widget-class name="VnCalendar" generic-name="calendar" title="Date Field" icon-name="widget-gtk-calendar"/>
|
||||
<glade-widget-class name="VnDateChooser" generic-name="date-chooser" title="Date Chooser" icon-name="widget-gtk-calendar"/>
|
||||
|
||||
<glade-widget-class name="VnBatch" generic-name="batch" toplevel="True" title="Group of objects" icon-name="widget-gtk-vbuttonbox">
|
||||
<add-child-verify-function>glade_vn_batch_add_verify</add-child-verify-function>
|
||||
<add-child-function>glade_vn_batch_add_child</add-child-function>
|
||||
<remove-child-function>glade_vn_batch_remove_child</remove-child-function>
|
||||
<get-children-function>glade_vn_batch_get_children</get-children-function>
|
||||
<replace-child-function>glade_vn_batch_replace_child</replace-child-function>
|
||||
</glade-widget-class>
|
||||
|
||||
</glade-widget-classes>
|
||||
|
||||
<glade-widget-group name="db-toplevels" title="Data Handling">
|
||||
<glade-widget-class-ref name="VnBatch"/>
|
||||
<glade-widget-class-ref name="GvnParam"/>
|
||||
<glade-widget-class-ref name="DbModel"/>
|
||||
<glade-widget-class-ref name="DbIterator"/>
|
||||
<glade-widget-class-ref name="DbParam"/>
|
||||
<glade-widget-class-ref name="DbFileLoader"/>
|
||||
</glade-widget-group>
|
||||
|
||||
<glade-widget-group name="vn-toplevels" title="Grid and Columns">
|
||||
<glade-widget-class-ref name="VnGrid"/>
|
||||
<glade-widget-class-ref name="VnColumnCheck"/>
|
||||
<glade-widget-class-ref name="VnColumnCombo"/>
|
||||
<glade-widget-class-ref name="VnColumnEntry"/>
|
||||
<glade-widget-class-ref name="VnColumnImage"/>
|
||||
<glade-widget-class-ref name="VnColumnSpin"/>
|
||||
</glade-widget-group>
|
||||
|
||||
<glade-widget-group name="vn-toplevels" title="Data Widgets">
|
||||
<glade-widget-class-ref name="VnHandler"/>
|
||||
<glade-widget-class-ref name="VnEntry"/>
|
||||
<glade-widget-class-ref name="VnCheck"/>
|
||||
<glade-widget-class-ref name="VnCombo"/>
|
||||
<glade-widget-class-ref name="VnSpin"/>
|
||||
<glade-widget-class-ref name="VnImage"/>
|
||||
<glade-widget-class-ref name="VnHttpImage"/>
|
||||
<glade-widget-class-ref name="VnCompletion"/>
|
||||
<glade-widget-class-ref name="VnCalendar"/>
|
||||
<glade-widget-class-ref name="VnDateChooser"/>
|
||||
</glade-widget-group>
|
||||
|
||||
</glade-catalog>
|
|
@ -0,0 +1,63 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
gvn_lib_LTLIBRARIES = libgvn.la
|
||||
gvn_include_HEADERS = \
|
||||
gvn.h \
|
||||
gvn-misc.h \
|
||||
gvn-null.h \
|
||||
gvn-time.h \
|
||||
gvn-param.h \
|
||||
gvn-param-spec.h \
|
||||
gvn-value.h
|
||||
|
||||
AM_CPPFLAGS = $(glib_CFLAGS)
|
||||
libgvn_la_LIBADD = $(glib_LIBS)
|
||||
libgvn_la_SOURCES = \
|
||||
$(gvn_include_HEADERS) \
|
||||
gvn-misc.c \
|
||||
gvn-null.c \
|
||||
gvn-time.c \
|
||||
gvn-param.c \
|
||||
gvn-param-spec.c \
|
||||
gvn-value.c
|
||||
|
||||
pkgconfig_DATA = gvn.pc
|
||||
|
||||
EXTRA_DIST = gvn.pc.in
|
||||
|
||||
DISTCLEANFILES = gvn.pc
|
||||
|
||||
if ENABLE_VALA
|
||||
if HAVE_INTROSPECTION
|
||||
|
||||
-include $(INTROSPECTION_MAKEFILE)
|
||||
|
||||
INTROSPECTION_SCANNER_ARGS = $(GIR_SCANNER_ARGS)
|
||||
|
||||
introspection_sources = $(libgvn_la_SOURCES)
|
||||
|
||||
Gvn-$(VERSION).gir: $(gvn_lib_LTLIBRARIES)
|
||||
Gvn_@uVERSION@_gir_INCLUDES = GObject-2.0
|
||||
Gvn_@uVERSION@_gir_LIBS = $(gvn_lib_LTLIBRARIES)
|
||||
Gvn_@uVERSION@_gir_FILES = $(introspection_sources)
|
||||
Gvn_@uVERSION@_gir_EXPORT_PACKAGES = gvn
|
||||
INTROSPECTION_GIRS = Gvn-$(VERSION).gir
|
||||
|
||||
gir_DATA = $(INTROSPECTION_GIRS)
|
||||
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
|
||||
|
||||
CLEANFILES = $(gir_DATA) $(typelib_DATA)
|
||||
|
||||
$(vapis)/gvn.vapi: $(INTROSPECTION_GIRS) $(vapidata)/Gvn-$(VERSION).metadata
|
||||
$(vapigen_v)$(VAPIGEN) -q \
|
||||
--directory $(vapis) \
|
||||
--metadatadir $(vapidata) \
|
||||
--library gvn \
|
||||
Gvn-$(VERSION).gir
|
||||
|
||||
vapi_DATA = $(vapis)/gvn.vapi
|
||||
|
||||
CLEANFILES += $(vapi_DATA)
|
||||
|
||||
endif
|
||||
endif
|
|
@ -0,0 +1,112 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "gvn-misc.h"
|
||||
|
||||
/**
|
||||
* SECTION: gvn-misc
|
||||
* @Short_description: Miscelaneous utility functions
|
||||
* @Title: Miscelaneous utility functions
|
||||
**/
|
||||
|
||||
const gchar * GVN_ABR_WDAY[] = {N_("Err"),
|
||||
N_("Mon"), N_("Tue"), N_("Wed"), N_("Thu"), N_("Fri"), N_("Sat"), N_("Sun")
|
||||
};
|
||||
|
||||
const gchar * GVN_ABR_MONTH[] = {N_("Err"),
|
||||
N_("Jan"), N_("Feb"), N_("Mar"), N_("Apr"), N_("May"), N_("Jun"),
|
||||
N_("Jul"), N_("Aug"), N_("Sep"), N_("Oct"), N_("Nov"), N_("Dec"),
|
||||
};
|
||||
|
||||
/**
|
||||
* GETTEXT_PACKAGE: (skip)
|
||||
**/
|
||||
|
||||
/**
|
||||
* gvn_object_warning:
|
||||
* @instance: the object instance within which the warning was emitted
|
||||
* @message: (allow-none): a string with the message to show or #NULL
|
||||
*
|
||||
* Prints a more verbose warning message than g_warning(), showing the type of
|
||||
* the object @instance, the file and line from where it's been called and
|
||||
* @message, if any.
|
||||
**/
|
||||
|
||||
/**
|
||||
* gvn_key_file_save:
|
||||
* @obj: a #GKeyFile
|
||||
* @file: the file name
|
||||
*
|
||||
* Creates an ini file with the contents of @obj.
|
||||
**/
|
||||
void gvn_key_file_save (GKeyFile * obj, const gchar * file)
|
||||
{
|
||||
gsize len;
|
||||
gchar * aux;
|
||||
|
||||
aux = g_key_file_to_data (obj, &len, NULL);
|
||||
|
||||
if (len > 0)
|
||||
g_file_set_contents (file, aux, len, NULL);
|
||||
|
||||
g_free (aux);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_encode:
|
||||
* @string: the string to be encoded.
|
||||
*
|
||||
* Encodes an string using base64.
|
||||
*
|
||||
* Return value: the encoded string.
|
||||
**/
|
||||
gchar * gvn_encode (const gchar * string)
|
||||
{
|
||||
if (string)
|
||||
return g_base64_encode ((guchar *) string, strlen (string));
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_decode:
|
||||
* @string: the string to be decoded.
|
||||
*
|
||||
* Decodes an string using base64.
|
||||
*
|
||||
* Return value: the decoded string.
|
||||
**/
|
||||
gchar * gvn_decode (const gchar * string)
|
||||
{
|
||||
if (string)
|
||||
{
|
||||
gsize len;
|
||||
gchar * base64;
|
||||
gchar * str;
|
||||
|
||||
base64 = (gchar *) g_base64_decode (string, &len);
|
||||
str = g_new (gchar, len + 1);
|
||||
g_memmove (str, base64, len);
|
||||
str[len] = '\0';
|
||||
g_free (base64);
|
||||
|
||||
return str;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GVN_AUX_H
|
||||
#define GVN_AUX_H
|
||||
|
||||
#define GETTEXT_PACKAGE "hedera"
|
||||
#include <glib.h>
|
||||
#include <glib/gi18n-lib.h>
|
||||
|
||||
void gvn_key_file_save (GKeyFile * obj, const gchar * file);
|
||||
gchar * gvn_encode (const gchar * string);
|
||||
gchar * gvn_decode (const gchar * string);
|
||||
|
||||
extern const gchar * GVN_ABR_WDAY[];
|
||||
extern const gchar * GVN_ABR_MONTH[];
|
||||
|
||||
#endif
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "gvn-null.h"
|
||||
|
||||
/**
|
||||
* SECTION: gvn-null
|
||||
* @Short_description: a boxed type to represent a null-valued #GValue
|
||||
* @Title: GvnNull
|
||||
**/
|
||||
|
||||
static GvnNull * gvn_null_copy (GvnNull * obj)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void gvn_null_free (GvnNull * obj) {}
|
||||
|
||||
G_DEFINE_BOXED_TYPE (GvnNull, gvn_null, gvn_null_copy, gvn_null_free);
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GVN_NULL_H
|
||||
#define GVN_NULL_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
/**
|
||||
* GVN_TYPE_NULL:
|
||||
*
|
||||
* The #GType for a boxed type holding a #GvnNull.
|
||||
**/
|
||||
#define GVN_TYPE_NULL (gvn_null_get_type())
|
||||
|
||||
/**
|
||||
* GvnNull:
|
||||
*
|
||||
* Primary struct to handle the NULL type. This struct has no members.
|
||||
**/
|
||||
typedef struct _GvnNull GvnNull;
|
||||
|
||||
struct _GvnNull;
|
||||
|
||||
GType gvn_null_get_type ();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,325 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "gvn-param-spec.h"
|
||||
#include "gvn-misc.h"
|
||||
#include "gvn-value.h"
|
||||
|
||||
/**
|
||||
* SECTION: gvn-param-spec
|
||||
* @Short_description:
|
||||
* @Title: GvnParamSpec
|
||||
**/
|
||||
|
||||
/**
|
||||
* gvn_param_spec_new:
|
||||
*
|
||||
* Creates a new #GvnParamSpec.
|
||||
*
|
||||
* Return value: the new #GvnParamSpec
|
||||
**/
|
||||
GvnParamSpec * gvn_param_spec_new ()
|
||||
{
|
||||
return gvn_param_spec_new_with_attrs (G_TYPE_NONE, TRUE, TRUE, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_new_with_attrs:
|
||||
* @gtype: the #GType
|
||||
* @editable: a %gboolean indicating whether it will be editable
|
||||
* @null: a %gboolean indicating whether it can be null
|
||||
* @def: the default #GValue
|
||||
*
|
||||
* Creates a new #GvnParamSpec.
|
||||
*
|
||||
* Return value: the new #GvnParamSpec
|
||||
**/
|
||||
GvnParamSpec * gvn_param_spec_new_with_attrs (GType gtype,
|
||||
gboolean editable, gboolean null, const GValue * def)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_VALUE (def) || !def, NULL);
|
||||
|
||||
GvnParamSpec * obj = g_new (GvnParamSpec, 1);
|
||||
obj->gtype = gtype;
|
||||
obj->editable = editable;
|
||||
obj->null = null;
|
||||
obj->def = NULL;
|
||||
gvn_param_spec_set_default (obj, def);
|
||||
return obj;
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Public
|
||||
|
||||
/**
|
||||
* gvn_param_spec_get_gtype:
|
||||
* @obj: a #GvnParamSpec
|
||||
*
|
||||
* Gets the type of @obj.
|
||||
*
|
||||
* Return value: the type
|
||||
**/
|
||||
GType gvn_param_spec_get_gtype (const GvnParamSpec * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, G_TYPE_INVALID);
|
||||
|
||||
return obj->gtype;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_set_gtype:
|
||||
* @obj: a #GvnParamSpec
|
||||
* @gtype: the #GType
|
||||
**/
|
||||
void gvn_param_spec_set_gtype (GvnParamSpec * obj, GType gtype)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
g_return_if_fail (G_TYPE_IS_VALUE_TYPE (gtype) || gtype == G_TYPE_NONE);
|
||||
|
||||
obj->gtype = gtype;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_get_editable:
|
||||
* @obj: a #GvnParamSpec
|
||||
**/
|
||||
gboolean gvn_param_spec_get_editable (const GvnParamSpec * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, FALSE);
|
||||
|
||||
return obj->editable;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_set_editable:
|
||||
* @obj: a #GvnParamSpec
|
||||
* @editable: a %gboolean indicating whether it will be editable
|
||||
*
|
||||
* Sets if the value can be edited.
|
||||
**/
|
||||
void gvn_param_spec_set_editable (GvnParamSpec * obj, gboolean editable)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
|
||||
obj->editable = editable;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_get_null:
|
||||
* @obj: a #GvnParamSpec
|
||||
**/
|
||||
gboolean gvn_param_spec_get_null (const GvnParamSpec * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, FALSE);
|
||||
|
||||
return obj->null;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_set_null:
|
||||
* @obj: a #GvnParamSpec
|
||||
* @null: a %gboolean indicating whether it can be null
|
||||
*
|
||||
* Set if the value can be null.
|
||||
**/
|
||||
void gvn_param_spec_set_null (GvnParamSpec * obj, gboolean null)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
|
||||
obj->null = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_get_default:
|
||||
* @obj: a #GvnParamSpec
|
||||
*
|
||||
* Gets the default value.
|
||||
*
|
||||
* Return value: the #GValue or %NULL if it havent
|
||||
**/
|
||||
const GValue * gvn_param_spec_get_default (const GvnParamSpec * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
return obj->def;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_set_default:
|
||||
* @obj: a #GvnParamSpec
|
||||
* @def: the default #GValue
|
||||
*
|
||||
* Sets the default value.
|
||||
**/
|
||||
void gvn_param_spec_set_default (GvnParamSpec * obj, const GValue * def)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
g_return_if_fail (G_IS_VALUE (def) || !def);
|
||||
|
||||
if (obj->def)
|
||||
{
|
||||
g_value_unset (obj->def);
|
||||
g_free (obj->def);
|
||||
obj->def = NULL;
|
||||
}
|
||||
if (def)
|
||||
{
|
||||
GValue * value = g_new0 (GValue, 1);
|
||||
g_value_init (value, G_VALUE_TYPE (def));
|
||||
g_value_copy (def, value);
|
||||
obj->def = value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_merge:
|
||||
* @obj: a #GvnParamSpec
|
||||
* @merge: (allow-none): a #GvnParamSpec
|
||||
*
|
||||
* Merges the attributes of @merge into @obj remaining the most restrictive.
|
||||
**/
|
||||
void gvn_param_spec_merge (GvnParamSpec * obj, const GvnParamSpec * merge)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
|
||||
if (merge)
|
||||
{
|
||||
obj->editable = obj->editable && merge->editable;
|
||||
obj->null = obj->null && merge->null;
|
||||
|
||||
if (obj->gtype == G_TYPE_NONE)
|
||||
obj->gtype = merge->gtype;
|
||||
if (!obj->def && merge->def)
|
||||
gvn_param_spec_set_default (obj, merge->def);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_ccopy_value:
|
||||
* @obj: a #GvnParamSpec
|
||||
* @src: source value to be copied
|
||||
* @dst: destination for the copied value
|
||||
*
|
||||
* Return value: %TRUE if the value has been copied, %FALSE otherwise
|
||||
**/
|
||||
gboolean gvn_param_spec_ccopy_value (const GvnParamSpec * obj, const GValue * src, GValue * dst)
|
||||
{
|
||||
g_return_val_if_fail (obj, FALSE);
|
||||
g_return_val_if_fail (G_IS_VALUE (src), FALSE);
|
||||
g_return_val_if_fail (G_IS_VALUE (dst), FALSE);
|
||||
|
||||
if (!gvn_value_is_null (src)
|
||||
&& G_VALUE_TYPE (src) != obj->gtype
|
||||
&& obj->gtype != G_TYPE_NONE)
|
||||
{
|
||||
if (gvn_value_is_null (dst))
|
||||
{
|
||||
g_value_unset (dst);
|
||||
g_value_init (dst, obj->gtype);
|
||||
}
|
||||
|
||||
g_value_transform (src, dst);
|
||||
}
|
||||
else
|
||||
return gvn_value_ccopy (src, dst);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_validate:
|
||||
* @obj: #GvnParamSpec object where @GValue wants to be validated
|
||||
* @value: new value
|
||||
* @err: (out) (allow-none): the return location for an allocated @GError, or
|
||||
* %NULL to ignore errors.
|
||||
*
|
||||
* It checks if the value is valid to be saved into @obj
|
||||
*
|
||||
* Return value: gboolean
|
||||
**/
|
||||
gboolean gvn_param_spec_validate (const GvnParamSpec * obj, const GValue * value, GError ** err)
|
||||
{
|
||||
g_return_val_if_fail (obj, FALSE);
|
||||
|
||||
gboolean is_null = gvn_value_is_null (value);
|
||||
|
||||
if (!obj->editable)
|
||||
g_set_error (err
|
||||
,GVN_PARAM_SPEC_LOG_DOMAIN
|
||||
,GVN_PARAM_SPEC_ERROR_NOT_EDITABLE
|
||||
,_("Param not editable"));
|
||||
else if (is_null && !obj->null)
|
||||
g_set_error (err
|
||||
,GVN_PARAM_SPEC_LOG_DOMAIN
|
||||
,GVN_PARAM_SPEC_ERROR_NOT_NULL
|
||||
,_("Param can't be NULL"));
|
||||
else if (!is_null && obj->gtype != G_TYPE_NONE
|
||||
&& !g_value_type_transformable (obj->gtype, G_VALUE_TYPE (value)))
|
||||
g_set_error (err
|
||||
,GVN_PARAM_SPEC_LOG_DOMAIN
|
||||
,GVN_PARAM_SPEC_ERROR_WRONG_TYPE
|
||||
,_("Incompatible type for this param"));
|
||||
else
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_unset:
|
||||
* @obj: a #GvnParamSpec
|
||||
**/
|
||||
void gvn_param_spec_unset (GvnParamSpec * obj)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
|
||||
obj->null = TRUE;
|
||||
obj->editable = TRUE;
|
||||
obj->gtype = G_TYPE_NONE;
|
||||
gvn_param_spec_set_default (obj, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_copy:
|
||||
* @obj: a #GvnParamSpec
|
||||
*
|
||||
* Makes a copy of @obj with the same attributes.
|
||||
*
|
||||
* Return value: the new created #GvnParamSpec
|
||||
**/
|
||||
GvnParamSpec * gvn_param_spec_copy (const GvnParamSpec * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
return gvn_param_spec_new_with_attrs (obj->gtype,
|
||||
obj->editable, obj->null, obj->def);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_spec_free:
|
||||
* @obj: a #GvnParamSpec
|
||||
*
|
||||
* Frees the memory used by @obj
|
||||
**/
|
||||
void gvn_param_spec_free (GvnParamSpec * obj)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
|
||||
gvn_param_spec_set_default (obj, NULL);
|
||||
g_free (obj);
|
||||
}
|
||||
|
||||
G_DEFINE_BOXED_TYPE (GvnParamSpec, gvn_param_spec, gvn_param_spec_copy, gvn_param_spec_free);
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GVN_PARAM_SPEC_H
|
||||
#define GVN_PARAM_SPEC_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
#define GVN_PARAM_SPEC_LOG_DOMAIN (g_quark_from_string ("GvnParamSpec"))
|
||||
|
||||
/**
|
||||
* GVN_TYPE_PARAM_SPEC:
|
||||
*
|
||||
* The #GType for a boxed type holding a #GvnParamSpec.
|
||||
**/
|
||||
#define GVN_TYPE_PARAM_SPEC (gvn_param_spec_get_type ())
|
||||
|
||||
typedef struct _GvnParamSpec GvnParamSpec;
|
||||
|
||||
/**
|
||||
* GvnParamSpec:
|
||||
* @gtype: Type of the param
|
||||
* @editable: %TRUE if value is editable
|
||||
* @null: %TRUE if value can be of type %GVN_TYPE_NULL
|
||||
* @def: Default value
|
||||
**/
|
||||
struct _GvnParamSpec
|
||||
{
|
||||
GType gtype;
|
||||
gboolean editable;
|
||||
gboolean null;
|
||||
GValue * def;
|
||||
};
|
||||
|
||||
/**
|
||||
* GvnParamError:
|
||||
* @GVN_PARAM_SPEC_ERROR_NOT_EDITABLE: The value can not be edited
|
||||
* @GVN_PARAM_SPEC_ERROR_NOT_NULL: The value can not be NULL
|
||||
* @GVN_PARAM_SPEC_ERROR_WRONG_TYPE: The value have a wrong type
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
GVN_PARAM_SPEC_ERROR_NOT_EDITABLE = 1
|
||||
,GVN_PARAM_SPEC_ERROR_NOT_NULL
|
||||
,GVN_PARAM_SPEC_ERROR_WRONG_TYPE
|
||||
}
|
||||
GvnParamError;
|
||||
|
||||
GType gvn_param_spec_get_type ();
|
||||
GvnParamSpec * gvn_param_spec_new ();
|
||||
GvnParamSpec * gvn_param_spec_new_with_attrs (GType gtype, gboolean editable, gboolean null, const GValue * def);
|
||||
GType gvn_param_spec_get_gtype (const GvnParamSpec * obj);
|
||||
void gvn_param_spec_set_gtype (GvnParamSpec * obj, GType gtype);
|
||||
gboolean gvn_param_spec_get_editable (const GvnParamSpec * obj);
|
||||
void gvn_param_spec_set_editable (GvnParamSpec * obj, gboolean editable);
|
||||
gboolean gvn_param_spec_get_null (const GvnParamSpec * obj);
|
||||
void gvn_param_spec_set_null (GvnParamSpec * obj, gboolean null);
|
||||
const GValue * gvn_param_spec_get_default (const GvnParamSpec * obj);
|
||||
void gvn_param_spec_set_default (GvnParamSpec * obj, const GValue * def);
|
||||
void gvn_param_spec_merge (GvnParamSpec * obj, const GvnParamSpec * merge);
|
||||
gboolean gvn_param_spec_ccopy_value (const GvnParamSpec * obj, const GValue * src, GValue * dst);
|
||||
gboolean gvn_param_spec_validate (const GvnParamSpec * obj, const GValue * value, GError ** err);
|
||||
void gvn_param_spec_unset (GvnParamSpec * obj);
|
||||
GvnParamSpec * gvn_param_spec_copy (const GvnParamSpec * obj);
|
||||
void gvn_param_spec_free (GvnParamSpec * obj);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,504 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "gvn-misc.h"
|
||||
#include "gvn-param.h"
|
||||
#include "gvn-value.h"
|
||||
|
||||
/**
|
||||
* SECTION: gvn-param
|
||||
* @Short_description:
|
||||
* @Title: GvnParam
|
||||
**/
|
||||
G_DEFINE_TYPE (GvnParam, gvn_param, G_TYPE_INITIALLY_UNOWNED);
|
||||
|
||||
enum {
|
||||
VALUE_CHANGED
|
||||
,SPEC_CHANGED
|
||||
,STATUS_CHANGED
|
||||
,LAST_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_SIGNAL] = {0};
|
||||
|
||||
/**
|
||||
* gvn_param_new:
|
||||
*
|
||||
* Creates a new #GvnParam.
|
||||
*
|
||||
* Return value: the new #GvnParam
|
||||
**/
|
||||
GvnParam * gvn_param_new ()
|
||||
{
|
||||
return g_object_new (GVN_TYPE_PARAM, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_new_with_spec:
|
||||
* @spec: the spec of param.
|
||||
*
|
||||
* Creates a new #GvnParam.
|
||||
*
|
||||
* Return value: the new #GvnParam
|
||||
**/
|
||||
GvnParam * gvn_param_new_with_spec (const GvnParamSpec * spec)
|
||||
{
|
||||
return g_object_new (GVN_TYPE_PARAM, "spec", spec, NULL);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
|
||||
|
||||
static void gvn_param_set_status (GvnParam * obj, GvnParamStatus status)
|
||||
{
|
||||
obj->status = status;
|
||||
g_signal_emit (obj, signals[STATUS_CHANGED], 0, status);
|
||||
}
|
||||
|
||||
static void gvn_param_set_error (GvnParam * obj, GError * error)
|
||||
{
|
||||
g_clear_error (&obj->error);
|
||||
obj->error = error;
|
||||
gvn_param_set_status (obj, GVN_PARAM_STATUS_ERROR);
|
||||
}
|
||||
|
||||
static void gvn_param_set_spec (GvnParam * obj, const GvnParamSpec * spec)
|
||||
{
|
||||
GSList * n;
|
||||
|
||||
if (obj->mode == GVN_PARAM_MASTER)
|
||||
for (n = obj->slaves; n; n = n->next)
|
||||
gvn_param_spec_merge (GVN_PARAM (n->data)->spec, spec);
|
||||
|
||||
gvn_param_spec_unset (obj->spec);
|
||||
gvn_param_spec_merge (obj->spec, spec);
|
||||
g_signal_emit (obj, signals[SPEC_CHANGED], 0);
|
||||
}
|
||||
|
||||
static void gvn_param_put_value (GvnParam * obj, const GValue * value)
|
||||
{
|
||||
if (gvn_param_spec_ccopy_value (obj->spec, value, obj->value))
|
||||
{
|
||||
GError * tmp_err = NULL;
|
||||
|
||||
if (obj->mode == GVN_PARAM_SLAVE)
|
||||
{
|
||||
if (!gvn_param_set_value (obj->master, obj->value, &tmp_err))
|
||||
gvn_param_set_error (obj, tmp_err);
|
||||
}
|
||||
else if (obj->mode == GVN_PARAM_MASTER)
|
||||
{
|
||||
GSList * n;
|
||||
|
||||
for (n = obj->slaves; n; n = n->next)
|
||||
if (!gvn_param_set_value (n->data, obj->value, &tmp_err))
|
||||
gvn_param_set_error (n->data, tmp_err);
|
||||
}
|
||||
|
||||
gvn_param_value_changed (obj);
|
||||
}
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Public
|
||||
|
||||
/**
|
||||
* gvn_param_get_value:
|
||||
* @param: a #GvnParam where be took the value
|
||||
*
|
||||
* Gets the value of param.
|
||||
*
|
||||
* Return value: (transfer none): the #GValue
|
||||
**/
|
||||
const GValue * gvn_param_get_value (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), NULL);
|
||||
return obj->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_set_value:
|
||||
* @param: #GvnParam object where @value wants to be validated.
|
||||
* @value: new value.
|
||||
* @err: (out) (allow-none): the return location for an allocated @GError, or
|
||||
* NULL to ignore errors.
|
||||
*
|
||||
* Sets @value into @param.
|
||||
*
|
||||
* Return value: %TRUE if assigment is valid, %FALSE otherwise.
|
||||
**/
|
||||
gboolean gvn_param_set_value (GvnParam * obj, const GValue * value, GError ** err)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), FALSE);
|
||||
g_return_val_if_fail (G_IS_VALUE (value), FALSE);
|
||||
|
||||
if (gvn_param_spec_validate (obj->spec, value, err))
|
||||
{
|
||||
gvn_param_put_value (obj, value);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_get_spec:
|
||||
* @param: #GvnParam object
|
||||
*
|
||||
* Gets the #GvnParamSpec of @obj
|
||||
*
|
||||
* Return value: (transfer none): the #GvnParamSpec
|
||||
**/
|
||||
const GvnParamSpec * gvn_param_get_spec (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), NULL);
|
||||
|
||||
return obj->spec;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_get_master:
|
||||
* @sparam: a #GvnParam where be took the value
|
||||
*
|
||||
* Gets the master param of @obj
|
||||
*
|
||||
* Return value: (transfer none): the master #GvnParam or %NULL if it haven't.
|
||||
**/
|
||||
GvnParam * gvn_param_get_master (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), NULL);
|
||||
|
||||
return obj->master;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_bind:
|
||||
* @src: #GvnParam object
|
||||
* @dst: #GvnParam master
|
||||
*
|
||||
* Sets @dst as a master of @src
|
||||
**/
|
||||
void gvn_param_set_master (GvnParam * obj, GvnParam * master)
|
||||
{
|
||||
g_return_if_fail (GVN_IS_PARAM (obj));
|
||||
g_return_if_fail (GVN_IS_PARAM (master) || !master);
|
||||
g_return_if_fail (obj->mode != GVN_PARAM_MASTER);
|
||||
g_return_if_fail (obj->mode != GVN_PARAM_SLAVE || !master);
|
||||
g_return_if_fail (!master || master->mode != GVN_PARAM_SLAVE);
|
||||
|
||||
if (master)
|
||||
{
|
||||
obj->master = g_object_ref_sink (master);
|
||||
obj->mode = GVN_PARAM_SLAVE;
|
||||
|
||||
master->slaves = g_slist_prepend (master->slaves, obj);
|
||||
master->mode = GVN_PARAM_MASTER;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (obj->mode == GVN_PARAM_SLAVE)
|
||||
{
|
||||
GSList ** slaves = &obj->master->slaves;
|
||||
|
||||
if (!(*slaves = g_slist_remove (*slaves, obj)))
|
||||
master->mode = GVN_PARAM_FREE;
|
||||
}
|
||||
|
||||
g_clear_object (&obj->master);
|
||||
obj->mode = GVN_PARAM_FREE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_get_status:
|
||||
* @obj: #GvnParam object
|
||||
*
|
||||
* Gets the status of @obj
|
||||
*
|
||||
* Return value: the current status of the param.
|
||||
**/
|
||||
GvnParamStatus gvn_param_get_status (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), GVN_PARAM_STATUS_OK);
|
||||
|
||||
return obj->status;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_get_error:
|
||||
* @obj: #GvnParam object
|
||||
*
|
||||
* Gets the error of @obj
|
||||
*
|
||||
* Return value: the current error of the param.
|
||||
**/
|
||||
const GError * gvn_param_get_error (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), NULL);
|
||||
|
||||
return obj->error;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_get_null:
|
||||
* @param: the #GvnParam
|
||||
**/
|
||||
gboolean gvn_param_get_null (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), FALSE);
|
||||
|
||||
return gvn_param_spec_get_null (obj->spec);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_get_editable:
|
||||
* @param: the #GvnParam
|
||||
**/
|
||||
gboolean gvn_param_get_editable (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), FALSE);
|
||||
|
||||
return gvn_param_spec_get_editable (obj->spec);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_get_default:
|
||||
* @obj: the #GvnParam
|
||||
**/
|
||||
const GValue * gvn_param_get_default (GvnParam * obj)
|
||||
{
|
||||
g_return_val_if_fail (GVN_IS_PARAM (obj), NULL);
|
||||
|
||||
return gvn_param_spec_get_default (obj->spec);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_set_to_default:
|
||||
* @obj: the #GvnParam
|
||||
**/
|
||||
void gvn_param_set_to_default (GvnParam * obj)
|
||||
{
|
||||
g_return_if_fail (GVN_IS_PARAM (obj));
|
||||
|
||||
gvn_param_set_value (obj,
|
||||
gvn_param_spec_get_default (obj->spec), NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_param_value_changed:
|
||||
* @obj: a #GvnParam
|
||||
*
|
||||
* Emits the "value-changed" signal for that param.
|
||||
**/
|
||||
void gvn_param_value_changed (GvnParam * obj)
|
||||
{
|
||||
g_signal_emit (obj, signals[VALUE_CHANGED], 0, obj->value);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Properties
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_VALUE = 1
|
||||
,PROP_MASTER
|
||||
,PROP_MODE
|
||||
,PROP_STATUS
|
||||
,PROP_SPEC
|
||||
,PROP_GTYPE
|
||||
,PROP_EDITABLE
|
||||
,PROP_NULL
|
||||
,PROP_DEFAULT
|
||||
};
|
||||
|
||||
static void gvn_param_set_property (GvnParam * obj, guint property_id,
|
||||
const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_VALUE:
|
||||
gvn_param_set_value (obj, g_value_get_boxed (value), NULL);
|
||||
break;
|
||||
case PROP_MASTER:
|
||||
gvn_param_set_master (obj, g_value_get_object (value));
|
||||
break;
|
||||
case PROP_SPEC:
|
||||
gvn_param_spec_merge (obj->spec, g_value_get_boxed (value));
|
||||
break;
|
||||
case PROP_GTYPE:
|
||||
gvn_param_spec_set_gtype (obj->spec, g_value_get_gtype (value));
|
||||
break;
|
||||
case PROP_EDITABLE:
|
||||
gvn_param_spec_set_editable (obj->spec, g_value_get_boolean (value));
|
||||
break;
|
||||
case PROP_NULL:
|
||||
gvn_param_spec_set_null (obj->spec, g_value_get_boolean (value));
|
||||
break;
|
||||
case PROP_DEFAULT:
|
||||
gvn_param_spec_set_default (obj->spec, g_value_get_boxed (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void gvn_param_get_property (GvnParam * obj, guint property_id,
|
||||
GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_VALUE:
|
||||
g_value_set_boxed (value, obj->value);
|
||||
break;
|
||||
case PROP_MASTER:
|
||||
g_value_set_object (value, obj->master);
|
||||
break;
|
||||
case PROP_MODE:
|
||||
g_value_set_int (value, obj->mode);
|
||||
break;
|
||||
case PROP_STATUS:
|
||||
g_value_set_boolean (value, obj->status);
|
||||
break;
|
||||
case PROP_SPEC:
|
||||
g_value_set_boxed (value, obj->spec);
|
||||
break;
|
||||
case PROP_GTYPE:
|
||||
g_value_set_gtype (value, gvn_param_spec_get_gtype (obj->spec));
|
||||
break;
|
||||
case PROP_EDITABLE:
|
||||
g_value_set_boolean (value, gvn_param_spec_get_editable (obj->spec));
|
||||
break;
|
||||
case PROP_NULL:
|
||||
g_value_set_boolean (value, gvn_param_spec_get_null (obj->spec));
|
||||
break;
|
||||
case PROP_DEFAULT:
|
||||
g_value_set_boxed (value, gvn_param_spec_get_default (obj->spec));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
|
||||
}
|
||||
}
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Class
|
||||
|
||||
static void gvn_param_init (GvnParam * obj)
|
||||
{
|
||||
obj->error = NULL;
|
||||
obj->master = NULL;
|
||||
obj->slaves = NULL;
|
||||
obj->mode = GVN_PARAM_FREE;
|
||||
obj->status = GVN_PARAM_STATUS_OK;
|
||||
obj->spec = gvn_param_spec_new ();
|
||||
|
||||
obj->value = g_new0 (GValue, 1);
|
||||
g_value_init (obj->value, GVN_TYPE_NULL);
|
||||
}
|
||||
|
||||
static void gvn_param_finalize (GvnParam * obj)
|
||||
{
|
||||
gvn_param_set_master (obj, NULL);
|
||||
gvn_param_spec_free (obj->spec);
|
||||
g_clear_error (&obj->error);
|
||||
g_value_unset (obj->value);
|
||||
g_free (obj->value);
|
||||
G_OBJECT_CLASS (gvn_param_parent_class)->finalize (G_OBJECT (obj));
|
||||
}
|
||||
|
||||
static void gvn_param_class_init (GvnParamClass * klass)
|
||||
{
|
||||
GObjectClass * k = G_OBJECT_CLASS (klass);
|
||||
k->finalize = (GObjectFinalizeFunc) gvn_param_finalize;
|
||||
k->set_property = (GObjectSetPropertyFunc) gvn_param_set_property;
|
||||
k->get_property = (GObjectGetPropertyFunc) gvn_param_get_property;
|
||||
klass->put_value = gvn_param_put_value;
|
||||
klass->set_spec = gvn_param_set_spec;
|
||||
klass->set_status = gvn_param_set_status;
|
||||
klass->set_error = gvn_param_set_error;
|
||||
|
||||
signals[VALUE_CHANGED] = g_signal_new ("value-changed",
|
||||
GVN_TYPE_PARAM, G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
|
||||
g_cclosure_marshal_VOID__BOXED, G_TYPE_NONE, 1, G_TYPE_VALUE
|
||||
);
|
||||
signals[SPEC_CHANGED] = g_signal_new ("spec-changed",
|
||||
GVN_TYPE_PARAM, G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0
|
||||
);
|
||||
signals[STATUS_CHANGED] = g_signal_new ("status-changed",
|
||||
GVN_TYPE_PARAM, G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
|
||||
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0
|
||||
);
|
||||
|
||||
g_object_class_install_property (k, PROP_VALUE,
|
||||
g_param_spec_boxed ("value"
|
||||
,_("Value")
|
||||
,_("The value of the param")
|
||||
,G_TYPE_VALUE
|
||||
,G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_MASTER,
|
||||
g_param_spec_object ("master"
|
||||
,_("Master")
|
||||
,_("The master GvnParam of this parameter")
|
||||
,GVN_TYPE_PARAM
|
||||
,G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_MODE,
|
||||
g_param_spec_uint ("mode"
|
||||
,_("Mode")
|
||||
,_("The mode of the parameter")
|
||||
,0 ,256 ,GVN_PARAM_FREE
|
||||
,G_PARAM_READABLE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_STATUS,
|
||||
g_param_spec_uint ("status"
|
||||
,_("Status")
|
||||
,_("The current status of the parameter")
|
||||
,0 ,256 ,GVN_PARAM_STATUS_OK
|
||||
,G_PARAM_READABLE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_SPEC,
|
||||
g_param_spec_boxed ("spec"
|
||||
,_("Spec")
|
||||
,_("The spec of the parameter")
|
||||
,GVN_TYPE_PARAM_SPEC
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_GTYPE,
|
||||
g_param_spec_gtype ("gtype"
|
||||
,_("Glib Type")
|
||||
,_("The type of the value")
|
||||
,G_TYPE_NONE
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_EDITABLE,
|
||||
g_param_spec_boolean ("editable"
|
||||
,_("Editable")
|
||||
,_("Whether the param value can be modified")
|
||||
,TRUE
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_NULL,
|
||||
g_param_spec_boolean ("null"
|
||||
,_("Null")
|
||||
,_("Whether the param value can be of type GVN_TYPE_NULL")
|
||||
,TRUE
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
g_object_class_install_property (k, PROP_DEFAULT,
|
||||
g_param_spec_boxed ("default"
|
||||
,_("Default Value")
|
||||
,_("The default value")
|
||||
,G_TYPE_VALUE
|
||||
,G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE
|
||||
));
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GVN_PARAM_H
|
||||
#define GVN_PARAM_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "gvn-param-spec.h"
|
||||
|
||||
#define GVN_PARAM_LOG_DOMAIN (g_quark_from_string ("GvnParam"))
|
||||
|
||||
#define GVN_TYPE_PARAM (gvn_param_get_type ())
|
||||
#define GVN_PARAM(obj) (G_TYPE_CHECK_INSTANCE_CAST (obj, GVN_TYPE_PARAM, GvnParam))
|
||||
#define GVN_IS_PARAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE (obj, GVN_TYPE_PARAM))
|
||||
#define GVN_PARAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS (obj, GVN_TYPE_PARAM, GvnParamClass))
|
||||
|
||||
typedef struct _GvnParam GvnParam;
|
||||
typedef struct _GvnParamClass GvnParamClass;
|
||||
|
||||
/**
|
||||
* GvnParamMode:
|
||||
* @GVN_PARAM_FREE: It is not set.
|
||||
* @GVN_PARAM_SLAVE: It is set as slave.
|
||||
* @GVN_PARAM_MASTER: It is set as master.
|
||||
*
|
||||
* The mode in which is Binded.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
GVN_PARAM_FREE
|
||||
,GVN_PARAM_SLAVE
|
||||
,GVN_PARAM_MASTER
|
||||
}
|
||||
GvnParamMode;
|
||||
|
||||
/**
|
||||
* GvnParamStatus:
|
||||
* @GVN_PARAM_STATUS_OK: The parameter is ready.
|
||||
* @GVN_PARAM_STATUS_BUSY: The parameter is busy.
|
||||
* @GVN_PARAM_STATUS_ERROR: The parameter value is incompatible to its spec.
|
||||
*
|
||||
* The status of the param.
|
||||
**/
|
||||
typedef enum
|
||||
{
|
||||
GVN_PARAM_STATUS_OK
|
||||
,GVN_PARAM_STATUS_BUSY
|
||||
,GVN_PARAM_STATUS_ERROR
|
||||
}
|
||||
GvnParamStatus;
|
||||
|
||||
/**
|
||||
* GvnParam:
|
||||
* @slaves: (element-type Gvn.Param):
|
||||
**/
|
||||
struct _GvnParam
|
||||
{
|
||||
GInitiallyUnowned parent;
|
||||
GValue * value;
|
||||
GError * error;
|
||||
GvnParamStatus status;
|
||||
GvnParamSpec * spec;
|
||||
GvnParamMode mode;
|
||||
GvnParam * master;
|
||||
GSList * slaves;
|
||||
};
|
||||
|
||||
struct _GvnParamClass
|
||||
{
|
||||
/* <private> */
|
||||
GInitiallyUnownedClass parent;
|
||||
void (* put_value) (GvnParam * obj, const GValue * value);
|
||||
void (* set_spec) (GvnParam * obj, const GvnParamSpec * spec);
|
||||
void (* set_status) (GvnParam * obj, GvnParamStatus status);
|
||||
void (* set_error) (GvnParam * obj, GError * error);
|
||||
};
|
||||
|
||||
GType gvn_param_get_type ();
|
||||
GvnParam * gvn_param_new ();
|
||||
GvnParam * gvn_param_new_with_spec (const GvnParamSpec * spec);
|
||||
const GValue * gvn_param_get_value (GvnParam * param);
|
||||
gboolean gvn_param_set_value (GvnParam * param, const GValue * value, GError ** err);
|
||||
const GvnParamSpec * gvn_param_get_spec (GvnParam * param);
|
||||
GType gvn_param_get_gtype (GvnParam * param);
|
||||
gboolean gvn_param_get_null (GvnParam * param);
|
||||
gboolean gvn_param_get_editable (GvnParam * param);
|
||||
const GValue * gvn_param_get_default (GvnParam * obj);
|
||||
void gvn_param_set_to_default (GvnParam * obj);
|
||||
GvnParam * gvn_param_get_master (GvnParam * sparam);
|
||||
void gvn_param_set_master (GvnParam * sparam, GvnParam * dparam);
|
||||
void gvn_param_value_changed (GvnParam * obj);
|
||||
GvnParamStatus gvn_param_get_status (GvnParam * obj);
|
||||
const GError * gvn_param_get_error (GvnParam * obj);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "gvn-time.h"
|
||||
|
||||
/**
|
||||
* SECTION: gvn-time
|
||||
* @Short_description: a boxed type to represent time with optional time-zone
|
||||
* @Title: GvnTime
|
||||
*
|
||||
* #GvnTime is a boxed type to manage time of a day without specifying the date,
|
||||
* just hours, minutes, seconds and the time-zone.
|
||||
**/
|
||||
G_DEFINE_BOXED_TYPE (GvnTime, gvn_time, gvn_time_copy, gvn_time_free);
|
||||
|
||||
/**
|
||||
* gvn_time_copy:
|
||||
* @obj: a #GvnTime
|
||||
*
|
||||
* Copies @obj to a new #GvnTime.
|
||||
*
|
||||
* Return value: a new #GvnTime
|
||||
**/
|
||||
GvnTime * gvn_time_copy (GvnTime * obj)
|
||||
{
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
|
||||
return gvn_time_new (obj->hour, obj->min, obj->sec, obj->tz);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_time_free:
|
||||
* @obj: a #GvnTime
|
||||
*
|
||||
* Releases the memory used by @obj.
|
||||
**/
|
||||
void gvn_time_free (GvnTime * obj)
|
||||
{
|
||||
g_return_if_fail (obj);
|
||||
g_free (obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_time_new:
|
||||
* @h: the hour, from 0 to 23
|
||||
* @m: the minutes, from 0 to 59
|
||||
* @s: the seconds, from 0 to 59
|
||||
* @tz: the time-zone, from -12 to 12
|
||||
*
|
||||
* Creates a new #GvnTime with the given parameters, if any parameter is out of
|
||||
* range, that parameter will be put to 0 instead.
|
||||
**/
|
||||
GvnTime * gvn_time_new (guint h, guint m, guint s, gint tz)
|
||||
{
|
||||
GvnTime * time = g_new (GvnTime, 1);
|
||||
time->hour = h > 24 ? 0 : h;
|
||||
time->min = m > 59 ? 0 : m;
|
||||
time->sec = s > 59 ? 0 : s;
|
||||
time->tz = tz < -12 || tz > 12 ? 0 : tz;
|
||||
|
||||
return time;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_time_to_string:
|
||||
* @obj: a #GvnTime
|
||||
* @tz: whether or not the time-zone will be used
|
||||
*
|
||||
* Returns a newly allocated string containing the time set by @obj. By passing
|
||||
* %FALSE in @tz, the time-zone is omited from the string. The format is
|
||||
* hh:mm:ss±tz if @tz is %TRUE and hh:mm:ss otherwise. The string must be freed.
|
||||
*
|
||||
* Return value: a string containing the time
|
||||
**/
|
||||
gchar * gvn_time_to_string (GvnTime * obj, gboolean tz)
|
||||
{
|
||||
g_return_val_if_fail (obj, NULL);
|
||||
if (tz)
|
||||
return g_strdup_printf ("%d:%d:%d%s%d", obj->hour, obj->min, obj->sec,
|
||||
obj->tz > 0 ? "+" : "-", obj->tz < 0 ? obj->tz * -1 : obj->tz);
|
||||
else
|
||||
return g_strdup_printf ("%d:%d:%d", obj->hour, obj->min, obj->sec);
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GVN_TIME_H
|
||||
#define GVN_TIME_H
|
||||
|
||||
#include <glib-object.h>
|
||||
|
||||
/**
|
||||
* GVN_TYPE_TIME:
|
||||
*
|
||||
* The #GType for a boxed type holding a #GvnTime.
|
||||
**/
|
||||
#define GVN_TYPE_TIME (gvn_time_get_type())
|
||||
|
||||
/**
|
||||
* GvnTime:
|
||||
* @hour: the hour, from 0 to 23
|
||||
* @min: the minutes, from 0 to 59
|
||||
* @sec: the seconds, from 0 to 59
|
||||
* @tz: the time-zone, from -12 to 12
|
||||
*
|
||||
* Primary struct to handle the TIME type.
|
||||
**/
|
||||
typedef struct _GvnTime GvnTime;
|
||||
|
||||
struct _GvnTime
|
||||
{
|
||||
guint hour;
|
||||
guint min;
|
||||
guint sec;
|
||||
gint tz;
|
||||
};
|
||||
|
||||
GType gvn_time_get_type ();
|
||||
|
||||
GvnTime * gvn_time_copy (GvnTime * obj);
|
||||
void gvn_time_free (GvnTime * obj);
|
||||
GvnTime * gvn_time_new (guint h, guint m, guint s, gint tz);
|
||||
gchar * gvn_time_to_string (GvnTime * obj, gboolean tz);
|
||||
|
||||
#endif
|
|
@ -0,0 +1,575 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include "gvn-value.h"
|
||||
#include "gvn-misc.h"
|
||||
|
||||
/**
|
||||
* SECTION: gvn-value
|
||||
* @Short_description: additional value manipulation functions
|
||||
* @Title: GvnValue
|
||||
* @See_also: #DbForm, #DbConn
|
||||
*
|
||||
* This functions are intended to expand or ease the use of the original GObject
|
||||
* library #GValue utilites.
|
||||
**/
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Private
|
||||
|
||||
static void gvn_value_new_from_string_real (GValue * value, GType type, const gchar * string, gsize len)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case G_TYPE_BOOLEAN:
|
||||
g_value_set_boolean (value, atoi (string));
|
||||
break;
|
||||
case G_TYPE_CHAR:
|
||||
g_value_set_schar (value, atoi (string));
|
||||
break;
|
||||
case G_TYPE_INT:
|
||||
g_value_set_int (value, atoi (string));
|
||||
break;
|
||||
case G_TYPE_UINT:
|
||||
g_value_set_int (value, (guint) atoi (string));
|
||||
break;
|
||||
case G_TYPE_LONG:
|
||||
g_value_set_long (value, g_ascii_strtoll (string, NULL, 0));
|
||||
break;
|
||||
case G_TYPE_ULONG:
|
||||
g_value_set_ulong (value, g_ascii_strtoull (string, NULL, 0));
|
||||
break;
|
||||
case G_TYPE_FLOAT:
|
||||
g_value_set_float (value, atof (string));
|
||||
break;
|
||||
case G_TYPE_DOUBLE:
|
||||
g_value_set_double (value, g_ascii_strtod (string, NULL));
|
||||
break;
|
||||
case G_TYPE_STRING:
|
||||
g_value_set_string (value, string);
|
||||
break;
|
||||
default:
|
||||
{
|
||||
if (len == -1)
|
||||
len = strlen (string);
|
||||
|
||||
if (type == G_TYPE_DATE)
|
||||
{
|
||||
if (len >= 10)
|
||||
{
|
||||
GDate * date = g_date_new_dmy (
|
||||
atoi (string + 8)
|
||||
,atoi (string + 5)
|
||||
,atoi (string)
|
||||
);
|
||||
g_value_take_boxed (value, date);
|
||||
}
|
||||
else
|
||||
g_warning ("Gvn: Can't transform string to GDate");
|
||||
}
|
||||
else if (type == G_TYPE_DATE_TIME)
|
||||
{
|
||||
if (len >= 19)
|
||||
{
|
||||
GDateTime * date_time = g_date_time_new_local (
|
||||
atoi (string)
|
||||
,atoi (string + 5)
|
||||
,atoi (string + 8)
|
||||
,atoi (string + 11)
|
||||
,atoi (string + 14)
|
||||
,atoi (string + 17)
|
||||
);
|
||||
g_value_take_boxed (value, date_time);
|
||||
}
|
||||
else
|
||||
g_warning ("Gvn: Can't transform string to GDateTime");
|
||||
}
|
||||
else if (type == G_TYPE_BYTES)
|
||||
{
|
||||
if (len > 0)
|
||||
g_value_take_boxed (value, g_bytes_new (string, len));
|
||||
else
|
||||
g_warning ("Gvn: Can't transform string to GBytes");
|
||||
}
|
||||
else if (type != GVN_TYPE_NULL)
|
||||
g_return_if_reached ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void gvn_value_transform_string_to_any (const GValue * src, GValue * dst)
|
||||
{
|
||||
gvn_value_new_from_string_real (dst,
|
||||
G_VALUE_TYPE (dst), g_value_get_string (src), -1);
|
||||
}
|
||||
|
||||
static void gvn_value_transform_null_to_any (const GValue * src, GValue * dst) {}
|
||||
|
||||
static void gvn_value_transform_any_to_null (const GValue * src, GValue * dst)
|
||||
{
|
||||
gvn_value_set_null (dst);
|
||||
}
|
||||
|
||||
static void gvn_value_transform_date_to_string (const GValue * src, GValue * dst)
|
||||
{
|
||||
GDate * date = g_value_get_boxed (src);
|
||||
|
||||
if (date)
|
||||
{
|
||||
g_value_take_string (dst, g_strdup_printf ("%04u-%02u-%02u"
|
||||
,g_date_get_year (date)
|
||||
,g_date_get_month (date)
|
||||
,g_date_get_day (date)
|
||||
));
|
||||
}
|
||||
else
|
||||
g_value_take_string (dst, NULL);
|
||||
}
|
||||
|
||||
static void gvn_value_transform_date_time_to_string (const GValue * src, GValue * dst)
|
||||
{
|
||||
gpointer date = g_value_get_boxed (src);
|
||||
|
||||
if (date)
|
||||
g_value_take_string (dst, g_date_time_format (date, "%Y-%m-%d %T"));
|
||||
else
|
||||
g_value_take_string (dst, NULL);
|
||||
}
|
||||
|
||||
static void gvn_value_transform_date_time_to_date (const GValue * src, GValue * dst)
|
||||
{
|
||||
GDateTime * date_time = g_value_get_boxed (src);
|
||||
|
||||
if (date_time)
|
||||
{
|
||||
GDate * date = g_date_new_dmy (
|
||||
g_date_time_get_day_of_month (date_time)
|
||||
,g_date_time_get_month (date_time)
|
||||
,g_date_time_get_year (date_time)
|
||||
);
|
||||
g_value_take_boxed (dst, date);
|
||||
}
|
||||
else
|
||||
g_value_take_boxed (dst, NULL);
|
||||
}
|
||||
|
||||
static void gvn_value_transform_date_to_date_time (const GValue * src, GValue * dst)
|
||||
{
|
||||
GDate * date = g_value_get_boxed (src);
|
||||
|
||||
if (date)
|
||||
{
|
||||
GDateTime * date_time = g_date_time_new_utc (
|
||||
g_date_get_year (date)
|
||||
,g_date_get_month (date)
|
||||
,g_date_get_day (date)
|
||||
,0
|
||||
,0
|
||||
,0.0
|
||||
);
|
||||
g_value_take_boxed (dst, date_time);
|
||||
}
|
||||
else
|
||||
g_value_take_boxed (dst, NULL);
|
||||
}
|
||||
|
||||
//+++++++++++++++++++++++++++++++++++++++++++++++++++ Public
|
||||
|
||||
/**
|
||||
* gvn_value_new:
|
||||
* @type: the type of new #GValue
|
||||
*
|
||||
* Creates a new #GValue
|
||||
*
|
||||
* Return value: a #GValue.
|
||||
**/
|
||||
GValue * gvn_value_new (GType type)
|
||||
{
|
||||
GValue * value = g_new0 (GValue, 1);
|
||||
return g_value_init (value, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_is_null:
|
||||
* @value: the value to be checked
|
||||
*
|
||||
* Checks if a @value is of type GVN_TYPE_NULL
|
||||
*
|
||||
* Return value: %TRUE if its NULL, %FALSE otherwise.
|
||||
**/
|
||||
|
||||
/**
|
||||
* gvn_value_set_null:
|
||||
* @value: the value to be nulled
|
||||
*
|
||||
* Checks if a @value is of type GVN_TYPE_NULL, if not, sets it.
|
||||
**/
|
||||
void gvn_value_set_null (GValue * value)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE (value));
|
||||
|
||||
if (!gvn_value_is_null (value))
|
||||
{
|
||||
g_value_unset (value);
|
||||
g_value_init (value, GVN_TYPE_NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_new_from_string:
|
||||
* @value: an uninitilized #GValue
|
||||
* @string: a string to be converted
|
||||
* @length: length of @string or -1 if its null terminated
|
||||
* @type: the type to be converted
|
||||
*
|
||||
* Creates a new @value from a string
|
||||
**/
|
||||
void gvn_value_new_from_string (GValue * value, GType type, const gchar * string, gsize len)
|
||||
{
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
g_value_init (value, type);
|
||||
gvn_value_new_from_string_real (value, type, string, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_new_valist:
|
||||
* @value: an uninitilized #GValue
|
||||
* @type: the type of value
|
||||
* @content: a pointer to the value content
|
||||
*
|
||||
* Initializes the @value with the specified type and content.
|
||||
**/
|
||||
void gvn_value_new_with_content (GValue * value, GType type, gpointer content)
|
||||
{
|
||||
g_value_init (value, type);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case G_TYPE_BOOLEAN:
|
||||
g_value_set_boolean (value, *((gboolean *) content));
|
||||
break;
|
||||
case G_TYPE_CHAR:
|
||||
g_value_set_schar (value, *((gint8 *) content));
|
||||
break;
|
||||
case G_TYPE_INT:
|
||||
g_value_set_int (value, *((gint *) content));
|
||||
break;
|
||||
case G_TYPE_UINT:
|
||||
g_value_set_uint (value, *((guint *) content));
|
||||
break;
|
||||
case G_TYPE_LONG:
|
||||
g_value_set_long (value, *((glong *) content));
|
||||
break;
|
||||
case G_TYPE_ULONG:
|
||||
g_value_set_ulong (value, *((gulong *) content));
|
||||
break;
|
||||
case G_TYPE_FLOAT:
|
||||
g_value_set_float (value, *((gfloat *) content));
|
||||
break;
|
||||
case G_TYPE_DOUBLE:
|
||||
g_value_set_double (value, *((gdouble *) content));
|
||||
break;
|
||||
case G_TYPE_STRING:
|
||||
g_value_set_string (value, (gchar *) content);
|
||||
break;
|
||||
default:
|
||||
if (type == G_TYPE_DATE
|
||||
|| type == G_TYPE_BYTES)
|
||||
g_value_set_boxed (value, content);
|
||||
else if (G_TYPE_IS_OBJECT (type))
|
||||
g_value_set_object (value, content);
|
||||
else if (type != GVN_TYPE_NULL)
|
||||
g_return_if_reached ();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_get_valist:
|
||||
* @value: the type of value
|
||||
* @va: a string to be converted
|
||||
*
|
||||
* Sets the value of the initilized @value with the value of next
|
||||
* element in @va
|
||||
**/
|
||||
void gvn_value_get_valist (const GValue * value, va_list va)
|
||||
{
|
||||
GType type = G_VALUE_TYPE (value);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case G_TYPE_BOOLEAN:
|
||||
*va_arg (va, gboolean*) = g_value_get_boolean (value);
|
||||
break;
|
||||
case G_TYPE_CHAR:
|
||||
*va_arg (va, gint8*) = g_value_get_schar (value);
|
||||
break;
|
||||
case G_TYPE_INT:
|
||||
*va_arg (va, gint*) = g_value_get_int (value);
|
||||
break;
|
||||
case G_TYPE_UINT:
|
||||
*va_arg (va, guint*) = g_value_get_uint (value);
|
||||
break;
|
||||
case G_TYPE_LONG:
|
||||
*va_arg (va, glong*) = g_value_get_long (value);
|
||||
break;
|
||||
case G_TYPE_ULONG:
|
||||
*va_arg (va, gulong*) = g_value_get_ulong (value);
|
||||
break;
|
||||
case G_TYPE_FLOAT:
|
||||
*va_arg (va, gfloat*) = g_value_get_float (value);
|
||||
break;
|
||||
case G_TYPE_DOUBLE:
|
||||
*va_arg (va, gdouble*) = g_value_get_double (value);
|
||||
break;
|
||||
case G_TYPE_STRING:
|
||||
*va_arg (va, gchar**) = g_value_dup_string (value);
|
||||
break;
|
||||
default:
|
||||
if (type == G_TYPE_DATE
|
||||
|| type == G_TYPE_BYTES)
|
||||
*va_arg (va, gpointer*) = g_value_dup_boxed (value);
|
||||
else if (G_TYPE_IS_OBJECT (type))
|
||||
*va_arg (va, gpointer*) = g_value_dup_object (value);
|
||||
else if (type != GVN_TYPE_NULL)
|
||||
g_return_if_reached ();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_compare:
|
||||
* @a: a #GValue to be compared
|
||||
* @b: a #GValue to be compared
|
||||
*
|
||||
* Does the same as g_value_compare0(), but returns a %gboolean.
|
||||
*
|
||||
* Return value: %TRUE if two values are equal, %FALSE otherwise.
|
||||
**/
|
||||
|
||||
/**
|
||||
* gvn_value_compare0:
|
||||
* @a: #GValue to be compared
|
||||
* @b: #GValue to be compared
|
||||
*
|
||||
* Compares a and b. The two values must be of the same type or GVN_TYPE_NULL.
|
||||
*
|
||||
* Return value: -1, 0 or 1, if @a is <, == or > than @b.
|
||||
**/
|
||||
gint gvn_value_compare0 (const GValue * a, const GValue * b)
|
||||
{
|
||||
GType a_type = G_VALUE_TYPE (a);
|
||||
gboolean a_is_val = G_IS_VALUE (a);
|
||||
gboolean b_is_val = G_IS_VALUE (b);
|
||||
|
||||
if (!(a_is_val && b_is_val))
|
||||
{
|
||||
if (a_is_val)
|
||||
return 1;
|
||||
if (b_is_val)
|
||||
return -1;
|
||||
}
|
||||
else if (a_type == G_VALUE_TYPE (b))
|
||||
{
|
||||
switch (a_type)
|
||||
{
|
||||
case G_TYPE_FLOAT:
|
||||
{
|
||||
gfloat aux = g_value_get_float (a) - g_value_get_float (b);
|
||||
return (aux > 0.0) ? 1 : (aux < 0.0) ? -1 : 0;
|
||||
}
|
||||
case G_TYPE_DOUBLE:
|
||||
{
|
||||
gdouble aux = g_value_get_double (a) - g_value_get_double (b);
|
||||
return (aux > 0.0) ? 1 : (aux < 0.0) ? -1 : 0;
|
||||
}
|
||||
case G_TYPE_INT:
|
||||
return g_value_get_int (a) - g_value_get_int (b);
|
||||
case G_TYPE_UINT:
|
||||
return (gint) (g_value_get_uint (a) - g_value_get_uint (b));
|
||||
case G_TYPE_LONG:
|
||||
return (gint) (g_value_get_long (a) - g_value_get_long (b));
|
||||
case G_TYPE_ULONG:
|
||||
return (gint) (g_value_get_ulong (a) - g_value_get_ulong (b));
|
||||
case G_TYPE_BOOLEAN:
|
||||
return (gint) (g_value_get_boolean (a) - g_value_get_boolean (b));
|
||||
case G_TYPE_CHAR:
|
||||
return (gint) (g_value_get_schar (a) - g_value_get_schar (b));
|
||||
case G_TYPE_STRING:
|
||||
return g_strcmp0 (g_value_get_string (a), g_value_get_string (b));
|
||||
default:
|
||||
if (a_type == GVN_TYPE_NULL)
|
||||
return 0;
|
||||
if (G_TYPE_FUNDAMENTAL (a_type) == G_TYPE_BOXED)
|
||||
{
|
||||
gpointer a_boxed = g_value_get_boxed (a);
|
||||
gpointer b_boxed = g_value_get_boxed (b);
|
||||
|
||||
if (!a_boxed)
|
||||
return (gint) (a_boxed - b_boxed);
|
||||
if (!b_boxed)
|
||||
return (gint) (a_boxed - b_boxed);
|
||||
if (a_type == G_TYPE_DATE)
|
||||
return g_date_compare (a_boxed, b_boxed);
|
||||
if (a_type == G_TYPE_DATE_TIME)
|
||||
return g_date_time_compare (a_boxed, b_boxed);
|
||||
else if (a_type == G_TYPE_BYTES)
|
||||
return (gint) (a_boxed - b_boxed);
|
||||
}
|
||||
|
||||
g_warning (_("Attempting to compare invalid types: %s\n"),
|
||||
g_type_name (a_type));
|
||||
}
|
||||
}
|
||||
else if (gvn_value_is_null (a))
|
||||
return -1;
|
||||
else if (gvn_value_is_null (b))
|
||||
return 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_copy:
|
||||
* @src: source #GValue
|
||||
* @dst: destination #GValue
|
||||
*
|
||||
* Copies the value of @src into @dst. This function also works with #GvnNull
|
||||
* values.
|
||||
**/
|
||||
void gvn_value_copy (const GValue * src, GValue * dst)
|
||||
{
|
||||
g_return_if_fail (G_IS_VALUE (src));
|
||||
g_return_if_fail (G_IS_VALUE (dst));
|
||||
|
||||
if (G_VALUE_TYPE (src) != G_VALUE_TYPE (dst))
|
||||
{
|
||||
g_value_unset (dst);
|
||||
g_value_init (dst, G_VALUE_TYPE (src));
|
||||
}
|
||||
|
||||
g_value_copy (src, dst);
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_ccopy:
|
||||
* @src: source #GValue
|
||||
* @dst: destination #GValue
|
||||
*
|
||||
* Compares @src with @dst, if they are different copies the value of @src into
|
||||
* @dst. This function also works with #GvnNull values.
|
||||
*
|
||||
* Return value: %TRUE if they are copied, %FALSE if they are equals.
|
||||
**/
|
||||
gboolean gvn_value_ccopy (const GValue * src, GValue * dst)
|
||||
{
|
||||
if (gvn_value_compare (src, dst))
|
||||
return FALSE;
|
||||
|
||||
gvn_value_copy (src, dst);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_value_to_format_string:
|
||||
**/
|
||||
void gvn_value_to_format_string (const GValue * src, guint digits, GValue * dst)
|
||||
{
|
||||
GType type = G_VALUE_TYPE (src);
|
||||
|
||||
g_value_init (dst, G_TYPE_STRING);
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case G_TYPE_FLOAT:
|
||||
case G_TYPE_DOUBLE:
|
||||
{
|
||||
gdouble dec;
|
||||
gchar * format;
|
||||
gchar buffer [G_ASCII_DTOSTR_BUF_SIZE];
|
||||
|
||||
if (type == G_TYPE_FLOAT)
|
||||
dec = (gdouble) g_value_get_float (src);
|
||||
else
|
||||
dec = g_value_get_double (src);
|
||||
|
||||
format = g_strdup_printf ("%%.%df", digits);
|
||||
g_ascii_formatd (buffer, G_ASCII_DTOSTR_BUF_SIZE, format, dec);
|
||||
g_value_set_string (dst, buffer);
|
||||
g_free (format);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
if (!gvn_value_is_null (src))
|
||||
g_value_transform (src, dst);
|
||||
else
|
||||
g_value_set_string (dst, "");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gvn_type_init:
|
||||
*
|
||||
* Initializes library types, also calls g_type_init().
|
||||
**/
|
||||
void gvn_type_init ()
|
||||
{
|
||||
gint n;
|
||||
|
||||
GType types[] = {
|
||||
G_TYPE_BOOLEAN
|
||||
,G_TYPE_CHAR
|
||||
,G_TYPE_INT
|
||||
,G_TYPE_UINT
|
||||
,G_TYPE_LONG
|
||||
,G_TYPE_ULONG
|
||||
,G_TYPE_FLOAT
|
||||
,G_TYPE_DOUBLE
|
||||
,G_TYPE_STRING
|
||||
,G_TYPE_DATE
|
||||
,G_TYPE_DATE_TIME
|
||||
,G_TYPE_BYTES
|
||||
,G_TYPE_NONE
|
||||
};
|
||||
|
||||
for (n = 0; types[n] != G_TYPE_NONE; n++)
|
||||
{
|
||||
g_value_register_transform_func (types[n], GVN_TYPE_NULL,
|
||||
gvn_value_transform_any_to_null
|
||||
);
|
||||
g_value_register_transform_func (GVN_TYPE_NULL, types[n],
|
||||
gvn_value_transform_null_to_any
|
||||
);
|
||||
g_value_register_transform_func (G_TYPE_STRING, types[n],
|
||||
gvn_value_transform_string_to_any
|
||||
);
|
||||
}
|
||||
|
||||
g_value_register_transform_func (G_TYPE_DATE, G_TYPE_STRING,
|
||||
gvn_value_transform_date_to_string
|
||||
);
|
||||
g_value_register_transform_func (G_TYPE_DATE_TIME, G_TYPE_STRING,
|
||||
gvn_value_transform_date_time_to_string
|
||||
);
|
||||
g_value_register_transform_func (G_TYPE_DATE_TIME, G_TYPE_DATE,
|
||||
gvn_value_transform_date_time_to_date
|
||||
);
|
||||
g_value_register_transform_func (G_TYPE_DATE, G_TYPE_DATE_TIME,
|
||||
gvn_value_transform_date_to_date_time
|
||||
);
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GVN_VALUE_H
|
||||
#define GVN_VALUE_H
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "gvn-null.h"
|
||||
|
||||
#define gvn_value_compare(a, b) (!gvn_value_compare0 (a, b))
|
||||
#define gvn_value_is_null(value) (G_VALUE_TYPE (value) == GVN_TYPE_NULL)
|
||||
|
||||
GValue * gvn_value_new (GType type);
|
||||
void gvn_value_new_with_content (GValue * value, GType type, gpointer content);
|
||||
void gvn_value_new_from_string (GValue * value, GType type, const gchar * string, gsize length);
|
||||
void gvn_value_set_null (GValue * value);
|
||||
void gvn_value_get_valist (const GValue * value, va_list va);
|
||||
gint gvn_value_compare0 (const GValue * a, const GValue * b);
|
||||
void gvn_value_copy (const GValue * src, GValue * dst);
|
||||
gboolean gvn_value_ccopy (const GValue * src, GValue * dst);
|
||||
void gvn_value_to_format_string (const GValue * src, guint digits, GValue * dst);
|
||||
void gvn_type_init ();
|
||||
|
||||
#endif
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef GVN_H
|
||||
#define GVN_H
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib-object.h>
|
||||
#include "gvn-misc.h"
|
||||
#include "gvn-null.h"
|
||||
#include "gvn-time.h"
|
||||
#include "gvn-param-spec.h"
|
||||
#include "gvn-param.h"
|
||||
#include "gvn-value.h"
|
||||
|
||||
#endif
|
|
@ -0,0 +1,11 @@
|
|||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@/hedera
|
||||
includedir=@includedir@/hedera
|
||||
|
||||
Name: Gvn
|
||||
Description: Utility Module for Hedera Library
|
||||
Version: @VERSION@
|
||||
Requires: glib-2.0 gobject-2.0
|
||||
Libs: -L${libdir} -lgvn
|
||||
Cflags: -I${includedir}/gvn
|
|
@ -0,0 +1,558 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="Capa_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="150"
|
||||
height="116.64393"
|
||||
viewBox="0 0 150.00001 116.64392"
|
||||
enable-background="new 0 0 272.352 211.738"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.48.1 r9760"
|
||||
sodipodi:docname="icon.svg"><metadata
|
||||
id="metadata262"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs260" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="710"
|
||||
id="namedview258"
|
||||
showgrid="false"
|
||||
inkscape:snap-global="true"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="1.3318346"
|
||||
inkscape:cx="31.80839"
|
||||
inkscape:cy="105.86902"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Capa_1" />
|
||||
<pattern
|
||||
x="-164.158"
|
||||
y="525.362"
|
||||
width="69"
|
||||
height="69"
|
||||
patternUnits="userSpaceOnUse"
|
||||
id="Motivo_de_lunares"
|
||||
viewBox="2.125 -70.896 69 69"
|
||||
overflow="visible">
|
||||
<g
|
||||
id="g4">
|
||||
<polygon
|
||||
fill="none"
|
||||
points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896 "
|
||||
id="polygon6" />
|
||||
<polygon
|
||||
fill="#F7C158"
|
||||
points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896 "
|
||||
id="polygon8" />
|
||||
<g
|
||||
id="g10">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path12" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path14" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path16" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path18" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path20" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path22" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path24" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path26" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19C0.361-71.362,0.3-71.4,0.248-71.335 c-0.051,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path28" />
|
||||
</g>
|
||||
<g
|
||||
id="g30">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.063-0.165,0.128 c-0.051,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path32" />
|
||||
</g>
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.063-0.165,0.128 c-0.051,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224C0.5-71.68,0.503-71.744,0.51-71.626 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path34" />
|
||||
<g
|
||||
id="g36">
|
||||
<g
|
||||
id="g38">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path40" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path42" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path44" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path46" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path48" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path50" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path52" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path54" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path56" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143C2-61.45,2.217-61.397,2.391-61.46c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path58" />
|
||||
</g>
|
||||
<g
|
||||
id="g60">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path62" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path64" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path66" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path68" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path70" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path72" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path74" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path76" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path78" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-56.374,0.503-56.438,0.51-56.32 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path80" />
|
||||
</g>
|
||||
<g
|
||||
id="g82">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path84" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path86" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path88" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path90" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path92" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path94" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path96" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path98" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path100" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path102" />
|
||||
</g>
|
||||
<g
|
||||
id="g104">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path106" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path108" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path110" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path112" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path114" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path116" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path118" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path120" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 C8.15-41.004,8.149-41.02,8.14-41.04"
|
||||
id="path122" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path124" />
|
||||
</g>
|
||||
<g
|
||||
id="g126">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path128" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path130" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path132" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path134" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path136" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path138" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path140" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path142" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path144" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-33.416,0.503-33.48,0.51-33.362 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path146" />
|
||||
</g>
|
||||
<g
|
||||
id="g148">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path150" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path152" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path154" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path156" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path158" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path160" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path162" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path164" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path166" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path168" />
|
||||
</g>
|
||||
<g
|
||||
id="g170">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path172" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path174" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path176" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path178" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path180" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path182" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path184" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path186" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path188" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-18.11,0.503-18.175,0.51-18.057 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path190" />
|
||||
</g>
|
||||
<g
|
||||
id="g192">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362C69-9.692,69.159-9.523,69.154-9.4c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path194" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path196" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path198" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path200" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path202" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path204" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path206" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053C17.933-7.969,17.839-8.227,18-8.34 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path208" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 C7.915-10.05,7.866-9.836,7.886-9.75C7.717-9.692,7.876-9.523,7.871-9.4C7.868-9.351,7.83-9.295,7.826-9.239 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C9.114-7.652,9.321-7.799,9.48-7.837c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path210" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 C0.254-10.05,0.205-9.836,0.225-9.75C0.056-9.692,0.215-9.523,0.21-9.4c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-8.671,0.501-8.456,0.668-8.325c0.19,0.148,0.365,0.572,0.608,0.631 C1.454-7.652,1.66-7.799,1.819-7.837C2-7.88,2.217-7.827,2.391-7.89c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46C3.477-8.933,3.471-8.995,3.5-9.071 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path212" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g214">
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M69.439-2.778c0.018,0.072,0.008,0.127-0.026,0.19C69.361-2.487,69.3-2.525,69.248-2.46 c-0.051,0.063-0.099,0.276-0.079,0.362C69-2.04,69.159-1.871,69.154-1.748c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C70.397,0,70.604-0.146,70.763-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path216" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M61.778-2.778c0.018,0.072,0.007,0.127-0.026,0.19C61.7-2.487,61.64-2.525,61.587-2.46 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C62.737,0,62.943-0.146,63.103-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C61.915-3.117,61.78-3.02,61.781-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path218" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M54.118-2.778c0.018,0.072,0.007,0.127-0.026,0.19C54.04-2.487,53.98-2.525,53.927-2.46 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C55.077,0,55.283-0.146,55.442-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C54.255-3.117,54.12-3.02,54.121-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path220" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M46.458-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C47.416,0,47.623-0.146,47.782-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C46.594-3.117,46.459-3.02,46.46-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path222" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M38.797-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C39.756,0,39.962-0.146,40.122-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C38.934-3.117,38.799-3.02,38.8-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path224" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M31.137-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C32.095,0,32.302-0.146,32.461-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C31.273-3.117,31.139-3.02,31.14-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path226" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M23.477-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C24.435,0,24.642-0.146,24.801-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
|
||||
id="path228" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M15.816-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.063-0.165,0.128 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C16.774,0,16.981-0.146,17.14-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 C15.81-2.74,15.809-2.756,15.8-2.776"
|
||||
id="path230" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M8.156-2.778c0.018,0.072,0.007,0.127-0.026,0.19C8.077-2.487,8.018-2.525,7.965-2.46 c-0.05,0.063-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35C7.868-1.698,7.83-1.643,7.826-1.587 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C9.114,0,9.321-0.146,9.48-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C8.954-3.54,8.847-3.448,8.692-3.367 c-0.17,0.088-0.139,0.166-0.318,0.224C8.292-3.117,8.158-3.02,8.159-2.92C8.16-2.805,8.164-2.869,8.17-2.751 C8.15-2.74,8.149-2.756,8.14-2.776"
|
||||
id="path232" />
|
||||
<path
|
||||
fill="#FFFFFF"
|
||||
d="M0.495-2.778c0.018,0.072,0.008,0.127-0.026,0.19C0.417-2.487,0.356-2.525,0.304-2.46 C0.253-2.397,0.205-2.184,0.225-2.098C0.056-2.04,0.215-1.871,0.21-1.748c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-1.019,0.501-0.804,0.668-0.673c0.19,0.148,0.365,0.572,0.608,0.631 C1.454,0,1.66-0.146,1.819-0.185C2-0.228,2.217-0.175,2.391-0.237c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46C3.477-1.28,3.471-1.343,3.5-1.419 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C1.293-3.54,1.187-3.448,1.031-3.367 c-0.17,0.088-0.139,0.166-0.318,0.224C0.632-3.117,0.498-3.02,0.498-2.92C0.5-2.805,0.503-2.869,0.51-2.751 C0.489-2.74,0.488-2.756,0.479-2.776"
|
||||
id="path234" />
|
||||
</g>
|
||||
</g>
|
||||
</pattern>
|
||||
<g
|
||||
id="g236"
|
||||
transform="matrix(0.5508879,0,0,0.5508879,-1.5927744e-4,4.524136e-6)">
|
||||
<g
|
||||
id="g238">
|
||||
<g
|
||||
id="g240">
|
||||
<g
|
||||
id="g242">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 187.071,0.908 c -26.769,3.766 -50.785,33.04 -55.106,68.615 l -5.229,43.174 78.873,0.086 c 1.951,0 3.894,-0.137 5.824,-0.409 26.775,-3.763 50.806,-33.046 55.126,-68.631 L 271.788,0.568 192.916,0.5 c -1.958,-0.002 -3.907,0.136 -5.845,0.408 z"
|
||||
id="path244"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#719500;fill-rule:evenodd;stroke:#000000" />
|
||||
</g>
|
||||
<g
|
||||
id="g246">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 124.775,128.765 -2.624,21.58 c -2.309,19.083 7.589,34.563 22.107,34.569 l 39.422,0.036 2.621,-21.598 c 2.31,-19.064 -7.57,-34.547 -22.105,-34.551 l -39.421,-0.036 z"
|
||||
id="path248"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#c9dd0a;fill-rule:evenodd;stroke:#000000" />
|
||||
</g>
|
||||
<g
|
||||
id="g250">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="M 46.788,129.683 C 27.27,132.428 9.759,153.781 6.615,179.71 l -3.819,31.471 57.505,0.057 c 1.429,0.002 2.851,-0.102 4.264,-0.299 19.518,-2.744 37.027,-24.082 40.169,-50.029 l 3.802,-31.469 -57.487,-0.055 c -1.426,-0.002 -2.848,0.1 -4.261,0.297 z"
|
||||
id="path252"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#719500;fill-rule:evenodd;stroke:#000000" />
|
||||
</g>
|
||||
<g
|
||||
id="g254">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="M 5.817,11.564 1.101,50.432 c -4.151,34.324 13.651,62.191 39.795,62.205 l 70.977,0.066 4.715,-38.849 C 120.755,39.509 102.937,11.662 76.792,11.631 L 5.817,11.564 z"
|
||||
id="path256"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#c9dd0a;fill-rule:evenodd;stroke:#000000" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 99 KiB |
|
@ -0,0 +1,172 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
width="196.80357"
|
||||
height="26.799999"
|
||||
viewBox="0 0 196.80357 26.799999"
|
||||
enable-background="new 0 0 226.229 31.038"
|
||||
xml:space="preserve"
|
||||
id="svg2"
|
||||
inkscape:version="0.48.1 r9760"
|
||||
sodipodi:docname="logo.svg"><metadata
|
||||
id="metadata61"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs59" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="710"
|
||||
id="namedview57"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="106.10715"
|
||||
inkscape:cy="-24.459399"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="-0.2" />
|
||||
<g
|
||||
id="Background"
|
||||
transform="translate(246,-6.0370002)">
|
||||
</g>
|
||||
<g
|
||||
id="Guides"
|
||||
transform="translate(246,-6.0370002)">
|
||||
</g>
|
||||
<g
|
||||
id="Foreground"
|
||||
transform="matrix(0.86992944,0,0,0.86992944,-1.8041992e-6,0)">
|
||||
<g
|
||||
id="g7">
|
||||
<g
|
||||
id="g9">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="M 10.417,30.321 0,0 h 8.233 l 4.26,15.582 0.349,1.276 c 0.521,1.866 0.918,3.431 1.191,4.693 0.15,-0.618 0.335,-1.345 0.555,-2.182 0.219,-0.837 0.528,-1.935 0.925,-3.293 L 19.981,0 h 8.19 l -10.5,30.321 h -7.254 z"
|
||||
id="path11"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill-rule:evenodd" />
|
||||
</g>
|
||||
<g
|
||||
id="g13">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 139.809,19.787 c -0.665,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.283,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.204,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.653,-1.665 1.98,-2.831 l 0.72,-2.573 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.925,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.307,-1.159 3.021,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.646,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.076,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.673,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.991,0 3.602,0.241 4.833,0.722 1.231,0.481 2.095,1.209 2.59,2.185 0.339,0.701 0.483,1.536 0.432,2.504 -0.052,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 l -0.235,0.842 z"
|
||||
id="path15"
|
||||
style="fill:#8ed300;fill-opacity:1;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g17">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 185.7,30.321 6.27,-22.393 h 7.049 l -1.097,3.918 c 1.213,-1.537 2.502,-2.659 3.867,-3.366 1.365,-0.707 2.951,-1.074 4.758,-1.101 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.912,-0.093 -0.303,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -2.104,0.168 -2.932,0.504 -0.829,0.336 -1.561,0.854 -2.197,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.359,4.232 l -2.104,7.516 H 185.7 z"
|
||||
id="path19"
|
||||
style="fill:#8ed300;fill-opacity:1;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g21">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 217.631,19.787 c -0.664,0.357 -1.748,0.686 -3.25,0.988 -0.727,0.137 -1.282,0.254 -1.667,0.35 -0.95,0.247 -1.661,0.563 -2.134,0.947 -0.472,0.384 -0.799,0.899 -0.979,1.544 -0.223,0.796 -0.155,1.438 0.205,1.925 0.359,0.488 0.945,0.731 1.757,0.731 1.252,0 2.375,-0.36 3.369,-1.081 0.994,-0.721 1.654,-1.665 1.98,-2.831 l 0.719,-2.573 z m 5.106,10.534 h -7.458 c 0.017,-0.356 0.048,-0.726 0.094,-1.11 l 0.159,-1.192 c -1.318,1.026 -2.627,1.786 -3.927,2.279 -1.299,0.493 -2.643,0.739 -4.031,0.739 -2.158,0 -3.7,-0.593 -4.625,-1.779 -0.926,-1.187 -1.106,-2.788 -0.542,-4.804 0.519,-1.851 1.431,-3.356 2.737,-4.515 1.306,-1.159 3.02,-1.972 5.142,-2.438 1.169,-0.247 2.641,-0.515 4.413,-0.803 2.647,-0.412 4.082,-1.016 4.304,-1.812 l 0.151,-0.539 c 0.182,-0.65 0.077,-1.145 -0.317,-1.483 -0.393,-0.339 -1.071,-0.508 -2.033,-0.508 -1.045,0 -1.934,0.214 -2.666,0.643 -0.731,0.428 -1.289,1.058 -1.672,1.887 h -6.748 c 1.065,-2.53 2.64,-4.413 4.723,-5.65 2.083,-1.237 4.724,-1.856 7.923,-1.856 1.99,0 3.601,0.241 4.833,0.722 1.232,0.481 2.095,1.209 2.591,2.185 0.339,0.701 0.483,1.536 0.431,2.504 -0.051,0.969 -0.377,2.525 -0.978,4.669 l -2.375,8.483 c -0.284,1.014 -0.416,1.812 -0.396,2.395 0.02,0.583 0.188,0.962 0.503,1.141 l -0.236,0.842 z"
|
||||
id="path23"
|
||||
style="fill:#8ed300;fill-opacity:1;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g25">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 188.386,7.928 -6.269,22.393 h -7.174 l 0.864,-3.085 c -1.227,1.246 -2.476,2.163 -3.746,2.751 -1.27,0.588 -2.625,0.882 -4.067,0.882 -2.471,0 -4.154,-0.634 -5.048,-1.901 -0.895,-1.268 -0.993,-3.149 -0.294,-5.644 l 4.31,-15.396 h 7.338 l -3.508,12.53 c -0.516,1.842 -0.641,3.109 -0.375,3.803 0.266,0.694 0.967,1.041 2.105,1.041 1.275,0 2.323,-0.422 3.142,-1.267 0.819,-0.845 1.497,-2.223 2.031,-4.133 l 3.353,-11.974 h 7.338 z"
|
||||
id="path27"
|
||||
style="fill:#8ed300;fill-opacity:1;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g29">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 149.937,12.356 1.239,-4.428 h 2.995 l 1.771,-6.326 h 7.338 l -1.771,6.326 h 3.753 l -1.24,4.428 h -3.753 l -2.716,9.702 c -0.416,1.483 -0.498,2.465 -0.247,2.946 0.25,0.48 0.905,0.721 1.964,0.721 l 0.549,-0.011 0.39,-0.031 -1.31,4.678 c -0.811,0.148 -1.596,0.263 -2.354,0.344 -0.758,0.081 -1.48,0.122 -2.167,0.122 -2.543,0 -4.108,-0.621 -4.695,-1.863 -0.587,-1.242 -0.313,-3.887 0.82,-7.936 l 2.428,-8.672 h -2.994 z"
|
||||
id="path31"
|
||||
style="fill:#8ed300;fill-opacity:1;fill-rule:evenodd"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<g
|
||||
id="g33">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 h 7.296 z"
|
||||
id="path35"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;fill-rule:evenodd" />
|
||||
<g
|
||||
id="g37">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 73.875,18.896 c -0.561,2.004 -0.616,3.537 -0.167,4.601 0.449,1.064 1.375,1.595 2.774,1.595 1.399,0 2.605,-0.524 3.62,-1.574 1.015,-1.05 1.806,-2.59 2.375,-4.622 0.526,-1.879 0.556,-3.334 0.09,-4.363 -0.466,-1.029 -1.393,-1.543 -2.778,-1.543 -1.304,0 -2.487,0.528 -3.551,1.585 -1.064,1.057 -1.852,2.496 -2.363,4.321 z M 96.513,0 88.024,30.321 h -7.337 l 0.824,-2.944 c -1.166,1.22 -2.369,2.121 -3.61,2.703 -1.241,0.582 -2.583,0.874 -4.025,0.874 -2.802,0 -4.772,-1.081 -5.912,-3.243 -1.139,-2.162 -1.218,-4.993 -0.238,-8.493 0.988,-3.528 2.668,-6.404 5.042,-8.627 2.374,-2.224 4.927,-3.336 7.661,-3.336 1.47,0 2.695,0.296 3.676,0.887 0.981,0.591 1.681,1.465 2.099,2.62 L 89.217,0 h 7.296 z"
|
||||
id="path39"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill-rule:evenodd" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g41">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="M 46.488,30.321 52.757,7.928 h 7.049 l -1.098,3.918 C 59.921,10.309 61.21,9.187 62.576,8.48 63.942,7.773 68.591,7.406 70.398,7.379 l -2.03,7.25 c -0.304,-0.042 -0.608,-0.072 -0.911,-0.093 -0.304,-0.02 -0.592,-0.03 -0.867,-0.03 -1.126,0 -5.167,0.168 -5.997,0.504 -0.829,0.336 -1.561,0.854 -2.196,1.555 -0.406,0.467 -0.789,1.136 -1.149,2.007 -0.361,0.872 -0.814,2.282 -1.36,4.232 l -2.104,7.516 h -7.296 z"
|
||||
id="path43"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill-rule:evenodd" />
|
||||
</g>
|
||||
<g
|
||||
id="g45">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z"
|
||||
id="path47"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;fill-rule:evenodd" />
|
||||
<g
|
||||
id="g49">
|
||||
<path
|
||||
clip-rule="evenodd"
|
||||
d="m 32.673,16.742 8.351,-0.021 c 0.375,-1.436 0.308,-2.558 -0.201,-3.365 -0.509,-0.807 -1.402,-1.211 -2.68,-1.211 -1.209,0 -2.285,0.397 -3.229,1.19 -0.944,0.793 -1.69,1.93 -2.241,3.407 z m 6.144,6.536 h 7.043 c -1.347,2.456 -3.172,4.356 -5.477,5.7 -2.305,1.345 -4.885,2.017 -7.74,2.017 -3.473,0 -5.923,-1.054 -7.351,-3.161 -1.427,-2.107 -1.632,-4.98 -0.613,-8.618 1.038,-3.707 2.875,-6.641 5.512,-8.803 2.637,-2.163 5.678,-3.244 9.123,-3.244 3.555,0 6.04,1.099 7.456,3.298 1.417,2.198 1.582,5.234 0.498,9.109 l -0.239,0.814 -0.167,0.484 H 31.721 c -0.441,1.575 -0.438,2.777 0.01,3.606 0.448,0.829 1.332,1.244 2.65,1.244 0.975,0 1.836,-0.206 2.583,-0.617 0.747,-0.411 1.366,-1.021 1.853,-1.829 z"
|
||||
id="path51"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill-rule:evenodd" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g53">
|
||||
<path
|
||||
d="m 112.881,30.643 -6.404,-18.639 -6.455,18.639 h -7.254 l 9.565,-30.321 h 8.19 l 4.434,15.582 0.35,1.276 c 0.521,1.866 0.917,3.431 1.191,4.693 l 0.555,-2.182 c 0.219,-0.837 0.528,-1.935 0.925,-3.293 l 4.468,-16.076 h 8.19 l -10.501,30.321 h -7.254 z"
|
||||
id="path55"
|
||||
style="fill:#8ed300;fill-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
|
@ -0,0 +1,45 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
hedera_bin_PROGRAMS = hedera-bin
|
||||
|
||||
AM_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
$(gtk_CFLAGS) \
|
||||
-D_HEDERA_LOCALE_DIR=\"$(datadir)/locale\"
|
||||
hedera_bin_LDFLAGS = -Wl,--export-dynamic
|
||||
hedera_bin_SOURCES = main.c
|
||||
hedera_bin_LDADD = \
|
||||
$(top_builddir)/gvn/libgvn.la \
|
||||
$(top_builddir)/db/libdb.la \
|
||||
$(top_builddir)/vn/libvn.la
|
||||
|
||||
SCRIPT = $(top_srcdir)/main/hedera.sh.in
|
||||
hedera_bin_SCRIPTS = hedera
|
||||
$(hedera_bin_SCRIPTS): $(SCRIPT)
|
||||
$(SED) -e 's,[@]bindir[@],$(bindir),g' $(SCRIPT) > $(hedera_bin_SCRIPTS)
|
||||
chmod +x $(hedera_bin_SCRIPTS)
|
||||
|
||||
pkgconfig_DATA = hedera.pc
|
||||
|
||||
desktop_DATA = vn-hedera.desktop
|
||||
|
||||
HOST=verdnatura.es
|
||||
certdir = $(datadir)/ca-certificates/$(HOST)
|
||||
cert_DATA = cacert.pem
|
||||
syscertdir = $(sysconfdir)/ssl/certs
|
||||
|
||||
man_MANS = hedera.1
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(SCRIPT) \
|
||||
hedera.pc.in
|
||||
|
||||
DISTCLEANFILES = \
|
||||
$(hedera_bin_SCRIPTS) \
|
||||
hedera.pc \
|
||||
vn-hedera.desktop
|
||||
|
||||
install-data-hook:
|
||||
mkdir -p $(DESTDIR)$(syscertdir)
|
||||
(cd $(DESTDIR)$(syscertdir) && \
|
||||
$(LN_S) -f $(DESTDIR)$(certdir)/$(cert_DATA) $(HOST).pem)
|
|
@ -0,0 +1,25 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIEQzCCAyugAwIBAgIJAJimL+J4jUaQMA0GCSqGSIb3DQEBBQUAMIG2MQswCQYD
|
||||
VQQGEwJFUzEdMBsGA1UECAwUQ29tdW5pZGFkIFZhbGVuY2lhbmExETAPBgNVBAcM
|
||||
CFZhbGVuY2lhMR4wHAYDVQQKDBVWZXJkbmF0dXJhIExldmFudGUgU0wxFDASBgNV
|
||||
BAsMC0luZm9ybWF0aWNhMRYwFAYDVQQDDA12ZXJkbmF0dXJhLmVzMScwJQYJKoZI
|
||||
hvcNAQkBFhhob3N0bWFzdGVyQHZlcmRuYXR1cmEuZXMwIBcNMTMwNjExMTE1MjQ1
|
||||
WhgPMjA2MzA1MzAxMTUyNDVaMIG2MQswCQYDVQQGEwJFUzEdMBsGA1UECAwUQ29t
|
||||
dW5pZGFkIFZhbGVuY2lhbmExETAPBgNVBAcMCFZhbGVuY2lhMR4wHAYDVQQKDBVW
|
||||
ZXJkbmF0dXJhIExldmFudGUgU0wxFDASBgNVBAsMC0luZm9ybWF0aWNhMRYwFAYD
|
||||
VQQDDA12ZXJkbmF0dXJhLmVzMScwJQYJKoZIhvcNAQkBFhhob3N0bWFzdGVyQHZl
|
||||
cmRuYXR1cmEuZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsqq+h
|
||||
1kUfZE19Inm3M2XF1ytIqXeIsXsiZ5T9aVdedQrF2xcVOr4dvJyE5zp9g7NNxy9T
|
||||
FyAHPXiPWKSoX3w0uoQfLW9Hm19QZYu40hBD5oRrJy5m6l4JU3Gj0tnkvYc4m8Fl
|
||||
2uEUT3ain0FE2I1XjKpL6eQi9TKjhgmWNRgDJUbllAB3lsQLkNfB6EFo2QJykiKl
|
||||
aRi4UaHdSkd3zkUJyYRdcG7IxCFvsViKpwr3JF+TLXSN/oronLFgG8cKedrn+sMW
|
||||
pBm2FZQKAh8hLT3QQQqQgGpQ2y4t2EVJkYVdcGBXCyWYDKegMXgJR10WunICFCaD
|
||||
kM0P3pYQdtbgr7e9AgMBAAGjUDBOMB0GA1UdDgQWBBQ9+iZdf7pLNQItxs4o43dN
|
||||
FZD0CTAfBgNVHSMEGDAWgBQ9+iZdf7pLNQItxs4o43dNFZD0CTAMBgNVHRMEBTAD
|
||||
AQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAcFzJhm3jjuexZf9tTgQfzwtsafLLsYkrm
|
||||
EZOTkhvZFJYbBd8UngL5UPF1M3buSEV1VqsWCALLrFkxzbmjk5uM8cswZR/3J6un
|
||||
7GFYWTEllVgkD8KmNA2b6j5uSuGCQmOccsR4069vwNjrvTbtQpEpEAAnDf6d5/N4
|
||||
MXuDozHq3iEYi7qyGf++5mp4D+82y2ONSUsiLgxqnMT5JX/yhDKI1IiX1ndyt+6r
|
||||
ie2i2fzdOgovlAILuTM4hoUjPYFOxwmUwpxU2EAjPqo9Bi7bQiH+fv0QBzbpQ9on
|
||||
DRHo7NuXaDG49nvatJjuf4DiDELBCTMeKBOk5hG7kyWCIwp5wr+w
|
||||
-----END CERTIFICATE-----
|
|
@ -0,0 +1,50 @@
|
|||
.\"Created with GNOME Manpages Editor Wizard
|
||||
.\"http://sourceforge.net/projects/gmanedit2
|
||||
.TH hedera 1 "2013-01-02" "1.0" "Hedera"
|
||||
|
||||
.SH NAME
|
||||
hedera \- modular management system
|
||||
|
||||
.SH SYNOPSIS
|
||||
.B hedera
|
||||
.\"RI [ options ]
|
||||
.br
|
||||
|
||||
.SH DESCRIPTION
|
||||
.B hedera
|
||||
is an enterprise management and administration application. It features modular
|
||||
conectivity to user-made modules.
|
||||
.PP
|
||||
Being so easily extensible,
|
||||
.B hedera
|
||||
can handle virtually any task related to a database if the right module is
|
||||
available. The modules can be written in C or in Vala.
|
||||
.PP
|
||||
By default
|
||||
.B hedera
|
||||
will look for the modules in /usr/lib/hedera/module and for its corresponding
|
||||
data (GUI files, configuration...) in /usr/share/hedera/module but more
|
||||
directories can be added by setting
|
||||
.B VN_MODULE_LIB_PATH
|
||||
(for the binaries) and
|
||||
.B VN_MODULE_DATA_PATH
|
||||
(for the additional data). These environment variables are intended for testing
|
||||
during the developement and the expected is to use the modules installed.
|
||||
.PP
|
||||
The format for the configuration files for the modules and some information on
|
||||
how to write the modules themselves, can be seen in the official documentation
|
||||
for
|
||||
.B hedera.
|
||||
|
||||
.SH OPTIONS
|
||||
|
||||
.SH EXAMPLE
|
||||
Given a module project in the home directory,
|
||||
.B hedera
|
||||
should be called like this to load the module without installing it:
|
||||
hedera --lib-dir ~/module/src/.libs --data-dir ~/module/data
|
||||
|
||||
.SH AUTHORS
|
||||
Copyright (C) 2012 Juan Ferrer Toribio <juan@verdnauta.es>.
|
||||
.PP
|
||||
Manual page written by Alejandro T. Colombini.
|
|
@ -0,0 +1,11 @@
|
|||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@/hedera
|
||||
includedir=@includedir@/hedera
|
||||
|
||||
Name: Hedera
|
||||
Description: The Hedera Library
|
||||
Version: @VERSION@
|
||||
Requires: gtk+-3.0 gvn sql db vn
|
||||
Libs: -L${libdir}
|
||||
Cflags: -I${includedir}
|
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
if [ -x @bindir@/vn-updater-gui ]
|
||||
then
|
||||
echo "Running updater..."
|
||||
@bindir@/vn-updater-gui
|
||||
fi
|
||||
|
||||
export LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN=1
|
||||
exec @bindir@/hedera-bin
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Copyright (C) 2012 - Juan Ferrer Toribio
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <vn/vn.h>
|
||||
#include <config.h>
|
||||
#include <locale.h>
|
||||
|
||||
int main (int argc, char * argv[])
|
||||
{
|
||||
#ifdef ENABLE_NLS
|
||||
setlocale (LC_ALL, "");
|
||||
bindtextdomain (GETTEXT_PACKAGE, _HEDERA_LOCALE_DIR);
|
||||
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||
textdomain (GETTEXT_PACKAGE);
|
||||
#endif
|
||||
|
||||
gvn_type_init ();
|
||||
gtk_init (&argc, &argv);
|
||||
|
||||
VnLogin * login = vn_login_new ("apps.hedera");
|
||||
vn_login_run (login);
|
||||
g_object_unref (login);
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
[Desktop Entry]
|
||||
Name=Hedera
|
||||
GenericName=Office Tool
|
||||
Comment=Runtime for the Hedera system
|
||||
Exec=hedera
|
||||
Icon=@prefix@/share/hedera/vn/image/icon.svg
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=GNOME;GTK;Office;
|
||||
StartupNotify=true
|
||||
Version=@VERSION@
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
SUBDIRS = \
|
||||
src \
|
||||
data \
|
||||
sql
|
|
@ -0,0 +1,13 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
exampledir = $(module_datadir)
|
||||
|
||||
example_DATA = \
|
||||
example.xml \
|
||||
example.ui \
|
||||
consulter.glade \
|
||||
consulter.ui \
|
||||
users.glade \
|
||||
customer.glade
|
||||
|
||||
EXTRA_DIST = $(example_DATA)
|
|
@ -0,0 +1,304 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<!-- interface-requires gtk+ 3.0 -->
|
||||
<!-- interface-requires vn 0.0 -->
|
||||
<!-- interface-local-resource-path ../image -->
|
||||
<object class="GtkActionGroup" id="actions">
|
||||
<child>
|
||||
<object class="GtkAction" id="send">
|
||||
<property name="label" translatable="yes">Send</property>
|
||||
<property name="short_label" translatable="yes">Send</property>
|
||||
<property name="tooltip" translatable="yes">Send the current query</property>
|
||||
<property name="icon_name">system-run</property>
|
||||
<signal name="activate" handler="vn_consulter_send" swapped="no"/>
|
||||
</object>
|
||||
<accelerator key="s" modifiers="GDK_CONTROL_MASK"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkAction" id="clean">
|
||||
<property name="label" translatable="yes">Clean</property>
|
||||
<property name="short_label" translatable="yes">Clean</property>
|
||||
<property name="tooltip" translatable="yes">Clean the messages</property>
|
||||
<property name="icon_name">edit-clear</property>
|
||||
<signal name="activate" handler="vn_consulter_clean_clicked" swapped="no"/>
|
||||
</object>
|
||||
<accelerator key="f" modifiers="GDK_CONTROL_MASK"/>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkAction" id="menu">
|
||||
<property name="label" translatable="yes">_Consulter</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkListStore" id="model">
|
||||
<columns>
|
||||
<!-- column-name col -->
|
||||
<column type="gchararray"/>
|
||||
</columns>
|
||||
</object>
|
||||
<object class="GtkBox" id="main">
|
||||
<property name="height_request">300</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="border_width">8</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">8</property>
|
||||
<child>
|
||||
<object class="GtkHBox" id="hbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">8</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="xalign">1</property>
|
||||
<property name="label" translatable="yes">Query:</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="query">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="has_entry">True</property>
|
||||
<property name="entry_text_column">0</property>
|
||||
<property name="id_column">1</property>
|
||||
<child internal-child="entry">
|
||||
<object class="GtkEntry" id="combo-entry">
|
||||
<property name="can_focus">True</property>
|
||||
<property name="activates_default">True</property>
|
||||
<property name="placeholder_text">Set on the code</property>
|
||||
<signal name="activate" handler="gtk_action_activate" object="send" swapped="yes"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button-send">
|
||||
<property name="related_action">send</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="related_action">send</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button-clean">
|
||||
<property name="related_action">clean</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="related_action">clean</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="stop">
|
||||
<property name="label">gtk-stop</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="clicked" handler="vn_consulter_on_stop_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkVPaned" id="paned">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="position">120</property>
|
||||
<property name="position_set">True</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hscrollbar_policy">never</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="treeview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">model</property>
|
||||
<property name="rules_hint">True</property>
|
||||
<property name="search_column">0</property>
|
||||
<property name="fixed_height_mode">True</property>
|
||||
<property name="rubber_banding">True</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeview-selection1"/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="resize">False</property>
|
||||
<property name="shrink">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="VnGrid" id="consulter">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="treeform-selection"/>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="resize">True</property>
|
||||
<property name="shrink">True</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="box1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">8</property>
|
||||
<child>
|
||||
<object class="GtkHButtonBox" id="buttonbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="spacing">8</property>
|
||||
<property name="layout_style">start</property>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="mode">
|
||||
<property name="label" translatable="yes">Immediate changes</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<signal name="toggled" handler="vn_consulter_mode_toggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="start">
|
||||
<property name="label" translatable="yes">Start</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="vn_consulter_start_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="commit">
|
||||
<property name="label" translatable="yes">Commit</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="vn_consulter_commit_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="rollback">
|
||||
<property name="label" translatable="yes">Rollback</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<signal name="clicked" handler="vn_consulter_rollback_clicked" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="VnHandler" id="handler">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="layout_style">start</property>
|
||||
<property name="show_flags">VN_HANDLER_SHOW_REFRESH | VN_HANDLER_SHOW_UNDO | VN_HANDLER_SHOW_SAVE | VN_HANDLER_SHOW_REMOVE | VN_HANDLER_SHOW_ADD</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
|
@ -0,0 +1,18 @@
|
|||
<ui>
|
||||
<menubar name="MenuBar">
|
||||
<placeholder name="ModuleMenu">
|
||||
<menu name="FormMenu" action="menu">
|
||||
<menuitem name="Send" action="send"/>
|
||||
<menuitem name="Clean" action="clean"/>
|
||||
</menu>
|
||||
</placeholder>
|
||||
</menubar>
|
||||
<toolbar name="Toolbar">
|
||||
<placeholder name="ModuleTools">
|
||||
<separator/>
|
||||
<toolitem name="Send" action="send"/>
|
||||
<toolitem name="Clean" action="clean"/>
|
||||
<separator/>
|
||||
</placeholder>
|
||||
</toolbar>
|
||||
</ui>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue