diff options
author | nobody <nobody@localhost> | 2001-04-16 17:30:54 +0800 |
---|---|---|
committer | nobody <nobody@localhost> | 2001-04-16 17:30:54 +0800 |
commit | b23e9457328b54c8a50f35d5f24b235d311c8ba1 (patch) | |
tree | aaa46c1cf6c9a87e8f291ef7673bd9463803e8c9 | |
parent | 75a16468d369f58587f27ab4655fbe1c1091fc95 (diff) | |
download | gsoc2013-evolution-GRAPEVINE_0_1.tar.gz gsoc2013-evolution-GRAPEVINE_0_1.tar.zst gsoc2013-evolution-GRAPEVINE_0_1.zip |
This commit was manufactured by cvs2svn to create tagGRAPEVINE_0_1
'GRAPEVINE_0_1'.
svn path=/tags/GRAPEVINE_0_1/; revision=9352
2170 files changed, 0 insertions, 861906 deletions
diff --git a/.cvsignore b/.cvsignore deleted file mode 100644 index 5d4ce997d6..0000000000 --- a/.cvsignore +++ /dev/null @@ -1,26 +0,0 @@ -ABOUT-NLS -Makefile -Makefile.in -aclocal.m4 -config.cache -config.guess -config.h -config.h.in -config.log -config.status -config.sub -configure -install-sh -intl -libtool -ltconfig -ltmain.sh -missing -mkinstalldirs -stamp-h -stamp-h.in -stamp.h -xlibtool -xltmain.sh -evolution.spec -xml-i18n-* diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index ac9da57868..0000000000 --- a/AUTHORS +++ /dev/null @@ -1,78 +0,0 @@ -Evolution was written by: - -Addressbook - Arturo Esponosa <arturo@nuclecu.unam.mx> (Original Gnomecard author) - Nat Friedman <nat@ximian.com> - Chris Lahey <clahey@ximian.com> - Chris Toshok <toshok@ximian.com> - Jon Trowbridge <trow@ximian.com> - -Artwork - Tuomas Kuosmanen <tigert@ximian.com> - Jakub Steiner <jimmac@ximian.com> - -Calendar - Seth Alves <seth@ximian.com> - Eric Busboom <eric@softwarestudio.org> (libical author) - Arturo Esponosa <arturo@nuclecu.unam.mx> (Gnomecal contributor) - Damon Chaplin <damon@ximian.com> - Federico Mena-Quintero <federico@ximian.com> - Jesse Pavel <jesse@ximian.com> - JP Rosevear <jpr@ximian.com> - Russell Steinthal <rms39@columbia.edu> (Gnomecal maintainer) - -Documentation - Kevin Breit <battery841@mypad.com> - Aaron Weber <aaron@ximian.com> - -Mailer - Bertrand Guiheneuf <bertrand@ximian.com> - Matt Loper <matt@ximian.com> - Ettore Perazzoli <ettore@ximian.com> - Jeff Stedfast <fejj@ximian.com> - Peter Williams <peterw@ximian.com> - Dan Winship <danw@ximian.com> - Michael Zucchi <notzed@ximian.com> - -Notes - Anders Carlsson <andersca@gnu.org> - -Pilot - JP Rosevear <jpr@ximian.com> - -Shell - Miguel de Icaza <miguel@ximian.com> - Ettore Perazzoli <ettore@ximian.com> - -Translations - Akira TAGOH <tagoh@gnome.gr.jp> - Andraz Tori <andraz.tori1@guest.arnes.si> - Andreas Hyden <a.hyden@cyberpoint.se> - Arjan Scherpenisse <acscherp@wins.uva.nl> - Clara Tattoni <clara.tattoni@libero.it> - Fatih Demir <kabalak@gmx.net> - Gediminas Paulauskas <menesis@delfi.lt> - GNOME PL Team <gnomepl@pandora.info.bielsko.pl> - Gustavo Maciel Dias Vieira <gdvieira@zaz.com.br> - Héctor García Alvarez <hector@scouts-es.org> - Jesús Bravo Álvarez <jba@pobox.com> - Keld Simonsen <keld@dkuug.dk> - Kjartan Maraas <kmaraas@gnome.org> - Matthias Warkus <mawa@iname.com> - Spiros Papadimitriou <spapadim+@cs.cmu.edu> - Sung-Hyun Nam <namsh@kldp.org> - Szabolcs BAN <shooby@gnome.hu> - Tiago Antão <tiagoantao@bigfoot.com> - Valek Filippov <frob@df.ru> - Vincent Renardias <vincent@redhat.com> - Yuri Syrota <rasta@renome.rovno.ua> - -UI - Anna Dirks <anna@ximian.com> - -Widgets - Damon Chaplin <damon@ximian.com> - Miguel de Icaza <miguel@ximian.com> - Chris Lahey <clahey@ximian.com> - Federico Mena-Quintero <federico@ximian.com> - Chris Toshok <toshok@ximian.com> diff --git a/COPYING b/COPYING deleted file mode 100644 index d60c31a97a..0000000000 --- a/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) 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 -this service 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 make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the 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 a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. - - 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 -convey 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 2 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, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This 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 Library General -Public License instead of this License. diff --git a/COPYING-DOCS b/COPYING-DOCS deleted file mode 100644 index b42936beb3..0000000000 --- a/COPYING-DOCS +++ /dev/null @@ -1,355 +0,0 @@ - GNU Free Documentation License - Version 1.1, March 2000 - - Copyright (C) 2000 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - -0. PREAMBLE - -The purpose of this License is to make a manual, textbook, or other -written document "free" in the sense of freedom: to assure everyone -the effective freedom to copy and redistribute it, with or without -modifying it, either commercially or noncommercially. Secondarily, -this License preserves for the author and publisher a way to get -credit for their work, while not being considered responsible for -modifications made by others. - -This License is a kind of "copyleft", which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - - -1. APPLICABILITY AND DEFINITIONS - -This License applies to any manual or other work that contains a -notice placed by the copyright holder saying it can be distributed -under the terms of this License. The "Document", below, refers to any -such manual or work. Any member of the public is a licensee, and is -addressed as "you". - -A "Modified Version" of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -A "Secondary Section" is a named appendix or a front-matter section of -the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall subject -(or to related matters) and contains nothing that could fall directly -within that overall subject. (For example, if the Document is in part a -textbook of mathematics, a Secondary Section may not explain any -mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -The "Invariant Sections" are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. - -The "Cover Texts" are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. - -A "Transparent" copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, whose contents can be viewed and edited directly and -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup has been designed to thwart or discourage -subsequent modification by readers is not Transparent. A copy that is -not "Transparent" is called "Opaque". - -Examples of suitable formats for Transparent copies include plain -ASCII without markup, Texinfo input format, LaTeX input format, SGML -or XML using a publicly available DTD, and standard-conforming simple -HTML designed for human modification. Opaque formats include -PostScript, PDF, proprietary formats that can be read and edited only -by proprietary word processors, SGML or XML for which the DTD and/or -processing tools are not generally available, and the -machine-generated HTML produced by some word processors for output -purposes only. - -The "Title Page" means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, "Title Page" means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. - - -2. VERBATIM COPYING - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. - - -3. COPYING IN QUANTITY - -If you publish printed copies of the Document numbering more than 100, -and the Document's license notice requires Cover Texts, you must enclose -the copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a publicly-accessible computer-network location containing a complete -Transparent copy of the Document, free of added material, which the -general network-using public has access to download anonymously at no -charge using public-standard network protocols. If you use the latter -option, you must take reasonably prudent steps, when you begin -distribution of Opaque copies in quantity, to ensure that this -Transparent copy will remain thus accessible at the stated location -until at least one year after the last time you distribute an Opaque -copy (directly or through your agents or retailers) of that edition to -the public. - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. - - -4. MODIFICATIONS - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -A. Use in the Title Page (and on the covers, if any) a title distinct - from that of the Document, and from those of previous versions - (which should, if there were any, be listed in the History section - of the Document). You may use the same title as a previous version - if the original publisher of that version gives permission. -B. List on the Title Page, as authors, one or more persons or entities - responsible for authorship of the modifications in the Modified - Version, together with at least five of the principal authors of the - Document (all of its principal authors, if it has less than five). -C. State on the Title page the name of the publisher of the - Modified Version, as the publisher. -D. Preserve all the copyright notices of the Document. -E. Add an appropriate copyright notice for your modifications - adjacent to the other copyright notices. -F. Include, immediately after the copyright notices, a license notice - giving the public permission to use the Modified Version under the - terms of this License, in the form shown in the Addendum below. -G. Preserve in that license notice the full lists of Invariant Sections - and required Cover Texts given in the Document's license notice. -H. Include an unaltered copy of this License. -I. Preserve the section entitled "History", and its title, and add to - it an item stating at least the title, year, new authors, and - publisher of the Modified Version as given on the Title Page. If - there is no section entitled "History" in the Document, create one - stating the title, year, authors, and publisher of the Document as - given on its Title Page, then add an item describing the Modified - Version as stated in the previous sentence. -J. Preserve the network location, if any, given in the Document for - public access to a Transparent copy of the Document, and likewise - the network locations given in the Document for previous versions - it was based on. These may be placed in the "History" section. - You may omit a network location for a work that was published at - least four years before the Document itself, or if the original - publisher of the version it refers to gives permission. -K. In any section entitled "Acknowledgements" or "Dedications", - preserve the section's title, and preserve in the section all the - substance and tone of each of the contributor acknowledgements - and/or dedications given therein. -L. Preserve all the Invariant Sections of the Document, - unaltered in their text and in their titles. Section numbers - or the equivalent are not considered part of the section titles. -M. Delete any section entitled "Endorsements". Such a section - may not be included in the Modified Version. -N. Do not retitle any existing section as "Endorsements" - or to conflict in title with any Invariant Section. - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -You may add a section entitled "Endorsements", provided it contains -nothing but endorsements of your Modified Version by various -parties--for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. - - -5. COMBINING DOCUMENTS - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice. - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -In the combination, you must combine any sections entitled "History" -in the various original documents, forming one section entitled -"History"; likewise combine any sections entitled "Acknowledgements", -and any sections entitled "Dedications". You must delete all sections -entitled "Endorsements." - - -6. COLLECTIONS OF DOCUMENTS - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. - - -7. AGGREGATION WITH INDEPENDENT WORKS - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, does not as a whole count as a Modified Version -of the Document, provided no compilation copyright is claimed for the -compilation. Such a compilation is called an "aggregate", and this -License does not apply to the other self-contained works thus compiled -with the Document, on account of their being thus compiled, if they -are not themselves derivative works of the Document. - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one quarter -of the entire aggregate, the Document's Cover Texts may be placed on -covers that surround only the Document within the aggregate. -Otherwise they must appear on covers around the whole aggregate. - - -8. TRANSLATION - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License provided that you also include the -original English version of this License. In case of a disagreement -between the translation and the original English version of this -License, the original English version will prevail. - - -9. TERMINATION - -You may not copy, modify, sublicense, or distribute the Document except -as expressly provided for under this License. Any other attempt to -copy, modify, sublicense or distribute the Document is void, and will -automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this -License will not have their licenses terminated so long as such -parties remain in full compliance. - - -10. FUTURE REVISIONS OF THIS LICENSE - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation 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. See -http://www.gnu.org/copyleft/. - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License "or any later version" applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. - - -ADDENDUM: How to use this License for your documents - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - - Copyright (c) YEAR YOUR NAME. - Permission is granted to copy, distribute and/or modify this document - under the terms of the GNU Free Documentation License, Version 1.1 - or any later version published by the Free Software Foundation; - with the Invariant Sections being LIST THEIR TITLES, with the - Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. - A copy of the license is included in the section entitled "GNU - Free Documentation License". - -If you have no Invariant Sections, write "with no Invariant Sections" -instead of saying which ones are invariant. If you have no -Front-Cover Texts, write "no Front-Cover Texts" instead of -"Front-Cover Texts being LIST"; likewise for Back-Cover Texts. - -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index c8dbd2ccf3..0000000000 --- a/ChangeLog +++ /dev/null @@ -1,6407 +0,0 @@ -2001-04-12 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Updated the required version of gal to 0.6.99.0. - -2001-04-11 JP Rosevear <jpr@ximian.com> - - * configure.in: Check if gethostbyname_r take five params - - * acconfig.h: add GETHOSTBYNAME_R_FIVE_ARGS - -2001-04-10 Gediminas Paulauskas <menesis@delfi.lt> - - * AUTHORS: /me is a translator. - * configure.in (EVO_CHECK_LIB): fail with AC_MSG_ERROR, not echo && - exit 1. - -2001-04-10 Jeffrey Stedfast <fejj@ximian.com> - - * configure.in (EVOLUTION_DIR): create the makefile in - camel/tests/smime - -2001-04-08 Chris Toshok <toshok@ximian.com> - - * tools/killev (sysname): add some more 16 character versions for - freebsd. - -2001-04-04 Kjartan Maraas <kmaraas@gnome.org> - - * AUTHORS: Brag. - -2001-04-04 Gediminas Paulauskas <menesis@delfi.lt> - - * art/evolution-today-mini.png: converted from exec-16-summary.xpm, - removed the latter. - * art/evolution-trash.png, art/evolution-trash-mini.png: images for - trash folder, one converted from deleted_message.xpm, another from mc. - * art/Makefile.am: install. - -2001-04-02 Jeffrey Stedfast <fejj@ximian.com> - - * README (SSL): Remind users that they will currently have to copy - their cert database from their mozilla directory into ~/evolution. - -2001-04-01 Gediminas Paulauskas <menesis@delfi.lt> - - * art/Makefile.am: added missing (new) files. - -2001-03-30 Dan Winship <danw@ximian.com> - - * configure.in (EVOLUTION_MICRO_VERSION): Bump this to 10. (We - forgot to do this before branching *again*...) - -2001-03-28 Dan Winship <danw@ximian.com> - - * README: add a bit mentioning that if configure claims you don't - have something installed when you think you do, that it's probably - because you installed it in the wrong prefix, or because you need - a -devel package. - - * configure.in: Add a new macro EVO_CHECK_LIB that checks for a - gnome-config-based library of a given version or later, correctly, - and if doesn't find it, suggests that you consult the README. Fix - the various library checks to use this. Meanwhile, remove a bunch - of old cruft and reorganize a little. - - * acconfig.h: Remove cruft - -2001-03-28 Jon Trowbridge <trow@ximian.com> - - * AUTHORS: In a burst of egomania, added myself. - -2001-03-26 Radek Doulik <rodo@ximian.com> - - * configure.in: create camel/misc/Makefile - -2001-03-22 Dan Winship <danw@ximian.com> - - * README: Update xml-i18n-tools version - -2001-03-22 Jakub Steiner <jimmac@ximian.com> - - * art/new-message.xpm: file->new->mail message - * art/folder.xpm: file->new->folder - * art/new_appointment.xpm: file->new->appontment - * art/print-preview.xpm: file->print preview - * art/configure_16_calendar.xpm: for the tools menu - -2001-03-22 Jakub Steiner <jimmac@ximian.com> - - * art/splash.png: move it a bit up so the icons fit better - -2001-03-22 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Bumped gal requirement to 0.5.99.11. - -2001-03-22 Jakub Steiner <jimmac@ximian.com> - - * art/configure_16_folder.xpm, configure_16_mail.xpm, - copy_16_message.xpm, edit.xpm, encrypt.xpm, - evo-16-address-conduit.png, evo-16-calendar-conduit.png, - evo-16-todo-conduit.png, exec-16-summary.xpm, import.xpm, - print.xpm, reply_to_all.xpm, reply.xpm, save.xpm, - send-receive.xpm, work_offline.xpm, find_contact.xpm, - send-24-receive.png, evo-48-calendar-conduit.png, - evo-48-todo-conduit.png, import.png, send-48-receive.png, - move_message.xpm, all_contacts.xpm, forward.xpm, - configure_16_addressbook.xpm, Makefile.am, - evo-48-address-conduit.png: renamed icons to make Miguel's - speedups possible - * art/evolution-inbox.png: color coded one - * art/envelope.png: reverted back to the non-color coded one - * art/evolution-contacts-plain.png: non-color coded one for - the "new contact" dialogue - -2001-03-21 Dan Winship <danw@ximian.com> - - * configure.in: Require bison, not yacc (for vcc.y) - -2001-03-20 Miguel de Icaza <miguel@ximian.com> - - * art/Makefile.am (images_DATA): Added all the new icons to the - distribution. - -2001-03-20 Jeffrey Stedfast <fejj@ximian.com> - - * configure.in: More fixes for NSPR and NSS checks - use fixed it - to use AC_CHECK_HEADERS instead of AC_CHECK_FILES. Also made it - not default the nspr lib path to /usr/lib/mozilla which may not be - in the user's library path when checking for nspr libs. - -2001-03-20 Jakub Steiner <jimmac@ximian.com> - - * art/48_send-receive.png: send-receive for the s/r dialog - * art/24_send-receive.png: send-receive to replace the - fetch-mail-doggie - * art/16_send-receive.xpm: send-receive for (future) menu - item - * art/16_import.xpm: for the file menu - * art/16_work_offline.xpm: for the file menu - * AUTHORS: so I can show off - * art/splash.png: making radek famous ;) - * art/envelope.png, evolution-calendar.png, evolution-contacts.png, - evolution-tasks.png, evolution-today.png: - new concept of color coded apps: - - mailer: #efb43e - - calendar: #bab5ab - - contacts: #9794ab - - tasks: #6e9e6e - - exec. summary: #c4757e - -2001-03-19 Jeffrey Stedfast <fejj@ximian.com> - - * configure.in: Fix ettore's fix ;-) - -2001-03-19 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Bumped gal requirement to 0.5.99.8. - -2001-03-19 Ettore Perazzoli <ettore@ximian.com> - - * configure.in: Make sure we never define `NSPR_CFLAGS' or - `NSS_CFLAGS' as just "-I". - -2001-03-19 Jeffrey Stedfast <fejj@ximian.com> - - * NEWS: pulled from the 0.9 release. - -2001-03-18 Jeffrey Stedfast <fejj@ximian.com> - - * configure.in: Updated the checks for NSS and NSPR - -2001-03-16 Jeffrey Stedfast <fejj@ximian.com> - - * README: Added directions on how to build with SSL support. - - * configure.in: Updated the checks for NSS and NSPR - -2001-03-16 Jakub Steiner <jimmac@ximian.com> - - * art/48_import.png: for the import druid - -2001-03-15 Dan Winship <danw@ximian.com> - - * configure.in: Bump gal requirement to 0.5.99.7 - -2001-03-15 Gediminas Paulauskas <menesis@delfi.lt> - - * configure.in: create doc/devel/executive-summary/Makefile - * evolution.png: moved to art/. - * evolution.desktop: moved to data/. - * Makefile.am: reflect those moves. - * art/*.xpm: moved 8 files from calendar/gui here. - * art/Makefile.am: added moved files. - distribute *.xpm, install *.png and *view.xpm. - -2001-03-12 Jeffrey Stedfast <fejj@ximian.com> - - * configure.in: Updated to AC_SUBST the NSPR/NSS flags. - -2001-03-14 Dan Winship <danw@ximian.com> - - * README: Pull up some of the clarifications from the 0.9 branch - -2001-03-13 Chris Toshok <toshok@ximian.com> - - * configure.in: add -lresolv to LDAP_LIBS if it's there. - -2001-03-13 Iain Holmes <iain@ximian.com> - - * configure.in: Added the mail/importers dir. - -2001-03-12 Jeffrey Stedfast <fejj@ximian.com> - - * README: Rearranged some of the dependencies to try to get them - into a more correct order (needed for people building all of these - packages by hand). - -2001-03-12 JP Rosevear <jpr@ximian.com> - - * README: Update - -2001-03-09 Dan Winship <danw@ximian.com> - - * configure.in (EVOLUTION_MICRO_VERSION): Hm... probably would be - clever to be calling this 0.9 rather than 0.8, since it's almost - 0.10. - -2001-03-09 Christopher James Lahey <clahey@ximian.com> - - * libversit/vcc.y: Changed int to char when returning a character - from a stream (since it needs to be able to hold EOF.) - -2001-03-07 Jeffrey Stedfast <fejj@ximian.com> - - * configure.in: Removed --enable-assbarn-security and replaced it - with the real options: - --with-nspr-includes=PREFIX - --with-nspr-libs=PREFIX - --with-nss=PREFIX - - * acconfig.h: #undef HAVE_NSS - -2001-03-07 Ettore Perazzoli <ettore@ximian.com> - - * configure.in: Require GAL 0.5.99.6 or later. - -2001-03-07 Kjartan Maraas <kmaraas@gnome.org> - - * shell/main: /* xgettext:no-c-format */ before the welcome - message. - * configure.in: Don't try to generate a Makefile in - camel/providers/vee as it's empty. - -2001-03-05 JP Rosevear <jpr@ximian.com> - - * README: Update pilot instructions - -2001-03-05 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Check for gal 0.5.99.4. - -2001-03-04 Dan Winship <danw@ximian.com> - - * configure.in: Reorganize a bit to get rid of warnings about - AC_TRY_COMPILE being used before AC_ISC_POSIX - -2001-03-04 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Added views/addressbook/Makefile. - -2001-03-02 JP Rosevear <jpr@ximian.com> - - * art/Makefile.am: install conduit icons - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * configure.in: add logic to make sure we're building against OpenLDAP >= 2 - -2001-03-01 Christopher James Lahey <clahey@ximian.com> - - * Makefile.am (SUBDIRS), configure.in: Added views stuff. - -2001-03-01 Dan Winship <danw@ximian.com> - - * configure.in: Redo the Kerberos stuff again to deal with the - stuff currently on my machine. I think it should deal with both - the MIT and KTH versions of both krb4 and krb5 now. - -2001-03-01 Jakub Steiner <jimmac@ximian.com> - - * art/48_evo-address-conduit.png: 48^2 version of the - addressbook pilot conduit. (for the new control center) - * art/16_evo-address-conduit.png: 16x16 version for current - gnomecc - * art/48_evo-todo-conduit.png: for new gnomecc - * art/16_evo-todo-conduit.png: for old gnomecc - * art/48_evo-calendar-conduit.png: for new gnomecc - * art/16_evo-calendar-conduit.png: for old gnomecc - -2001-03-01 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Check for gal 0.5.99.2. - -2001-02-19 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Check for gal 0.5.99.1. - -2001-02-15 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Check for gal 0.5.99.0. - -2001-02-14 Dan Winship <danw@ximian.com> - - * various .cvsignore files: Ignore generated .oaf files - -2001-02-13 JP Rosevear <jpr@ximian.com> - - * art/Makefile.am: install new files - - * art/*view.xpm: add files from calendar/gui - -2001-02-11 Chris Toshok <toshok@ximian.com> - - * configure.in: rework ldap check logic so it'll work to - --disable-ldap if you've previously configured with --enable-ldap. - -2001-02-11 Gediminas Paulauskas <menesis@delfi.lt> - - * data/evolution.keys, evolution.desktop: removed, they are generated. - * data/evolution.keys.in, evolution.desktop.in: new untranslated files. - * data/evolution.desktop: removed, it duplicates above. - * Makefile.am, data/Makefile.am: reflect above changes, merge - translations. - -2001-02-09 Jeffrey Stedfast <fejj@ximian.com> - - * configure.in: Added hacks to check for Mozilla libs like nspr - and nss that we will need for SSL and S/MIME. - -2001-02-09 Michael Meeks <michael@ximian.com> - - * configure.in: depend on bonobo >= 0.36 - -2001-02-08 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Upped the version number of gal required to 0.5. - -2001-02-07 JP Rosevear <jpr@ximian.com> - - * README: Update to latest requirements - -2001-02-05 Jeffrey Stedfast <fejj@ximian.com> - - * .cvsignore: Added xml-* files. - -2001-02-05 Gustavo Maciel Dias Vieira <gdvieira@zaz.com.br> - - * configure.in (ALL_LINGUAS): Added pt_BR to ALL_LINGUAS. - -2001-02-04 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Require version 0.4.99.8 of gal. - -2001-02-03 Federico Mena Quintero <federico@ximian.com> - - * configure.in: Make sure we have gnome-libs 1.2.9 or higher. - -2001-02-01 Chris Toshok <toshok@ximian.com> - - * configure.in: allow --enable/disable-ldap. - -2001-02-01 Jason Leach <jasonleach@usa.net> - - * tools/killev: Fix this script to make it work with Solaris. - Patch from Louise Miller. - -2001-01-29 Eskil Heyn Olsen <eskil@eazel.com> - - reviewed by: JP Rosevear <jpr@ximian.com> - - * acconfig.h: - Added the ENABLE_NNTP define - - * configure.in: - Fixed the NNTP m4 section. - -2001-01-29 Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz> - - * configure.in: added sk to ALL_LINGUAS. - * evolution.desktop: added Slovak messages. - -2001-01-27 Jason Leach <jasonleach@usa.net> - - * configure.in (AC_OUTPUT): remove - widgets/shortcut-bar/Makefile from here. - -2001-01-25 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Upped the required version of gal in evolution. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * art/Makefile.am (images_DATA): Add the missing .xpm files. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * art/Makefile.am (images_DATA): Add `24_find_contacts.xpm', - `16_print_xpm', `16_configure_addressbook'. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * art/Makefile.am (images_DATA): Add `24_all_contacts.xpm'. - -2001-01-24 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Upped the required version of gal in evolution. - -2001-01-22 Tuomas Kuosmanen <tigert@ximian.com> - - * art/splash.png: From the "Ideas from the shower" department: - new splash screen. - -2001-01-17 JP Rosevear <jpr@ximian.com> - - * README: Update package requirements - -2001-01-19 Jason Leach <jasonleach@usa.net> - - * configure.in: Changed a leftover $with_x_mailer to - $with_sub_version. Made it so that if $with_sub_version isn't - specified, we don't try to output it, and also corrected the way - SUB_VERSION is defined. - -2001-01-18 Federico Mena Quintero <federico@ximian.com> - - * Makefile.am: Um, why was the doc directory removed from SUBDIRS? - -2001-01-17 Larry Ewing <lewing@helixcode.com> - - * configure.in (EVOLUTION_DIR): add the - doc/devel/importer/Makefile as a target. - -2001-01-17 Ettore Perazzoli <ettore@ximian.com> - - * acconfig.h: Add `SUB_VERSION', remove `XMAILER_VERSION'. - - * configure.in: Removed `--with-x-mailer' option; replaced with a - more generic `--with-sub-version' option. So, don't define - `X_MAILER'; instead, define `SUB_VERSION'. - -2001-01-16 Chris Toshok <toshok@helixcode.com> - - * configure.in: add --enable-nntp switch. default is no. - -2001-01-16 Dan Winship <danw@ximian.com> - - * configure.in, acconfig.h: Add --with-x-mailer to set the version - string that appears in the X-Mailer header. - -2001-01-15 Christopher James Lahey <clahey@ximian.com> - - * configure.in: Changed the required version of gal. - -2001-01-15 Tuomas Kuosmanen <tigert@ximian.com> - - * art/16_copy_message.xpm, art/16_move_message.xpm: icons for the - Message->Move/Copy to folder -menu entries. - -2001-01-15 Tuomas Kuosmanen <tigert@ximian.com> - - * art/evolution-calendar-mini.png: New version of calendar icon that - looks more like a calendar and not a dictionary or something :) - - Btw, the icons get scaled for some reason, even though that is - not necessary as all of those should be 16x16 pixels. Can anyone look - into this? - -2001-01-15 Dietmar Maurer <dietmar@ximian.com> - - * *.c: changed the signature of the property_bag get/set - functions. - -2001-01-14 JP Rosevear <jpr@ximian.com> - - * configure.in: remove old config message - -2001-01-14 Damon Chaplin <damon@helixcode.com> - - * tools/evolution-move-tasks: new script to move tasks from the - Calendar folder to the new Tasks folder, so people won't lose tasks. - This can be deleted after a few releases. - - * tools/Makefile.am (bin_SCRIPTS): added above. - - * configure.in: added default_user/local/Tasks/Makefile to AC_OUTPUT. - -2001-01-12 Jeffrey Stedfast <fejj@ximian.com> - - * config.h.in: Removed GPG stuff. - - * acconfig.h: Take out all refs to PGP and GPG stuff. - - * configure.in: Take out the PGP/GPG detection stuff. - -2001-01-12 Federico Mena Quintero <federico@ximian.com> - - * configure.in: Suggest what to do if gtk-doc is not found. - -2001-01-12 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Make evolution depend on the new version of gal. - -2001-01-12 Dan Winship <danw@ximian.com> - - * MAINTAINERS, AUTHORS, README: Ximianize. Also update the README - a bit and mention the OAF stable branch. - -2001-01-11 Dan Winship <danw@helixcode.com> - - * art/priority-high.xpm: Add a white outline around the "!" so it - still shows up clearly in selected rows when your theme selection - color is reddish. (Problem pointed out by Federico.) - -2001-01-11 Federico Mena Quintero <federico@helixcode.com> - - * configure.in: At the end of the configure process, report - whether the documentation files will be built or not. - -2001-01-10 Tuomas Kuosmanen <tigert@helixcode.com> - - * art/move-message.png, art/move-message.png: New versions. - -2001-01-09 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (AC_OUTPUT): Added calendar/gui/alarm-notify/Makefile. - -2001-01-05 Tuomas Kuosmanen <tigert@helixcode.com> - - * art/evolution-contacts-mini.png: This looks more pretty. - -2001-01-03 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Removed camel/providers/mbox/Makefile and - camel/providers/mh/Makefile. - -2001-01-01 Michael Meeks <michael@helixcode.com> - - * configure.in: Require bonobo 0.31 - -2000-12-24 Not Zed <NotZed@HelixCode.com> - - * configure.in: If we find threads ok, then always turn on - ENABLE_THREADS. - -2000-12-14 Christopher James Lahey <clahey@helixcode.com> - - * NEWS (Addressbook): Added a bit of addressbook NEWS. - - * configure.in: Updated the gal check to require gal 0.4. - -2000-12-14 Christopher James Lahey <clahey@helixcode.com> - - * art/mail-new.xpm, art/mail-read.xpm, art/mail-replied.xpm: Moved - these images each up one pixel. - -2000-12-14 Jeffrey Stedfast <fejj@helixcode.com> - - * NEWS: Update. - -2000-12-14 JP Rosevear <jpr@helixcode.com> - - * NEWS: Update - -2000-12-14 Christopher James Lahey <clahey@helixcode.com> - - * art/splash.png: New splash from Jimmac. - -2000-12-12 Christopher James Lahey <clahey@helixcode.com> - - * README: Removed mention of ETable and EText in widgets - directory. - -2000-12-12 Dan Winship <danw@helixcode.com> - - * README: Mention the gconf stable branch. - -2000-12-07 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Updated the required version of gal. - -2000-12-07 Radek Doulik <rodo@helixcode.com> - - * configure.in (GTKHTML_LIBS): renamed HTMLEditor.idl to - Editor.idl - -2000-12-06 Kjartan Maraas <kmaraas@gnome.org> - - * data/evolution.keys: Added some Norwegian translations. - -2000-12-06 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Increased the required version of gal. - -2000-12-05 JP Rosevear <jpr@helixcode.com> - - * README: minor tweak - -2000-12-05 Not Zed <NotZed@HelixCode.com> - - * configure.in: Added camel/tests/stream/Makefile.am. - -2000-12-01 Dan Winship <danw@helixcode.com> - - * README: gnome-vfs depends on gconf, so add that. - -2000-11-30 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Bumped required gal version to 0.2.99.4 for - e_str_make_safe. - - * README: Added some necessary :'s in the pilot-link cvs stuff. - -2000-11-30 Gediminas Paulauskas <menesis@delfi.lt> - - * calendar/gui/main.c, executive-summary/component/main.c, mail/main.c, - shell/main.c, notes/main.c, - addressbook/gui/component/addressbook-factory.c: - removed #ifdef ENABLE_NLS/#endif on Miguel's request. - -2000-11-29 JP Rosevear <jpr@helixcode.com> - - * README: Update pilot info - -2000-11-29 Dan Winship <danw@helixcode.com> - - * configure.in: Bump required gal version to 0.2.99.3 for iconv - changes - -2000-11-29 Federico Mena Quintero <federico@helixcode.com> - - * COPYING-DOCS: Added a copy of the GNU Free Documentation - License. - - * Makefile.am (EXTRA_DIST): Added COPYING-DOCS. - -2000-11-28 JP Rosevear <jpr@helixcode.com> - - * acconfig.h: Add USE_FLOCK, USE_FCNTL, USE_FLOCK - - * configure.in: Auto* magic for various camel locking types - -2000-11-28 Not Zed <NotZed@HelixCode.com> - - * configure.in (AC_OUTPUT): Added camel/tests/folder/Makefile - -2000-11-27 JP Rosevear <jpr@helixcode.com> - - * AUTHORS: Update - hopefully I assigned blame correctly :-) - - * MAINTAINERS: ditto - -2000-11-27 JP Rosevear <jpr@helixcode.com> - - * configure.in: Correct the bonobo version error message - - * README: Update - -2000-11-24 Not Zed <NotZed@HelixCode.com> - - * configure.in: Added camel/tests stuff to output macro. - -2000-11-14 Not Zed <NotZed@HelixCode.com> - - * configure.in: Added local provider dir to output macro. - -2000-11-21 Dan Winship <danw@helixcode.com> - - * configure.in: Check for libgpgme. (Support not added to mail - yet.) - -2000-11-21 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (EVOLUTION_DIR): Removed the - default_user/local/Tasks/Makefile until the relevant files are on - CVS. - -2000-11-18 Miguel de Icaza <miguel@helixcode.com> - - * Added widgets/menus that contains the gal-view-menus.c code from - Gal that depended on Bonobo. - - * configure.in: Update list of Makefiles; - - * widgets/Makefile.am: Update. - -2000-11-13 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Update the gal reqiurement version. - -2000-11-10 Michael Meeks <michael@helixcode.com> - - * configure.in: Require Bonobo >= 0.29, due to the XSync - fix. - -2000-11-09 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Require gal 0.2.99.1. - -2000-11-06 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Require gal 0.2.1.3 - -2000-11-06 Dan Winship <danw@helixcode.com> - - * configure.in (GTKHTML_LIBS): ${prefix} doesn't get defaulted - until the end of configure, so check if it's "NONE" and use - ${ac_default_prefix} if so. - -2000-11-06 Radek Doulik <rodo@helixcode.com> - - * configure.in (GTKHTML_LIBS): also look for HTMLEditor.idl in - ${prefix}/share/gtkhtml - -2000-11-03 Radek Doulik <rodo@helixcode.com> - - * configure.in (BONOBO_HTML_GNOME_CFLAGS): raise required version - number to 0.8 - added check for HTMLEditor.idl file - -2000-11-02 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Require gal 0.2.1.2. - -2000-11-02 Michael Meeks <michael@helixcode.com> - - * configure.in: Require Bonobo-0.27+ - -2000-11-01 Gediminas Paulauskas <menesis@delfi.lt> - - * addressbook/ename/.cvsignore, addressbook/gui/minicard/.cvsignore, - calendar/doc/.cvsignore, widgets/e-paned/.cvsignore, - widgets/e-table/.cvsignore, widgets/e-text/.cvsignore: added these - files. - * calendar/gui/.cvsignore, composer/.cvsignore, - executive-summary/.cvsignore, executive-summary/component/.cvsignore, - po/.cvsignore: added some files to ignore. - - * addressbook/gui/component/addressbook-factory.c, mail/main.c, - shell/main.c, calendar/gui/main.c, notes/main.c, - executive-summary/component/main.c: call *textdomain() only if - ENABLE_NLS is defined. - -2000-11-01 Gediminas Paulauskas <menesis@delfi.lt> - - * configure.in: added lt to ALL_LINGUAS. - -2000-10-30 Dan Winship <danw@helixcode.com> - - * configure.in: fix up printing of kerberos configuration status - -2000-10-27 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Require gal cvs version. - -2000-10-27 <jpr@helixcode.com> - - * tools/killev: Kill executive summary components - -2000-10-25 Iain Holmes <iain@helixcode.com> - - * configure.in: Added executive-summary stuff - - * Makefile.am: Added the executive-summary subdirs. - -2000-10-23 Dan Winship <danw@helixcode.com> - - * notes/Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR - - * configure.in: set localedir here to use in Makefiles. - (AM_GNOME_GETTEXT doesn't actually always set it to - $(datadir)/locale). - -2000-10-23 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Updated the gal check to check for gal 0.2.1. - -2000-10-22 Robert Brady <rwb197@zepler.org> - - * configure.in: Added "en_GB" to ALL_LINGUAS. - -2000-10-20 Michael Meeks <michael@helixcode.com> - - * notes/component-factory.c (control_activate_cb): - -2000-10-19 Christopher James Lahey <clahey@helixcode.com> - - * NEWS (General, Addressbook): Updated NEWS for addressbook and - ETable. - -2000-10-19 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Updated the gal check to check for gal 0.2. - -2000-10-19 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in (EVOLUTION_MICRO_VERSION): 6. - - * Makefile.am (EXTRA_DIST): Remove `evolution.spec.in'. - (dist-hook:): Removed. - -2000-10-18 Michael Meeks <michael@helixcode.com> - - * notes/component-factory.c (control_activate, control_deactivate), - (create_view): cripple, not worth updating to new UI code. - -2000-10-17 Tuomas Kuosmanen <tigert@helixcode.com> - - * art/splash.png: This looks happier than the dark piece of rusty - metal. And the Big Dig in Boston is ugly looking too. Finnish - road poles are much more cool! - -2000-10-15 Peter Williams <peterw@helixcode.com> - - * tools/verify-evolution-install.sh (libcamelvee): Check - for linkage against version 0.5 libcamelvee, not version 0.3. - This should track with the version of Evolution itself. - (rm -f $ldddfile): Remove a temporary file. - -2000-10-15 Kjartan Maraas <kmaraas@gnome.org> - - * configure.in: Added "nn" to ALL_LINGUAS. - -2000-10-14 Ettore Perazzoli <ettore@helixcode.com> - - * art/Makefile.am (images_DATA): Add `splash.png'. - -2000-10-14 Tuomas Kuosmanen <tigert@helixcode.com> - - * art/splash.png: umm.. it's a splash screen image. - -2000-10-11 JP Rosevear <jpr@helixcode.com> - - * configure.in: Fix bonobo error message - -2000-10-11 Jesse Pavel <jpavel@helixcode.com> - - * data/evolution.keys: Added support for the text/calendar and - text/x-calendar MIME types. - -2000-10-10 Gediminas Paulauskas <menesis@delfi.lt> - - * configure.in: Added lt to ALL_LINGUAS. - -2000-10-10 Tuomas Kuosmanen <tigert@helixcode.com> - - * calendar/gui/recur.xpm: Updated round-we-go-thingy icon.. - -2000-10-06 Chris Toshok <toshok@helixcode.com> - - * art/empty.xpm: make it transparent instead of white. - -2000-10-06 Christophe Merlet <christophe@merlet.net> - - * *.desktop: Added french strings. - -2000-10-05 Dan Winship <danw@helixcode.com> - - * tools/Makefile.am (EXTRA_DIST): Add verify-evolution-install.sh - to EXTRA_DIST - -2000-10-05 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Check for isblank - - * config.h.in: - * acconfig.h: #undef HAVE_ISBLANK - -2000-10-05 Michael Meeks <michael@helixcode.com> - - * configure.in: Bump Bonobo requirement to >= 0.20 - -2000-10-05 Iain Holmes <iain@helixcode.com> - - * executive-summary/*: Added the executive summary stuff. - - * ui/evolution-executive-summary.xml: New. - - * art/add-service.png: New icon. - -2000-10-03 Matt Bissiri <bissiri@eecs.umich.edu> - - * ui/evolution-addressbook-ldap.xml, - * ui/evolution-addressbook.xml, - * ui/evolution-calendar.xml, - * ui/evolution-contact-editor.xml: - Fixed typo `_decr' -> `_descr', so some missing tooltips will appear. - Also fixed some typos in descr values. - -2000-09-29 Peter Williams <peterw@helixcode.com> - - * ui/Makefile.am (XML_FILES): Install the new evolution-subscribe.xml - file. - -2000-09-29 Chris Toshok <toshok@helixcode.com> - - * ui/evolution-mail.xml: add a Settings/Manage Subscriptions... - menu item. - - * ui/evolution-subscribe.xml: add a File/Close menu item. - -2000-09-28 Chris Toshok <toshok@helixcode.com> - - * ui/evolution-subscribe.xml: add a FolderSearch control, and - change "Refresh" to "RefreshList". - -2000-09-27 Chris Toshok <toshok@helixcode.com> - - * ui/evolution-subscribe.xml: add an Refresh List button.. - -2000-09-27 Chris Toshok <toshok@helixcode.com> - - * ui/Makefile.am (XML_FILES): add evolution-subscribe.xml. - - * ui/evolution-subscribe.xml: new file. - -2000-09-25 Jeffrey Stedfast <fejj@helixcode.com> - - * ui/evolution-mail.xml: Moved the (un)select all menu items over - to the Edit menu - this looks nicer. - -2000-09-25 Jeffrey Stedfast <fejj@helixcode.com> - - * ui/evolution-mail.xml: Added some new menu items to the Message - menu like (un)select all and moved "mark as read" to the Message - menu. - -2000-09-25 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Moved addressbook/ename to e-util/ename so - generate e-util/ename/Makefile and don't generate - addressbook/ename/Makefile - -2000-09-23 Tuomas Kuosmanen <tigert@localhost> - - * art/attachment.xpm - * art/add-attachment.png: OOPS. The attachment.xpm was not the one - I thought, so I accidentally replaced the paperclip icon in the mail - list column, which wasnt my intention. I hope this works now. The old - one is back, instead the toolbar icon to add attachment is now called - "add-attachment.png" as you can see also from above. Bummer. Sorry :) - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * libversit/vcc.y: Fixed some warnings. Fixed a bug where quoted - printable fields were reading in semi-colons that should have been - field separators. - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * ui/Makefile.am: Added evolution-addressbook-ldap.xml. - - * ui/evolution-addressbook-ldap.xml: New file. (A Variation on - evolution-addressbook.xml) - - * ui/evolution-addressbook.xml: Added View All and Stop buttons. - -2000-09-21 Federico Mena Quintero <federico@helixcode.com> - - * ui/evolution-calendar.xml: Removed the AboutCalendar stuff. - - * ui/evolution.xml: Fix mis-spelling of "calendar". - -2000-09-21 Michael Meeks <michael@helixcode.com> - - * notes/component-factory.c (control_activate): upd. - -2000-09-20 Christopher James Lahey <clahey@helixcode.com> - - * ui/.cvsignore: Added a cvsignore file here. - -2000-09-20 Christopher James Lahey <clahey@helixcode.com> - - * ui/Makefile.am (XML_FILES): Added evolution-contact-editor.xml. - - * ui/evolution-contact-editor.xml: New file for the UI for the - evolution contact editor. - -2000-09-20 Tuomas Kuosmanen <tigert@gimp.org> - - * art/attachment.xpm - * art/send.png: new icons for "compose mail" dialog... - -2000-09-19 Dan Winship <danw@helixcode.com> - - * configure.in: alter the krb4 check a bit to deal with configure - cache suckage. (If you do AC_CHECK_LIB with the same library and - function name but different LDFLAGS, it will still use the result - of the previous check. So use a different function the second - time.) - -2000-09-18 Dan Winship <danw@helixcode.com> - - * README: add gal as a dependency - -2000-09-18 Jeffrey Stedfast <fejj@helixcode.com> - - * art/score-*.xpm: stupid looking icons for use with displaying - scores in the message-list view. These need a makeover BADLY ;-) - -2000-09-18 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Added check for gnome-app-lib. Removed - directories that have been moved to gal. - -2000-09-15 Dan Winship <danw@helixcode.com> - - * configure.in, evolution.spec.in: remove spec file. We haven't - been keeping it up to date, and it's only good for RH anyway, and - if people really want a spec file they can get it from our SRPMs. - -2000-09-07 Michael Meeks <michael@helixcode.com> - - * configure.in: Require Bonobo 0.19 - -2000-09-13 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Added widgets/e-reflow/Makefile. Replaced - addressbook/gui/minicard/Makefile with - addressbook/gui/widgets/Makefile. - -2000-09-13 Tuomas Kuosmanen <tigert@localhost> - - * art/pin.png: added icon for the folder tree "pin down" button - -2000-09-12 JP Rosevear <jpr@helixcode.com> - - * NEWS (Calendar): Pilot stuff - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: The notes subdir isn't actually used, so remove - it. - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: 0.5. - -2000-09-12 Jeffrey Stedfast <fejj@helixcode.com> - - * NEWS (Mailer): Added Sent/Outbox feature descriptions - -2000-09-12 Dan Winship <danw@helixcode.com> - - * NEWS (Mailer): add most (but not all) 0.5 Mailer features - - * configure.in: s/Sentbox/Sent/ - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * art/Makefile.am (buttonsdir): Install the new button icons into - `$(datadir)/images/evolution/buttons'. - -2000-09-11 Tuomas Kuosmanen <tigert@helixcode.com> - - * art/fetch-mail.png - * art/compose-message.png - * art/reply.png - * art/reply-to-all.png - * art/forward.png - * art/move-message.png - * art/copy-message.png: New icons for the main window toolbar - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * NEWS: Added 0.5 changes for ETable and Addressbook. - -2000-09-07 Dan Winship <danw@helixcode.com> - - * README: Add a mention of the verify-evolution-install.sh script - in tools/. - -2000-09-03 Jeffrey Stedfast <fejj@helixcode.com> - - Reversed my last change as it broke configure, how do I get it so - that we can do folders with spaces in the name!? - -2000-09-03 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Renamed default_user/local/Sentbox to - default_user/local/Sent\ Mail as Ettore and Danw are picky about - folder names - -2000-09-02 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Added calendar/conduits/Makefile, - calendar/conduits/calendar/Makefile and - calendar/conduits/todo/Makefile to the list of makefiles to - output. - -2000-09-01 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Add default_user/local/Sentbox/Makefile to the - list of makefiles to output - -2000-08-31 Peter Williams <peterw@helixcode.com> - - * configure.in (kerberos): Check and see if krb_sendauth needs - prototyping. (#define NEED_KRB_SENDAUTH_PROTO). Also check - for a libkrb that doesn't need -ldes. - - * acconfig.h: #undef it - -2000-08-30 Lauris Kaplinski <lauris@helixcode.com> - - * configure.in: AC_DEFINE(USING_GNOME_PRINT_0_20) - - * acconfig.h: #undef that - -2000-08-30 Peter Williams <peterw@helixcode.com> - - * configure.in: Robustify the kerberos checks. - -2000-08-29 Dan Winship <danw@helixcode.com> - - * configure.in, acconfig.h: decruft - -2000-08-28 Jesus Bravo Alvarez <jba@pobox.com> - - * configure.in: Added Portuguese (pt) to ALL_LINGUAS - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * configure.in: Require oafized bonobo - -2000-08-24 Federico Mena Quintero <federico@helixcode.com> - - * configure.in: Ahem. If you add dependencies on libraries, make - sure things still build. Fixed the libunicode foo. - -2000-08-22 Lauris Kaplinski <lauris@helixcode.com> - - * widgets/e-text/e-text.c (_get_position_from_xy): Don't crash on illegal string - -2000-08-22 Lauris Kaplinski <lauris@helixcode.com> - - * widgets/e-text/e-text.c (e_text_event): Use e_utf8_from_gtk_event_key - to translate GDK_KEY_PRESS to insertable UTF-8 string - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * announcement-0.4.1.txt: Updated dependency list. - -2000-08-22 Lauris Kaplinski <lauris@helixcode.com> - - * widgets/e-text/e-text.c: Use byte based UTF-8 syntax - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * announcement-0.4.1.txt: Announcement message - -2000-08-19 Mathieu Lacage <mathieu@gnu.org> - - Fixes compile for non-standard prefixes. Mainly in idl - compilation where -I`gnome-config --datadir`/idl is replaced - by `gnome-config --cflags idl` (ugly but it works at least) - and add some random _CFLAGS here and there and _LIBS for linking. - * addressbook/gui/component/select-names/Makefile.am - * composer/Makefile.am - * e-util/Makefile.am - * filter/Makefile.am - * mail/Makefile.am - * shell/Makefile.am - * widgets/e-text/Makefile.am - - -2000-08-21 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-paned.c, - widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c: Added code - to make handle position persist across resizes. - -2000-08-20 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Fixed a warning. - -2000-08-20 arik devens <arik@helixcode.com> - - * widgets/e-text/Makefile.am (INCLUDES): added UNICODE_CFLAGS - support so that compiling in an alternate prefix works. - -2000-08-19 Lauris Kaplinski <lauris@helixcode.com> - - * widgets/e-text/e-text.h: Commented out Suckfont, added EFont - * widgets/e-text/e-text.c: Ported to UTF-8 - -2000-08-18 Peter Williams <peterw@helixcode.com> - - * configure.in (gnome-vfs): Check for new enough gnome-vfs - (needs gnome_vfs_mime_get_default_action_without_fallback) - -2000-08-14 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (AC_OUTPUT): Generate - doc/devel/calendar/cal-util/Makefile. - -2000-08-14 Peter Williams <peterw@helixcode.com> - - * configure.in: Check for db1/db.h too, which is what - RH 7.0 uses for the old db headers. Patch from Kenny Graunke - <kwg@teleport.com> - -2000-08-13 Chris Toshok <toshok@helixcode.com> - - * configure.in: offer --enable-pilot-conduits to add pilot - conduits if the user wants them. - -2000-08-13 Dan Winship <danw@helixcode.com> - - * configure.in: Fix the name of the binary to look for for PGP5 - -2000-08-12 Michael Meeks <michael@helixcode.com> - - * configure.in: Check for Bonobo 0.17 - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Added addressbook/gui/search/Makefile. - -2000-08-12 Dan Winship <danw@helixcode.com> - - * configure.in, README: Depend on gnome-vfs 0.3 - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/.cvsignore, widgets/e-text/Makefile.am, - widgets/e-text/e-entry-test.c: Added a test for the EEntry widget. - -2000-08-09 Dan Winship <danw@helixcode.com> - - * data/evolution.keys: New file containing MIME keys for - Evolution. Currently just the addressbook minicard display. - - * data/Makefile.am (mime_DATA): add evolution.keys - -2000-08-09 Peter Williams <peterw@helixcode.com> - - * configure.in (EVOLUTION_DIR): Remove the warning about camel-async. - -2000-08-08 Peter Williams <peterw@helixcode.com> - - * Makefile.am (SUBDIRS): Reenable the calendar. Oops. - -2000-08-05 Dan Winship <danw@helixcode.com> - - * tools/verify-evolution-install.sh: Look for oafinfo files in - oaf's prefix, not gnome-libs's. Allow binaries to be installed - anywhere in $PATH. - - * configure.in, README: Update the README and the text of the - Bonobo configure check to match reality. Remove the 0.15 vs - 0.15-and-a-half check since we require post-0.16 now. - -2000-08-03 JP Rosevear <jpr@helixcode.com> - - * configure.in: Remove gconf check - -2000-08-03 Alastair McKinstry <mckinstry@computer.org> - - * configure.in (ALL_LINGUAS): Add Irish translation - -2000-08-02 Michael Meeks <michael@helixcode.com> - - * configure.in: update for BonoboX - -2000-08-02 Dan Winship <danw@helixcode.com> - - * configure.in (AC_OUTPUT): Add camel/providers/nntp - -2000-08-02 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Made clicking choose the right - character even if show_borders is on. - -2000-08-01 Dan Winship <danw@helixcode.com> - - * configure.in, acconfig.h: Add checks for GPG, PGP 5 and PGP 2. - Only record the first one found. - -2000-08-01 Damon Chaplin <damon@helixcode.com> - - * configure.in (AC_OUTPUT): removed calendar/doc/* - -2000-08-01 Not Zed <NotZed@HelixCode.com> - - * configure.in: Added mh provider. - -2000-07-27 Dan Winship <danw@helixcode.com> - - * configure.in: Check for gconf_client_get_default (gconf 0.5 vs - newer) - -2000-07-26 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Bump version number to 0.3. - -2000-07-26 Peter Williams <peterw@helixcode.com> - - * widgets/e-table/e-table-scrolled.c (right_click_proxy): Default - the return value to 0. - -2000-07-25 Dan Winship <danw@helixcode.com> - - * configure.in: some unrelated changes: check for mkdtemp, - gnome_vfs_mime_get_default_action_without_fallback, and a - setuid/setgid movemail binary. - - * acconfig.h: add MOVEMAIL_PATH - -2000-07-25 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Added addressbook/conduit/Makefile. - -2000-07-21 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Made focus in not change your selection - position. - -2000-07-21 Szabolcs BAN <shooby@gnome.hu> - - * calendar/gui/event-editor.c: Typo fix - -2000-07-20 Peter Williams <peterw@helixcode.com> - - * configure.in (THREADS_CFLAGS): Make threads mandatory - again. - -2000-07-19 Fatih Demir <kabalak@gmx.net> - - * evolution.desktop & data/evolution.desktop: Added - the Turkish desktop entries. - -2000-07-17 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (EVOLUTION_DIR): Typo fix. - - * configure.in (AC_OUTPUT): Added the doc/devel Makefiles. - (EVOLUTION_DIR): Substitute EVOLUTION_DIR for the top_srcdir. - Added checks for gtk-doc. - -2000-07-13 Peter Williams <peterw@curious-george.helixcode.com> - - * configure.in (end): Bigass warnings for camel-async branch - (remove them later). - -2000-07-12 Federico Mena Quintero <federico@helixcode.com> - - * configure.in: Make gnome-print-0.20 mandatory. We will bail out - with CVS HEAD versions to avoid breakage. - -2000-07-10 Ettore Perazzoli <ettore@helixcode.com> - - * Version 0.2. - - * configure.in: Reverse the GtkHTML check. - -2000-07-10 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Updated to check for required GtkHTML and - gnome-print - -2000-07-10 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Remove the conduits stuff for now. They depend on - CVS gnome-pilot, and this is not good for the release. - -2000-07-10 Dan Winship <danw@helixcode.com> - - * README: updates - -2000-07-10 Seth Alves <alves@hungry.com> - - * configure.in: added makefiles for calendar conduits - -2000-07-10 Dan Winship <danw@helixcode.com> - - * configure.in: Add a check for Bonobo 0.15 vs Bonobo post-0.15 - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Don't draw quite as large a "flat_box". - If draw_borders is TRUE, cause the cursor to change even if not - editing. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-entry.c: Removed some border padding and set - the "draw_borders" argument of the contained GtkText. - - * widgets/e-text/e-text.c, widget/e-text/e-text.h: Added a - "draw_borders" argument which, if set, makes the EText look more - like a GtkEntry. - -2000-07-09 Tuomas Kuosmanen <tigert@gimp.org> - - * art/evolution-contacts.png: updated so it has better contrast - against the background. - - * art/evolution-contacts-small.png: Fits the style of the new contacts - icon, this is a sigle card. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text-model.c (e_text_model_real_get_text): - Return "" instead of NULL. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * art/Makefile.am: Fixed EXTRA_DIST for make distcheck. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-entry.c: Set "anchor" and "fill_clip_rectangle" - arguments. - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added - "fill_clip_rectangle" argument which describes whether to accept - clicks throughout the clipping rectangle. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-entry.c: Fixed some typos. - -2000-07-07 Tuomas Kuosmanen <tigert@gimp.org> - - * art/evolution-contacts.png: Changed icon (hi ettore) - The old handshake one was a little too firm handshake.. - this is a rolodex icon.. - -2000-07-07 Dan Winship <danw@helixcode.com> - - * configure.in: make pthreads not required again, since they - aren't, and remove widgets/e-toolbar/Makefile from AC_OUTPUT since - that dir doesn't exist any more. - -2000-07-06 Chris Toshok <toshok@helixcode.com> - - * configure.in (AC_OUTPUT): remove the default_user Directories - dir. - -2000-07-06 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am, libical/configure.in: Fixed some make distcheck - errors. - -2000-07-05 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in (GNOME_VFS_CFLAGS): Define. - (GNOME_VFS_LIBS): Define. - -2000-07-03 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Add - `addressbook/gui/component/select-names/Makefile' to the - `AC_OUTPUT()' list. - -2000-07-03 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/Makefile.am: Added e-entry.c and e-entry.h. - - * widgets/e-text/e-entry.c, widgets/e-text/e-entry.h: New files to - be a widget containing a text item. - - * widgets/e-text/e-text.c: Fixed some spacing. - -2000-06-29 Ettore Perazzoli <ettore@helixcode.com> - - * notes/component-factory.c (owner_set_cb): Get an - EvolutionShellClient instead of an Evolution_Shell to match the - changes in libeshell. - -2000-06-29 Peter Williams <peterw@helixcode.com> - - * configure.in: Re-enable GNOME_PILOT_CHECK. - Change AC_MSG_CHECKING([For...]) to [for...]. It's the little - things that matter. - -2000-06-28 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: `AM_PATH_GCONF'. - -2000-06-27 Peter Williams <peterw@curious-george.helixcode.com> - - * configure.in (ctime_r): Check for whether ctime_r takes - two (Linux) or three (Solaris) arguments. - (AC_OUTPUT): Don't create notes/Makefile twice. - - * acconfig.h: Add CTIME_R_THREE_ARGS to the list. - -2000-06-26 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Calculate height including if - clip_height is set to -1. - -2000-06-26 Peter Williams <peterw@curious-george.helixcode.com> - - * configure.in (THREADS_CFLAGS): Add option --enable-broken-threads - to turn on the threading stuff in evolution-mail. Defaults to no. - - * acconfig.h: Add USE_BROKEN_THREADS to the list. - -2000-06-25 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Use `glib-config' instead of `$GLIB_CONFIG' as the - latter is not actually defined anywhere. - -2000-06-25 Peter Williams <peterw@helixcode.com> - - * configure.in (pthread stuff): Make threads required due - to threaded evolution-mail. Subst in the THREADS_LIBS et - al. - - * tests/Makefile.am: Remove USE_THREADS conditional as we - always use threads now. - -2000-06-21 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Fixed some vertical scroll bugs. - -2000-06-21 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Fix a bug with intial vertical scroll. - -2000-06-21 Christopher James Lahey <clahey@helixcode.com> - - * notes/e-note.c, widgets/meeting-time-sel/e-meeting-time-sel.c, - widgets/shortcut-bar/e-icon-bar.c: Removed the usage of "x" and - "y" arguments to EText. - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Removed the - "x" and "y" arguments to EText. Added vertical scrolling. - -2000-06-20 Damon Chaplin <damon@helixcode.com> - - * widgets/meeting-time-sel/e-meeting-time-sel-item.c: - * widgets/meeting-time-sel/e-meeting-time-sel.c: fixed a few warnings. - -2000-06-17 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Made EText use the font from the - canvas's style if one isn't set. - -2000-06-17 Damon Chaplin <damon@helixcode.com> - - * widgets/meeting-time-sel/*: updated to use EText items rather than - GtkEntry widgets and added support for adding new rows. - -2000-06-15 Dan Winship <danw@helixcode.com> - - * README: bye bye goad - -2000-06-14 Damon Chaplin <damon@helixcode.com> - - * README (http): added command to co ORBit. - -2000-06-13 Jeffrey Stedfast <fejj@helixcode.com> - - * configure.in: Added IMAP into the build - -2000-06-13 Ettore Perazzoli <ettore@helixcode.com> - - * notes/Makefile.am (SHELL_OBJS): Removed. - (evolution_notes_LDADD): Link with - `$(top_builddir)/shell/libeshell.a'. - -2000-06-12 Ettore Perazzoli <ettore@helixcode.com> - - * widgets/Makefile.am (SUBDIRS): build `misc' before everything - else. - - * Makefile.am: Install `evolution.png' and `evolution.desktop' - where appropriate. - - * evolution.png: New. For now, it's just a copy of - `art/evolution-inbox.png'. - - * evolution.desktop: New. - -2000-06-10 Zbigniew Chyla <chyla@buy.pl> - - * configure.in: Added pl (Polish) to ALL_LINGUAS - -2000-06-09 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Added new directory `shell/glade'. - -2000-06-07 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-paned.c, - widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c: Added a - "quantum" argument for making the panes move in jumps. - -2000-06-07 Anders Carlsson <andersca@gnu.org> - - * configure.in: Create notes/Makefile - - * notes/*: Add preliminary yellow sticky notes. - -2000-06-05 Mathieu Lacage <mathieu@gnome.org> - - * addressbook/contact-editor/Makefile.am: make it - compile: add proper bonobo linking params. - * addressbook/gui/minicard/Makefile.am: idem. - * wombat/Makefile.am: add BONOBO_VFS_GNOME_CFLAGS. - cleanup some useless includes and libs. - -2000-06-02 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in (ALL_LINGUAS): Add `it' and `de'. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Released Evolution 0.1. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * tests/test-movemail.c: Reverted removal of e_setup_base_dir. - -2000-06-02 Jesus Bravo Alvarez <jba@pobox.com> - - * configure.in: Added pt (Portuguese) to ALL_LINGUAS - -2000-06-02 Dan Winship <danw@helixcode.com> - - * README: Update dependencies. Rewrite the GOAD vs OAF thing some - more to reflect OAF's new ascendency. Make the fact that you don't - need pilot stuff clearer. Add some new directories to the - directory layout section. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * widgets/misc/e-clipped-label.c: Free the finish data. - -2000-06-01 Christopher James Lahey <clahey@helixcode.com> - - * tests/test-movemail.c (main): Don't call e_setup_base_dir. - -2000-06-01 Dan Winship <danw@helixcode.com> - - * configure.in (AC_OUTPUT): add doc, doc/C - - * Makefile.am (SUBDIRS): add doc - -2000-05-31 Federico Mena Quintero <federico@helixcode.com> - - * widgets/misc/e-scroll-frame.[ch]: Imported GtkScrollFrame from - EOG and renamed it to EScrollFrame. - - * widgets/misc/Makefile.am (libemiscwidgets_a_SOURCES): Added - e-scroll-frame.[ch]. - -2000-05-30 Ettore Perazzoli <ettore@helixcode.com> - - * widgets/e-paned/e-vpaned.c (e_vpaned_handle_shown): Show the - handle even if the requisition for the child is zero. - * widgets/e-paned/e-hpaned.c (e_hpaned_handle_shown): Likewise. - -2000-05-26 Héctor García Alvarez <hector@scouts-es.org> - - * configure.in: Added Spanish language - -2000-05-25 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-vpaned.c: Fixed a - bug where we were resizing a non-existent window. - -2000-05-25 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-paned/e-hpaned.c, widgets/e-paned/e-paned.c, - widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c: Made - the handlebar disappear if either side is empty, hidden, or - requests 0 size. - -2000-05-24 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Added widgets/e-paned/Makefile. - - * tests/ui-tests/message-browser.c: Switched from GtkPaned to - EPaned. - - * widgets/Makefile.am: Added e-paned directory. - - * widgets/e-paned/, widgets/e-paned/.cvsignore, - widgets/e-paned/Makefile.am, widgets/e-paned/e-hpaned.c, - widgets/e-paned/e-hpaned.h, widgets/e-paned/e-paned.c, - widgets/e-paned/e-paned.h, widgets/e-paned/e-vpaned.c, - widgets/e-paned/e-vpaned.h: New widget based completely on - GtkPaned from 1.4. This will be more advanced soon. - -2000-05-22 Jeff Stedfast <fejj@helixcode.com> - - * configure.in: Readded camel/providers/smtp - -2000-05-22 Szabolcs BAN <shooby@gnome.hu> - - * configure.in: Added Hungarian language - -2000-05-18 Dan Winship <danw@helixcode.com> - - * configure.in (AC_OUTPUT): add camel/providers/vee - -2000-05-16 Ettore Perazzoli <ettore@helixcode.com> - - * art/Makefile.am: Install the mini icons. - -2000-05-16 Chris Toshok <toshok@helixcode.com> - - * configure.in: add --with-purify-options support, and default it - to what we at helix need - -Tue May 16 06:11:40 2000 Tuomas Kuosmanen <tigert@gimp.org> - - * art/evolution-calendar-mini.png art/evolution-inbox-mini.png - art/evolution-tasks-mini.png art/evolution-contacts-mini.png - art/evolution-notes-mini.png: new mini-icons for the tree view - of folders and stuff. - -2000-05-14 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (AC_OUTPUT): Added calendar/gui/dialogs/Makefile.am. - -2000-05-10 Matt Loper <matt@helixcode.com> - - * README: Added version and availability of required libunicode - library. - -2000-05-10 Dan Winship <danw@helixcode.com> - - * configure.in: Update versions needed for gnome-print, bonobo, - and gtkhtml. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * HACKING: We need a HACKING file. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Removed dist-hook section. - - * configure.in: Set the version number. Added a check for gnome - window icons. Removed a bunch of unused Makefiles. - - * tools/Makefile.am: Created a proper EXTRA_DIST section. - - * widgets/e-text/Makefile.am: Added - e-text-event-processor-types.h. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * art/Makefile.am: Added briefcase.png to get installed. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Remove the tooltip callback when - destroyed. - -2000-05-09 Matt Loper <matt@helixcode.com> - - * calendar/pcs/cal-backend.c (cal_backend_add_cal): Return nothing - for a 'void' function. - -2000-05-08 Christopher James Lahey <clahey@helixcode.com> - - * widget/e-text/e-text.c, widgets/e-text/e-text.h: Added an - activate signal. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * configure.in: Added new Directories section for the default_user. - -2000-05-06 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Updated for the new `default_user' directory - setup. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * configure.in: check for purify. - -2000-05-06 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added a - "changed" signal that gets sent whenever the text changes. - -2000-05-05 Ettore Perazzoli <ettore@helixcode.com> - - * Added `--enable-purify' flag. - -2000-05-05 Chris Toshok <toshok@helixcode.com> - - * shell/Makefile.am: add support for building purified evolution. - - * shell/.cvsignore: ignore evolution.pure - -2000-05-05 Chris Toshok <toshok@helixcode.com> - - * addressbook/backend/ebook/.cvsignore, - addressbook/contact-editor/.cvsignore, - addressbook/gui/component/.cvsignore, - addressbook/gui/minicard/.cvsignore, - addressbook/printing/.cvsignore, - calendar/cal-client/.cvsignore, - calendar/gui/.cvsignore, - calendar/pcs/.cvsignore, - filter/.cvsignore, - mail/.cvsignore, - shell/.cvsignore, - tests/.cvsignore, - widgets/e-table/.cvsignore, - widgets/e-text/.cvsignore, - widgets/meeting-time-sel/.cvsignore, - widgets/shortcut-bar/.cvsignore, - wombat/.cvsignore: ignore the .pure directory - -2000-05-04 Dan Winship <danw@helixcode.com> - - * configure.in: Oops. The Kerberos check was succeeding when it - shouldn't have (and thus breaking the pop3 build for "normal" - people). Fix. - -2000-05-03 Michael Meeks <michael@helixcode.com> - - * configure.in (xmlversion): Fix to remove older 'libxml' prefix. - -2000-05-02 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Do not output `doc/Makefile' because there is - nothing to generate it from. - -2000-05-02 Dan Winship <danw@helixcode.com> - - * configure.in, acconfig.h: add some minimal Kerberos checking. - This isn't intended to be generically useful at this point, it's - just there to give me a second POP auth mechanism to play with. - - Also remove a bit of cruft, and reorganize configure.in a bit. - -2000-05-02 NotZed <NotZed@HelixCode.com> - - * tests/test13.c: And here too. - - * tests/test2.c (main): REmoved gmime-utils.h - - * tests/Makefile.am (LDADD): Add libeutil to default link line. - (test_movemail_LDADD): Fixed order for libutil linking. - -2000-05-02 Matt Loper <matt@helixcode.com> - - * tests/Makefile.am: set G_LOG_DOMAIN. - * tests/ui-tests/Makefile.am: same. - * widgets/e-text/Makefile.am: same. - * widgets/meeting-time-sel/Makefile.am: same. - -2000-05-01 NotZed <NotZed@HelixCode.com> - - * tests/test11.c (main): *sigh* moved back to sync api. - -2000-05-01 NotZed <NotZed@HelixCode.com> - - * tests/test11.c (search_cb): Try deleting messages ... - (main): Fix for provider api changes. - -2000-05-01 Anders Carlsson <andersca@gnu.org> - - * configure.in: Check if bonobo uses oaf, so you don't - need to specify --enable-oaf. - -2000-04-27 Ettore Perazzoli <ettore@helixcode.com> - - * acconfig.h: New configured #define `USING_OAF'. - - * configure.in: Added `--enable-oaf' option and corresponding - `OAF_LIBS' and `OAF_FLAGS' variables. Code friendly provided by - Maciej Stachowiak <mjs@eazel.com>. - -2000-04-27 NotZed <NotZed@HelixCode.com> - - * tests/test10.c: Fix for removal of camelmimebodypart, and changes - to recipient stuff. - - * tests/test1.c: Fix for removal of camelmimebodypart, and changes - to recipient stuff. - -2000-04-27 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Added addressbook/ename/Makefile. - -2000-04-27 Matt Loper <matt@helixcode.com> - - * configure.in: added tools/Makefile. - - * Makefile.am: Added tools. - - * tools/: New directory for tools relating to evolution. - - * tools/killev: New script for killing all evolution-related - stuff. - - * tools/Makefile.am: New file. - - * tools/.cvsignore: New file. - -2000-04-26 NotZed <NotZed@HelixCode.com> - - * tests/test13.c (main): And here too. - - * tests/test2.c (main): Same here. - - * tests/test1.c (main): Change for removed simpledatawrapper. - -2000-04-26 Matt Loper <matt@helixcode.com> - - * tests/.cvsignore: Added test13. - - * default_user/.cvsignore: New file. - - * widgets/e-text/e-text.c (e_text_destroy): Kill text->timer and - text->timeout on destroy. - -2000-04-26 Dan Winship <danw@helixcode.com> - - * tests: Update for the camel changes. - - * Makefile.am (SUBDIRS): Remove tests. They aren't terribly - useful/interesting any more for the most part, and they frequently - don't compile. - -2000-04-24 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Made the tooltip show up in the correct - place and configuration when using the "max_lines", "anchor" - (untested), or "justification" arguments. - -From a patch by Iain Holmes <ih@csd.abdn.ac.uk> - - * widgets/e-text/e-text-event-processor-emacs-like.c, - widget/e-text/e-text-event-processor-types.h, - widgets/e-text/e-text.c, widgets/e-text/e-text.h: Changed C-w and - C-y to control the X clipboard. Added double and triple click - events. - -2000-04-24 Fatih Demir <kabalak@gmx.net> - - * configure.in : Added tr to ALL_LINGUAS . - -2000-04-24 NotZed <NotZed@HelixCode.com> - - * tests/test13.c (main): Fixed for method movements. - - * tests/test3.c (main): Removed from build, data-wrapper-repository removed. - -2000-04-23 NotZed <NotZed@HelixCode.com> - - * tests/test2.c (main): Changed to use construct_from_stream. - - * tests/test1.c (main): Chagned to use construct_from_stream. - -2000-04-24 Matt Loper <matt@helixcode.com> - - * default_user/Makefile.am: new file. - - * default_user/Main_Shortcuts.xml: New file; is used to fill the - shortcut bar's "main shortcuts" pane. - - * default_user/Other_Shortcuts.xml: New file, used to fill the - shortcut bar's "other shortcuts" pane. - - * default_user/Inbox.mbox: New file. This is the first message a - new user will see when they fire up Evolution. Needs work. - - * Makefile.am: added default_user directory. - * configure.in: same. - -2000-04-23 NotZed <NotZed@HelixCode.com> - - * tests/test10.c: Removed some unecessary includes. From - Ali Abdin <aliabdin@aucegypt.edu> - (create_sample_mime_message): Changed for date api change. - - * tests/Makefile.am (noinst_PROGRAMS): Put test10 back. - -2000-04-22 NotZed <NotZed@HelixCode.com> - - * tests/test1.c (main): Changed for date api change. - -2000-04-20 NotZed <NotZed@HelixCode.com> - - * tests/test11.c: Fixed some headers. - - * tests/Makefile.am (noinst_PROGRAMS): Removed test9. - (noinst_PROGRAMS): Removed test12, temporarirly (nntp not being - built). - Removed test10. - -2000-04-20 Yukihiro Nakai <nakai@gnome.gr.jp> - - * configure.in: Add Japanese to ALL_LINGUAS - -2000-04-19 Dan Winship <danw@helixcode.com> - - * README: More detail on exactly what versions of what libraries - are needed. - -2000-04-18 Dan Winship <danw@helixcode.com> - - * tests/*: remove camel-log references - -2000-04-17 Dan Winship <danw@helixcode.com> - - * configure.in (xmlpatch): Require gnome-xml 1.8.7 (or later, - but not 2.0). xmlParseMemory's behavior in 1.8.7 is incompatible - with its behavior in 1.8.6 and earlier. - - * tests/test-url.c: New program to test CamelURL - -2000-04-16 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h, - addressbook/backend/ebook/test-card.c, - addressbook/backend/pas/pas-backend-file.c, - addressbook/contact-editor/e-contact-editor.c: Added - orginizational unit, nickname, and internet free-busy fields. - - * addressbook/contact-editor/contact-editor.glade: Renamed some - incorrectly named fields. - -2000-04-16 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h, - addressbook/backend/ebook/test-card.c, - addressbook/backend/pas/pas-backend-file.c, - addressbook/gui/minicard/e-minicard.c: Added orginization and role - fields. - - * addressbook/contact-editor/contact-editor.glade, - addressbook/contact-editor/e-contact-editor-strings.h: Renamed - some incorrectly named fields. - - * addressbook/contact-editor/e-contact-editor.c: Added - orginization and role fields as well as hooking up the birth date - field. - - * addressbook/gui/minicard/e-minicard-view.c: Added a missing include. - -2000-04-15 Matt Loper <matt@helixcode.com> - - * addressbook/gui/component/addressbook.c - (search_entry_activated): New function. Gets called when the quick - search entry is called on to perform a search. - (make_quick_search_widget): New function; returns a "quick search" - widget. - (control_activate): During the construction of the toolbar, a - "quick search" widget is included. - -2000-04-14 Chris Toshok <toshok@helixcode.com> - - * tests/.cvsignore: add test12 - - * tests/test12.c (main): add test for nntp stuff. - - * tests/Makefile.am (noinst_PROGRAMS): same. - - -2000-04-14 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h, - addressbook/backend/pas/pas-backend-file.c, - addressbook/backend/pas/pas-backend-ldap.c, - addressbook/contact-editor/e-contact-editor.c: Added a note field. - -2000-04-15 Ettore Perazzoli <ettore@helixcode.com> - - * addressbook/backend/ebook/e-card-cursor.h: #include - "addressbook/backend/ebook" to make sure we pick up the right - addressbook.h. Butt ugly, but at least it makes it possible for - me to build Evolution. - - * addressbook/gui/minicard/Makefile.am (INCLUDES): Use - `$(builddir)' so that we pick up the IDL-generated includes - correctly. - * addressbook/backend/pas/Makefile.am: Likewise. Also use - `$(srcdir)'. - - * addressbook/backend/ebook/Makefile.am: Use `$(srcdir)' so that - it works with builddir != srcdir. - * addressbook/backend/pas/Makefile.am: Likewise. - -2000-04-14 Chris Toshok <toshok@helixcode.com> - - * addressbook/backend/pas/pas-backend-ldap.c - (pas_backend_ldap_ensure_connected): don't ldap_simple_bind_s if - the ldap_open failed, and fix warnings. - (pas_backend_ldap_build_all_cards_list): don't do search if the - ensure_connected failed, and fix warnings. - (pas_backend_ldap_search): same. - (poll_ldap): fix warnings. - (pas_backend_ldap_process_get_book_view): same. - (pas_backend_ldap_get_vcard): same. - (pas_backend_ldap_load_uri): same. - - * configure.in: quiet configure in the case where it can't find - ldap libs. - -2000-04-13 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/contact-editor/e-contact-editor.c (extract_info): - Check for 0 length fields when building the outgoing ECard. - -2000-04-13 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/pas/pas-book-view.c: Give correct warnings. - - * addressbook/backend/ebook/e-card.c (e_card_set_arg): g_strdup - url and title. - -2000-04-13 Chris Toshok <toshok@helixcode.com> - - * addressbook/contact-editor/e-contact-editor.c - (fill_in_info): reflect the title attribute in the contact editor. - (extract_info): same. - - * addressbook/backend/pas/pas-backend-ldap.c: add the title attribute. - - * addressbook/gui/minicard/test-reflow.c: add a title. - - * addressbook/gui/minicard/e-minicard.c (remodel): add support for - the title attribute. - - * addressbook/backend/ebook/e-card.c (e_card_get_vcard): save out - the title to the vcard. - - * addressbook/backend/ebook/test-card.c: add title field foo to - the test. - - * addressbook/backend/ebook/e-card.c: reflect the title field. - - * addressbook/backend/ebook/e-card.h: un-#if 0 the title field. - - * addressbook/backend/pas/pas-backend-ldap.c (poll_ldap): new - function that polls ldap for more search responses. - (pas_backend_ldap_search): use the async search interface and - register an idle call to poll for the responses. - (view_destroy): make sure to g_source_remove the idle id. - -2000-04-12 Chris Toshok <toshok@helixcode.com> - - * addressbook/backend/pas/pas-backend-file.c (entry_compare): - rework this function to use a table mapping search field names to - vcard properties and extra information (such as whether or not the - property is a list.) - - * addressbook/backend/pas/pas-backend-ldap.c - (construct_email_list): new function, to build the ECardList for - email addresses. - (construct_phone_list): new function, to build the ECardList for - phone numbers. - (pas_backend_ldap_search): use a table mapping ldap attributes to - ecard properties, and use the special list construction functions - if the property calls for it. general cleanup. added a comment - about not calling ber_free if there was a decoding error. - - -2000-04-12 Matt Loper <matt@helixcode.com> - - * art/Makefile.am: Add tigert's contact-dlg-related images. - - * addressbook/contact-editor/e-contact-editor.c (_add_images): Add - tigert's images. - - * addressbook/contact-editor/Makefile.am: add EVOLUTION_IMAGES. - -2000-04-12 Tuomas Kuosmanen <tigert@gimp.org> - - * art/house.png, art/malehead.png, art/cellphone.png, - art/briefcase.png, art/envelope.png, art/globe.png: - New icons for the contact manager.. more to follow once I get - around to do more artist work.. - -2000-04-12 Chris Toshok <toshok@helixcode.com> - - * addressbook/backend/pas/pas-backend-ldap.c - (pas_backend_ldap_build_all_cards_list): delay the setting of the - ldap variable until we've ensured we were connected. Also, set - the search limit to LDAP_MAX_SEARCH_RESPONSES (we'll eventually - want a user setting here i assume.) - (pas_backend_ldap_search): same here, and also send back lists of - CARDS_PER_VIEW_NOTIFICATION length in each - pas_book_view_notify_add call. also, don't call ber_free if there - was a decoding error, since the ldap library frees it for us. - -2000-04-11 Miguel de Icaza <miguel@gnu.org> - - * configure.in (have_pthread): Properly use AC_ARG_WITH - -2000-04-11 Chris Toshok <toshok@helixcode.com> - - * wombat/Makefile.am (wombat_LDADD): add LDAP_LIBS here. - - * configure.in: check for -lldap and -llber and if both are - present include ldap support in the pas/wombat. - - * addressbook/backend/pas/Makefile.am (libpas_la_SOURCES): include - pas-backend.ldap.c if ENABLE_LDAP. - - * addressbook/backend/pas/pas-backend-ldap.c: get searching - working (converting between the sexp and ldap stuff.) - - * wombat/wombat.c (setup_pas): register the ldap pas backend if - HAVE_LDAP is defined. - -2000-04-11 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Changed AC_DEFUN to AC_DEFINE. - - * acconfig.h: Added HAVE_TIMEZONE and HAVE_TM_GMTOFF. - -2000-04-11 Chris Toshok <toshok@helixcode.com> - - * configure.in: check for timezone as a variable (as it is in - linux, but not in freebsd or netbsd.) - -2000-04-11 Larry Ewing <lewing@helixcode.com> - - * widgets/e-table/e-cell-toggle.c (etog_draw): update for new - gdk-pixbuf. Added a disabled chuck of code to do alpha blending - on pixmaps. - -2000-04-11 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Moved some logic a bit. Minor changes. - -00-04-11 Iain Holmes <ih@csd.abdn.ac.uk> - - * widgets/e-text/e-text.c - (e_text_set_args): Recalculate bounds when width or clip_width changes. - (tooltip_event): Forward clicks on the tooltip onto the text item. - (_do_tooltip): Correct the origin co-ordinates to the items co-ords. - (e_text_point): Return 0 when the mouse is on the item. - (_do_tooltip): Make the tooltip obey the parent items - line_wrap and max_lines. - -00-04-11 Chris Toshok <toshok@helixcode.com> - - * addressbook/backend/pas/pas-backend-file.c - (get_e_card_prop): new function, taking code from func_contains to - get string properties. - (entry_compare): new function generic, taking strstr-like function - as a parameter. - (func_contains): rewrite function to use entry_compare. - (is_helper): new helper function to map strcmp to a strstr-like - function. - (func_is): new function, implementing "is" for searches. - (endswith_helper): new function. - (func_endswith) new function, implementing "endswith" for - searches. - (beginswith_helper): new function. - (func_beginswith): new function, implementing "beginswith" for - searches. - (compare_email): new function for searching all email addresses of - a contact. - (compare_phone): new function for searching all phone numbers of a - contact. - (compare_address): new function for searching all addresses of a - contact (unimplemented as yet). - (entry_compare): add support for searching the list items "email", - "phone" and "address". - (vcard_matches_search): free the esexp_result. - (entry_compare): we want comparison functions to take 2 args. - -2000-04-11 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/gui/minicard/e-minicard-view.c: This was setting - E_REFLOW(view)->items to NULL too soon. Fixed now. - -2000-04-11 Chris Toshok <toshok@helixcode.com> - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_search): remove spew. - (pas_backend_file_process_create_card): move the sync to the - earliest possible point after the db operation. - (pas_backend_file_process_remove_card): same. - (pas_backend_file_process_modify_card): same, and call - pas_book_respond_modify, not pas_book_respond_remove, here. - - * addressbook/gui/component/addressbook.c (card_deleted_cb): new - function. - (delete_contact_cb): wire up button to call - e_minicard_view_remove_selection. - - * addressbook/gui/minicard/e-minicard-view.c - (e_minicard_view_remove_selection): fix warning, and stick "view" - in the name. - -2000-04-10 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-book-view.c, - addressbook/backend/ebook/e-book.c: Changed some incorrect - gtk_object_refs and gtk_object_unrefs into bonobo_object_refs and - bonobo_object_unrefs. - - * addressbook/backend/pas/pas-card-cursor.c: Changed a - gtk_object_destroy to a gtk_object_unref. - - * addressbook/gui/minicard/e-minicard-view.c, - addressbook/gui/minicard/e-minicard-view.h: Set a list pointer to - NULL after freeing its contents. Added - e_minicard_view_remove_selection function. - - * addressbook/gui/minicard/e-reflow.c: Set a list pointer to NULL - after freeing its contents. - -2000-04-11 Chris Toshok <toshok@helixcode.com> - - * addressbook/gui/component/addressbook.c (find_contact_cb): - implement braindead dialog to input the query string for the view. - - also, change all callbacks to get the EMinicardView instead of the - EBook. - - * addressbook/gui/minicard/e-minicard-view.c - (e_minicard_view_get_arg): add missing break. - -2000-04-10 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/gui/minicard/e-minicard-view.c, - addressbook/gui/minicard/e-minicard-view.h: Added a "query" - argument to the e-minicard-view. Documented all the arguments to - the e-minicard-view. - -2000-04-10 Chris Toshok <toshok@helixcode.com> - - * addressbook/gui/minicard/e-minicard-view.c (get_view): change - the empty search string ("") to the valid (contains "full_name" ""). - - * wombat/Makefile.am (wombat_LDADD): reorder so libeutil.la comes - after libpas (since it uses the sexp stuff now.) - - * addressbook/backend/pas/Makefile.am (INCLUDES): add - -I$(top_srcdir)/addressbook/backend/ebook - - * addressbook/backend/pas/pas-backend-file.c - (view_destroy): free the search context and unref the sexp. - (string_to_dbt): save the zero byte of strings, so we don't have - to g_strndup everywhere. - (func_contains): new function, implementing the (contains) search - function. - (vcard_matches_search): generic predicate to tell whether or not a - vcard entry matches the current book view. - (pas_backend_file_search): rip some of this code out of - get_book_view (the portion building the list of cards) and make it - use the e-sexp stuff. - (pas_backend_file_process_create_card): use vcard_matches_search - to only notify if the card will appear in the view. - (pas_backend_file_process_remove_card): use vcard_matches_search - to only notify if the card will be removed from the view. - (pas_backend_file_process_modify_card): use vcard_matches_search - to notify if the modified card was added, removed, or changed in - the view. - -2000-04-10 Miguel de Icaza <miguel@gnu.org> - - * configure.in (GNOME_PRINT_CFLAGS): Update to support - --disable-threads correctly. - -2000-04-10 Chris Toshok <toshok@helixcode.com> - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_process_get_book_view): use view != NULL instead - of checking db_error when we call pas_book_respond_get_book_view) - -2000-04-10 Dan Winship <danw@helixcode.com> - - * configure.in: check for mkstemp - -2000-04-10 Damon Chaplin <damon@helixcode.com> - - * configure.in (AC_OUTPUT): removed libical stuff since it has its - own configure.in. - -2000-04-10 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-book-view.c: Fixed a bug where I was - sending the wrong information to some callbacks. - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h: Added an e_card_duplicate - function. Made ids get stored in vcards. Made sure to delete the - url if it exists. - - * addressbook/backend/pas/Makefile.am: Made pas include - addressbook/backend/ebook/ in the search path. - - * addressbook/backend/pas/pas-backend-file.c: Fixed some bugs and - made the create card function store the generated id in the card - being saved. - - * addressbook/backend/pas/pas-book-view.c: Fixed a double free - bug. - - * addressbook/contact-editor/e-contact-editor.c: Fixed some bugs. - Made the contact editor actually return a valid card when - gtk_object_get(editor, "card", ...) is called. - - * addressbook/contact-editor/e-contact-editor.h: Fixed a copy and - paste error. - - * addressbook/gui/component/addressbook.c: Made this get the card - properly. - - * addressbook/gui/minicard/Makefile.am: Made this include - contact-editor directory in the search path and link against - libecontacteditor so that double clicking can open a dialog. - - * addressbook/gui/minicard/e-minicard.c: Fixed some small bugs. - Made double clicking open a contact editor dialog if this minicard - is contained in a minicard view. (It needs the minicard view to - get the EBook to save to. - - * wombat/Makefile.am: Link wombat against libebook, since - pas-backend-file now uses ECard. - -2000-04-09 Matt Loper <matt@helixcode.com> - - * addressbook/gui/component/addressbook.c (control_activate): Make - "New Contact" menuitem add a card with new_contact_cb(). - - * addressbook/Makefile.am: Compile contact-editor, _then_ gui, - since the gui now depends on the contact editor (shouldn't the - contact-editor directory be moved into 'gui'?). - - * addressbook/gui/component/addressbook.c (card_added_cb): New - function. Gets called when a card is successfully added via the - contact-editor. - (new_contact_cb): New function. Gets called when a user clicks the - "new contact" button on the toolbar, and creates a contact-editor - to edit a new contact entry. - (control_activate): Call gnome_app_fill_toolbar_with_data() - instead of gnome_app_fill_toolbar(), so that our toolbar can find - the right book to add a new card to. - (addressbook_factory): On an "activate" signal, send the book up - to control_activate_cb. - - * addressbook/gui/component/addressbook-factory.c (init_bonobo): - Call glade_gnome_init(), so that our contact-editor (which - requires glade) doesn't barf. - - * addressbook/gui/component/Makefile.am: added the contact-editor - to our libraries and include files. - - * addressbook/contact-editor/e-contact-editor.c - (e_contact_editor_new): Set "card" gtk property to the passed-in - card property. - - * addressbook/gui/component/addressbook.c (addressbook_factory): - Added gtk_widget_push/pop_colormap/visual, which I assume is - necessary for canvas use. - -2000-04-08 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/contact-editor/Makefile.am, - addressbook/contact-editor/e-contact-editor.c, - addressbook/contact-editor/e-contact-editor.h, - addressbook/contact-editor/test-editor.c: Made the contact editor - load from an ECard. - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h, - addressbook/gui/minicard/e-minicard.c: Added support for the URL - field. - -2000-04-08 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card.c (e_card_get_vcard): Fixed a - small typo. - -2000-04-08 Dan Winship <danw@helixcode.com> - - * art/Makefile.am: pixmap_DATA should have been images_DATA (after - pixmapdir was renamed to imagesdir) - -2000-04-08 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/gui/minicard/.cvsignore, - addressbook/gui/minicard/Makefile.am, - addressbook/gui/minicard/e-minicard-view.c, - addressbook/gui/minicard/e-minicard-view.h, - addressbook/gui/minicard/e-minicard.c, - addressbook/gui/minicard/e-minicard.h, - addressbook/gui/minicard/e-reflow-sorted.c, - addressbook/gui/minicard/e-reflow-sorted.h, - addressbook/gui/minicard/e-reflow.c, - addressbook/gui/minicard/e-reflow.h, - addressbook/gui/minicard/test-minicard-view.c, - addressbook/gui/minicard/test-reflow.c, - widgets/e-minicard/.cvsignore, widgets/e-minicard/Makefile.am, - widgets/e-minicard/e-minicard-label.c, - widgets/e-minicard/e-minicard-label.h, - widgets/e-minicard/e-minicard-view.c, - widgets/e-minicard/e-minicard-view.h, - widgets/e-minicard/e-minicard.c, widgets/e-minicard/e-minicard.h, - widgets/e-minicard/e-reflow-sorted.c, - widgets/e-minicard/e-reflow-sorted.h, - widgets/e-minicard/e-reflow.c, widgets/e-minicard/e-reflow.h, - widgets/e-minicard/test-minicard-label.c, - widgets/e-minicard/test-minicard-view.c, - widgets/e-minicard/test-minicard.c, - widgets/e-minicard/test-reflow.c: CVS move mistake. Fixed the - correct changes in the correct places. - -2000-04-08 Christopher James Lahey <clahey@helixcode.com> - - * art/Makefile.am: pixmap_DATA isn't defined so don't use it as a variable. - - * addressbook/gui/component/, - addressbook/gui/component/.cvsignore, addressbook/gui/Makefile.am, - addressbook/gui/component/addressbook-factory.c, - addressbook/gui/component/addressbook.c, - addressbook/gui/component/addressbook.gnorba, - addressbook/gui/component/addressbook.h: New directory to proivde - the component for contact management. Simply uses an e-minicard-view. - - * addressbook/gui/minicard/e-minicard-view.c, - addressbook/gui/minicard/e-minicard-view.h: New subclass of - e-reflow-sorted that takes an EBook and uses it to compute the - card data to display. - - * addressbook/gui/minicard/e-minicard.c, - addressbook/gui/minicard/e-minicard.h: This now backends to a - ECard instead of a ETableModel. - - * addressbook/gui/minicard/e-reflow.c, - addressbook/gui/minicard/e-reflow.h: This now has a virtualized - add method. - - * addressbook/gui/minicard/e-reflow-sorted.c, - addressbook/gui/minicard/e-reflow-sorted.h: New subclass of - e-reflow that allows the data to be sorted on the fly. - - * addressbook/gui/minicard/test-minicard-view.c: New test to test - the new minicard view. - - * addressbook/gui/minicard/test-reflow.c: Uses the new ECard - backend of the e-minicard. - - * addressbook/gui/minicard/.cvsignore, - addressbook/gui/minicard/Makefile.am: Added new test. Fixed - dependencies. Added new files. - - * addressbook/gui/, addressbook/gui/Makefile.am, - addressbook/gui/.cvsignore: New directory for addressbook gui - bits. Added subdirectories. Created an initial .cvsignore. - - * addressbook/Makefile.am (SUBDIRS): Removed demo and added gui. - - * addressbook/backend/pas/pas-backend-file.c: Added code to do - notification on bookviews when changes in the backend are made. - - * addressbook/backend/pas/pas-book-view.c, - addressbook/backend/pas/pas-book-view.h: Added helper functions to - notify the view about the addition or modification of a single - card. Fixed a mistaken extra free. - - * addressbook/backend/ebook/e-card-list-iterator.h: Fixed - incorrect parent class. - - * addressbook/backend/ebook/test-client.c: Made this accept an - optional parameter that specifies the vcard to add. - - * configure.in: Replaced widgets/e-minicard/Makefile and - addressbook/demo/Makefile with addressbook/gui/minicard/Makefile - and addressbook/gui/component/Makefile respectively. - - * widgets/Makefile.am: Removed e-minicard since it's being moved - to addressbook/gui/minicard. - - * widgets/e-text/e-text.c: Fixed the border width around tooltips - and made the main tooltip area yellow. - -2000-04-08 Dan Winship <danw@helixcode.com> - - * configure.in, acconfig.h: add SYSTEM_MAIL_DIR - -2000-04-08 Jesus Bravo Alvarez <jba@pobox.com> - - * configure.in (ALL_LINGUAS): Added Galician (gl). - -2000-04-07 Jeffrey Stedfast <fejj@stampede.org> - * configure.in: Modified to create camel/providers/smtp/Makefile - -2000-04-07 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Made text tooltips appear in place. - Iain figured out that to get them to not appear, we hide the - tooltip when the mouse leaves the tooltip window, not the canvas - item (this works because the tooltip window always covers the - canvas item completely.) - -2000-04-07 Matt Loper <matt@helixcode.com> - - * addressbook/demo/addressbook.c (control_activate_cb): New - function. Called when the control is (de)activated. - (control_activate): New function; called when the control is - activated, and sets up toolbar/menu times. - (control_deactivate): New function; removes those toolbar/menu - items. - (do_nothing_cb): Does nothing :-) - (addressbook_factory): Hook up to control_activate_cb(). - -2000-04-07 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_process_get_book_view): correctly (well, - untested) implement. - (view_destroy): new function. - -2000-04-06 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/demo/demo.c, addressbook/demo/addressbook-widget.c: - Changed calls to e_cell_text_new to match new function signature. - -2000-04-06 Miguel de Icaza <miguel@gnu.org> - - * art/Makefile.am (images_DATA): Renamed from pixmaps to images. - -2000-04-05 Matt Loper <matt@helixcode.com> - - * README: Added wombat. - -2000-04-04 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text-test.c: Got rid of some runtime errors. - Changed to "fixed" font so that it will work on everyone's - machine. Added a white background rectangle. Made resizing the - window resize the contained text item. Changed to using affines - (e_canvas_item_move_absolute) instead of "x" and "y" attributes. - Set the text in the entries so that they match the original values - of the displayed text object. - -2000-04-04 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-minicard/e-minicard.c: Fixed some referencing and - lifetime issues. - -2000-04-04 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Removed an unnecessary get_bounds call. - - (From a patch by Iain Holmes <ih@csd.abdn.ac.uk>) - - * widgets/e-text/e-text.c: Made tooltips look more like the - underlying text. Made tooltips show up more consistently. - -2000-04-04 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/demo/Makefile.am, addressbook/demo/e-test-model.c, - addressbook/demo/e-test-model.h: Changed this to backend to an - ebook. - - * addressbook/backend/ebook/e-card-iterator.c, - addressbook/backend/ebook/e-card-iterator.h, - addressbook/backend/ebook/e-card-list-iterator.c, - addressbook/backend/ebook/e-card-list.c, - addressbook/backend/ebook/e-card-list.h, - addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h: Fixed const correctness and - changed a couple of functions to be external. - - * addressbook/Makefile.am: Fixed subdir ordering. - -2000-04-04 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-book-view.c: Fixed an incorrect - function. - - * addressbook/backend/ebook/e-book-view.h, - addressbook/backend/ebook/e-book.h: Fixed some incorrect function - pointer declarations. - - * addressbook/backend/ebook/e-card-iterator.c, - addressbook/backend/ebook/e-card-iterator.h, - addressbook/backend/ebook/e-card-list-iterator.c, - addressbook/backend/ebook/e-card-list-iterator.h, - addressbook/backend/ebook/e-card-list.c, - addressbook/backend/ebook/e-card-list.h, - addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h, - addressbook/backend/ebook/test-card.c: Built new iterator system - for getting fields with multiple entries. - - * addressbook/backend/ebook/Makefile.am: Added new files - addressbook/backend/ebook/e-card-iterator.c, - addressbook/backend/ebook/e-card-iterator.h, - addressbook/backend/ebook/e-card-list-iterator.c, - addressbook/backend/ebook/e-card-list-iterator.h, - addressbook/backend/ebook/e-card-list.c, and - addressbook/backend/ebook/e-card-list.h. - -2000-04-04 Yuri Syrota <rasta@renome.rovno.ua> - - * configure.in: Added uk to ALL_LINGUAS. - -2000-04-04 Andreas Hyden <a.hyden@cyberpoint.se> - - * configure.in: Added no and sv to ALL_LINGUAS. - -2000-04-03 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card-cursor.h, - addressbook/backend/ebook/e-card.c: A bit of clean up. - - * addressbook/backend/ebook/e-book-types.h, - addressbook/backend/ebook/e-book-view-listener.c, - addressbook/backend/ebook/e-book-view-listener.h, - addressbook/backend/ebook/e-book-view.c, - addressbook/backend/ebook/e-book-view.h, - addressbook/backend/pas/pas-book-view.c, - addressbook/backend/pas/pas-book-view.h: New files for live views. - - * addressbook/backend/ebook/Makefile.am, - addressbook/backend/ebook/e-book-listener.c, - addressbook/backend/ebook/e-book-listener.h, - addressbook/backend/ebook/e-book.c, - addressbook/backend/ebook/e-book.h, - addressbook/backend/ebook/test-client-list.c, - addressbook/backend/ebook/test-client.c, - addressbook/backend/pas/pas-backend-file.c, - addressbook/backend/pas/pas-book.c, - addressbook/backend/pas/pas-book.h, - addressbook/backend/idl/addressbook.idl: Added live views and - searching to the interface (neither is working yet.) - -2000-04-01 Matt Loper <matt@helixcode.com> - - * tests/.cvsignore: Added test-movemail. - - * art/.cvsignore: New file. - -2000-03-31 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/demo/demo.c, addressbook/demo/addressbook-widget.c: - Added some missing gtk_object_refs. - -2000-03-30 Matt Loper <matt@helixcode.com> - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_build_all_cards_list): Get first card (with - R_FIRST) on first seq(). - -2000-03-30 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/pas/pas-backend-ldap.h: new-file - * addressbook/backend/pas/pas-backend-ldap.c: new file - -2000-03-30 Dan Winship <danw@helixcode.com> - - * configure.in: - * Makefile.am: - * art/Makefile.am: install new shortcut bar pixmaps. - -2000-03-30 Tuomas Kuosmanen <tigert@gimp.org> - - * art/evolution-calendar.png art/evolution-inbox.png - art/evolution-tasks.png art/evolution-contacts.png - art/evolution-notes.png evolution-today.png: - added some artwork for the main shortcutbar.. someone - could stick them in it. - -2000-03-29 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card-cursor.c: Fixed management of - the corba-cursor object by calling CORBA_Object_duplicate on it on - e-card-cursor creation and calling CORBA_Object_release on - e-card-cursor destruction. Also, properly free string returned - from Evolution_CardCursor_get_nth function. - -2000-03-29 Matt Loper <matt@helixcode.com> - - * addressbook/backend/ebook/test-client.c (get_cursor_cb): Added - some debugging. - - * addressbook/backend/ebook/e-book-listener.c: Added inline - documentation for exposed functions. - * addressbook/backend/ebook/e-card-cursor.c: same. - * addressbook/backend/ebook/e-card.c: same. - - * Makefile.am: add calendar compilation back in. - - * addressbook/backend/pas/pas-book-factory.c - (PAS_BOOK_FACTORY_GOAD_ID): changed to - "evolution:addressbook-server". - - * addressbook/backend/pas/Makefile.am: no need to install a - .gnorba file from here, as the wombat.gnorba file in - evolution/wombat will do its job. - - * addressbook/backend/ebook/test-client.c (ebook_create): if - ebook_new fails, print a warning and return. - - * addressbook/backend/ebook/e-book.c (CARDSERVER_GOAD_ID): changed - to "evolution:addressbook-server". - - * wombat/wombat.c: Changed headerfile path. - - * wombat/Makefile.am: Use relative paths to libraries in the build - tree, rather than requiring libraries (such as libpcs) to already - be installed. - -2000-03-28 Matt Loper <matt@helixcode.com> - - * wombat/Makefile.am: new file. - - * wombat/wombat.gnorba: Cleaned up. - - * wombat/wombat.c (setup_pcs): filled in the rest. - - * Makefile.am: added wombat. - - * wombat/wombat.gnorba: new file. - - * wombat/.cvsignore: new file. - - * wombat/wombat.c (setup_pcs): fill out this function some. - - * configure.in: added wombat. - -2000-03-28 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/pas/pas-card-cursor.c (create_cursor): use - g_new0 to allocate the BonoboObjectServant. - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_build_all_cards_list): remove unnecessary - strdup/free. - -2000-03-28 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/pas/pas-backend-file.c: Removed an infinite - loop. - - * addressbook/backend/ebook/test-client-list.c: New test that - doesn't add an extra database item. - - * addressbook/backend/ebook/Makefile.am, - addressbook/backend/ebook/.cvsignore: Added test-client-list. - -2000-03-28 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/pas/pas-card-cursor.c: Fixed memory - allocation. - - * addressbook/backend/pas/pas-backend-file.c: Fixed memory - allocation. Made database stuff not do an extra entry. - - * addressbook/backend/ebook/test-client.c: Add test for - get_all_cards functionality. Changed database name to test.db. - - * addressbook/backend/ebook/e-card-cursor.c: Changed bonobo_object - to gtk_object in a couple of places. - -2000-03-28 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_create_unique_id): create id's for entries using - the following format: ("pas-id-%08lX%08X", time(NULL), c++). - -2000-03-27 Dan Winship <danw@helixcode.com> - - * tests/test-movemail.c: new test program. Can be used to copy POP - mail into your evolution inbox. - -2000-03-27 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_get_vcard): remove unneeded g_strdup; - (get_length): implement function. - (get_nth): implement function. - (cursor_destroy): free up the internal glist of vcards, and fix - warning. - (pas_backend_file_build_all_cards_list): new function, to build up - the list of cards in the db. - (pas_backend_file_process_get_all_cards): call - pas_backend_file_build_+all_cards_list, and fix warning. - -2000-03-27 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/test-card.c: Fixed some warnings. - - * addressbook/backend/ebook/test-client.c: Added a section to test - cursors and returning an id when adding. - - * addressbook/backend/ebook/e-card-pairs.h: Removed the address - pairs since they were added to e-card.c. - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h: Made the set_id function take - a const char *. - - * addressbook/backend/ebook/e-book-listener.c, - addressbook/backend/ebook/e-book-listener.h, - addressbook/backend/ebook/e-book.c, - addressbook/backend/ebook/e-book.h, - addressbook/backend/idl/addressbook.idl, - addressbook/backend/pas/pas-backend-file.c, - addressbook/backend/pas/pas-book.c, - addressbook/backend/pas/pas-book.h: Added a get_all_cards function - and made the response to the create_card function include the card - id. - - * addressbook/backend/ebook/Makefile.am: Added e-card-cursor.c and - e-card-cursor.h. - - * addressbook/backend/ebook/e-card-cursor.c, - addressbook/backend/ebook/e-card-cursor.h: New class for proxying - to an Evolution_CardCursor. - - * addressbook/backend/pas/Makefile.am: Added pas-card-cursor.c and - pas-card-cursor.h. - - * addressbook/backend/pas/pas-card-cursor.c, - addressbook/backend/pas/pas-card-cursor.h: New bonobo class for - making an Evolution_CardCursor server. - -2000-03-27 NotZed <NotZed@HelixCode.com> - - * tests/test9.c (main): This test is basically now invalid. - * tests/test11.c (main): Fix for async search api. Probably works. - Removed camel-mbox-*.h headers, should be private. - -2000-03-27 Tuomas Kuosmanen <tigert@gimp.org> - * art/attachment.xpm art/mail-new.xpm art/mail-read.xpm - art/mail-replied.xpm art/mark.xpm art/meeting.xpm - art/priority-high.xpm art/priority-low.xpm - - Added some new icons for the message-list view.. - -2000-03-26 Chris Toshok <toshok@laptoph.xtoph.org> - - * configure.in: check for db_185.h (present in newer db - distributions.) - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_create_unique_id): new function. - (pas_backend_file_process_create_card): call - pas_backend_file_create_unique_id and pas_book_notify_add (if the - db->put was successful). also, sync out db. - (pas_backend_file_process_remove_card): call - pas_book_notify_remove if the db->del was successful, and sync out - db. - (pas_backend_file_process_modify_card): call - pas_book_notify_change if db->put was successful, and sync out db. - (string_to_dbt): new function. - (pas_backend_file_process_create_card): use string_to_dbt - (pas_backend_file_process_remove_card): likewise - (pas_backend_file_process_modify_card): likewise - (pas_backend_file_get_vcard): likewise - (pas_backend_file_upgrade_db): new function, to upgrade a db file - if we change the data format. - (pas_backend_file_maybe_upgrade_db): check db version vs. current - code version, and upgrade it necessary. - (pas_backend_file_load_uri): call pas_backend_file_maybe_upgrade. - -2000-03-26 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/test-client.c: Load an ECard instead - of a VCard and then get the VCard from that ECard. Just tests - ECard and the client stuff at the same time. Also, replaces - carriage returns with newlines. - - * addressbook/backend/ebook/e-book.c: Fixed a small parity error. - -2000-03-25 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/ebook/test-client.c: create a card and then - look it up. - -2000-03-26 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/pas/pas-backend-file.c - (pas_backend_file_process_create_card): add db calls to flesh out - the interface. hardcoded id that needs to change, once we decide - how we're going to create it. - (pas_backend_file_process_remove_card): add db calls to flesh out - the interface. - (pas_backend_file_process_modify_card): likewise - (pas_backend_file_process_check_connection): likewise - (pas_backend_file_get_vcard): likewise - (pas_backend_file_load_uri): likewise - -2000-03-26 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-book.c: Set the card id properly - when retrieving a card. - -2000-03-22 NotZed <NotZed@HelixCode.com> - - * e-util/e-sexp.h: Formatting cleanup. - -2000-03-07 NotZed <NotZed@HelixCode.com> - - * e-util/Makefile.am (libeutil_la_SOURCES): s-sexp.h -> e-sexp.h. - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h: Added the ability to set the - card's id (and made getting it work correctly also.) - -2000-03-25 Chris Toshok <toshok@laptoph.xtoph.org> - - * addressbook/backend/ebook/e-book.c (e_book_pop_op): pass GList* - as second parameter to g_list_remove_link, not the data pointer. - -2000-03-26 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card-types.h: Removed the - address->description field. - - * addressbook/backend/ebook/e-card.c: Added VCard output and - the use of GtkArguments. - - * addressbook/backend/ebook/test-card.c: Updated this to use the - GtkArguments. - - * addressbook/backend/ebook/e-book.c: Fixed a memory leak. - -2000-03-25 Matt Loper <matt@helixcode.com> - - * ebook/e-book.c, - ebook/e-book.h, - ebook/e-book.h, - ebook/e-card-fields.h, - ebook/e-card.h, - ebook/e-commerce.h: old, removed. Up-to-date EBook stuff is kept - in addressbook/backend/ebook. - -2000-03-23 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h, - addressbook/backend/ebook/e-card-types.h, - addressbook/backend/ebook/e-card-pairs.h, - addressbook/backend/ebook/test-card.c: Added parsing and testing - for name, full name, birthday, telephone, email, and street - address properties. - -2000-03-22 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/backend/ebook/.cvsignore, - addressbook/backend/pas/.cvsignore, - addressbook/backend/idl/.cvsignore, - addressbook/backend/.cvsignore: Updated .cvsignore files. - -2000-03-22 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/Makefile.am, configure.in: Added the - addressbook/backend directory. - - * addressbook/backend/Makefile.am: Removed the libversit directory - as it's now included in the base evolution directory. - - * addressbook/backend/ebook/e-card-pairs.h, - addressbook/backend/ebook/Makefile.am: Changed the place where - libversit is looked for. - - * addressbook/backend/ebook/e-book-listener.c: Fixed some - indentation. - - * addressbook/backend/ebook/e-card-pairs.h, - addressbook/backend/ebook/e-card-types.h: Commented out some code - to get this to compile. - - * addressbook/backend/ebook/e-card.c, - addressbook/backend/ebook/e-card.h: Turned this into a GTK+ - object. - - * addressbook/backend/pas/pas.c, - addressbook/backend/ebook/test-client.c: Include gnome.h and - gnorba.h. - - * addressbook/backend/idl/addressbook.idl: Include Bonobo.idl - instead of bonobo-unknown.idl. - - * addressbook/backend/pas/pas-backend-file.c, - addressbook/backend/pas/pas-book.c, - addressbook/contact-editor/test-editor.c, - addressbook/contact-editor/e-contact-editor.c, - addressbook/printing/e-contact-print.c, - addressbook/printing/test-contact-print-style-editor.c, - addressbook/printing/test-print.c: Killed some warnings. - -2000-03-21 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c: Changed gnome_canvas_item_grab_focus to - e_canvas_item_grab_focus. - -2000-03-21 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/demo/addressbook-widget.c: Make background pixmap - get properly set to NULL. - -2000-03-20 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added the - ability to access the text event processor. - -2000-03-13 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/demo/addressbook-widget.c: Made the addressbook - component look in the users home directory for the addressbook.xml - file. - -2000-03-20 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/.cvsignore: added filter. - - * addressbook/demo/.cvsignore: added test-addressbook. - -2000-03-17 Elliot Lee <sopwith@redhat.com> - * calendar/cal-client/Makefile.am, - calendar/cal-util/Makefile.am, calendar/gui/Makefile.am, - calendar/pcs/Makefile.am, mail/Makefile.am, - widgets/e-text/Makefile.am: Fix for srcdir != builddir. - -2000-03-14 Dan Winship <danw@helixcode.com> - - * Makefile.am (SUBDIRS): build shell before mail, since mail - relies on the shell idl files being compiled. - -2000-03-13 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/demo/Makefile.am: Added files for addressbook bonobo - component. Changed non bonobo version to compile as - test-addressbook. - - * addressbook/demo/addressbook.c, - addressbook/demo/addressbook.gnorba, - addressbook/demo/addressbook.h, - addressbook/demo/addressbook-factory.c, - addressbook/demo/addressbook-widget.c, - addressbook/demo/addressbook-widget.h: New factory to create an - addressbook bonobo component. - -2000-03-12 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/.cvsignore: Added e-text-test. - - * addressbook/demo/e-test-model.c, - addressbook/demo/e-test-model.h: A model storing data in an array - of Address objects. - - * addressbook/demo/demo.c: Changed to use - addressbook/demo/e-test-model.c and - addressbook/demo/e-test-model.h. - - * addressbook/demo/Makefile.am: Added e-test-model.c and - e-test-model.h. - -2000-03-12 Christopher James Lahey <clahey@helixcode.com> - - * widgets/Makefile.am: Rearranged SUBDIRS for dependencies. - - * widgets/e-text/e-text-model.c, widgets/e-text-model.h: New - object which stores a piece of text data. All methods are - virtual. - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Modified this - to use an ETextModel for its data. - - * widgets/e-text/Makefile.am: Added e-text-model.c and e-text-model.h. - - * widgets/e-minicard/test-minicard-label.c: Made this work again. - - * widgets/e-minicard/e-minicard.c, - widgets/e-minicard/e-minicard.h: Made this use an ETableModel to - get its data. - - * widgets/e-minicard/e-minicard-label.c, - widgets/e-minicard/e-minicard-label.h: Added the ability to set - the text model used for the contained text widget. - - * widgets/e-minicard/Makefile.am: Added e-table since e-minicard - is now dependent on an e-table-model for its data. - - * addressbook/demo, addressbook/demo/.cvsignore, - addressbook/demo/Makefile.am, addressbook/demo/demo.c, - addressbook/demo/spec: A new program to test ETable and EMinicard - integration. - - * configure.in: Added addressbook/demo/Makefile. - - * addressbook/Makefile.am: Added the demo/ subdirectory. - -2000-03-10 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-minicard/e-minicard.c, - widgets/e-minicard/e-minicard-label.c, - widgets/e-minicard/e-minicard-label.h, - widgets/e-minicard/e-reflow.c, widgets/e-minicard/test-reflow.c, - widgets/e-text/e-text.c, widgets/e-text/e-text.h: Adapted to use - the new e-canvas reflow system. - -2000-03-07 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Added a - "break_characters" argument. It lets you define a set of - characters which should cause optional linebreaks to occur. Made - setting the "clip_height" argument to -1 mean no height clipping. - Moved calling the "resize" signal into an idle handler to avoid - reentering the canvas update loop. Made EText recalc bounds if - the affine has changed. Fixed up tooltip_count (this counts the - number of ENTER and LEAVE events.) - - * widgets/e-text/e-text-test.c: Got rid of a few warnings. - - * widgets/e-minicard/e-minicard-label.h: Reindent a few lines. - - * widgets/e-minicard/e-minicard.c, - widgets/e-minicard/e-minicard-label.c: Switch from using "x" and - "y" to set the children's position to using - e_canvas_item_move_absolute. - -2000-03-05 Matt Loper <matt.loper@splashtech.com> - - * tests/ui-tests/message-browser.c: Commenting added. - (on_url_data_requested): renamed from "on_url_requested", to - reflect that a stream of data is what's actually being asked for. - (hydrate_persist_stream_from_gstring): New function. - (camel_stream_to_gstring): New function. - (on_object_requested): Cleaned up. - -2000-03-04 bertrand <bertrand@helixcode.com> - - * tests/ui-tests/Makefile.am: add bonobo to the build - process. - - * tests/ui-tests/message-browser.c (main): - initialize Bonobo. Use bonobo_main. - (get_gtk_html_contents_window): set signal handlers - for url requests and objects requests. - (on_object_requested): answer to object requests. - -2000-03-03 bertrand <bertrand@helixcode.com> - - * tests/ui-tests/message-browser.c (main): initialize - gdkrgb. Push visual/colormap. - (on_url_requested): in the case where a camel url is requested, - write the camel stream to gtkhtml. - - * tests/ui-tests/Makefile.am (filter_LDADD): add - gnomeprint in the lib list. - -2000-03-01 Ettore Perazzoli <ettore@helixcode.com> - - * configure.in: Build `filter/Makefile'. Added check for GtkHTML. - Set `GTKHTML_CFLAGS' and `GTKHTML_LIBS' to the appropriate values - for linking with GtkHTML. - -2000-03-01 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (AC_OUTPUT): Added calendar/idl/Makefile, - calendar/cal-client/Makefile, and calendar/pcs/Makefile to the - list of files to generate. - -2000-02-29 Iain Holmes <ih@csd.abdn.ac.uk> - - * widgets/e-text/e-text.c: Don't show the tooltip if the text is being - editted or isn't clipped. Remove the tooltip when editting starts. - - * widgets/e-text/Makefile.am: Build the test program - -2000-02-29 NotZed <NotZed@HelixCode.com> - - * tests/ui-tests/Makefile.am (filter_LDADD): Added test program. - - * tests/ui-tests/filterdescription.xml, saveoptions.xml: Data - files for test program. - - * tests/ui-tests/filter.c (main): Test program for filter ui. - -2000-02-28 NotZed <NotZed@HelixCode.com> - - * widgets/e-minicard/Makefile.am (INCLUDES): Fixed references to - eutil. - - * Makefile.am (SUBDIRS): Build e-util before other stuff. - (SUBDIRS): Build filter after camel. - -2000-02-28 Chris Lahey <clahey@umich.edu> - - * widgets/e-text/e-text.c: Compilation error. - -2000-02-28 Chris Lahey <clahey@umich.edu> - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Updated these - to use the canvas ::update system properly. - -2000-02-24 Dan Winship <danw@helixcode.com> - - * acconfig.h: - * configure.in: define SENDMAIL_PATH with the path to sendmail. - -2000-02-24 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text.c, widgets/e-text.h, e-text-event-processor.c, - e-text-event-processor.h, e-text-event-processor-emacs-like.c, - e-text-event-processor-emacs-like.h, - e-text-event-processor-types.h: This were moved to widgets/e-text/ - a while ago but never removed. They have now been removed. - - * widgets/e-text/e-text.c, widgets/e-text/e-text.h: Removed some - warnings from this file. Made tooltips disappear when you're - finished with them. - - * widgets/e-minicard/test-reflow.c, - widgets/e-minicard/test-minicard.c, - widgets/e-minicard/test-minicard-label.c: Commented out unused - about_callback functions. - - * widgets/e-minicard/e-reflow.c: Made e-reflow pass an EFocus to - its e-minicard children. - - * widgets/e-minicard/e-minicard.c: Made e-minicard take and return - an EFocus for its "has_focus" argument. This makes shift-tab work properly. - - * widgets/e-minicard/e-minicard-label.c: Made e-minicard-label take and return - an EFocus for its "has_focus" argument. Made the font that - e-minicard-label uses only be allocated once. - -2000-02-21 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/message-browser.c (on_link_clicked): stop - sscanf() abuse. - - * tests/Makefile.am: changed references to libibex.a to - libibex.la. - - * libical/src/libical/.cvsignore: Added *.lo, *.la, and .libs. - * libical/src/libicalss/.cvsignore: same. - - * tests/.cvsignore: Added test11. - - * libical/Makefile.in: autogenerated file removed from cvs, and - added to .cvsignore. - * libical/src/Makefile.in: same. - * libical/src/libical/Makefile.in: same. - * libical/src/libicalss/Makefile.in: same. - -2000-02-22 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/ui-tests/message-browser.c (on_link_clicked): - uggly hack to test part saving and - b64 streams. - -2000-02-21 Dan Winship <danw@helixcode.com> - - * tests/test10.c: - * tests/test11.c: update for camel changes - -2000-02-20 Matt Loper <matt@helixcode.com> - - * tests/Makefile.am: Changed dependencies on libibex.la to - libibex.a. In test9_LDADD, placed libcamelmbox.la before - libibex.la, as the former requires the latter. - -2000-02-20 Iain Holmes <ih@csd.abdn.ac.uk> - - * widgets/e-text/e-text.[ch] (_do_tooltip): Show the text of the item, - in a tooltip style. - (e_text_event): Add a timeout on the Enter and remove it on the Leave - events. - - * e-text-test.c: New file to test e-text items. - -2000-02-20 Matt Loper <matt@helixcode.com> - - * .cvsignore: added ABOUT-NLS. - * ABOUT-NLS: removed. - -2000-02-19 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/message-browser.c (on_link_clicked): When a link - is clicked, indicate the link with a dialog. - - * libical/src/test/.cvsignore: Added Makefile. - - * libical/.cvsignore: Added Makefile, configure, config.status. - - * libical/src/.cvsignore: New file. - - * libical/Makefile: autogenerated file removed from cvs. - * libical/configure: same. - * libical/config.status: same. - * libical/src/Makefile: same. - * libical/src/test/Makefile: same. - - * widgets/e-minicard/.cvsignore: Added minicard-label-test, - minicard-test, and reflow-test. - - * shell/.cvsignore: added files autogenerated from Evolution.idl. - - * libversit/.cvsignore: Added .libs, vcc.c, vcc.lo, vobject.lo, - vcaltmp.lo, libversit.la - - * libical/src/test/.cvsignore: New file. - - * libical/src/libical/.cvsignore: New file. - - * libical/src/libicalss/.cvsignore: New file. - - * libical/.cvsignore: New file, with config.log in it. - - * tests/ui-tests/message-browser.c: minor cleanup. - - * tests/ui-tests/.cvsignore: added message-browser. - -2000-02-18 NotZed <NotZed@HelixCode.com> - - * tests/test11.c (main): Use a relative path to the mbox provider - module. - -2000-02-18 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/message-browser.c (filename_to_camel_msg): Call - camel_data_wrapper_set_input_stream, rather than - camel_data_wrapper_construct_from_stream. For the whole message, - allow someone to see the header ("to", "from", etc.). Clicking on - tree items to see their elements, now works also. - -2000-02-18 Miguel de Icaza <miguel@nuclecu.unam.mx> - - * configure.in: Make gnomeui the last library on the command line, - as its path is the one most likely to hold other old libraries - (libxml) and we need newer versions. - - (BONOBO_VFS_GNOME_CFLAGS): Add libical to the - AC_CONFIG_SUBDIRS - - (BONOBO_HTML_GNOME_CFLAGS): VFS checking needs to - go before we rquery them. - - Use the new method for gnome-print - checking instead of the old crufty gtk+ based one that nobody can - debug. ever. - -2000-02-16 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/message-browser.c (tree_selection_changed): New - callback function, which will later change the main html window to - reflect the newly-selected tree item. - (get_gtk_html_contents_window): New function. Gets the content - part of a message. - (get_gtk_html_header_window): New function. Will get the header - part of a message, when applicable. - - * camel/camel-formatter.c (str_tolower): Now returns a new string, - rather than changing it in place. - (initialize_camel_formatter): New function; gives a root - CamelDataWrapper and a stream to a CamelFormatter. - (camel_formatter_wrapper_to_html): New function. Translates any - CamelDataWrapper into html. - (lookup_unique_id): Allows the root object to be a - CamelDataWrapper, which is more general than the previously - required CamelMimeMessage. - - -2000-02-14 NotZed <notzed@zedzone.helixcode.com> - - * configure.in (EXTRA_GNOME_CFLAGS): Add libunicode to CFLAGS/LIBS. - -2000-02-13 NotZed <notzed@zedzone.helixcode.com> - - * configure.in: Added check for libunicode. - - * Makefile.am (SUBDIRS): Added libibex. - - * tests/test11.c (main): New test, tests search api. - -2000-02-13 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/test-multipart-mixed.msg: New rfc822 file, which - crashes message-browser. - - * tests/ui-tests/message-browser.c (get_gtk_html_window): Takes a - CamelMimeMessage as a param, rather than a filename. - (main): Puts our windows in an hpane rather than a vbox. Also - opens a file dlg box if a filename wasn't given as a first param. - - * camel/camel-stream-fs.c (_init_with_name): Set stream_fs->fd to - -1 if we fail to load the file. - (camel_stream_fs_new_with_name): If stream_fs->fd is -1, return - NULL. These changes make it so that a CamelStreamFs won't be - created if you give it a bogus filename; they may be replaced once - exception handling is in place. - - * tests/ui-tests/message-browser.c (handle_tree_item): Expand tree - items. - (mime_message_to_html): New function; translates a - CamelMimeMessage into two strings (one for the header, and one for - the body). - (get_gtk_html_window): New function; fills out a window with - html. The html is taken from a processed rfc822 file, via a - CamelFormatter. - - * camel/camel-formatter.c: Added assertions. - (handle_text_html): Don't call text_to_html on something that's - already html. - (multipart_foreach): function deleted. - - * tests/ui-tests/message-browser.c: Added preliminary support for - the viewing of messages via gtkhtml. Lots of commenting. - -2000-02-11 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/contact-editor/e-contact-editor.c: Fixed the - location the first time you see the drop down menus for changing - which phone, email, or snail mail address you see. - -2000-02-11 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.c (e_text_event): Made a click on a text - widget set the cursor properly. - -2000-02-11 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text/e-text.h: Removed some arguments from the .h that - will never be implemented. - - -2000-02-10 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/data-wrapper-repository.c (data_wrapper_repository_init): - default the text/* mime types to CamelSimpleDataWrapper so - that Michael can use get_stream. - -2000-02-10 NotZed <notzed@zedzone.helixcode.com> - - * camel/camel-simple-data-wrapper-stream.h: The superclass is - actually a seekable stream, not just a stream. - -2000-02-10 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/Makefile.am (THREAD_RELATED_TESTS): don't - build thread related tests if evolution has been - compiled with no thread support. - - * configure.in (have_pthread): allow user to enable/disable - thread support at configure time - (EXTRA_GNOME_CFLAGS): - (EXTRA_GNOME_LIBS): thread support is directly - included in this variable if enabled. No more - EXTRA_GNOME_CFLAGS_THREADS - Other special support should be added in - EXTRA_GNOME_LIBS and EXTRA_GNOME_CFLAGS - instead of redefining a new variable - each time we want to add a new lib. - (bonobo, ....) - - * camel/camel.c (camel_init): only try to initialize threads if - we enabled threads support. - - * tests/ui-tests/Makefile.am (message_browser_LDADD): use - EXTRA_GNOME_LIBS - - * configure.in (have_pthread): remove HAVE_PTHREADS - variable. Define ENABLE_THREADS instead. - - * camel/Makefile.am: use ENABLE_THREADS not HAVE_PTHREADS - to test if we build thread relateed code. - - * tests/Makefile.am: use EXTRA_GNOME_LIBS, - not EXTRA_GNOME_LIBS_THREADS - -2000-02-10 NotZed <notzed@zedzone.helixcode.com> - - * camel/hash-table-utils.c (g_strcase_hash): Removed a bizarre - comparison construct for converting case. - -2000-02-09 NotZed <notzed@zedzone.helixcode.com> - - * camel/data-wrapper-repository.c (data_wrapper_repository_init): - Uses case-insensitive compares. - - * camel/gmime-content-field.c (gmime_content_field_new): Uses - case-insensitive compares. - - * camel/data-wrapper-repository.c (data_wrapper_repository_init): - Use case-insensitive mime types. - - * camel/camel-simple-data-wrapper-stream.c (read): Increment the - copy source address to match the data read offset. - (seek): Actually implement the seek. - - * camel/camel-mime-part-utils.c - (camel_mime_part_store_stream_in_buffer): If we get a -1 read, - DONT update the total bytes, and try and truncate the array in - reverse. Eek. - - * camel/camel-mime-part.c (camel_mime_part_encoding_from_string): - This was DEFINETLEY not the right way to do it. strncmp!=strcmp - (camel_mime_part_encoding_to_string): Handle the default case. - : include string.h for strcmp() etc. - -2000-02-09 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/test-multipart-alt.msg: New test file; run - message-browser on it, and it will crash. - -2000-02-09 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/ui-tests/message-browser.c (handle_tree_item): - show the item. - (handle_tree_item): show the containers and the containees - (get_message_tree_ctrl): call handle_tree_item - on the message itself - - * camel/camel-mime-message.c (camel_mime_message_init): - set the mime type to "mime/message". - --- THIS IS NOT THE CONTENT TYPE --- - - * camel/camel-mime-body-part.c (camel_mime_body_part_init): - set the mime type to "body-part". - --- THIS IS NOT THE CONTENT TYPE --- - - * camel/camel-data-wrapper.c (camel_data_wrapper_set_mime_type): - mime_type is const. - (_set_input_stream): really set the input stream - (_set_output_stream): really set the output stream - various other typo fixes. - - * tests/ui-tests/message-browser.c: various typo - fixes in the ctree construction. - - * camel/string-utils.c (string_trim): fix braindead - trailing trim bug. - - * camel/gmime-content-field.c (gmime_content_field_construct_from_string): - strip the leading and trailing quotes when constructing the - content field. This should be done in a more generic - RFC822 approach, but this fixes a bug that prevent - matt from analysing some multipart messages. - - * camel/camel-data-wrapper.h: reorganize the - deprecated and new methods. - - * camel/providers/mbox/camel-mbox-folder.c - (_check_get_or_maybe_generate_summary_file): - Use "From " as the message separating string. - - * camel/providers/mbox/camel-mbox-folder.c (_append_message): - set the mode when creating the mbox file. - - * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): - ditto - * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary): - ditto - -2000-02-09 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/message-browser.c (print_usage_and_quit): Minor - cleanup. - -2000-02-09 NotZed <notzed@zedzone.helixcode.com> - - * camel/camel-simple-data-wrapper-stream.c (class_init): Actually - initialise the class. It simple couldn't have worked before. - (camel_simple_data_wrapper_stream_construct): Commented out code - which crashes just to get something working, memory corruption?? - -2000-02-09 Christopher James Lahey <clahey@helixcode.com> - - * configure.in: Add new Makefiles to Makefile list. - - * widgets/e-text/Makefile.am: Build libetext. - - * widgets/e-minicard/Makefile.am: Build libeminicard and test - programs. - - * widgets/Makefile.am: Remove all e-text and e-minicard code and - add them to the SUBDIRS list. - -2000-02-08 Matt Loper <matt@helixcode.com> - - * tests/ui-tests/message-browser.c: New file; shows a message in - tree format, where multipart's have multiple leaves. - - * camel/camel-formatter.c: Changed references from - 'multipart/alternate' to 'multipart/alternative'. - - * tests/test-formatter.c (convert_to_html_and_print): Use the - buffer length of the stream to create strings which are then - printed, rather than printing the stream (which might not have a - trailing \0) directly. - - * camel/camel-formatter.c (str_tolower): New function; makes a - string lowercase. - - * tests/test-formatter.c (convert_to_html_and_print): Fixed call - to 'camel_formatter_mime_message_to_html' to contain correct - params. - - * camel/camel-formatter.c: New member to 'CamelFormatterPrivate', - 'attachments', will be used to let the caller know which items - should be treated as attachments (as opposed to objects which are - inline to the body). - (text_to_html): name changed from 'encode_entities'. Also now - converts newlines to <br> tags. - (camel_formatter_mime_message_to_html): Now takes two output - streams -- one for the header, and one for the body. - (get_bonobo_tag_for_object): New function; tries to make a tag out - of (1) the leaf of a mime message and (2) a bonobo object that can - handle its mime type, but can return NULL if it fails to find the - mime type. - (handle_vcard): New function; will write out a vcard as html. - -2000-02-07 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text.h, widgets/e-text.c: Added line wrap and a max - number of lines (max number of lines is only obeyed if text is not - being edited). - -2000-02-07 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/printing/e-contact-print.c: Removed an unneccessary - include of libhnj. All uses of libhnj are commented out. - -2000-02-07 Matt Loper <matt@helixcode.com> - - * camel/camel-formatter.c (mime_part_to_html): function deleted. - - * tests/test-formatter.c (print_usage_and_quit): New function, - which gives usage information. - - * camel/camel-formatter.c: made the 'stream' a member of the - CamelFormatter class, so that streams don't have to be explicitly - sent as a param where a CamelFormatter is also sent.. - (handle_text_plain): Use 'encode_entities' to change '<' to - '>', etc. - -2000-02-03 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-formatter.c (find_preferred_displayable_body_part_in_multipart_alternative): - (mime_part_to_html): typo fix : - use find_preferred_displayable_body_part_in_multipart_alternative - instead of the other names. Allows camel to have no undefined symbols. - -2000-02-02 Matt Loper <matt@helixcode.com> - - * tests/test-formatter.c: New file; intended to test the - CamelFormatter class. - - * camel/camel-formatter.c: Lots of cleanup, commenting, some new - functions, and a really basic skeleton for getting bonobo objects - into the html. - (encode_entities): New function, stolen from Daniel Velliard. - -2000-01-28 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/printing/e-contact-print-style-editor.h, - addressbook/printing/e-contact-print-style-editor.c, - addressbook/printing/test-contact-print-style-editor.c: Files to - load the contact print style editor from the glade file. Doesn't - really do anything yet. - - * addressbook/printing/Makefile.am: Added style editor stuff. - - * addressbook/printing/e-contact-print.glade: Changed a bit. - Fixed an out of place widget. - - * addressbook/printing/.cvsignore: Added - contact-print-style-editor-test. - - * addressbook/printing/smallbook.ecps: Fixed up the values to - match the new types. - - * addressbook/printing/medbook.ecps, - addressbook/printing/phonelist.ecps: Added two new printing - styles. - - * addressbook/printing/e-contact-print.h: Fixed an incorrect - comment. - - * addressbook/printing/e-contact-print.c: Added columns and letter - tabs. Tweaked spacing all over the place. Fixed card height - function so that column wrapping is always done correctly. Added - pulling of style information from a file. Added line wrapping - within each text field. - - * addressbook/printing/e-contact-print-types.h: Added a type field - for different types of print styles. - - -2000-01-28 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text.c (e_text_command): Handle the grab and ungrab - command instead of doing focus by hand. This fixes a problem - related to the scroll wheel. - (e_text_command): Reset the blink timer in many more command - situations so that the cursor blinks less when you're interacting - with it. - - * widgets/e-text-event-processor-emacs-like.c: Send the grab focus - command when starting a selection and the ungrab focus command - when ending it. - - * widgets/e-text-event-processor-types.h: Added grab command type - so that the event processor can tell the widget to grab the focus. - - * widgets/e-reflow.c: Redefined all sizes using #defines so that - they can be tweaked later. Added scroll wheel handling and set up - adjustment increments so that the scroll bars will work correctly. - - * widgets/e-minicard.h: Added minicard focus type enum. This - doesn't mean anything yet, but it will later be used to say which - direction the focus is coming from (below for shift-tab, above for - tab.) - -2000-01-28 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-minicard-label.c, widgets/e-minicard.c: Use - e_canvas_item_grab_focus so that it will work with old versions of - gnome-canvas. - - * widgets/e-canvas.c, widgets/e-canvas.h: Finished working around - focus bugs. - -2000-01-28 Christopher James Lahey <clahey@helixcode.com> - - * widgets/test-reflow.c: Set the minimum_width. - - * widgets/e-reflow.h, widgets/e-reflow.c: Added one more column - line so that the right edge of the reflow will have a line. Also - added a minimum_width so that even if the reflow is thinner than - the window, when you resize it larger all the lines are drawn. - -2000-01-27 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-reflow.h, widgets/e-reflow.c: Added an arrow cursor - for the draggable columns. Made the clickable column area - larger. - - * widgets/e-text.h, widgets/e-text.c: Added an I beam cursor for - the text item when it is editable. - - * widgets/e-minicard-label.c: Forward enter and leave - notifications to the contained editable text item. - -2000-01-26 Matt Loper <matt@helixcode.com> - - * camel/camel-formatter.c: By looking up a mimetype in a - hashtable, we can now get a handler function for an arbitrary - mimetype. - -2000-01-25 Mathieu Lacage <mathieu@advogato.org> - - * .cvsignore s: cvs shutup. - -2000-01-25 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-reflow.c, widgets/e-minicard.c: Handle shift-tab - properly now. - - * widgets/e-minicard-label.c: Reindented some areas. - - * widgets/test-reflow.c: Use e-canvas. Set the back pixmap to - NULL for the canvas so that scrolling won't flash grey. - - * widgets/e-canvas.c, widgets/e-canvas.h: These subclass - GnomeCanvas to work around a few bugs so that evolution will work - well with old versions of gnome-libs. - - * widgets/Makefile.am: Added e-canvas.c and e-canvas.h. - - * addressbook/contact-editor/contact-editor.glade: Not much - change. Mostly internal reorganization by glade itself. - -2000-01-25 Christopher James Lahey <clahey@helixcode.com> - - * addressbook/printing/smallbook.ecps: Example contact printing - style. Not used yet. - - * addressbook/printing/e-contact-print.glade: A glade file for - editing contact printing styles. Not used yet. - - * addressbook/printing/test-print.c: Test file for printing. - - * addressbook/printing/e-contact-print.c, - addressbook/printing/e-contact-print.h, - addressbook/printing/e-contact-print-types.h, - addressbook/printing/Makefile.am, addressbook/printing/.cvsignore: - New files for contact printing support. - - * addressbook/Makefile.am (SUBDIRS): Add printing. - - * configure.in: Check for gnome-print. Build the - addressbook/printing Makefile. - -2000-01-24 bertrand <bertrand@helixcode.com> - - * camel/camel-data-wrapper.h: - * camel/camel-data-wrapper.c - (_set_input_stream): - (_get_input_stream): - (_set_output_stream): - (_get_output_stream): - The CamelDataWrapper can now be provided with input and - output streams, so that nothing has to be kept in memory. - - * camel/camel-stream.c (camel_stream_class_init): - added the "data_available" signal. - - -2000-01-24 Federico Mena Quintero <federico@helixcode.com> - - * configure.in: Added the gnome-pilot and capplet checks; they - will likely be reworked for the Evolution framework, but for now - the calendar/ directory needs them. - - * configure.in: Added checks for gnome-vfs. - -2000-01-24 bertrand <bertrand@helixcode.com> - - * camel/camel-seekable-stream.c: - * camel/camel-seekable-stream.h: - new files. - - * camel/camel-simple-data-wrapper-stream.h: parent class is now - CamelSeekableStream - * camel/camel-stream-buffered-fs.h: idem - * camel/camel-stream-buffered-fs.c: idem - * camel/camel-stream-mem.h: idem - * camel/camel-stream-mem.c: idem - (_seek): change declaration - * camel/camel-stream-fs.c: parent class is now - CamelSeekableStream - (_seek): change declaration - - * camel/camel-stream-fs.h: parent class is now - CamelSeekableStream - - * camel/camel-stream-fs.[ch]: converted all - gint64 variables into guint32. - - - * camel/camel-stream-fs.c (_read): fix stupid bug. - (_write): ditto. - - * camel/camel-exception.c (camel_exception_new): don't - forget to clean the exception when creating it. - - * camel/camel-recipient.c (camel_recipient_table_add_list): - add recipient_list to the recipients, not recipients_list. - I don't know what that variable was doing here. - - -2000-01-24 Matt Loper <matt@helixcode.com> - - * camel/camel-formatter.c (write_header_info_to_stream): new - function, broken out from 'camel_formatter_make_html'. - (write_mimepart_to_stream): same. - (find_text_body_part_in_multipart_related): new function. - (camel_formatter_make_html): Now tries to deal with - multipart/related, multipart/alternate, and text/(plain|html). - - -2000-01-23 bertrand <bertrand@helixcode.com> - - * camel/camel-store.c (camel_store_get_session): - added a public get_session method. - - * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary): - (camel_mbox_load_summary): load/save message sizes in the summary file - - * camel/providers/mbox/camel-mbox-summary.h: - added a size field to the message information - structure. - - * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary): - copy message size to the mbox summary information too. - - * camel/camel-stream-fs.c (_seek): updated to - work with bounded fs streams. - (_write): ditto. - (_read): ditto. - - * camel/camel-stream-fs.h (struct ): - added the cur_pos, inf_bound and sup_bound - members to allow for bounded fs stream. - - * camel/camel-stream-fs.c (_set_bounds): new func. - (_init_with_fd_and_bounds): idem. - (_init_with_name_and_bounds): idem. - New functions to allow the usage of bounded fs streams. - - The bounded fs stream allow, for example, to make a stream - from a message stored in an mbox file. - - -2000-01-22 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-folder.c (_check_get_or_maybe_generate_summary_file): - use the real summary file path instead of a - stupid hardcoded one. Fixes yet another bug. - - * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary): - don't forget to copy the date too. Fix a very annoying bug. - - * camel/providers/mbox/camel-mbox-folder.c (_append_message): - implemented. A lot of fixes too. Works now. - (_get_uid_list): implemented. - -2000-01-21 bertrand <bertrand@helixcode.com> - - * tests/test10.c: - test the mbox provider. - - * camel/camel-folder.c (_set_name): - if camel_folder_get_mode returns an - exception, return it instead of - overriding it with a new one. - (camel_folder_is_open): make the is_open - method public. - (_set_name): use the is_open instead of - get_mode. - (_set_name): set the fullname even in the case - where the folder has no parent. - (_set_name): use %c, not %d to add the - separator char into the full path. - - * camel/camel-store.c: add exception handling everywhere in - the store related functions arguments. - * camel/providers/mbox/camel-mbox-folder.c: idem - * camel/providers/mbox/camel-mbox-folder.h: idem - * camel/providers/mbox/camel-mbox-store.h: idem - - * camel/providers/mbox/Makefile.am (libcamelmbox_la_SOURCES): - added camel-mbox-provider.c to the mbox provider - sources. - - * camel/providers/mbox/camel-mbox-provider.c: - provider registration code. - - * camel/providers/mbox/camel-mbox-folder.c (_get_message_count): implemented - (_append_message): implemented - - * camel/providers/mbox/camel-mbox-parser.c (initialize_buffer): - use \0 to mark the end of the buffer. - (read_next_buffer_chunk): ditto. - (read_header): test the presence of a \0 instead of - reading the eof field - (read_message_begining): idem. - (camel_mbox_parse_file): idem. - Remove the eof field from the parser - structure. - (read_next_buffer_chunk): removed some nasty bugs - again. - - -2000-01-21 Federico Mena Quintero <federico@helixcode.com> - - * libversit/vcc.y: Removed the VFS crap; my mistake, it should not - go here. - - * configure.in: Added yacc requirements for libversit. - -2000-01-21 Matt Loper <matt@helixcode.com> - - * camel/camel-formatter.c (camel_formatter_make_html): added a - CamelMimeMessage as a param to this function, and removed it as a - member of the object. - -2000-01-21 Federico Mena Quintero <federico@helixcode.com> - - * configure.in (AC_OUTPUT): Added libversit/Makefile and - calendar/Makefile. - - * Makefile.am (SUBDIRS): Added libversit and calendar. - -2000-01-20 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): - compute and return the file size. - - -2000-01-20 Matt Loper <matt@helixcode.com> - - * camel/camel-formatter.c, camel/camel-formatter.h: New - files. You'll be able to use a CamelFormatter to get - html-formatted versions of a CamelMimeMessage. - -2000-01-20 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text-event-processor-types.h: Changed some line - spacing. - - * widgets/test-reflow.c: Connected to the resize signal of the - reflow. - - * widgets/e-minicard.c: Made width argument set function only - update if width is different. - - * widgets/e-reflow.h, widgets/e-reflow.c: Added draggable column dividers. - - * addressbook/contact-editor/test-editor.c: Open two dialogs for - more interesting testing. - - * addressbook/contact-editor/e-contact-editor.h, - addressbook/contact-editor/e-contact-editor.c: Modified to use - glade. Added menus to change which phone/address/email entries to - view. Added images to the dialog. - - * addressbook/contact-editor/e-contact-editor-strings.h, - addressbook/contact-editor/contact-editor.glade: Glade files for - the contact editor dialog. - - * addressbook/contact-editor/Makefile.am: Added images and added - glade stuff. - - * addressbook/contact-editor/arrow.png, - addressbook/contact-editor/briefcase.png, - addressbook/contact-editor/netfreebusy.png, - addressbook/contact-editor/netmeeting.png: Image files for the - contact editor dialog. - -2000-01-19 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-folder.c (_get_message_count): - implemented. - - * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary): - (camel_mbox_load_summary): save/load the next uid. - - * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): - Compute the next available uid. - * camel/providers/mbox/camel-mbox-folder.c (_create): - (_check_get_or_maybe_generate_summary_file): - Set and use the next_uid field properly. - * camel/providers/mbox/camel-mbox-summary.h: added - an extra field to store the next available uid. - - * camel/providers/mbox/camel-mbox-folder.c - (_check_get_or_maybe_generate_summary_file): - routine called when the folder is opened. - Reads or creates the summary file. - (_create): initialize the internal summary - structure. - (_close): save the summary file on closing. - (_init_with_store): initialize mbox specific - folder members. - -2000-01-18 bertrand <bertrand@helixcode.com> - - * tests/test9.c: - tests for summary and parsing process of mbox files. - - * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): do - not use case insensitive comp to detect message separators. Kill - some nasty bugs in netscape file parsing, - - * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary): - don't use g_array_append but write directly inside the - array data instead. Better performance and bug fix. - - * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_load_summary): - fix the name and bugs. - - * camel/camel-folder-summary.h: update the class - method definition to match the public defs. - - * camel/providers/mbox/camel-mbox-summary.c (camel_mbox_save_summary): - (mbox_load_summary): summary file read/write routines. - - * camel/providers/mbox/camel-mbox-utils.c (parsed_information_to_mbox_summary): - routine to construct the summary after the mbox - file has been parsed and the x-evolution fields - inserted. - -2000-01-17 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): - dont use the x_evolution field but rather the uid to - determine the presence of "X-Evolution" in the mail. - - * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): - parse the status and uid values if the x-evolution - has been found. - - * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_xev_parse_header_content): - return the parsed status field correctly. - - * camel/providers/mbox/camel-mbox-utils.h: - fixed bad prototype. - - * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): - parse and store the "To:" header. - - * camel/providers/mbox/camel-mbox-parser.h: - added a "to" field - - * camel/camel-folder-summary.c: - create the arrays here. - - * camel/camel-folder-summary.h: the list of - summary information is no longer a GList but - rather a GArray. - -2000-01-17 Chrsitopher James Lahey <clahey@helixcode.com> - - * head.png, phone.png, email.png, web.png, snailmail.png: Images - for e-contact-editor.c. - - * addressbook/contact-editor/text-editor.c: Test program - for contact editor widget. - - * addressbook/contact-editor/e-contact-editor.c, - addressbook/contact-editor/e-contact-editor.h: Contact editor - widget files. - - * addressbook/contact-editor/.cvsignore, - addressbook/contact-editor/Makefile.am: New directory for contact - editor files. - - * addressbook/.cvsignore, addressbook/Makefile.am: New directory - for addressbook files. - - * widgets/.cvsignore: Added reflow-test. - - * Makefile.am (SUBDIRS): Added addressbook subdirectory. - - * configure.in, widgets/Makefile.am: Removed widgets/toolbar from - SUBDIRS since the lack of content was preventing it from - compiling. - - * widgets/e-text.c, widgets/e-text.h: Fixed a crashing bug. - -2000-01-17 bertrand <bertrand@helixcode.com> - - * tests/test9.c (main): test for the mbox utils. - -2000-01-17 Federico Mena Quintero <federico@helixcode.com> - - * configure.in: Add the gnomecanvaspixbuf argument to gnome-config - invocations. - -2000-01-17 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-utils.c (camel_mbox_write_xev): - (copy_file_chunk): - (camel_mbox_xev_write_header_content): - (string_to_flag): - (flag_to_string): - (string_to_uid): - (uid_to_string): - A bunch of new funcs to handle x-evolution - private header field. - (copy_file_chunk): fixed a nasty bug. - (camel_mbox_write_xev): create the copy file descriptor - with the proper arguments. Exceptions implememnted. - (camel_mbox_write_xev): changed the way bytes are counted. - No more uses the message size cause it did not take into - account the message separators characters. - (camel_mbox_write_xev): hopefully fixed the last bugs. - works ok now. - - -2000-01-15 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-parser.c - (camel_mbox_parse_file): - store the end of headers position. - - * camel/providers/mbox/camel-mbox-parser.h: - added the end_of_header_position to locate the - begining of the mail body. - - - * camel/providers/mbox/camel-mbox-utils.c (uid_to_string): - (string_to_uid): - (flag_to_string): - (string_to_flag): - new functions to handle uids and - flags in the X-Evolution header. - (camel_mbox_xev_parse_header_content): - new function to parse an X-Evolution - header. - (camel_mbox_xev_write_header_content): - new function to write the X-Evolution - header. - -2000-01-13 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-parser.c (read_next_buffer_chunk): - eof is true when no more chars are available, not - when we've read the entire file. - (initialize_buffer): ditto. - (read_message_begining): documented. - (read_header): ditto. - (new_message_detected): ditto. - (advance_n_chars): ditto. - (goto_next_char): ditto. - (read_next_buffer_chunk): ditto. - (initialize_buffer): ditto. - (parser_free): ditto. - (new_parser): ditto. - -2000-01-12 <clahey@galapagos.helixcode.com> - - * widgets/e-text-event-processor-types.h, - widgets/e-text-event-processor-emacs-like.c, widgets/e-text.c, - widgets/e-text.h: Added selection and clipboard support. Added up - and down arrow keys. Fixed choice of font colors for the - selection to be based on the current style. - - * widgets/e-minicard.c: Caused a click to grab the focus. Changed - the fake information added. - - * widgets/e-minicard-label.c: Forward mouse events to the field - EText item. - -2000-01-13 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-canvas-utils.c, widgets/e-canvas-utils.h: - e_canvas_item_move_absolute is just a helper function not supplied - by the gnome_canvas.[ch] I put it here so that multiple items can - use it. - - * widgets/e-reflow.c, widgets/e-reflow.h: This item contains a - number of other items and places them into multiple columns. The - items contained must support a number of arguments and signals to - allow the reflow to interact with them. - - * widgets/test-reflow.c: This is a test program for e-reflow. - - * widgets/e-text.c, widgets/e-text.h: Added properly drawn - selected text. Added some preliminary code for X selection - handling and cut & paste. - - * widgets/e-minicard.c, widgets/e-minicard.h: Added ARG_HAS_FOCUS - handling. Made label display random for more interesting tests of - multiple cards. Tweaked sizing information for better display. - - * widgets/e-minicard-label.c, widgets/e-minicard-label.h: Added - ARG_HAS_FOCUS handling. - - * widgets/Makefile.am: Added the reflow test and reflow files. - -2000-01-12 bertrand <bertrand@helixcode.com> - - * camel/providers/mbox/camel-mbox-parser.h (camel_mbox_parse_file): - Added the prototype of camel_mbox_parse_file. - - * camel/providers/mbox/camel-mbox-parser.c (camel_mbox_parse_file): - updated in-line documentation. - - * tests/Makefile.am (noinst_PROGRAMS): - remove non updated tests from the build - process. - - * corrected a bunch of bugs - - * camel/providers/mbox/camel-mbox-parser.c - (camel_mbox_parse_file): - parser the subject and date. - - - * camel/providers/mbox/camel-mbox-parser.c - (camel_mbox_parse_file): added the ability to - follow the parsing progression. - - * camel/providers/mbox/camel-mbox-parser.h: - parse the x-evolution field. - - * camel/Makefile.am (libcamel_la_SOURCES): - disabled gmime-rfc2047 as it depends on libunicode - and is not used for the moment. - -2000-01-12 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-minicard.c, widgets/e-minicard.h: Added a resize - signal for when the card changes height. Made it so that when you - press tab inside of a field, it goes to the next field. - - * widgets/e-minicard-label.c, widgets/e-minicard-label.h: Added a - resize signal for when the label changes height. - - * widgets/e-text.c, widgets/e-text.h: Added a resize signal for - multiple lines. Added scrolling based on cursor position. - - * widgets/Makefile.am: Removed an extraneous build target. - -2000-01-11 Christopher James Lahey <clahey@helixcode.com> - - * widgets/e-text-event-processor-emacs-like.c: Blocked the tab key - from getting inserted into the buffer since the renderer doesn't - know what a tab is. - - * widgets/e-text.c, widgets/e-text.h: Fixed a memory leak. Added - a blinking cursor and scrolling for the text item. - -2000-01-11 Christopher James Lahey <clahey@helixcode.com> - - * widgets/test-minicard.c: Removed some code which got in the way - of testing properly. - - * widgets/e-minicard-label.c (e_minicard_label_realize): Made the - field text item editable. - - * widgets/Makefile.am: Added e-text-event-process*.[ch]. - - * widgets/e-text.c, widgets/e-text.h: Changed these to support - editing. - - * widgets/e-text-event-processor.c, - widgets/e-text-event-processor.h, - widgets/e-text-event-processor-types.h, - widgets/e-text-event-processor-emacs-like.c, - widgets/e-text-event-processor-emacs-like.h: These are a new pair - of classes which handle all events from the text item and convert - them into commands. - - -2000-01-10 Christopher James Lahey <clahey@helixcode.com> - - * widgets/Makefile.am: Added minicard and text stuff. - - * widgets/e-minicard.c, widgets/e-minicard.h, - widgets/e-minicard-label.c, widgets/e-minicard-label.h: Added - canvas items for the minicard view in the contact manager. - - * widgets/test-minicard.c, widgets/test-minicard-label.c: Tests - for the minicard items. - - * widgets/e-text.h, widgets/e-text.c: New canvas item. Based on - GnomeCanvasText. Adds ellipsis capabilities. Used in - e-minicard*.[ch]. - - * widgets/.cvsignore: Added minicard-test and minicard-label-test. - -2000-01-06 Miguel de Icaza <miguel@gnu.org> - - * configure.in: Add Bonobo detection, Bonobo flags for compilation - for the components and the shell. - -2000-01-06 Elliot Lee <sopwith@redhat.com> - * composer/Makefile.am, widgets/e-table/Makefile.am: Work with - builddir != srcdir - -2000-01-05 Miguel de Icaza <miguel@gnu.org> - - * configure.in (EXTRA_GNOME_CFLAGS_THREADS, - EXTRA_GNOME_LIBS_THREADS): New variables that hold the thread - version of the compile/link lines. - -1999-11-20 Miguel de Icaza <miguel@gnu.org> - - * configure.in (PACKAGE): Raise warning level. - -2000-01-04 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/mbox/camel-mbox-folder.c (_list_subfolders): - in the io_error label does not return before the - list has been freed. - -2000-01-03 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/mbox/camel-mbox-folder.c (_list_subfolders): - detects netscape ".sdb" folders as well as simple - non-suffixed folders (as the ones used in pine). - - - * camel/string-utils.c (string_prefix): - finished implementation. - (string_prefix): added a boolean flag to indicate if the - suffix has been found. When the suffix does not match, - return NULL. - -1999-12-26 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-exception.c (camel_exception_setv): - new function. Allow printf-like description - string constructions. - - * camel/camel-exception.h: cosmetic changes. - - * camel/providers/mbox/camel-mbox-store.h: - * camel/providers/mbox/camel-mbox-store.c: - * camel/providers/mbox/camel-mbox-folder.h: - * camel/providers/mbox/camel-mbox-folder.c: - More work on the mbox provider. - - -1999-12-22 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/mbox/camel-mbox-store.h: - * camel/providers/mbox/camel-mbox-store.c: - * camel/providers/mbox/camel-mbox-folder.h: - * camel/providers/mbox/camel-mbox-folder.c: - part of the mbox provider. - -1999-12-20 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (_set_name): - check that the folder is closed or raise an exception. - (_set_name): unset the name fields as soon as possible, - even if an exception is raised. - - * configure.in: - build mbox provider Makefile - - * camel/Makefile.am (SUBDIRS): - re-enable providers compilation - -1999-12-19 Damon Chaplin <damon@karuna.freeserve.co.uk> - - * configure.in (AC_OUTPUT): added widgets/meeting-time-sel/Makefile - -1999-12-19 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder-utils.c: include camel-log.h - to avoid unresolved symbols. - -1999-12-18 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (camel_folder_get_summary): - documented. - - * camel/camel-folder-pt-proxy.c (_append_message): - updated to take the change on append into account. - - * camel/camel-folder.h: - updated class def concerning append. - * camel/camel-folder.c - (camel_folder_append_message): documented. - (camel_folder_append_message): don't return the - message number. Use specific methods instead. - (_append_message): idem. - - (_delete): use exception mechanism. - (camel_folder_delete): idem. - (_delete_messages): idem. - (camel_folder_delete_messages): idem. - (_get_parent_folder): idem. - (camel_folder_get_parent_folder): idem. - (_get_parent_store): idem. - (_get_mode): idem. - (camel_folder_get_parent_store): idem. - (camel_folder_get_mode): idem. - (_list_subfolders): idem. - (camel_folder_list_subfolders): idem. - (_expunge): idem. - (camel_folder_expunge): idem. - (_has_message_number_capability): idem. - (camel_folder_has_message_number_capability): idem. - (_get_message_by_number): idem. - (camel_folder_get_message_by_number): idem. - (camel_folder_get_message_count): idem. - (_list_permanent_flags): idem. - (camel_folder_list_permanent_flags): idem. - (_copy_message_to): idem. - (camel_folder_copy_message_to): idem. - (camel_folder_has_summary_capability): idem. - (camel_folder_get_summary): idem. - (camel_folder_has_uid_capability): idem. - (camel_folder_get_message_uid): idem. - (_get_message_uid_by_number): idem. - (camel_folder_get_message_uid_by_number): idem. - (camel_folder_get_message_by_uid): idem. - (camel_folder_get_uid_list): idem. - -1999-12-17 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (_set_name): - use exception mechanism. - (camel_folder_set_name): idem. - (camel_folder_set_full_name): idem. - (_get_name): idem. - (camel_folder_get_name): idem. - (_get_full_name): idem. - (camel_folder_get_full_name): idem. - (_can_hold_folders): idem. - (_can_hold_messages): idem. - (_exists): idem. - (camel_folder_exists): idem. - (_is_open): idem. - (_get_subfolder): idem. - (camel_folder_get_subfolder): idem. - - * camel/camel-exception.c (camel_exception_clear): - New function. Clear an exception. - (camel_exception_get_id): - New function. - (camel_exception_get_description): - New function. - - * camel/camel-folder.c (_set_name): - Use the exception system. When the folder - has no parent, don't set its full name - field. - - -1999-12-16 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (camel_folder_expunge): - (_expunge): - * camel/camel-folder-pt-proxy.c (_expunge): - changed the return value. Now returns the list - of expunged messages - - * camel/camel-folder.c (_init_with_store): - cleaned up. Use the exception system now. - (_open): ditto. - (camel_folder_open): ditto. - (camel_folder_open_async): ditto. - (_close): ditto. - (camel_folder_close): ditto. - (camel_folder_close_async): ditto. - - * camel/camel-exception.c (camel_exception_set): - When no exception is given, do nothing, just - return. - (camel_exception_set): documented. - (camel_exception_new): idem. - (camel_exception_free): idem. - (camel_exception_xfer): idem. - - - * camel/camel-folder.c: - * camel/camel-folder.h: more clean-ups. - Removed message list related code. - This was braindead design. - - - * camel/camel-folder-utils.c (camel_aml_expunge_messages): - implemented. The routines in this file will be - called by providers to handle the list of - message already standing in memory. - -1999-12-15 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder-utils.c: - * camel/camel-folder-utils.h: - New files, misc utilities for the - folder providers. Includes active message - list utilities. - - - * camel/camel-folder.c (_has_message_number_capability): - (camel_folder_has_message_number_capability): - Added this to know if a folder provides - number-based message access. - - * camel/camel-folder.c (_get_message_count): - added warning when called directly. - (_append_message): ditto - (_open_async): ditto - (_close_async): ditto - (_delete_messages): ditto - (_expunge): ditto - (_get_message_by_number): ditto - (_get_message_uid): ditto - (_get_message_uid_by_number): ditto - (_get_message_by_uid): ditto - (_get_uid_list): ditto - - - * camel/camel-folder-pt-proxy.c (_open_async): - (_open): - (_close_async): - (_close): - (camel_folder_pt_proxy_class_init): - update - (_get_message_by_number): - Update to reflect changes in CamelFolder - - * camel/camel-folder.h: - * camel/camel-folder.c (_get_subfolder): - (camel_folder_get_subfolder): - The CamelFolder::get_folder is renamed to - get_subfolder as it is more intuitive. - - * camel/camel-folder.c (_get_message_by_number): - (camel_folder_get_message_by_number): - * camel/camel-folder.h - (camel_folder_get_message_by_number): - The get_message method is now named - get_message_by_number for consistency - with the _by_uid methods. - - * camel/camel-folder.[ch]: - clean-ups. - -1999-12-13 Nat Friedman <nat@helixcode.com> - - * ebook/e-book.h: New file. - * ebook/e-book.c: New file. - * ebook/e-card.h: New file. - * ebook/e-card-fields.h: New file. - * ebook/e-commerce.h: New file. :-) - -1999-12-08 Ettore Perazzoli <ettore@gnu.org> - - * tests/test1.c (main): Removed the strdup()s, which are not - deeded anymore. - - * camel/camel-mime-message.c (_set_subject): `subject' made const. - (camel_mime_message_set_subject): Likewise. - (_set_from): `from' made const. - (camel_mime_message_set_from): Likewise. - (_set_reply_to): Made `reply_to' const. - (camel_mime_message_set_reply_to): Likewise. - (_set_set_received_date): Made `received_date' const. - (camel_mime_message_set_reply_to): Likewise. - (_set_field): `value' made const. Also, strdup the string before - assigning. - - * camel/camel-mime-message.h: Virtual methods changed to use const - strings when setting header values. - -1999-11-17 Ettore Perazzoli <ettore@gnu.org> - - * composer/Makefile.am (EXTRA_DIST): Added `$(glade_DATA)'. - - * camel/Makefile.am (EXTRA_DIST): Added - `$(libcamel_extra_sources)'. - (libcamelinclude_HEADERS): Added `gmime-base64.h'. - -1999-11-17 Ettore Perazzoli <ettore@gnu.org> - - * camel/camel-mime-message.c (_write_to_stream): Removed extra ':' - in the `Mime-Version' header. - - * tests/ui-tests/msg-composer-test.c: Removed. - - * Makefile.am (SUBDIRS): Added `composer'. - - * configure.in: Create `composer/Makefile'. - - * camel/camel-simple-data-wrapper-stream.c - (camel_simple_data_wrapper_stream_construct): Updated accordingly. - (camel_simple_data_wrapper_stream_new): Updated accordingly. - * camel/camel-stream-data-wrapper.c - (camel_stream_data_wrapper_construct): Updated accordingly. - - * camel/camel-data-wrapper.h: Replaced `IS_CAMEL...()' type check - macro name with `CAMEL_IS...()'. - * camel/camel-folder-pt-proxy.h: Likewise. - * camel/camel-folder-summary.h: Likewise. - * camel/camel-folder.h: Likewise. - * camel/camel-medium.h: Likewise. - * camel/camel-mime-body-part.h: Likewise. - * camel/camel-mime-message.h: Likewise. - * camel/camel-mime-part.h: Likewise. - * camel/camel-multipart.h: Likewise. - * camel/camel-service.h: Likewise. - * camel/camel-session.h: Likewise. - * camel/camel-simple-data-wrapper-stream.h: Likewise. - * camel/camel-simple-data-wrapper.h: Likewise. - * camel/camel-store.h: Likewise. - * camel/camel-stream-buffered-fs.h: Likewise. - * camel/camel-stream-data-wrapper.h: Likewise. - * camel/camel-stream-fs.h: Likewise. - * camel/camel-stream-mem.h: Likewise. - * camel/camel-stream.h: Likewise. - - * tests/test1.c (main): Updated to match the `RECIPIENT_TYPE' - changes. - - * camel/camel-mime-message.h: Changed `RECIPIENT_TYPE_TO', - `RECIPIENT_TYPE_CC' and `RECIPIENT_TYPE_BCC' into - `CAMEL_RECIPIENT_TYPE_TO', `CAMEL_RECIPIENT_TYPE_CC' and - `CAMEL_RECIPIENT_TYPE_BCC', respectively. - -1999-11-17 Ettore Perazzoli <ettore@gnu.org> - - * camel/camel-mime-message.c (_write_to_stream): Write - "Mime-Version: 1.0" to the stream. - - * tests/test1.c: If executed with a file name parameter, attach a - file with with that name to the email without loading it into - core, thus demonstrating usage of my latest changes. - - * camel/camel-mime-part.c (_set_encoding): Updated to use - `CamelMimePartEncodingType'. - (camel_mime_part_set_encoding): Likewise. - (_get_encoding): Likewise. - (camel_mime_part_get_encoding): Likewise. - (_write_content_to_stream): Honour the `encoding' member. - (_construct_from_stream): Made static. - (camel_mime_part_encoding_to_string): New function. - (_write_to_stream): Write the encoding string using it. - (camel_mime_part_init): Set encoding to - `CAMEL_MIME_PART_ENCODING_DEFAULT'. - (_finalize): Don't free `encoding' anymore. - (camel_mime_part_encoding_from_string): New function. - (_parse_header_pair): Use it. - - * camel/camel-mime-part.h: New enum `CamelMimePartEncodingType'. - Member `encoding' of `struct _CamelMimePart' changed from `gchar - *' to `CamelMimePartEncodingType'. All the encoding-related - methods changed to use this type instead of `gchar *'. - - * camel/gmime-base64.c (gmime_encode_base64): Got it to work. - - * camel/Makefile.am (libcamel_la_SOURCES): Compile - `gmime-base64.c'. - - * camel/gmime-base64.h: New, previously missing, header. - - * camel/camel-stream-data-wrapper.c: New file implementing the - `CamelStreamDataWrapper' class. - * camel/camel-stream-data-wrapper.h: Corresponding header. - - * camel/camel-simple-data-wrapper.c: Implemented the `get_stream' - virtual method. - (_get_stream): New function implementing the method. - (camel_simple_data_wrapper_class_init): Install it in the class - struct. - (camel_simple_data_wrapper_init): New function initializing the - `stream' member to NULL, - (camel_simple_data_wrapper_class_init): Set it as the - GtkObjectInitFunc. - - * camel/camel-simple-data-wrapper.h: New member `stream' in - `struct _CamelSimpleDataWrapper'. - - * camel/camel-simple-data-wrapper-stream.c: New file implementing - the `CamelSimpleDataWrapperStream' class. - * camel/camel-simple-data-wrapper-stream.h: Corresponding header. - - * camel/camel-data-wrapper.c (camel_data_wrapper_get_stream): New - function. - (_get_stream): New private function, just returning NULL. - (camel_data_wrapper_class_init): Install it as the default - `get_stream' virtual method. - - * camel/camel-data-wrapper.h: New virtual method `get_stream' in - `CamelDataWrapperClass'. - (camel_data_wrapper_get_stream): New function prototype. - -1999-11-05 Ettore Perazzoli <ettore@gnu.org> - - * tests/ui-tests/msg-composer-test.c: New file for testing the - `EMsgComposer' widget. - * tests/ui-tests/Makefile.am (noinst_PROGRAMS): Compile it. Do - not compile `store_listing' for now because it's currently broken. - (INCLUDES): Added the `widgets' source directory to the include - path list. - (LDADD): Removed the MH dependency; link with - `libevolutionwidgets.la' from the `widgets' directory. - - * configure.in: Create `widgets/Makefile'. - - * camel/gmime-rfc2047.c (rfc2047_clean): Removed C++-like comment. - * camel/camel-folder.c (camel_folder_get_message_uid_by_number): - Likewise. - * camel/gmime-content-field.c (gmime_content_field_get_parameter): - Likewise. - * camel/camel.c (camel_init): Likewise. - * camel/camel-provider.c (camel_provider_register): Likewise. - * camel/camel-multipart.c (_construct_from_stream): Likewise. - * camel/camel-mime-part.c (_write_content_to_stream): Likewise. - * camel/camel-medium.c (camel_medium_class_init): Likewise. - - * camel/camel-data-wrapper.h (camel_data_wrapper_get_type): Make - prototype non-static. - - * camel/Makefile.am (libcamelinclude_HEADERS): Move - `camel-exception-list.def' from `EXTRA_DIST' to - `libcamelinclude_HEADERS'. - - * camel/camel.h: Do not #include <config.h>. - * camel/data-wrapper-repository.h: Likewise. - -1999-11-05 Ettore Perazzoli <ettore@gnu.org> - - * tests/Makefile.am (INCLUDES): Add `-I$(top_srcdir)'. - -1999-10-13 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (camel_folder_close): the - folder->close method is now asynchronous. - - * camel/camel-folder-pt-proxy.c (_folder_open_cb): - (_open): - (_folder_open_cb): - (_open): - open/close method implemented in the thread proxy - folder. More to come. - - * camel/camel-exception.c (camel_exception_xfer): - new utility func. - - * camel/camel-marshal-utils.c: some new marshallers - - * camel/camel-folder-pt-proxy.c: Some explanations - on the thread proxy system. - -1999-10-11 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-marshal-utils.c: - camel/camel-marshal-utils.h: - Handles operation marshalling. - - * camel/camel-thread-proxy.c: - camel/camel-thread-proxy.h: - new files. Generic proxy system. - - * camel/camel-folder-pt-proxy.c - moved all proxy related code in dedicated files. - - (camel_folder_pt_proxy_init): - removed proxy initialisation code - (_finalize): - removed proxy finalization code - - - * camel/camel-exception.c - (camel_exception_new): - (camel_exception_set): - (camel_exception_free): - New funcs. - -1999-09-21 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder-pt-proxy.c (_async_close): - implemented. - - * configure.in: - Check pthreads. - - * camel/Makefile.am: - camel-folder-pt-proxy.c is only compiled - when pthreads are available. - - * camel/camel-folder-pt-proxy.c: - Signal proxying implemenatation. - (_signal_marshaller_server_side): - (_signal_marshaller_client_side): - (_init_signals_proxy): - Code not is tested and has to be best - explained as it uses threads conditions and - gtk signal system. - (_thread_notification_catch): notify pending signals - as well as thread availability. - -1999-09-20 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder-pt-proxy.c (_op_exec_or_plan_for_exec): - completed - - Binch of new funcs: - (_maybe_run_next_op): - Called by the watch notification when - a threaded op is completed - (_thread_notification_catch): - notification watch call back - (_init_notify_system): - set up the notification channel - (notify_availability): - called by threads before completion. - -1999-09-18 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder-pt-proxy.c (_op_exec_or_plan_for_exec): - new func. Try to exec an operation in a thread - or queue it if a thread is already busy. - - * camel/camel-op-queue.c (camel_op_queue_set_service_availability): - (camel_op_queue_get_service_availability): - new funcs. - - * camel/camel-op-queue.c (camel_op_new): - (camel_op_free): - new funcs. Uses glib mem chunks. - - -1999-09-17 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder-pt-proxy.c (_init_with_store): - added notify io_channel. - - * camel/camel-op-queue.h: - * camel/camel-op-queue.c: - New object. Operation queue. Meant to be used in - non-blocking proxy objects. - (camel_op_queue_run_next_op): new func. - run the next operation. - -1999-09-14 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/Makefile.am (libcamel_la_SOURCES): - added camel-folder-pt-proxy.[ch] to the build - process. - - * camel/camel-folder-pt-proxy.c (_init_with_store): - started implementation of the pthread-based - folder proxy. - - -1999-09-08 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/mh-summary.c - (mh_load_summary): - (mh_save_summary): - (mh_create_summary): - implemented summary (files) for MH folders. - - * camel/providers/MH/camel-mh-folder.c - (_get_message_by_uid): implemented. - (camel_mh_folder_class_init): - (_get_message_uid): implemented - - * camel/camel-folder.c (camel_folder_has_uid_capability): - (camel_folder_get_message_uid): - (camel_folder_get_message_uid_by_number): - (camel_folder_get_message_by_uid): - (camel_folder_get_uid_list): - Documented UID methods. - (camel_folder_get_message_uid_by_number): - const'ified uid. - (camel_folder_get_message_by_uid): idem - removed stupid camel_folder_get_message_uid_by_number - method. - - * tests/ui-tests/store_listing.c (close_all): - close all open folders and stores. (necessary - for UID list saving ). - - * camel/providers/MH/mh-uid.c (mh_generate_uid_list): - fix: store UID list in CamelMHFolder object. - - * camel/providers/MH/camel-mh-folder.c (_open): - read or create UID list. - (_close): save UID list. - -1999-09-07 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/md5-utils.c (md5_get_digest_from_file): - correct parameter decl (const) - - * camel/md5-utils.h: typo. - - * camel/providers/MH/mh-uid.c - More work on UID stuff for MH. - (mh_save_uid_list): - (mh_load_uid_list): - (mh_generate_uid_list): - new funcs. Manage on-disk uid list. - - * camel/providers/MH/mh-utils.c (mh_is_a_message_file): - Util routines live here now. - - * camel/md5-utils.c - Documented all funcs. - - (md5_get_digest_from_stream): - correct typo. - (md5_get_digest_from_file): - same typo corrected. - - - * camel/md5-utils.h : - raw routines are declared public now. - Md5 use has to be versatile. - - * camel/providers/MH/mh-uid.c (mh_uid_get_for_file): - new func. Returns an UID for an MH message. - -1999-09-06 bertrand <Bertrand.Guiheneuf@aful.org> - - - * camel/md5-utils.h: - * camel/md5-utils.c: - changed names to follow camel style. - (md5_get_digest_from_stream): - new methods. - (md5_get_digest_from_file): - new function : get file md5 signature. - To be used in providers code. - - * camel/md5-utils.c: imported md5 coding - routine from rpm. Compiles. - - -1999-09-05 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (camel_folder_has_uid_capability): - (camel_folder_get_message_uid): - (camel_folder_get_message_uid_by_number): - (camel_folder_get_message_by_uid): - (camel_folder_get_uid_list): - Basic UID framework. - - * devel-docs/misc/ref_and_id_proposition.txt: - New revision. Some fixes. - - * camel/camel-folder.h (struct _CamelFolder): added - uid_capability field. - - - * camel/camel-folder.c (camel_folder_close): publicized - the close method. - - * tests/ui-tests/store_listing.c (show_folder_messages): - use folder summary instead of opening all messages. - (show_folder_messages): re-enabled old CPU/Mem consumming - method. Useful for pop3 for instance. - - * camel/providers/MH/camel-mh-folder.c (_create_summary): - basic and highly non-efficient summary implementation. - Should be seen as a proof of concept only. - subfolder summary still has to be implemented. - - * camel/providers/maildir/camel-maildir-folder.c (_init_with_store): - hasn't summary for the moment. - * camel/providers/maildir/camel-maildir-folder.c - cosmetic changes. - - -1999-09-04 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/camel-mh-folder.c (_create_summary): - started summary implementation. - (_open): correct use of open. - - * camel/camel-folder.c (camel_folder_get_summary): - get folder associated summary object. - - * camel/Makefile.am: - added summary files build - - * camel/camel-folder-summary.[ch]: - basic summary framework - -1999-09-03 bertrand <Bertrand.Guiheneuf@aful.org> - - * devel-docs/camel/Makefile.am: - sgml doc has camel-recipient now. - - * camel/camel-recipient.c (camel_recipient_foreach_recipient_type): - added in-line documentation. - -1999-09-02 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/maildir: Added (experimental) maildir - provider written by Jukka Zitting <hukka@greywolves.org> - - * camel/providers/Makefile.am (SUBDIRS): build maildir - provider. - - * camel/camel-provider.c (camel_provider_get_for_protocol): - bug fix. patch from Jukka Zitting <hukka@greywolves.org> - - * camel/camel-mime-message.c (_write_one_recipient_to_stream): - changed decl to fit CRLFunc. - (_write_recipients_to_stream): - calls camel_recipient_foreach_recipient_type now. - - * camel/camel-recipient.c (camel_recipient_foreach_recipient_type): - new convinience function. Iterate over all recipient types. - - * camel/gmime-utils.c (gmime_write_header_table_to_stream): - s/write_header_table_to_stream/gmime_write_header_table_to_stream/ - (gmime_write_header_with_glist_to_stream): - s/write_header_with_glist_to_stream/gmime_write_header_with_glist_to_stream/ - -1999-09-01 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-message.c (_finalize): - (_add_recipient): - (_remove_recipient): - (_get_recipients): now use CamelRecipientTable - - * camel/gmime-content-field.c: - (gmime_content_field_unref): test if object - to free is non void. - - * camel/camel-folder.c (_finalize): - (_set_name): - * camel/camel-mime-part.c (_finalize): - (_set_description): - (_set_disposition): - * camel/camel-service.c (_finalize): - * camel/camel-stream-fs.c (_finalize): - * camel/gmime-content-field.c: - (gmime_content_field_construct_from_string): - - * camel/url-util.c (g_url_free): - - When using g_free (obj) don't test if obj != NULL - g_free () already do that. Thanks to elerium for - the feedback. - -1999-08-30 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-recipient.c (camel_recipient_get): - (camel_recipient_remove): - (camel_recipient_add): - new func. More work on new independant recipient code. - -1999-08-29 bertrand <Bertrand.Guiheneuf@aful.org> - - * MAINTAINERS: updated my e-mail address. - -1999-08-28 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (camel_mime_part_set_text): - text parameter declared const - - * camel/camel-mime-part-utils.c (camel_mime_part_store_stream_in_buffer): - actually test correctly nb_bytes_read_chunk is >0 - - * camel/gstring-util.c: - * camel/gmime-content-field.c: - * camel/providers/MH/camel-mh-folder.c: - * camel/camel-stream-fs.c: - include string.h - - * camel/camel-stream-mem.c (_write): return - the numver of written bytes. - - * camel/camel-stream-buffered-fs.c (_eos): - return sthg - - * camel/camel-stream.c (default_camel_seek): - return something. - -1999-08-26 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (_get_content_object): - contruct the content from the buffer before calling - CamelMedium implementation. - (_construct_from_stream): Do not construct the content - by default, just store the content bytes in - a temporary buffer. Content will be constructed only - at caller request (when calling CamelMedium::get_content_object) - Providers with better access to the messages (mbox/MH ...) - will have to provider lighter implementation, that is - shall not read content at all unless the caller asks - for it (again with get_content). - - * camel/camel-mime-part-utils.c: new file, groups - mime-part related utils. Meant to be used by providers - subclassing MimeMessage. - (camel_mime_part_construct_headers_from_stream): - (camel_mime_part_construct_content_from_stream): - no more useless temporary hash table. - - * camel/camel-mime-part.c (_construct_from_stream): calls - mime-part-utils functions now. - - * camel/gmime-utils.c (_store_header_pair_from_string): - do not use hash table to store header, use an array instead. - -1999-08-25 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c: now descend from CamelMedium. - - * tests/test1.c (main): all headers must be strdup'ed - (main): unref created objects - - * camel/camel-medium.c (_set_content_object): - (_get_content_object): these methods are - in CamelMedium now. - -1999-08-24 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-medium.c (camel_medium_class_init): - new class. Will handle all sort of information media - (Mime mail messages, Lotus Notes mail messages, - postit notes, faxes, who knows .... :) - CamelMimePart will inherit from it. - - * camel/camel-mime-part.c (_set_disposition): - (_set_description): - description and disposition parameters are now const. - - - * camel/gmime-content-field.c (gmime_content_field_free): added - assertion code. - - * camel/providers/MH/camel-mh-folder.c (_get_message): - uses buffered stream. - - * camel/camel-stream-buffered-fs.c: - new stream to accelerate file ops. - -1999-08-20 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-stream-fs.c (camel_stream_fs_new_with_name): - name parameter is const. This fixes a bug in destroy () - -1999-08-18 Robert Brady <rwb197@ecs.soton.ac.uk> - - * camel/gmime-rfc2047.c: more work on encoder. - -1999-08-17 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-stream.c (camel_stream_read): - return the number of bytes read. - How can this have ever worked ? - (camel_stream_flush): don't return anything. - - * camel/gmime-utils.c (get_header_table_from_stream): - mem leak fixed. - -1999-08-16 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/ui-tests/store_listing.c: - Now has a popup menu on mailbox tree to allow - easier tests. Implemented the copy stuff. - Works well for the MH provider :))) - - * camel/providers/MH/camel-mh-folder.c (_copy_message_to): - Test MH provider fast copy implemented. - - -1999-08-15 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (camel_folder_expunge): - moved the active list readjustment code here. - Much saner, providers won't have to worry about - that. - (_copy_message_to): new method. - - * camel/providers/MH/camel-mh-folder.c (_expunge): - no more active list readjustment stuff. - - * camel/camel-folder.h: the expunge virtual no more - returns a list of expunged messages. Now providers - only have to set the expunge flag on the expunged - messages. - - * camel/camel-folder.c (camel_folder_get_message): - moved the caching code here. Finally, I don't want - providers to crash the libs with a bad message cache - implementation. - (_close): do not call the CamelFolder virtual expunge - method directly, use camel_folder_expunge() instead. - (camel_folder_expunge): added the want_list param. - The client can decide if it wants the expunged message - list or not. If yes, it'll have to unref the messages - itself. - -1999-08-14 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/ui-tests/store_listing.c (delete_selected_messages): - (expunge_selected_folders): - Implemented deletion/expunge mechanism. - - * camel/camel-folder.c (_get_message): - Added some debug info. - - * camel/providers/MH/camel-mh-folder.c (_expunge): - implemented and tested. - - * camel/camel-mime-message.c (_set_flag): - changed the old braindead implementation. - boolean are inserted in the flag hash - table casted as gpointers. - - - * camel/camel-mime-message.c: indentation fix - - -1999-08-13 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (_get_message): default implementation - to be called first by providers methods. It looks in the - folder message list (in memory) to see if the message has - not already been retrieved, and in this case, returns - the same CamelMimeMessage object - - * camel/providers/MH/camel-mh-folder.c (_get_message): set - message->message_number correctly. - - * camel/camel-folder.h (struct _CamelFolder): - New field (message_list) which will hold a - reference on each message obtained by the folder, - which is necessary in order for the caching procedure - to work (Getting the same message from a folder twice - will return the same CamelMimeMessage object). - - * camel/camel-folder.c (camel_folder_get_message): - When the store retreives a message put it in its - message list. - (_finalize): free message list. - - * ChangeLog: fix typo (parmanent) - - * camel/camel-folder.c (_get_permanent_flag_list): - (camel_folder_get_permanent_flag_list): - new method, returns the list of permanent - flags supported by the folder. - - * camel/camel-mime-message.c (_get_flag_list): - (camel_mime_message_get_flag_list): new method, - return the list of flag name used by this message. - - * camel/hash-table-utils.c (g_strcase_equal): - (g_strcase_hash): those two func go here now. - - * camel/hash_table_utils.c (hash_table_generic_free): - free a (gpointer, gpointer) hash table pair. - - * camel/camel-mime-message.c (camel_mime_message_init): use - case insensitive hash table functions. - (_set_flag): - (camel_mime_message_set_flag): - (_get_flag): - (camel_mime_message_get_flag): - Use const for flag name, they are now - duplicated. - -1999-08-12 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/ui-tests/store_listing.c (show_folder_messages): - remove stupid debug code. - (add_mail_store): use camel_session_get_store instead - of creating MH store directly. - (main): load MH provider. - - * camel/camel-provider.c (camel_provider_register_as_module): - register new provider. - (camel_provider_get_for_protocol): - Now, implementation is correct. - - * camel/camel-store.c (_finalize): - * camel/camel-store.h (struct _CamelStore): - further disabled url_name field use. - URL will be generated dynamically. - - * camel/camel-session.c (camel_session_get_store_for_protocol): - compilation and runtime fixes. - - * camel/providers/MH/camel-mh-store.c (_init): - synced with CamelStore. - - * camel/camel-store.c (_init): - in CamelStore::init, url_name is now const. - disabled url_name copy. - - * camel/camel-session.c (camel_session_get_store): - new function: returns a store for an URL. - (camel_session_get_store_for_protocol): - new functionc: returns a store for a given - store protocol (as IMAP/POP/MH ...) - * camel/string-utils.c (g_strcase_equal): - (g_strcase_hash): case insensitive hash table - funcs. - - * camel/camel-session.c (camel_session_init): hash table - keys are case insensitive. - - * camel/camel-provider.c (camel_provider_get_for_protocol): - new function, returns the last registered - provider for a protocol. - - * camel/providers/MH/camel-mh-provider.c: - new file. MH provider registration stuff. - - * camel/camel-provider.c (camel_provider_register_as_module): - load a provider from a shared object (plugin). - (camel_provider_register): register a provider - "by hand". Used for statically defined providers. - - * tests/test7.c: new test. - tests providers loading framework. - -1999-08-11 - - * camel/camel-service.c (_finalize): - * camel/camel-stream-fs.c (_finalize): - (_destroy): close file descriptor. - * camel/camel-stream-mem.c (_finalize): - * camel/camel-store.c (_finalize): - * camel/camel-folder.c (_finalize): - * camel/camel-multipart.c (_finalize): - * camel/camel-simple-data-wrapper.c (_finalize): - * camel/camel-mime-part.c (_finalize): - implemented destructors. - - - * camel/gmime-content-field.c (gmime_content_field_ref): - (gmime_content_field_unref): - New reference mechanism for GMimeContentField objects. - - * camel/camel-data-wrapper.c (_finalize): - Started implementing destructors. - - * camel/camel-mime-part.c (_construct_from_stream): - * camel/gmime-content-field.c (gmime_content_field_write_to_stream): - * camel/camel-multipart.c (_construct_from_stream): - removed forgotten anarchic traces. - -1999-08-10 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/ui-tests/store_listing.c: - * tests/ui-tests/store_listing.glade: - Quick and (very) dirty hack to test Camel more - easily. - - * camel/camel-folder.c (camel_folder_append_message): - new method. - -1999-08-09 bertrand <Bertrand.Guiheneuf@aful.org> - - * devel-docs/misc/ref_and_id_proposition.txt: - new file. Document message UID and vfolder - implementation. - -1999-08-08 Robert Brady <rwb197@ecs.soton.ac.uk> - - * camel/gmime-rfc2047.c: more advanced RFC2047 encoder started. - -1999-08-08 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/camel-mh-folder.c (_get_message): - fix. In MH, message number is not related to - message position in folder. - - * camel/providers/MH/camel-mh-folder.c (_is_a_message_file): - util func. - (_get_message_count): implemented. - -1999-08-06 bertrand <Bertrand.Guiheneuf@aful.org> - - * devel-docs/camel/: - updated some autogen doc stuff. - Still don't understand warnings :( - - * camel/camel-data-wrapper.c: - * camel/providers/MH/camel-mh-store.c: - * camel/url-util.c: - * camel/gmime-content-field.c: - * camel/camel-store.c: - various inline doc corrections. - - * camel/camel-folder.c (get_message_count): - new method. Returns the number of message - in the folder. - - - -1999-08-06 Robert Brady <rwb197@ecs.soton.ac.uk> - - * tests/test6.c: encoder test. - - * camel/gmime-rfc2047.c: Fixed decoder bug : sequence - ?= is not always the terminator for an encoded-string. - - -1999-08-06 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/camel-mh-folder.c (_list_subfolders): - stat was not testing the good file. Fixed. - - * tests/test4.c (main): added real test for MH folder - provider. All tested things seem to work OK :) - -1998-08-06 Robert Brady <rwb197@ecs.soton.ac.uk> - - * tests/test5.c: test for RFC2047 decoder. - - * camel/gmime-rfc2047.c: Improved RFC2047 decoder. - -1999-08-06 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/camel-mh-folder.c (_exists): add debug information - (_list_subfolders): test if first char in folder name is not '.' - before adding it to the folder list. - - * camel/camel-store.c (_init): - disable session check temporarily - (_get_separator): - (_get_folder): new static func. - Fixed several oddities in class definition. - - * camel/providers/MH/camel-mh-store.c (camel_mh_store_get_type): - parent type is CAMEL_STORE_TYPE not CAMEL_FOLDER_TYPE - - * camel/camel-store.c: - prent class is CamelServiceClass not GtkObjectClass - - * camel/url-util.c : - cosmetic changes + use of const when possible. - (find_host): - fix a bug: when there is no host and no port don't skip the '/' - all static find_* func are now named _func_* - (g_url_free): destructor func. - cache field has been disabled. Constructing the url string - won't be too slow and will occur rarely enough that we - do not need to add complexity to this code. - - * camel/providers/MH/camel-mh-store.c: - parent class is CamelStorClass not GtkObjectClass - -1999-08-05 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/test4.c: - test mh provider. - - * camel/providers/MH/camel-mh-folder.c (_get_message): - implemented - - * camel/camel-folder.c (_get_message): - new method. - (camel_folder_get_message): - corresponding public call - - * camel/README.HACKING: - Some notes. - - * camel/CODING.STYLE: - short note about coding style. - - * camel/README.COPYRIGHT: - Note about copyright policy. - - * camel/providers/MH/camel-mh-folder.c (_list_subfolders): - minor typo fixes. - - -1999-08-04 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-rfc2047.c: - * camel/gmime-rfc2047.h: - indentation and cosmetic changes. - - * camel/providers/MH/camel-mh-folder.c (_list_subfolders): - implemented. - * camel/providers/MH/camel-mh-folder.c (_delete): - finshed implementation - (_delete_messages): implemented. - - -1999-08-04 Robert Brady <rwb197@ecs.soton.ac.uk> - - * camel/gmime-rfc2047.[ch]: added an implemention of RFC2047 - (support for character sets other than US-ASCII in MIME - headers). Not actually called from anywhere yet. - - -1999-08-03 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/camel-mh-folder.c (_create): - implemented. - (_delete): started implementation. - - * camel/camel-folder.c (_get_folder): default implementation - calls camel_store_get_folder (). - - * camel/providers/MH/camel-mh-folder.c (_init_with_store): - implemented. - - * camel/camel-folder.h (struct _CamelFolder): - remove useless exist_on_store field. - - * camel/camel-folder.c (_exists): - do not use exist_on_store field. - - * camel/camel-folder.c (camel_folder_set_name): - (camel_folder_get_name): - new public functions - (_set_name): set full_path. - - (_set_full_name): - (camel_folder_set_full_name): - commented out this functions def. - It would make things very difficult to handle, and would not - be very useful. - - * camel/providers/MH/camel-mh-store.h: - * camel/providers/MH/camel-mh-store.c (camel_mh_store_set_toplevel_dir): - (camel_mh_store_get_toplevel_dir): - * camel/providers/MH/camel-mh-folder.c (_set_name): - * camel/providers/MH/camel-mh-folder.h: - use (gchar *) instead of (GString *) everywhere. - use const when necessary. - - * camel/camel-folder.h (struct _CamelFolder): - removed unused message_list field. - - * camel/camel-mime-part.c (_set_content_object): - There is a probleme here. We can not allow mime part - content-type field and content_object mime-type to be - different. I thus chosed to set mime part object - content field to be freed (if necessary) and set - to be a pointer to content_object mime type - field. - (_construct_from_stream): set content_object mime type - to be the same as mime_part's one. This is necessary - because we use _set_content_type. - - This two things are a bit hackish ansd may need - to be redesigned. - - * camel/gmime-utils.c (gmime_write_header_pair_to_stream): - use g_strdup_printf and remove a bug. - - * camel/camel-simple-data-wrapper.c (_construct_from_stream): - more debugging output + nb_bytes_read is now a signed int - to avoid bug when eos is encountered. - - * camel/camel-mime-part.c (_construct_from_stream): - sync to data_wrapper_repository function name changes. - Use default "text/plain" type when conten-type field - is not found. (following RFC 2046 spec). - - * camel/data-wrapper-repository.c (data_wrapper_repository_set_data_wrapper_type): - (data_wrapper_repository_get_data_wrapper_type): - change function name prefix (s/data_wrapper/data_wrapper_repository/) - - * camel/camel-multipart.c (_read_part): - add `\n` at eol but not before boundary. - - * camel/gmime-utils.c (get_header_table_from_stream): - correct implementation of end of stream detection. - -1999-08-01 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-multipart.c (_read_part): - use a stream to store the part instead of GString. - - * camel/camel-mime-part.c (camel_mime_part_set_text): - set data wrapper content type to "text/plain". - - * camel/camel-stream-mem.c: - * camel/camel-stream-mem.h: - new memory buffer based stream. - - * camel/camel-stream-fs.c (_seek): - implementation for file system based stream. - - * camel/camel-stream.c (camel_stream_seek): - new method. - - * camel/camel-stream-fs.c (camel_stream_fs_class_init): - pass CamelStreamFsClass instead of CamelStreamClass. - -1999-08-01 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-utils.c (gmime_write_header_pair_to_stream): - corrected a bug with memory not allocated for '\0' in strtmp - - * camel/gmime-utils.c (gmime_read_line_from_stream): - do not return NULL when line is empty. - - * camel/camel-multipart.c (_read_part): return true when end - of multipart is found, not the opposite - -1999-07-31 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-utils.c (gmime_read_line_from_stream): - Don't return crlf at end of line. - -1999-07-30 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-utils.c (gmime_read_line_from_stream): - new function: reads a line from a stream. - should be in streams utils maybe. - -1999-07-29 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (_construct_from_stream): - Uses data wrapper repository to find what data wrapper - to use to construct the content from a stream. When - no object is registered for the mime type found in - content type field a CamelSimpleDataWrapper is - used. - - * camel/camel-mime-part.c (_get_content_type): - (camel_mime_part_get_content_type): returns - a pointer on the content_type field instead - of the gchar * mime "type/subtype". - -1999-07-28 bertrand <Bertrand.Guiheneuf@aful.org> - - - * camel/data-wrapper-repository.c - * camel/data-wrapper-repository.h - New files. Handles mime type <-> camel object - (for example "multipart" <-> CamelMultipart - * tests/tesst3.c: test data repository thing. - -1999-07-26 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-multipart.c (_write_to_stream): - implemented output of multipart. - - * tests/test1.c (main): testing content objects operations. - -1999-07-25 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (camel_mime_part_set_text): - new util function to set a mime part content to be - a text string. - - * camel/camel-simple-data-wrapper.c (camel_simple_data_wrapper_set_buffer_from_text): - new util func. - (camel_simple_data_wrapper_new): new func. - - * camel/camel-multipart.c (_write_to_stream): - implemented output of multiparts. - -1999-07-24 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-content-field.c (gmime_content_field_get_parameter): - New function. Returns the value associated to a - mime parameter. - - -1999-07-22 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-multipart.h: - * camel/camel-multipart.c: - New class. Models multipart mime objects. - - * camel/camel-mime-body-part.h: - * camel/camel-mime-body-part.c: - New class. Body part is a mime part contained in - a multipart object. - - -1999-07-21 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-log.h: - implemented hard log level stuff. - * came/*.c use "CAMEL_LOG_*" instead of "CAMEL_LOG (*" - in order to allow hard level switch. - - * tests/test1.c: - * tests/test2.c: - updated to use gchar instead of GString. Tests passed. - - -1999-07-19 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-stream.c: - * camel/camel-stream.h: - "const"-antified - - - * camel/camel-simple-data-wrapper.c: (_construct_from_stream) - do not use any limit when constructing the object from a stream - - * camel/camel-stream-fs.c: - * camel/camel-stream-fs.h: - * camel/camel-mime-message.c: - * camel/camel-mime-message.h: - * camel/camel-session.c: - * camel/camel-session.h: - * camel/camel-service.c: - * camel/camel-service.h: - * camel/camel-store.c: - * camel/camel-store.h: - * camel/camel-folder.c: - * camel/camel-folder.h: - * camel/gmime-utils.c: - * camel/gmime-utils.h: - GString -> gchar - constantified what had to be. - - * camel/string-utils.c: - * camel/string-utils.h: - New files. Meant to replace gstring-util for gchar * - -1999-07-16 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-content-field.c (gmime_content_field_construct_from_string): - GString -> gchar - use const to indicate copied parameter. - -1999-07-15 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-simple-data-wrapper.c: - * camel/camel-simple-data-wrapper.h: - Gstring -> gchar - -1999-07-15 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/url-util.c: - * camel/url-util.h: - Do not use GStrings any more. - Added assertion code. - Cosmetic reformating - - * AUTHORS: - * ChangeLog: - Changed my email address. - - -1999-07-13 Miguel de Icaza <miguel@gnu.org> - - * camel/gmime-base64.c (gmime_encode_base64): Implemented base64 - encoder based on CamelStreams. Should the encoder/decoder be a - Stream itself? - - * camel/gmime-utils.c: include config.h here. - * camel/url-util.c: ditto. - * camel/gstring-util.c: ditto. - * camel/gmime-content-field.c: ditto. - * camel/camel-stream.c: ditto. - * camel/camel-stream-fs.c: ditto. - * camel/camel-store.c: ditto. - * camel/camel-simple-data-wrapper.c: ditto. - * camel/camel-session.c: ditto. - * camel/camel-service.c: ditto. - * camel/camel-mime-part.c: ditto. - * camel/camel-mime-message.c: ditto. - * camel/camel-log.c: ditto. - * camel/camel-data-wrapper.c: ditto - * camel/camel-folder.c: ditto. - - * camel/camel-stream.c (camel_stream_write): Moved api - documentation to the places that they document. - (camel_stream_class_init): Virtual classes do not need to have a - default implementation. So null them all. - (camel_stream_write): Return value from write. - (camel_stream_available): implement. - (camel_stream_write_strings): documented. - - * devel-docs/query/virtual-folder-in-depth.sgml: Small - reformatting - -1999-06-28 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/test2.c (main): now use - CamelDataWrapper::contruct_form_stream to test - message parsing - - * camel/camel-data-wrapper.c: - * camel/camel-data-wrapper.h: - construct_from_stream no longer has maximimum size arg. - - * camel/camel-mime-part.c (_construct_from_stream): new. - Construct the mime_part from a stream. - - * camel/camel-mime-part.c: - new field (content_type) and associated methods. - (camel_mime_part_init): initialize content_type field. - (_parse_header_pair): now set content_type MimePart field - instead of using DataWrapper Mime typing facility. - -1999-06-28 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-data-wrapper.h: - s/content_type/mime_type/ - -1999-06-24 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-simple-data-wrapper.[ch]: - new class. Simple implementation of a data wrapper: - simply keeps the stream result in a byte array. - - * camel/camel-mime-part.c (_parse_header_pair): added a warning. - Have to think about the correct way to store content type stuff. - -1999-06-24 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-message.c (_write_one_recipient_to_stream): - includes gmime-utils header. - patch from Ulrich Drepper <drepper at cygnus.com> - set separator string in write_header_with_glist_to_stream() - - * camel/camel-log.c (camel_log): - patch from Ulrich Drepper <drepper at cygnus.com> - Do not use stderr in initialization of logfile descriptor. - - * camel/camel-stream-fs.c (camel_stream_fs_new_with_name): - patch from Ulrich Drepper <drepper at cygnus.com> - initialize mode field in open(). - -1999-06-22 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-data-wrapper.c (_get_content_type): - moved all the content-type stuff here. - (camel_data_wrapper_init): initialize the instance - content-type field. - - * camel/camel-mime-part.c (_parse_header_pair): - parse Content-Type stuff in header. - (_write_to_stream): write the content type stuff to - the stream. - - * camel/gmime-content-field.c (gmime_content_field_get_mime_type): - new function, returns "type/subtype" mime type string. - (gmime_content_field_construct_from_string): - new function, construbt a content_field object - form a string. be used to set the mime_type from a - string. - - * camel/camel-mime-part.c (_set_content_type): - (camel_mime_part_set_content_type): - (_get_content_type): - (_get_content_type): - new methods. - -1999-06-21 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-utils.c (get_header_table_from_stream): - replace CR/LF+'\t' with ' ' - - * camel/camel-mime-message.c (_set_recipient_list_from_string): - trim \t when splitting - - * camel/gmime-utils.c (get_header_table_from_file): - corrected bug in scanning tabulations ('t' -> '\t') - - * tests/test2.c (main): read mail.test instead - of mail1.test - - * camel/camel-mime-part.c (_add_header): - added comments - -1999-06-03 bertrand <Bertrand.Guiheneuf@aful.org> - - * devel-docs/query/virtual-folder-in-depth.sgml: - sgmlized Giao's doc about virtual folders. - -1999-05-31 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/test2.c (main): - use new stream code instead of raw file * stuff. - - * camel/gmime-utils.c (get_header_table_from_stream): - new func. Will replace get_header_table_from_file and will - be used to parse headers from files as well as from - memory buffers. - - * camel/camel-stream-fs.c: - CamelStream Subclass. File system based - stream. - - -1999-05-30 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-stream.h: new class. Represents an - abstract stream object. - - * camel/camel-mime-message.c (_set_recipient_list_from_string): - remove leading and trailing spaces in recipient addresses. - - * camel/gmime-utils.c (_store_header_pair_from_gstring): - remove leading and trailing spaces from header values. - - * camel/gstring-util.c (g_string_trim): new - func: remove leading or trailng chars from - a specified char set. - (g_string_split): allow trimming of substrings. - - * tests/test1.c (main): remove gtk_main call - -1999-05-28 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c - (_parse_header_pair): - (_init_header_name_table): - More header parsing code. - - -1999-05-27 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/test2.c (main): rewrite message obtained via - parsing into a file. Actually, it works pretty well :)) - - * camel/camel-mime-message.c (_set_recipient_list_from_string): - create recipient list form a comma separated string. - (_parse_header_pair): added recipient lists parsing. - - * camel/camel-mime-part.c (_parse_header_pair): - new (protected) method. Parse a head pair and - decides what to do with it. - - (_add_header): Call in _parse_header_pair - - * camel/camel-mime-message.c (_parse_header_pair): - overload header parsing MimePart mthod. - - * camel/gstring-util.c (g_string_split): - new func: split a gstring into a GList of - substring. - -1999-05-26 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/gmime-utils.c (get_header_lines_from_file): - new func. Parses message header zone and returns - a Glist of all header lines. - - * tests/test2.c: tests message parsing - - * camel/gmime-utils.c (write_header_table_to_file): - new func to write a table of headers. - -1999-05-20 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-message.c (_write_to_file): - recipient list printing - - * tests/test1.c (main): more tests. - -1999-05-19 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (_write_to_file): test if content - exists before calling its write_to method. - - * camel/camel-mime-message.c (_write_to_file): bugs fix. - - * camel/camel-mime-message.c (camel_mime_message_new_with_session): - new func. Creates a message with the session field set - up correctly. - -1999-05-18 bertrand <Bertrand.Guiheneuf@aful.org> - - * tests/test1.c (main): tests - - * camel/camel-mime-message.c (_write_to_file): - started write_to framework for mime_messages - - * camel/camel-mime-message.c (*_message_number): - message number funcs. - -1999-05-15 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-message.c (*_flag): - flags handling methods - -1999-05-14 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-message.c (camel_mime_message_class_init): - added recipient handling class funcs. - -1999-05-13 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-message.c (camel_mime_message_init): - create recipients hash table - (_remove_recipient): - (_add_recipient): - (_get_recipients): new funcs. - Internal Recipients data structure is - a bit complicated though. - - * camel/camel-mime-part.c (camel_mime_part_init): - create headers hash table - - * camel/camel-mime-message.h: - a bunch of get/set header field - method done. Does nothing yet though. - - * camel/camel-mime-message.[ch] : - new file. - -1999-05-12 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.h (struct ): - disposition is now a full GMimeContentField - object. - - * camel/gmime-content-field.c: new file - handle "type/subtype ;parameter=value ; parameter=value ..." - BNF grammar elements - (gmime_content_field_write_to_file): new func - - * camel/gmime-utils.c (gmime_write_header_pair_to_file): - namespace change - -1999-05-11 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (_write_to_file): - overload wrapper class method. - (_write_to_file): start to write some text in - file. - - * camel/camel-store.c: typo fix. - - * camel/camel-store.c: - * camel/camel-service.c: - * camel/camel-folder.c: - * camel/camel-data-wrapper.c: - * camel/camel-mime-part.c: - static functions naming follows gnome - coding style guide. - - * camel/camel-mime-part.h: implemented public interfaces - - -1999-05-10 Bertrand Guiheneuf <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (__camel_mime_part_get_header_lines): - (__camel_mime_part_set_header_lines): - (__camel_mime_part_get_content_languages): - (__camel_mime_part_set_content_languages): - (__camel_mime_part_get_encoding): - (__camel_mime_part_set_encoding): - (__camel_mime_part_get_content_MD5): - (__camel_mime_part_set_content_MD5): - (__camel_mime_part_get_content_id): - (__camel_mime_part_set_content_id): - A bunch of new set/get func. - - * camel/gstring-util.c (g_string_list_free): - convenience function for string list - complete deallocation. - -1999-05-09 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.c (__camel_mime_part_add_header): - new method - - * camel/camel-mime-part.h (struct CamelMimePart): - added core fields. - -1999-05-08 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-mime-part.[ch]: - new class. models a mime mail part. - - * camel/camel-data-wrapper.c - (camel_data_wrapper_write_to_buffer): method to - stream data content in a buffer. - (camel_data_wrapper_write_to_file): - (camel_data_wrapper_construct_from_buffer): - (camel_data_wrapper_construct_from_file): - new methods. - -1999-05-07 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-data-wrapper.[ch]:new class. - This should not be a class but rather an - interface. The day Gtk support interfaces, - it dataWrapper should become an interface. - -1999-05-04 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-service.c (camel_service_get_url): - new method. - - * devel-docs/camel/camel-sections.txt: added - function doc references - - * camel/camel-folder.c (__camel_folder_close): - fixed indentation. - (camel_folder_expunge): new method. - (__camel_folder_close): used expunge flag - -1999-05-03 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (camel_folder_get_mode): - typo fix - - * camel/camel-folder.c (__camel_folder_list_subfolders): - new func. - - * some doc stuffs - - -1999-05-01 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c - (__camel_folder_get_mode): - (camel_folder_get_mode): - (camel_folder_get_parent_store): - (__camel_folder_get_parent_store): - (camel_folder_get_parent_folder): - (__camel_folder_get_parent_folder): - new methods - - * camel/camel-service.c: put __ prefix before - private virtual funcs. - - * camel/camel-folder.c (camel_folder_delete): - (camel_folder_delete_messages): - new methods. - - * camel/url-util.c (g_url_new): some - more comments - -1999-04-27 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c (camel_folder_create): - new public function. - -1999-04-25 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-session.c (camel_session_get_store_from_provider): - initialize folder object. - - * camel/camel-store.c (init): new method. - called by session object at instantiation time. - - * camel/camel-store.h (struct _CamelStore): - new fields : session and url_name - -1999-04-25 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-session.c (camel_session_set_provider): - new method to set the default provider for a protocol. - (camel_session_get_store_from_provider): - new method to instantiate a folder from a provider. - - * camel/camel-provider.h: s/GString/gchar/g - + typo fix. - - * camel/camel-provider.[ch]: - basic provider structure. Have to write the - code for dynamic loading. - -1999-04-24 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/url-util.[ch]: s/new_g_url/g_url_new - - * camel/url-util.c (new_g_url): URL - rewritten completely. Error handling not - implemented in public functions. - But URL scan works pretty well :))) - -1999-04-24 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/url-util.[ch]: I needed the url - functions to use GString, and I wanted a more - general scheme so I finally started rewriting - the whole thing from scratch. - No more code from gzilla :( - -1999-04-23 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/url-util.[ch]: - Utility functions to parse URLs. - Stolen shamelessly from gzilla (www.gzilla.com) - written by Raph Levien <raph@acm.org> - - * camel/Makefile.am: added url-util.[ch] - compilation. - - * Makefile.am (SUBDIRS): removed devel-docs - until I come up with a correct Makefile.am - - * camel/camel-store.h: - * camel/camel-folder.h: - correct declarations of structs - - -1999-04-22 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/camel-mh-store.c: - more test implementation. - - * camel/camel-store.c (camel_store_get_type): typo fix - - -1999-04-21 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/providers/MH/camel-mh-folder.c (camel_mh_folder_get_type): - start test provider. - -1999-04-20 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-store.h: now CamelStore inherits from - CamelService. - - * camel/camel-service.c (camel_service_class_init): - basic abstract service class. - -1999-04-19 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/README: added some (few) explanations. - -1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-store.[ch]: started implementation - * camel/camel-folder.c (camel_folder_get_type): typo - uncommented the store related code. - (camel_folder_create): enable som store relted code. - Not finished. Have to define public methods first. - - * camel/camel-log.h: some explanation about the - log system - -1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c: - (camel_folder_create): implemented (partially) - have to write CamelStore before finishing it. - - * camel/camel-folder.h (CamelFolder): added full_name field - (CamelFolderClass): added set/get_full_name methods - -1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org> - - * camel/camel-folder.c: some work - * camel/camel-log.c: log system for camel - * camel/gstring-util.c: some utilities for GString objects - - -1999-04-18 bertrand <Bertrand.Guiheneuf@aful.org> - - * autogen.sh (PKG_NAME): groomf -> gnome-mailer - diff --git a/HACKING b/HACKING deleted file mode 100644 index e69de29bb2..0000000000 --- a/HACKING +++ /dev/null diff --git a/INSTALL b/INSTALL deleted file mode 100644 index b42a17ac46..0000000000 --- a/INSTALL +++ /dev/null @@ -1,182 +0,0 @@ -Basic Installation -================== - - These are generic installation instructions. - - 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, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - 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 at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' 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. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes awhile. 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. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. 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. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -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 must use a version of `make' that -supports the `VPATH' variable, such as 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 `..'. - - If you have to use a `make' that does not supports the `VPATH' -variable, you have 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. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=PATH' 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. - - 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'. - -Optional Features -================= - - 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. - -Specifying the System Type -========================== - - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -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 host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -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. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--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. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. diff --git a/MAINTAINERS b/MAINTAINERS deleted file mode 100644 index 602e3bf73b..0000000000 --- a/MAINTAINERS +++ /dev/null @@ -1,5 +0,0 @@ -Email: ettore@ximian.com -Email: danw@ximian.com -Email: chris@ximian.com -Email: federico@ximian.com -Email: iain@ximian.com diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index cc6c804035..0000000000 --- a/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -changelogs = \ - ChangeLog - -EXTRA_DIST = \ - AUTHORS \ - $(changelogs) \ - COPYING-DOCS \ - README \ - HACKING \ - MAINTAINERS \ - NEWS \ - xml-i18n-merge.in \ - xml-i18n-update.in \ - xml-i18n-extract.in - -SUBDIRS = \ - intl \ - macros \ - data \ - e-util \ - widgets \ - shell \ - executive-summary \ - libibex \ - camel \ - filter \ - composer \ - mail \ - libical \ - libversit \ - addressbook \ - calendar \ - wombat \ - art \ - ui \ - default_user \ - views \ - tools \ - po @@ -1,992 +0,0 @@ -Version 0.9 "Platypus", 2001-03-12 ----------------------------------- - -Shell: - - - Importing framework. (Iain) - - - Made the splash screen a regular window. (Miguel) - - - Added a menu item to hide the shortcut bar to the shortuct bar - right-click menu. (Jason) - - - Update the shortcut labels to contain the number of unread - messages as well. (Jason) - - - Pre-select a newly created folder in the folder selection dialog. - (Ettore) - -Mail: - - - GPG/PGP support is now mostly working and sort of configurable. - Except that the pretty pictures are missing. (Jeff) - - - Exciting new configuration druid (Anna, Jeff) and configuration - editor-of-the-month (Jeff). You can now have multiple identities - that use different transports. (Jeff) - - - The folder-tree unread message counts now work much better. But - vfolders only display their unread message counts *after you've - looked at the folder for the first time*. (Dan) - - - New mail send/receive stuff with status dialog. (NotZed) - - - "Stop" button and support for cancelling operations. (NotZed) - - - Various fixes involving IMAP folders and subscriptions. (Dan) - - - Fake messages to root threads in the message list are now gone. (NotZed) - - - NNTP support is no longer configured by default, as this code is - not expected to be completed by 1.0. - - - Interface for hiding messages matching certain criteria. (NotZed) - - - Quick search bar now includes "Sender contains" option (Tuomas? Eek!) - - - The mailer now properly launches "gnome_segv" when it crashes. I - mean, if it were to crash. (Dan) - - - IMAP attachments are now not loaded unless you look at them. (Dan) - - - The X-Mailer header can now include a compile-time-specified - string (for specifying package version, etc). (Dan) - - - The Date header in the message list now formats dates differently - depending on how long ago they are. (Chris) - - - The composer doesn't ask if you want to save before closing if you - haven't changed anything. Also, it has more useful window titles - (Jason Leach) And you can now turn off the "are you sure you - didn't mean to enter a subject?" dialog box. (Jeff) - - - The "Menu" key on a Windows keyboard (the one with the picture of - a pop-up menu) now pops up the message list right-click menu. - (Dan) - - - Lots of internal stuff that doesn't much affect the user-visible - functionality, particularly involving multithreading, message - threading, filters/searching, and regression testing. (NotZed) - - - Importers for Outlook Express 4 and mbox (used by most mailers like - Netscape, Pine, Elm, Eudora) (Iain & Jeff) - -Addressbook: - - - Fixed crashing bug on PPC. (Clahey) - - - Updated to work with both OpenLDAP 1 and OpenLDAP 2. (Toshok) - - - Added configuration dialog for LDAP. (Toshok) - - - Plenty of bug fixes. (Clahey, Toshok, Meeks, JP, Larry, Jason, - Federico, Dan, Zucchi, Gediminas Paulauskas, Ettore) - - - Moved category dialog to gal. (JP) - - - Worked on LDAP authentication. (Toshok) - - - Worked on status messages. (Toshok) - - - Worked on GalView stuff. (Clahey) - - - Improved the select names dialog GUI. (Clahey) - -Calendar: - - - New "go to date" dialog. (JP) - - - Categories support for appointments. (JP) - - - New alarms page in event editor. (Anna, JP) - - - Weekday picker now follows the week start setting. (Federico) - - - Date-editing widgets are more consistent with each other. - (Federico) - - - Colorization fixes to the views. (Damon) - - - Optimizations to the views. (Damon) - - - New, simpler loading interface for calendars in the Wombat. (Federico) - - - Removal of lots of old Gnomecal code. (Federico, JP) - - - Alarm instance generation support for the Wombat. (Federico) - - - Alarm trigger queueing for the GUI. (Federico) - - - More robust launching and registration of the components. (Federico) - - - More i18n friendliness. (JP, Federico) - - - Start of the alarm notification daemon. (Federico) - - - Cosmetic and focus fixes all over the place. (Federico, JP) - -Tasks: - - - New, stand-alone tasks component. (Damon) - - - Categories support. (JP, Damon) - - - Your old tasks are migrated automatically to the new tasks folder. - (Federico) - - - You get asked for confirmation when trying to delete a task entry. - (Federico) - -Conduits: - - - Many bug fixes and cleanups. (JP) - -Executive Summary: - - - Bugfixes and memory leaks removed. (Iain) - - - Calendar summary component. (Iain) - - - RDF Summary saves it's state. (Iain) - - - Mail summary shows vFolder summaries as well. (Iain) - - - User changable number of columns. (Iain) - - -Version 0.8 "Archaeopteryx", 2000-12-14 ---------------------------------------- - -Shell: - - - Added a `--no-splash' option. (Ettore) - - - Plugged a number of memory leaks. (Federico) - - - Added interfaces to display an arbitrary string associated with a - folder, and highlight it on demand. (Ettore, Dan) - - - Changed the Storage IDLs so that you can associate a physical URI - to the toplevel node as well. (Ettore) - - - If a shell is already running, `evolution' will just make it - create a new view instead of creating a new shell. (Ettore) - -Mail: - - Display: - - - The folder tree now shows unread message counts for mail - folders. For local folders, this updates in real time. For IMAP, it - only updates when you "Get Mail". To be continued. (Dan) - - - New "important" column in the message list. User-settable. (Dan) - - - The message list "Size" column now displays more prettily and - sorts correctly. (Jeff) - - - New command to view the raw source to a message. (Jeff) - - - More reliable MIME icon code in the mailer and the composer. - (Dan, Iain) - - - Lots of internationalization fixes. (Dan, Kjartan) - - Composer / Outgoing mail - - - Various fixes to use the best charset and MIME encoding for - outgoing messages. (Michael, Jeff) - - - You can now forward messages inline, instead of attaching them. - Forwarding multiple messages now results in a multipart/digest - attachment. (Jeff) - - - Replies are now preceded by "On DATE, PERSON wrote:" (Jeff) - - - Better reply editing, automagically sets indentation and paragraph - style to Normal. (Radek) - - - HTML signature support. (Radek) - - - Inline image support. (Radek) - - - Fixes for addresses with commas. (Jeff, Michael) - - - Fix to not allow attaching directories, devices, etc. - (Jeff) - - - Fixed the sign of the GMT offset in generated Date headers. - (Michael) - - - Fixed a bug in base64 encoding. (Michael) - - - Fixed a problem in connecting to non-ESMTP SMTP servers. (Jeff) - - Miscellaneous Commands / Features: - - - The mailer will now remember your passwords, if you configure - that option for a service. (Dan) - - - New "Apply Filters" command to apply filter rules to selected - messages. (Jeff) - - - No more "No new mail" dialog. (Jeff) - - - Individual messages can now be saved to disk. (Jeff) - - - Synced the Message menu with the right-click menu. (Jeff) - - - Mailer now uses the same search bar as the addressbook. (Anna, - Chris, Jeff) - - Filters: - - - Now supports filtering on system flags (ie Answered, Seen, - Unseen). (Jeff) - - - Regular expression searches are now moved to their own Option - menu. (Jeff) - - - Allows regex searching on the entire message header. (Jeff) - - - Now has soundex filters (x sounds like y). (Jeff) - - IMAP: - - - "Get Mail" now scans all folders. (Dan) - - - IMAP password dialog no longer pops up at startup: click on the - server in the folder tree to connect. (Dan) - - - Folder subscription support. (Chris Toshok, Dan) - - - Various IMAP folder naming fixes. (May fix Cyrus support) (Dan) - - - Seen/deleted flags are preserved across "Get Mail". (Jeff) - - - Fixed a bug that could cause messages to be marked as seen - even when the UI thought they weren't. (Dan) - - - Fixes for IMAP folders with spaces in their names (again). - (Jeff) - - - IMAP Kerberos 4 authentication support. (Dan) - - POP3: - - - Fixed a bunch of error cases in POP3 connection. (Dan) - - - Fixed POP3 to more reliably delete messages when it was supposed - to be doing so. (Dan) - - Local mail: - - - Major local mail rewrite that fixed memory leaks, reduced - memory consumption, improved efficiency, etc. (Michael) - - - Maildir support. (Michael) - - - Local mail folders are now locked (via dot locking and/or - fcntl/flock) while Evolution is modifying them, and it will - notice if they've changed while it's not looking. (Michael) - -Calendar: - - - To-do and calendar conduits working except for extended - character support (ie accented chars) (JP) - - - Updated wombat implementation of change reporting (JP) - - - Majorly kick-ass new recurrence page in the event editor with an - easy UI, a preview of what will happen, and lots of love. (Anna) - - - Imported a new libical with the APIs we require for alarms, the - start of the timezone code. This may be the last Evolution - release that uses a CVS-imported libical; in the future we should - depend on official tarballs. (Federico) - - - Event editor now deals gracefully with iCalendar recurrences we - cannot edit. (Federico) - - - Plenty of fixes to the ETable calendar model for the task list - (Damon). - - - The task list now saves its state, selected columns and sort order - (Damon). - - - Lots of love to the iTIP engine and user interface. Scheduling - appointments via email should be working fine, and they should - also work when you receive them. (Jesse) - - - Lots of work on the calendar preferences code. (Damon) - - - Many functional and cosmetic fixes to the day and week - views. (Damon) - - - Event and task editors now ask if you try to close them without - saving changes. (Damon) - - - You are now prompted if you are sure that you want to delete an - appointment. (Federico) - - - Plenty of memory leaks fixed. (JP, Federico) - - - Prettified the event editor a bit by making widget spacings - consistent. (Federico) - - - Fixed semantics for handling exception dates (Federico) - - - Some fixes to the recurrence instance generation engine. (Damon) - - - Fixed insertion of new objects via notification into the task - list. (JP, Federico) - - - Misc. polishing for the event editor's innards. (Damon, Federico) - - - Misc. cruft removal from old Gnomecal code (Federico, Miguel) - - - Prettier icons for the task list. (Federico) - -Addressbook: - - - Addressbook conduit now working, experimentally, except for - extended character support (ie accented chars.) (JP) - - - Extended wombat functionality with getChanges call. (JP) - - - Full name and address dialogs in contact editor fixed. (Chris) - -Executive Summary: (iain) - - - Now compiled by default. - - - Prettier default dialogs. - - - Customisable background. - - - RDF Summary, and Mail Summary components. - - - Fixes and optimisations. - - - Can restore state. - -Version 0.7, "Loch Ness Monster", ???? --------------------------------------- - -There have been no verified sightings of this release. - - -Version 0.6, "Procompsognathus", 2000-10-19 -------------------------------------------- - -General: - - - Split out lots of functionality to gal. Evolution now depends on - gal. (Chris Lahey, Gal Team) - -Shell: - - - Added a cute splash screen. (Ettore, TigerT) - - - Improved the way `~/evolution' is initialized the first time. - (Iain) - - - Fixed the problem with the folder bar disappearing too son when - clicking on the scrollbar. (Ettore) - - - Updated to use the new toolbar and UI merging code from Bonobo. - (Michael Meeks, Ettore) - -Mail: - - - Numerous i18n encoding, decoding, and display fixes. Non-ASCII - text should be displayed correctly in most context in the mailer - now. The composer no longer sends undeclared 8bit data. (Jeff) - - - The IMAP provider now caches summary info between sessions, so - startup should be much faster for large folders. (Dan) - - - Subscribe/unsubscribe UI for newsgroups. (IMAP subscriptions will - be supported in a later release.) NNTP authentication support. - Various other NNTP fixes. (Chris Toshok) - - - New "full search" button to do more complicated searches. (NotZed) - - - Composer attachment bar improvements. You can now drag files to - the composer window to attach them to the message. (Iain) - - - Message list state (columns selected, sorting, etc) is now saved - between sessions. (NotZed) - - - "Get Mail" now works for IMAP. IMAP mail no longer arrives - asynchronously (although if you delete mail from another client, - it will be deleted asynchronously). (Dan) - - - Image attachments now use thumbnail images rather than a generic - image icon. (Iain) - - - Various IMAP provider bugs (Dan, Jeff) - - - Filter code cleanup/improvements. (NotZed) Filtering can read and - write message scores. (Jeff) On-demand filters no longer expunge - the source folder, and don't filter deleted messages. (Jeff) - Filters now log their actions. (Jeff) - - - Drafts, Outbox, and Sent folders now default to showing "To" - instead of "From" in the header list. Messages output to the Sent - folder are marked as "Seen". "Send later" on a reply will mark the - message as having been replied to. (Jeff) - - - Message list "attachment" column is now functional. The - read/unread state of a fake thread header now matches the state of - the thread. (NotZed) Message list sorting is more clever (Jeff) - - - The "Print" toolbar button now opens a Print dialog rather than a - Print Preview window. (Miguel) - - - New "Select All" command. "Mark all messages as seen" became "Mark - (selected) messages seen". (Jeff) - -Calendar: - - - Improved todo list and calendar view gui (Damon) - - - Printing works again (Federico) - - - Config dialog improvement and implementation (Damon) - - - Todo and calendar conduits working, except for archiving (JP) - -Addressbook: - - - Lots of internal refactoring of addressbook, including changes due - to gal. (Chris, Chris) - - - Lots of bug fixes. (Chris, Chris, Matt Bissiri, Iain, Dan) - - - Added a working field to save whether the contact wants - HTML. (Chris Lahey) - - - Added "Stop" and "View All" toolbar buttons. (Chris Lahey) - - - Lots of work on modifiable LDAP. (Chris Toshok) - - - Recognizes a lot more Prefixes and Suffixes when parsing names. (Nat) - - - The card view doesn't write out cards unless they've changed. (Chris Lahey) - - - New layout of address editor dialog. (Anna, Chris Lahey) - -Version 0.5.1, "Salamended", 2000-09-15 ---------------------------------------- - -General: - - - Fixed a font-handling problem that would cause Evolution to crash - at startup with certain Gtk themes. (Chris) - - - Fixed some build problems. (Chris) - - - We no longer ship an out-of-date Red Hat-only RPM spec file. - -Shell: - - - The shell now installs the `Sent' folder at startup if it doesn't - exist yet. (Ettore) - - - If a component crashes unexpectedly, the shell displays a dialog - box informing the user of that. (Ettore) - - - Fixed a bug in the folder selector dialog that would result in - crashes while trying to move messages in the mailer. (Dan) - -Addressbook: - - - Fixed a bug that would cause the addressbook to crash when - embedded in the composer. (Dan) - -Mail: - - - Fixed a display problem caused by expunging an IMAP folder. (Dan) - - - Fixed POP mail so that "keep on server" is obeyed correctly. (Dan, - Jeff) - - - Fixed replies so that replying to a message twice doesn't turn off - the "replied" flag. (Dan) - - - Fixed a bug that prevented "Send later" from working. (Dan) - - -Version 0.5, "Salamander", 2000-09-13 -------------------------------------- - -Shell: - - - Switched to using ETree for the folder view. (Chris Toshok, - Ettore) - - - Added interfaces to change the string displayed in the tree view - as the name of the folder. (Ettore) - -Calendar: - - - Uses only the new iCalendar standard internally; this means future - interoperability with new calendaring programs. (JP, Federico) - - - New ultra-cool date range selector, aka little calendar. (Damon) - - - Plenty of internal refactoring. (JP, Damon, Federico) - - - Pilot synch work, mostly on pcs infrastructure and some todo work (JP) - <EXPERIMENTAL> - - - Pilot synch work, mostly on pcs infrastructure and some todo work (JP) - <EXPERIMENTAL> - -Addressbook: - - - New advanced search dialog. (Michael Zucchi, Chris Lahey) - - - Added parsing of addresses. (Jesse Pavel) - - - Converted most of addressbook to UTF8. (Lauris) - -Mailer: - - - Filters (but not vfolders) are now more powerful: they can check - any message header, and can do regexp searches on the headers and - body. (Jeff) - - - A first draft of an automated mailing list recognizer - has been added. (It will need more/better rules.) (Ettore) - - - Attachments are handled differently now. All attachments always - have an icon and a header, and you can right-click on the icon to - view/hide, save, or launch an external viewer. (Dan) - - - It is no longer necessary to quit and restart after adding a new - IMAP server. (Peter) - - - Lots of i18n/charset fixing. (Lauris) - - - Shiny new toolbar icons. (Tuomas) - - - Giant menu reorganization. Most message operations are now in the - "Message" menu, and folder operations in the "Folder" menu. - (Ettore, Dan, Peter) - - - "Mark as seen" timeout is now configurable. Mail view remembers - the location of the message list/message display split. (Richard - Hult) - - - New filter category: "On-demand", for filters to be applied - at arbitrary times rather than during mail incorporation. (Peter) - - - POP/IMAP config pages allow you to specify a port... this may - go away in a later release when we support ssl/ssh tunneling - directly. (Peter) - - - Reply To All will now remove your own addresses from the recipient - lists. (Jesse Pavel) - - - Folders are synced when you switch to another folder now. (Dan) - - - An IMAP bug that caused all messages to be marked as read before - they were read has been fixed. (Dan) - - - The IMAP provider is now more robust about dealing with other - concurrent IMAP clients. (Jeff) - - - POP and IMAP are better about when they do and don't try to - reconnect. This was part of Camel operation cancellation support, - which unfortunately didn't make it into 0.5. (Peter) - - - Sent and Outbox folders are now functional. You now have 2 - options when sending a message - "Send Now" which will send the - message imediately and "Send Later" which will queue the message in - Outbox for later sending. When a message is successfully sent, it - is copied to the Sent folder for your records. (Jeff) - -ETable: - - - ETree fixes. (Chris Toshok) - - - Lots of small usability fixes. (Chris Lahey) - - - Lots of grouping bug fixes. Specifically, fixed crashes when - grouping in trees and made ETable not go crazy when you change - data and the table is grouped. (Chris Lahey) - - - Improved table printing when grouped. (Chris Lahey) - - - Converted most of ETable to UTF8. (Lauris) - - -Version 0.4, "Alewife", 2000-08-14 ----------------------------------- - -Shell: - - - Added interfaces to display messages and a progress bar when the - component is busy. (Ettore) - - - Changed the shell BonoboUIHandler code to allow placing menu items - such as "Print" in the right places. (Ettore) - - - Added code to check if an existing `~/evolution' directory - actually has the content we expect and, if not, complain to the - user. (Dan) - - - Fixed some Bonobo-related refcounting problems. (Michael Meeks) - - - Removed the GConf dependency. (JP) - - - Improved the API for the folder selection dialog. (Ettore) - - - Memory leak fixes. (Peter) - -Calendar: - - The calendar is in the middle of major rewrite. Evolution 0.4 - ships with essentially the same calendar component as 0.3 did. - -Addressbook: - - - More work on the Palm Pilot conduits. (Chris Toshok) - - - Fixed some LDAP-related crashes. (Chris Toshok) - - - Added support for displaying embedded vCards through a Bonobo - component. (Chris Lahey) - - - Added support for generic fields. (Chris Lahey) - - - Fixed the navigation order for the Tab key in the contact editor - window. (Chris Lahey) - - - Fixed some Bonobo-related bugs and crashes. (Chris Lahey, Michael - Meeks) - - - Only display entries that have an email address in the address - selector dialog. (Chris Lahey) - - - Added an utility program to import vCards from Gnomecard. (Chris - Lahey) - -Mailer: - - Generic - - - Long mailer operations (such as fetching new mail) now run - asynchronously rather than blocking the UI. This involved - a major rewrite of much of the Camel and mailer code. (Peter) - - - GPG/PGP message decryption support (Nathan Thompson-Amato, Dan) - - - Unfinished messages in the composer can be saved to the "Drafts" - folder and finished later. (Jeff) - - - Double-clicking on a message in the message view now opens it in a - separate window. (Jeff) - - - vCards attached to messages now bring up a minicard view with a - button to add the vCard to the addressbook (Chris Lahey, Dan) - - - Inline uuencoded/binhexed "attachment" support (Dan) - - - "Mark All Messages Seen" command. (Cody Russell) - - Filters / VFolders - - - Major filter/vfolder dialog rewrite (Michael Zucchi) VFolders can - now search any (searchable) folder, not just Inbox. - - - Auto-filter/auto-vfolder code (right click on a message in the - list and pick one of the options at the bottom of the menu to - create a filter/vfolder rule for similar messages). (Michael) - - - You can now set the color of messages in the message list, based - on filter rules. (Local stores can also now store arbitrary user - flags, although there is not yet UI code to set/view them.) - (Michael) - - - Added "Save" button to the quicksearch bar to save a search as a - vfolder. (Michael) - - Configuration - - - Major mail config dialog rewrite (JP). - - - The mailer now remembers your threaded/unthreaded message view - setting between sessions. (Jeremy Wise). - - - Support for multiple identities (JP, Jeff), sources (JP, Peter), and - IMAP servers (JP, Dan) - - Providers - - - You can now leave POP mail on the server. (This will [currently] - only work right with POP servers that support the UIDL command. - On other servers, it will never download some messages unless you - never delete mail.) - - - There is now an MH-like local store available, and code to convert - a folder from one type to the other. (Michael) - - - The mbox provider now writes out "From " lines that are more - compatible with other mailers (like Mutt) that are picky about - their exact format. (Michael) - - - The IMAP provider now supports searching (Jeff). Also various - other speed/efficiency/robustness improvements (Jeff), and support - for old IMAP4 servers as well as IMAP4rev1 (Jon K Hellan). - - -Version 0.3, "Jellyfish", 2000-07-21 ------------------------------------- - -Shell: - - - Pop-up folder selection. (Ettore) - - - Added support for multiple views. (Ettore) - - - Added support for saving component-specific settings, and - some initial code to save the view's configuration. - (Ettore) - - - Fixed the Bonobo menu code so that it works with all the - locales. (Ettore) - -Mailer: - - - Lots of IMAP fixes. (Jeff) - - - You can use an external setuid/setgid movemail program - (although we don't ship our own yet). If you have one - installed with emacs, the configure script will find - that. Otherwise, you can specify --with-movemail=/path. - (Dan) - - - You can toggle HTML/plain text for an individual message - in the composer now. (Ettore) - - - Bonobo embedding sort of works again, but there are - problems with size allocation somewhere. Attachments can now - also be handled by external applications. (Dan) - - - text/plain mail is now line-wrapped in the mail display, - to deal with people who don't put newlines in their mail. - (Dan) - - - Allow user to specify IMAP namespace in the mail config - dialog. (Dan, Jeff) - - - Quoted-printable encoder fixes. (Michael Zucchi) - - - Various NNTP fixes, include a news pane in the config - dialog. (Chris Toshok) - - - Some memory corruption fixes. (Peter Williams) - - - Fix for message not being re-drawn as deleted. (Peter - Williams, Jeff) - - - Moving a message to another folder copies the flags now - (Jeff) - - - Close signature in HTML mail with </PRE>, not <PRE>, and - default to ~/.signature. (Michael Meeks) - - - Fixed some confusing behavior in the message threading - algorithm. (Dan) - - - Improvements to the item selection code. (Chris Lahey) - -Calendar: - - - Added support for a bunch of previously unsupported iCalendar - properties. (Federico) - - - Conduit for synchronizing the calendar with gnome-pilot - (requires gnome-pilot from CVS). (Seth) - - - ETable-based to-do list view ("taskpad"), for your viewing - pleasure. - -Addressbook: - - - Conduit for synchronizing the addressbook with gnome-pilot - (requires gnome-pilot from CVS). (Chris Toshok) - - - Conduit for synchronizing the addressbook with gnome-pilot - (requires gnome-pilot from CVS). (Chris Toshok) - - - Fixed some random crashes. (Chris Lahey) - - - Implemented a vCard Bonobo control so that we can support - inline vCard viewing in the mailer. (Chris Lahey) - - - Quick search looks at both the name and the company name now. - (Chris Lahey) - - - Added more functionality to the contact editor's toolbar. (Chris - Lahey) - - - Support for printing single cards. (Chris Lahey) - -Version 0.2, "Saccharomyces", 2000-07-11 ----------------------------------------- - -Shell: - - * Folder selection dialog (Ettore). - - * Folder creation dialog (Ettore). - -Addressbook: - - * LDAP server configuration dialog (Chris Toshok). - - * Integration of LDAP servers in the shell's tree view (Chris Toshok). - - * ETable-based view (Chris Lahey). - - * Printing support for the ETable-based view (Chris Lahey). - - * Address selection dialog integrated with the message composer (Chris - Lahey). - - * Many miscellaneous bugs fixed (everyone). - -Calendar: - - * Printing support (Michael, Federico). - - * Many, many behavior fixes and polishing to the day/week/month view - widgets (Damon). - - * New glade-based event editor. This is unfinished but usable (Seth, - Federico). - - * Mouse wheel scrolling support (Anders). - - * We have an awesome new engine for computing recurring events - (Damon). This will be plugged in to the new iCalendar code. - - * Internal and public API fixes (Federico, Seth). - - * Shell-related changes (Ettore). - - * Data model for ETable; this is not used yet (Federico). - - * New iCalendar support; this is not used yet (Federico). - - * Pilot syncing updates; this is not used yet (Seth). - - * Many miscellaneous bugs fixed (everyone). - - -Mailer: - - Major features: - - * Basic IMAP support (Jeff) - - * Threaded message view (Michael, Chris Toshok) - - * Filters now work (original work by Michael, bugfixes by Dan) - - - Smaller features: - - * Implemented moving messages between folders (Dan) - - * Very basic printing support (Dan, but it was only like 5 lines - of code, because gnome-print kicks ass) - - * "Delete", "Forward", and "Refile" operations now work on - multiple messages. (Chris Lahey, Peter Williams, Dan) - - * Toggle read/unread flag when the user clicks on the envelope - icon (Chris Lahey, Dan). - - * The "New folder" menu item now works (Ettore, Dan). - - * The filter/vfolder druid now uses the new shell folder selection - UI (Michael) - - * Added "Cc" to the set of filter/vfolderable headers and make the - filter/vfolder "messages to address" rule work with to or cc. - (Dan) - - * New key bindings: "Delete" deletes the current message and jumps - to the next undeleted message. "N" and "P" go to next/previous - unread message. (Dan) - - * Keep asking for POP/IMAP password until the user gets it correct - or hits Cancel, and remember the result until the user exits (or - chooses "Forget Passwords"). (Dan, Jeff) - - * Kludge Camel to output ISO-8859-1 instead of UTF-8, since - neither GtkHTML nor ETable supports UTF-8 still. (Dan) - - * Use the gnome-vfs "sniff buffer" interface to try to identify - the MIME type of attachments without useful type information - (Dan) - - * Allow saving drafts in the composer (Ettore) - - * Added "Received date" header to the set of possible message list - headers. (Dan) - - * Partial gladification of the config dialog (JP Rosevear) - - - Bug fixes: - - * Message read/unread/deleted flags should now be saved reliably - when you exit, and summary should not be rebuilt when a rebuild - isn't needed. Expunging should work reliably (Dan, Ettore, - Jeff). - - * Fix disappearing toolbar bug (Dan). - - * Fixed a bug that made downloading of very large messages over - POP incredibly slow, and various other smaller POP bugs. (Dan) - - * Fixed bugs that made large attachments sometimes get dropped and - small ones sometimes get truncated. (Dan) - - * Fixed filter/vfolder "messages to address" rule to correctly - match "to" rather than "from". (Michael) - - * Fix some text/plain formatting bugs in the composer. (Dan, - Ettore) - - * Turn off search mode when getting new mail (to avoid corrupting - the display). Make "get mail" always put unfiltered mail into - Inbox rather than the current folder. (Dan) - - * Fixed a bug that caused "Re:" to be prepended even to subjects - that started with "Re:" when replying. Added a default subject - to forwarded messages. (Dan) - - * Make the "Attach" dialog in the composer remember the last - directory it was in. (Dan) - - * Code to parse invalid date formats since some mailers generate - them... (Jeff) - - * Fixed various small SMTP bugs (Jeff, Chris Lahey) - - * Fixed some memory leaks (Peter, Jeff) - - * Make replies use the text/plain part of a multipart/alternative - if the user configured plain text rather than HTML mail sending. - (Dan) - - * Various config dialog fixes (Jeff) - - * Partial filter/vfolder GUI facelift (Jacob) diff --git a/README b/README deleted file mode 100644 index d385f0b97c..0000000000 --- a/README +++ /dev/null @@ -1,217 +0,0 @@ -Evolution is the integrated mail, calendar and address book -distributed suite from Ximian, Inc. - -See http://www.ximian.com/apps/evolution.php3 for more information. - -Note that Evolution is still beta. This means it may delete all of -your mail if you give it the chance. - -If you are using Evolution, you should subscribe to the Evolution -mailing list. If you are interested in hacking on it, you should -subscribe to the Evolution Hackers mailing list. Send mail to -"evolution-request@ximian.com" or -"evolution-hackers-request@ximian.com" with the word "subscribe" in -the body of the message. If you are planning to work on any part of -Evolution, please send mail to the mailing list first, to avoid -duplicated effort (and to make sure that you aren't basing your work -on interfaces that are expected to change). - -There are mailing list archives available at -http://lists.ximian.com/archives/public/evolution/ and -http://lists.ximian.com/archives/public/evolution-hackers/ - -There is also an #evolution IRC channel on irc.gnome.org. - - -IF IT DOESN'T WORK ------------------- - -Did you read the "How to build" section below? :-) - -If you have built Evolution and it doesn't work, or you can't get it -or one of its dependencies to compile, try running the -"verify-evolution-install.sh" script in the tools/ subdirectory. It -may be able to figure out what went wrong. - -If the configure script complains that you don't have a library that -you know you have installed, it usually means either that you've -installed things into multiple prefixes (see the bits on GNOME_PATH -below) or (if you're on Linux) that you installed the "foo" package -but forgot the "foo-devel" package. - - -HOW TO BUILD EVOLUTION ----------------------- - - *** READ THIS BEFORE YOU START BUILDING ANYTHING! *** - -Evolution depends on a large number of unreleased and rapidly-changing -libraries. Some of these libraries in turn depend on other unreleased -and rapidly-changing libraries. - -Building Evolution is HARD, and it's going to stay hard until all of -the libraries it depends on stabilize, and there's nothing we can do -to make it any easier until then. - - -General Principles ------------------- - -First you have to decide whether you want to install Evolution (and -its dependencies) into the same prefix as the rest of your GNOME -install, or into a new prefix. Installing everything into the same -prefix as the rest of your GNOME install will make it much easier to -build and run programs, and easier to switch between using packages -and building it yourself, but it may also make it harder to uninstall -later. - -If you want to install into the same prefix as the rest of GNOME, -type: - - gnome-config --prefix - gnome-config --sysconfdir - -and remember the answers, and pass them to "configure" or "autogen.sh" -when building the other packages you need. Eg: - - ./configure --prefix=/usr --sysconfdir=/etc - - -If you build in another prefix instead, you will need to set the -GNOME_PATH environment variable (and ACLOCAL_FLAGS as well if building -from CVS) to include the prefix you install into. Eg: - - export GNOME_PATH=/usr/local - export ACLOCAL_FLAGS="-I /usr/local/share/aclocal" - -(Assuming your shell is bash, and you installed into /usr/local.) You -need to set GNOME_PATH both during compiling AND when you run -evolution. Remember also that if you're installing into an odd prefix -such as /evolution, that you also need to make sure to put -${prefix}/bin in your PATH and ${prefix}/lib in your LD_LIBRARY_PATH. - - -Dependencies ------------- - -All of these libraries are available in GNOME CVS, under the given -names. Most (but not all) of them are also available as tarballs on -ftp.gnome.org. The (*)ed packages are available in Ximian GNOME -(http://www.ximian.com/desktop/) Other packages may be available from -the Ximian GNOME evolution preview mirror. - -If installing from packages, remember that you need both the runtime -and -devel packages for each library. - - - xml-i18n-tools - lates from xml-i18n-tools-stable-1-x branch in - GNOME CVS (0.8.2 is too old) - - - gnome-xml - 1.8.10 or later in the 1.0 series, but not from the 2.0 - series (If you get this from GNOME CVS, use the tag "LIB_XML_1_X".) - (*) - - - gnome-print - 0.25 or later (*) - - - gdk-pixbuf - 0.8.0 or later (*) - - - ORBit - 0.5.6 or later (*) (If you get this from GNOME CVS, use the - tag "orbit-stable-0-5".) - - - oaf - 0.6.2 or later (If you get this from GNOME CVS, use the tag - "oaf-stable-0-6") - - *** If you are using oaf from CVS, you should use the flag - *** "--disable-more-warnings" when configure, or it may fail to - *** build. - - - gconf - 0.6 or later. - - - gnome-vfs - 0.4.2 or later (If you get this from GNOME CVS, use - the tag "gnome-vfs-1-0") - - *** If you are using gnome-vfs from CVS, you should use the flag - *** "--disable-more-warnings" when configuring, or it may fail to - *** build. - - - libglade (*) - - - bonobo - 0.37 or later - - *** Note that bonobo must be installed with the same --prefix as - *** either gnome-libs or evolution for the Makefiles to work - *** properly. - - - libunicode - 0.4.gnome (*) - - - gal (GNOME Application Library) - 0.5.99.5 or later - - - gtkhtml - 0.8.2 or later - -If you want support for PalmPilot syncing (currently experimental so -please back up your pilot) you will also need to do the following: - -1) pilot-link -cvs -d :pserver:anonymous@cvs.gnu-designs.com:/cvs/pilot-link login -The password is just <ENTER>. -cvs -d :pserver:anonymous@cvs.gnu-designs.com:/cvs/pilot-link co pilot-link -./configure --prefix=<pilot-link-prefix> --with-perl=no --with-java=no ---with-tcl=no --with-python=no -make -make install - -2) gnome-pilot -cvs -z3 co gnome-pilot -./autogen.sh --prefix=<gnome-pilot-prefix> --with-pisock=<pilot-link-prefix> -make -make install - -3) evolution -in your evo source dir do ./autogen.sh --prefix=<evo-prefix> ---with-pisock=<pilot-link-prefix> --enable-pilot-conduits=yes -make -make install - - -If you want support SSL (and someday S/MIME), you will also need libnspr4 and -libnss3 which can be found at http://www.mozilla.org. - -Once you have libnspr4 and libnss3 (and their respective includes) installed, -in your evolution source dir do: -./autogen.sh --prefix=<evo-prefix> --with-nspr-includes=<nspr-includes-prefix> ---with-nspr-libs=<nspr-libs-prefix> --with-nss-includes=<nss-includes-prefix> ---with-nss-libs=<nss-libs-prefix> - -You'll need to `cp ~/.mozilla/default/*.db ~/evolution` on you've -installed Evolution in order to get a functional SSL-enabled -Evolution. - -The layout of the source tree is: - -addressbook: the Address Book UI -art: graphics used by evolution -calendar: the Calendar UI -camel: libcamel, a messaging library used by the mailer. - Camel is inspired by Sun's JavaMail - (http://java.sun.com/products/javamail/) and the - IMAPv4 spec (RFC 2060). -composer: the message composer UI -data: the .desktop file for Evolution -default_user: initial Evolution config files for new users -devel-docs: entirely inadequate documentation -doc: more adequate documentation -e-util: utility code used by various parts of Evolution -filter: libfilter, a mail filtering library -libibex: an indexing library used by the mailer -libical: a library for the iCalendar format (RFC 2445-2446) -libversit: a library for the vCard (RFC 2425-2426) and vCalendar - (http://www.imc.org/pdi/vcal-10.txt) formats -mail: the mail display UI -shell: the Evolution shell (the main program that launches - the other components) -tests: some test programs -tools: utilities, notably "killev", a script to kill of all - of the Evolution components -widgets: widgets used by Evolution, including the shortcut bar -wombat: Has source code that will load in the addressbook - and calendar backend, and will form the server - process we'll be using diff --git a/acconfig.h b/acconfig.h deleted file mode 100644 index 1bb33c8042..0000000000 --- a/acconfig.h +++ /dev/null @@ -1,32 +0,0 @@ -#undef ENABLE_NLS -#undef HAVE_CATGETS -#undef HAVE_GETTEXT -#undef HAVE_LC_MESSAGES -#undef HAVE_STPCPY -#undef HAVE_LIBSM -#undef PACKAGE -#undef VERSION -#undef ENABLE_THREADS -#undef SENDMAIL_PATH -#undef SYSTEM_MAIL_DIR -#undef HAVE_LDAP -#undef HAVE_TIMEZONE -#undef HAVE_TM_GMTOFF -#undef HAVE_KRB4 -#undef NEED_KRB_SENDAUTH_PROTO -#undef HAVE_KRB5 -#undef HAVE_NSS -#undef MOVEMAIL_PATH -#undef USE_DOT -#undef USE_FCNTL -#undef USE_FLOCK -#undef ENABLE_NNTP - -/* Sub-version identification string. */ -#undef SUB_VERSION - -/* Define if ctime_r takes three arguments */ -#undef CTIME_R_THREE_ARGS - -/* Define if gethostbyname_r takes five arguments */ -#undef GETHOSTBYNAME_R_FIVE_ARGS diff --git a/addressbook/.cvsignore b/addressbook/.cvsignore deleted file mode 100644 index 09980ae6ba..0000000000 --- a/addressbook/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog deleted file mode 100644 index f4bbac447a..0000000000 --- a/addressbook/ChangeLog +++ /dev/null @@ -1,5077 +0,0 @@ -2001-04-14 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-view-listener.c, - backend/ebook/e-book-view-listener.h: Added the function - e_book_view_listener_stop to tell the book view listener to stop - sending signals. - - * backend/ebook/e-book-view.c (e_book_view_destroy): Tell the - EBookViewListener to stop when we're destroyed. - - * backend/pas/pas-backend-file.c (view_destroy, - pas_backend_file_process_get_book_view, - pas_backend_file_process_get_changes): Cleaned these up a bit - using bonobo_object_ref and bonobo_object_unref. - (pas_backend_file_process_get_book_view, - pas_backend_file_process_get_changes): bonobo_object_release_unref - the EBookListener here. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_get_book_view): Cleaned this up a bit - using bonobo_object_ref. Make sure to unref the listener when - we're done with it. Put the new book_view in the list before - telling the book_listener that it's ready. - - * backend/pas/pas-book-view.c (pas_book_view_construct): Cleaned - this up a bit using bonobo_object_dup_ref. - (pas_book_view_destroy): Cleaned this up a bit using - bonobo_object_release_unref. - - * backend/pas/pas-book.c (pas_book_queue_get_book_view, - pas_book_queue_get_changes): bonobo_object_dup_ref here instead of - just duplicating. - -2001-04-14 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-listener.c - (impl_BookListener_respond_get_cursor): Ref the cursor here when - we receive it. - (impl_BookListener_respond_get_view, - impl_BookListener_respond_get_changes): Ref the book_view here - when we receive it. - (impl_BookListener_respond_open_book): Ref the book here when we - receive it. - (e_book_listener_destroy): Unref the objects in our queue here. - - * backend/ebook/e-book-view.c (e_book_view_construct): Cleaned - this up using bonobo_object_dup_ref. - (e_book_view_destroy): Cleaned this up using - bonobo_object_release_unref. - - * backend/ebook/e-book.c (e_book_do_response_get_cursor, - e_book_do_response_get_view, e_book_do_response_get_changes, - e_book_unload_uri): Cleaned this up using - bonobo_object_release_unref. - -2001-04-13 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Get the ESelectNamesModel from the - widget's text model instead of storing it as a gtk_object_set_data - since it may change. - -2001-04-12 Jason Leach <jasonleach@usa.net> - - * backend/pas/pas-backend-file.c (INITIAL_VCARD): Update the Voice - and Fax phone numbers too, finishing off bug #1667. - -2001-04-11 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (INITIAL_VCARD): Update the built - in VCard. - -2001-04-12 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): put the - business address into the pilot record as that is what we put into - the desktop record - (ecard_from_remote_record): set both the address label and - delivery address to avoid bad parser guessing, fixes #2143 - - * backend/ebook/e-card-types.h: remove deprecated pilot code - - * backend/ebook/e-card.c: ditto - - * backend/ebook/e-card.h: ditto - -2001-04-11 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): Don't add - more than five phone numbers and set the remaining blank entries - to some reasonable defaults - -2001-04-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.h: Added - E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING. - - * gui/component/addressbook-component.c (accepted_dnd_types): - Fixed a warning here. - - * gui/widgets/e-addressbook-model.c: Modified this to have more - columns, but not let them be edited if they're not a simple - string. - - * gui/widgets/e-minicard-view.c (e_minicard_view_init): Fixed a - warning and a memory leak here. - -2001-04-10 Gediminas Paulauskas <menesis@delfi.lt> - - * backend/ebook/evolution-gnomecard-importer.c: added missing #include. - * contact-editor/e-contact-editor.c (_arrow_pressed): popup menu items were - not translated after selecting one of them. - * gui/widgets/e-addressbook-view.c: mark popup menu items with N_(). - Updated list[] for translators. - * gui/widgets/e-minicard.c: same. - * gui/widgets/e-minicard-view-widget.c (e_minicard_view_widget_set_arg): fix warning - for "editable" arg. - * gui/widgets/e-minicard-view.c: convert "empty_message" to utf8. - -2001-04-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (remove_folder): stubbed, - #if 0'ed - (xfer_folder): same. - (populate_context_menu): same. - (get_dnd_selection): same. - (factory_fn): add the accepted drag types ("text/x-vard") to - folder_types. - -2001-04-09 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_event): on BUTTON_PRESS: if - it's button 1, store the button x, y, and set drag_button_down to - TRUE. on BUTTON_RELEASE: always set drag_button_down to FALSE. - for MOTION_NOTIFY: initiate drag if the pointer has moved 3 - pixels. - - * gui/widgets/e-minicard.h (struct _EMinicard): add fields for - button x, y, and a bit for if the button has been pressed so we - can tell whether a motion should be a drag. - (struct _EMinicardClass): add drag_begin signal. - - * gui/widgets/e-minicard-view.c (e_minicard_view_drag_begin): new - function, starts the drag. - (book_view_loaded): connect the "drag_data_get" signal. - (e_minicard_view_drag_data_get): new function. - - * gui/widgets/e-minicard-view.h (struct _EMinicardView): add - drag_card and id for canvas_drag_data_get_id. - - * gui/widgets/e-addressbook-view.c (table_drag_data_get): new - function. - (create_table_view): add d&d stuff. - -2001-04-08 Chris Toshok <toshok@ximian.com> - - * printing/e-contact-print.c: add #include <sys/types.h> since - gnome-print.h uses time_t without including it. this really - should be fixed in gnome-print. - -2001-04-08 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): - make sure to notify new clients to the writable status of an - already open (and authenticated) book. - -2001-04-04 Kjartan Maraas <kmaraas@gnome.org> - - * contact-editor/e-contact-editor.[ch]: Fix headers. - * component/addressbook-storage.c: Same here. - * gui/search/e-addressbook-search-dialog.c: Same here. - * gui/widgets/e-addressbook-view.c: Same here. - * gui/widgets/e-minicard-label.c: Same here. - * gui/widgets/e-minicard-view-widget.c: Same here. - * gui/widgets/e-minicard-view.c: Same here. - * gui/widgets/e-minicard-widget-test.c: Same here. - * gui/widgets/e-minicard-widget.c: Same here. - * gui/widgets/e-minicard.c: Same here. - * gui/widgets/test-minicard-label.c: Same here. - -2001-04-03 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_double_click): Fixed a - crash here. - -2001-04-03 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-model.c (COLS): Made this table model - more consistent in the number of columns it has. - (addressbook_append_row): Fixed this function. We removed the col - offset. - -2001-04-02 Iain Holmes <iain@ximian.com> - - * backend/ebook/evolution-gnomecard-importer.c (importer_init): Shut - down and unregister the factory on exit. - -2001-04-01 Gediminas Paulauskas <menesis@delfi.lt> - - * contact-editor/contact-editor.glade: changed icon to - evolution-contacts-plain.png. - * gui/component/addressbook.c: use new pixmap cache. Added icon for new - contact, print, print preview, changed filenames of renamed icons. - -2001-03-31 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (real_add_address_cb): Call e_select_names_model_clean after - adding address. This should deal with the bug reports related - to stray commas. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_clean): Added. Remove all empty destinations. - - * backend/ebook/e-destination.c (e_destination_is_empty): Added. Check - if an EDestination is in essentially a null state. - -2001-03-30 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_add_client): - Tell new clients that are added whether they're writable. - -2001-03-29 Jon Trowbridge <trow@ximian.com> - - * printing/e-contact-print.c: Added #include <libgnome/gnome-paper.h> - - * printing/e-contact-print-envelope.c: Added #include <time.h> - and #include <libgnome/gnome-paper.h> - -2001-04-03 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (match_email): Better handle matching of "nameless" contacts. - - * backend/ebook/e-destination.c (e_destination_get_string): Better - handle the case of a "nameless" contact. - -2001-03-29 Kjartan Maraas <kmaraas@gnome.org> - - * *.*: Clean up #includes. Replace <gnome.h>, <bonobo.h> and - <gtk/gtk.h> with more finegrained headers where needed. - -2001-03-28 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (e_card_set_arg): Fixed some crashes. - -2001-03-28 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Use E_CARD_SIMPLE_FIELD_NAME_OR_ORG instead of - getting the NAME and then the ORG. That way if we expand - NAME_OR_ORG, this will use it. - - * gui/component/select-names/e-select-names.c - (e_addressbook_create_ebook_table, SPEC): Use the correct column - in the SPEC. - -2001-03-25 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_seq_complete_cb): Rather than starting - the pending query by directly calling - e_select_names_completion_do_query, call - e_completion_begin_search. Circumventing the ECompletion API was - causing it to get confused in some cases. - -2001-03-23 Jon Trowbridge <trow@ximian.com> - - * gui/widgets/e-minicard-widget.c (e_minicard_widget_set_card): - Added. Call me old-fashioned, but I just prefer to have a real - API rather than doing everything via gtk_object_get/set-type - calls. - (e_minicard_widget_set_arg): Changed to call - e_minicard_widget_set_card. - - * backend/ebook/e-book-util.c: Small changes to get rid of - compiler warnings. (Casting out const, removed unused variables, - etc.) Removed some debugging messages. - - * gui/component/addressbook-factory.c (main): Added call - to e_address_popup_factory_init. - - * gui/component/e-address-popup.c: Added. A popup gadget that is - invoked (as a bonobo control) when an address is left-clicked in - the mailer. The addressbook is queries, and the address is either - displayed as a minicard (if it already exists) or in a "generic - format". A button is provided for editting/adding the contact. - Some of the semantics of this widget are a bit... non-standard, - because of bonobo issues. I can't really seem to replicate - popup-menu behavior because of how bonobo propogates events, etc. - so I've tried to produce something that I think is non-annoying. - YMMV. - -2001-03-22 Iain Holmes <iain@ximian.com> - - * backend/ebook/evolution-gnomecard-importer.c: Update to the new - IDL. - -2001-03-20 Miguel de Icaza <miguel@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Added artwork from - Jakub. - -2001-03-19 Christopher James Lahey <clahey@ximian.com> - - * Merged branch: - -2001-03-14 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view.c: Call - e_selection_model_simple_insert_rows and - e_selection_model_simple_delete_rows instead of - e_selection_model_simple_insert_row and - e_selection_model_simple_delete_row. - -End of branch - -2001-03-17 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c: Brutally - refactored to boost performance in large-addressbook situations. - These fixes give accepable performance (even with the suboptimal - pas-backend-file searching) using tigert's addressbook-of-death. - - * backend/pas/pas-backend-file.c (pas_backend_file_search): - Start feeding query matches back to the caller before the - entire search is complete; this gives us some "instant feedback" - rather than causing evolution to totally lock up... - - * backend/ebook/e-book.c (e_book_queue_op): Tag all queued ops. - (e_book_cancel_op): Added. Search for a pending op with a given - tag, and mark it as inactive. - (e_book_do_response_get_cursor): Don't execute callback if this - operations has been cancelled. - (e_book_do_response_get_view): Ditto. - (e_book_do_response_get_changes): Ditto. - (e_book_do_response_get_supported_fields): Ditto. - (e_book_get_supported_fields): Return an operation tag (that can - be used to cancel the operation) rather than just TRUE/FALSE. - Zero is always an invalid tag and is returned in the case of an - error, so this shouldn't break any code that looked at the return - value (unless it did so in a particularly stupid way, of course). - (e_book_get_cursor): Ditto. - (e_book_get_book_view): Ditto. - (e_book_get_changes): Ditto. - (e_book_cancel): Added. Cancel a pending operation. (Basically - a call to e_book_cancel_op with error checking, etc.) - - * backend/ebook/e-book-types.h: Added E_BOOK_STATUS_CANCELLED. - -2001-03-17 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_writable_status): new function. - (impl_BookListener_report_writable): new function. - (e_book_listener_get_epv): fill in epv->notifyWritable. - - * backend/ebook/e-book-listener.h: add writable status entries. - - * backend/ebook/e-book.c (e_book_do_writable_event): new function. - (e_book_check_listener_queue): add WritableStatusEvent to the - switch. - (e_book_class_init): register writable_status signal. - - * backend/ebook/e-book.h: add writable_status signal. - - * backend/idl/addressbook.idl: add notifyWritable method to - BookListener. - - * gui/widgets/e-minicard.c (e_minicard_class_init): add "editable" - arg. - (e_minicard_init): init editable. - (e_minicard_set_arg): loop over the minicard fields setting their - "editable". - (e_minicard_get_arg): add editable. - (supported_fields_cb): use editable when creating the - contact_editor. - (add_field): set "editable" when creatin the e_minicard. - - * gui/widgets/e-minicard.h (struct _EMinicard): add "editable". - - * gui/widgets/e-minicard-view.c (e_minicard_view_class_init): add - editable arg. - (e_minicard_view_init): init editable. - (create_card): pass editable to e_minicard canvas item. - (e_minicard_view_set_arg): bit of a hack - loop over all the - canvas items setting their "editable." - (e_minicard_view_get_arg): add editable. - (supported_fields_cb): use editable when creating the contact - editor. - - * gui/widgets/e-minicard-view.h (struct _EMinicardView): add - "editable." - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): add "editable" field. - (e_minicard_view_widget_init): init editable to FALSE. - (e_minicard_view_widget_set_arg): save editable, and pass it along - the e-minicard-view. - (e_minicard_view_widget_realize): same. - (e_minicard_view_widget_get_arg): add editable. - - * gui/widgets/e-minicard-view-widget.h (struct - _EMinicardViewWidget): add "editable" field. - - * gui/widgets/e-minicard-label.h (struct _EMinicardLabel): add - "editable" field. - - * gui/widgets/e-minicard-label.c (e_minicard_label_class_init): - add "editable" arg. - (e_minicard_label_set_arg): editable, set it on the e_text too. - (e_minicard_label_get_arg): editable. - (e_minicard_label_construct): set the "editable" field when we - create the e_text cavas item - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): - default editable to FALSE. - (book_writable_cb): new function, set our editable field and - gtk_object_set it on the active view. - (e_addressbook_view_set_arg): set the active view's editable when - we set the view's book, and connect the "writable_status" signal - to book_writable_cb. - (change_view_type): same. - (supported_fields_cb): use our "editable" when creating the - contact editor. - - * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): add - editable field. - - * gui/widgets/e-addressbook-model.c (e_addressbook_model_init): - change the default of editable to FALSE. - - * backend/pas/pas-book.c (pas_book_report_writable): new function. - - * backend/pas/pas-book.h: prototype for pas_book_report_writable. - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): if - we open the file O_RDWR (or create it) report it as writable. if - we can't open it as O_RDWR, try opening it read-only before we - attempt to create it. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_authenticate_user): if we authenticate - successfully, grant write permissions (this is lacking but there's - really nothing we can do to determine the extent of the access - afforded a user.) - - -2001-03-15 Jon Trowbridge <trow@ximian.com> - - * gui/component/e-address-widget.c: Added addressbook querying and - "cardification" functions, which are turned off by default for now - because of addressbook bugs. Added a popup menu option to turn - queries on, so that others can enjoy the thrill of massive flaming - death. - - * gui/component/addressbook-factory.c (main): Made warnings always - be fatal. - - * backend/pas/pas-book-view.c: Added some debugging spew. - - * backend/pas/pas-backend-file.c (pas_backend_file_search): Added - a little experimental code to try to make file searches scale - better. #if 0/#endif-ed out for now. - - * contact-editor/e-contact-quick-add.c: #included e-book-util.h. - - * backend/ebook/e-card.c (e_card_name_match_string): Added. - Looser name-matching function. - (e_card_email_match_string): Added. Loose e-mail matching. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): Added code to cause us to - abort rather than get trapped in a 100%-CPU-consuming loop in - certain situations. Now we just need to figure out how to avoid - these situations altogether. - - * backend/ebook/e-book-util.c: Added. Now contains the simple - query stuff and the open local addressbook functions. - - * backend/ebook/e-book.c: Moved simple query stuff and open local - addressbook functions into e-book-util.c. - -2001-03-15 Dan Winship <danw@ximian.com> - - * gui/widgets/e-minicard-label.c (e_minicard_label_set_arg): - * gui/widgets/e-minicard.c (e_minicard_set_arg, e_minicard_event): - Update arguments to e_canvas_item_grab_focus. - -2001-03-13 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Fix a warning - here. - -2001-03-13 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/Makefile.am (minicard_label_test_LDADD): Change to - ld order from Greg Williams. - -2001-03-13 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_book_view): Moved where we call - pas_book_respond_get_book_view. - -2001-03-12 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c: add E_STRING_PROP for - categories. - - * backend/pas/evolutionperson.schema: add categories attribute. - - * backend/ebook/e-card-simple.c (field_data): add - E_CARD_SIMPLE_FIELD_CATEGORIES. - - * backend/ebook/e-card-simple.h: add - E_CARD_SIMPLE_FIELD_CATEGORIES. - -2001-03-12 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (supported_fields_cb): add is_read_only - param. - - * gui/widgets/e-minicard-view.c (supported_fields_cb): add - is_read_only param. - - * gui/widgets/e-addressbook-view.c (supported_fields_cb): add - is_read_only param. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): add is_read_only param. - also, include a little policy here and make it TRUE, as the user - shouldn't be editting in this context anyway (imo). - - * gui/component/addressbook.c (supported_fields_cb): add - is_read_only param. - - * contact-editor/test-editor.c (main): add is_read_only param. - - * contact-editor/e-contact-editor.c (set_read_only): new function, - that either enables or disables all the text fields, combo boxes, - and some buttons, depending on the state of is_read_only. - (e_contact_editor_class_init): add read/write arg "is_read_only". - (full_name_clicked): set the is_read_only of the fullname dialog - to the editor's. - (full_addr_clicked): same. - (e_contact_editor_new): add is_read_only param, that gets set - along with the other params. - (e_contact_editor_set_arg): add setter for is_read_only. - (e_contact_editor_get_arg): add getter for is_read_only. - (_phone_arrow_pressed): change TRUE to !editor->is_read_only for - entry. - (_email_arrow_pressed): same. - (_address_arrow_pressed): same. - (enable_writable_fields): same. - - * contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_class_init): add read/write arg - "is_read_only". - (e_contact_editor_fullname_set_arg): add setter for is_read_only - that enables/disables all the entries/combos. - (e_contact_editor_fullname_get_arg): add getter for is_read_only. - - * contact-editor/e-contact-editor-fullname.h (struct - _EContactEditorFullname): add is_read_only flag. - - * contact-editor/e-contact-editor-address.c - (e_contact_editor_address_class_init): add read/write arg - "is_read_only". - (e_contact_editor_address_set_arg): add setter for is_read_only - that disables/enables all the entries/combos. - (e_contact_editor_address_get_arg): add getter for is_read_only. - - * contact-editor/e-contact-editor-address.h (struct - _EContactEditorAddress): add is_read_only flag. - -2001-03-13 Iain Holmes <iain@ximian.com> - - * backend/ebook/Makefile.am: Change the importer includes around a bit. - - * backend/ebook/evolution-gnomecard-importer.c: Correctly add the includes. - -2001-03-09 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: PISOCK_INCLUDEDIR has become - PISOCK_CFLAGS in gnome-pilot.m4 and remove capplet foo - -2001-03-11 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book.c (e_book_simple_query): Added. A - simplified, cancellable query mechanism that lets you avoid - dealing with EBookView. - (e_book_simple_query_cancel): Added. Cancels a running query. - - * backend/ebook/e-book-types.h: Add enum EBookSimpleQueryStatus. - -2001-03-08 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-popup.c - (quick_add_cb): Switched to use e_contact_quick_add_free_form. - Removed debugging code, hopefully without introducing any bugs - in the process. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Fix bug with commas - inside of name/address combos. As long as the comma is inside of - quotes, it will be treated as part of the name rather than as a - break between addresses. - - * gui/component/select-names/e-select-names-completion.c - (match_nickname): Use e_card_name_to_string for nickname match - strings. - (match_email): Use e_card_name_to_string for email match strings. - (e_select_names_completion_begin): Strip quotes out of query text, - so we don't produce malformed sexps. - Added William Blake quote easter egg. - - * contact-editor/e-contact-quick-add.c: Further attempts to fix... - mostly unsuccessful. - (e_contact_quick_add_free_form): Added. Takes a single string - and tries to parse out (using some simple, loose rules) the - name and e-mail -- then calls e_contact_quick_add. An attempt to - get the computer to automatically Do The Right Thing. - - * backend/ebook/e-book.c: Fixed some broken indentation. Yes, I'm - anal. - - * gui/component/GNOME_Evolution_Addressbook.oafinfo: Added oaf_server - info for EAddressWidget. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Added oaf_server - info for EAddressWidget. - - * gui/component/addressbook-factory.c (main): Add call to - e_address_widget_factory_init. - - * gui/component/e-address-widget.h: - * gui/component/e-address-widget.c: Added. A little widget (and a - Bonobo control, BTW) for displaying addresses, with a left-click - menu. Used to display addresses in the mail viewer (as embedded - GtkHTML objects, replacing the text previously used). Still quite - incomplete. - -2001-03-08 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (factory_fn): Specify a - NULL `EvolutionShellComponentGetDndSelectionFn'. - -2001-03-06 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Fix glitch with - inserting comma-delimited stuff when length > 1. - -2001-03-06 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book.c (e_book_load_local_address_book): Added. - Just encapsulates opening - file://~username/evolution/local/Contactes/addressbook.db, so that - path doesn't need to be hardwired in throughout the code. - -2001-03-06 Benjamin Kahn <xkahn@cybersites.com> - - * contact-editor/e-contact-quick-add.c (clicked_cb): - Added the third argument to e_contact_editor_new. (Cheated - and send NULL for the field argument, which is probably - troublesome. It will be fixed soon by either clahey or - toshok.) - -2001-03-06 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_replace): Fix a reference counting bug. - - * gui/component/select-names/e-select-names-manager.c (popup_cb): - A callback for creating the appropriate popup by calling - e_select_names_popup. - (e_select_names_manager_create_entry): Connect popup_cb to the - entry's popup signal - - * gui/component/select-names/e-select-names-popup.c: Added. Code - for popup right-click menus for recipient entries. Still a bit - incomplete. - - * backend/ebook/e-destination.c (e_destination_get_email_num): - Added. - - * contact-editor/e-contact-quick-add.c: Added. Some code and a - dialog for very quickly adding entries to the address book. - Still not fully working. - -2001-03-04 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c: Cleaned up the formatting in this - file a bit. - - * contact-editor/e-contact-editor.c (e_contact_editor_set_arg): - Made it so that passing in NULL to the writable_fields arg sets - the set of writable fields to the empty set. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): Pass NULL as the - writable_fields argument here. - - * gui/widgets/e-addressbook-model.c: Don't offset by one here. - This way we will get the file_as field as one of our - ETableColumns. - - * gui/widgets/e-addressbook-view.c (SPEC): Updated this for the - changes in ECardSimple. - - * gui/widgets/e-minicard.c (remodel): Don't remodel if the item - isn't realized. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c: doh, track renaming of - objectclass from evolvePerson to evolutionPerson. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/evolutionperson.schema: rename evolveperson.schema - to this, and add remaining attributes. - - * backend/pas/pas-backend-ldap.c: add remaining fields, and fix up - ones that were incorrent (either the ldap_attr or the query prop). - -2001-03-02 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: update sed script - - * conduit/e-address.conduit.in: update for new pilot foo - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): track change to - e_contact_editor_new. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (add_objectclass_mod): add - objectclasses for "person", "organizationalPerson", and "top" as - well, just to be complete. - (check_schema_support): rename check_for_evolve_person to this, to - reflect that we're doing more than just checking for that - objectClass. - (add_oc_attributes_to_supported_fields): new function. - (add_to_supported_fields): new function. - (pas_backend_ldap_destroy): unref supported_fields. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-view.c (supported_fields_cb): new - function. - (e_minicard_view_event): split out the creation of the contact - editor to the supported_fields callback. - - * gui/widgets/e-minicard.c (supported_fields_cb): new function. - (e_minicard_event): split out the creation of the contact editor - to the supported_fields callback. - - * gui/widgets/e-addressbook-view.c (table_double_click): split - function into two functions, since e_book_get_supported_fields - requires a callback now. - (supported_fields_cb): new function. - - * gui/component/addressbook.c (new_contact_cb): split this into - two functions, since e_book_get_supported_fields requires a - callback now. - (supported_fields_cb): new function. - - * contact-editor/test-editor.c (main): track change to - e_contact_editor_new (pass NULL for the writable_fields arg.) - - * contact-editor/contact-editor.glade: fix several labels so they - make better sense (since we look them up in e-contact-editor.c.) - - * contact-editor/e-contact-editor.h (struct _EContactEditor): add - writable_fields. also, add it to e_contact_editor_new. - - * contact-editor/e-contact-editor.c (e_contact_editor_class_init): - add writable_fields arg. - (e_contact_editor_destroy): unref the writable_fields list. - (e_contact_editor_new): pass @fields as the writable_fields arg. - (e_contact_editor_set_arg): add writable_fields support. - (enable_writable_fields): new (very hairy) function, to disable - everything and reenable just the fields listed in the - writable_fields list. - (_email_arrow_pressed): set label-email1, entry-email1, and - checkbutton-htmlmail to be sensitive since the only way to get - here is to activate a writable field in the menu. - (_address_arrow_pressed): set label-address, button-fulladdr, and - text-address to be sensitive for the same reason. - (_phone_arrow_pressed): sensitize the label and entry for the same - reason. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-card-simple.c (field_data): add new entries for - phone enums, and fill in the ecard_field with (bogus in all but a - few cases) strings. these are the strings sent from wombat to - evolution-addressbook for supported_fields. - (e_card_simple_get_ecard_field): new function. - (e_card_simple_map_phone_to_field): new function. - (e_card_simple_map_email_to_field): new function. - (e_card_simple_map_address_to_field): new function. - - * backend/ebook/e-card-simple.h: add a few phone entries to the - ECardSimpleField enum, and add prototypes for mapping the list - types (phone, email, address) to ECardSimpleField. Also, add - prototype for e_card_simple_get_ecard_field. - - * backend/ebook/e-book.c - (e_book_do_response_get_supported_fields): don't build the EList - here, it's already built. - - * backend/ebook/e-book-listener.h: change fields from the CORBA - sequence to the EList in our reponse struct. - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_get_supported_fields_response): we make the - EList here, since after we return the CORBA list is freed up. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_supported_fields): implement - properly, we support everything. - -2001-03-01 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): Oops, we do need to be able to write to - "text" after all (for things like Reply-to: to work properly). - Fixed. - (impl_SelectNames_get_entry_for_section): Made "text" a writeable - property again. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Increment pos so that - we don't reverse strings when length > 1 (a particularly amusing - bug). - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_destroy): Check for NULL before calling - gtk_object_unref (GTK_OBJECT (---)), to get rid of annoying error - messages. - -2001-03-01 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c: I am an - idiot. - -2001-03-01 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Change for new EDestination/ESelectNamesModel API. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_get_source): Added. A function for - looking up the ESelectNamesModel by id. (I didn't end up using - this function, but it might come in handy later.) - (e_select_names_manager_get_cards): #if 0/#endif out this - function. - (e_select_names_manager_create_entry): Modified to attach an - ESelectNamesCompletion to the entry we create. - (completion_handler): A post-completion handler for our EEntry, to - take the completion's extra data (an EDestination) and properly - stick it into our ESelectNamesModel. - - * gui/component/select-names/e-select-names.c - (real_add_address_cb): Changed to operate on EDestinations rather - than ECards and to use the new ESelectNamesModel API. This leads - to a rather nice code simplication. - (remove_address): Changed for new ESelectNamesModel API. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Rather than just passing the entry's text - through the property bag, get the "address text" from the model. - This returns a nice, verbose string of addresses with names - expanded when the address is tied to an ECard (i.e. "Jon - Trowbridge <trow@ximian.com>"). - (impl_SelectNames_get_entry_for_section): Make the text property - read-only. - (entry_set_property_fn): ...and since it is read-only now, chop - out the setter code. - - * gui/component/select-names/e-select-names-text-model.h: - * gui/component/select-names/e-select-names-text-model.c: Again, - this code has been (pretty much) totally rewritten to convert all - text operations into changes on the ESelectNamesModel. This lets - us give the associated EEntry some (IMHO) nice semantics regarding - whitespace, etc. Includes object activation, so destinations tied - to ECards are underlined and can be double-clicked to bring up a - contact editor. - - * gui/component/select-names/e-select-names-model.h: - * gui/component/select-names/e-select-names-model.c: I've heavily - modified this object to both hide all implementation details - (which the old version exposed a bit too much for my peculiar - tastes) and to act as an EDestination container. The old code put - the text model operations here. I've moved them all to - ESelectNamesTextModel --- so the text model actions (insert, - delete, etc.) are all done through the API rather than operating on - ESelectNamesModel internals. - - * gui/component/select-names/e-select-names-completion.c: Added. A - fairly complicated object derived from ECompletion that searches - our local addressbook in various and sundry ways. - - * gui/component/select-names/e-select-names-completion.h: - - * backend/ebook/e-destination.h: - * backend/ebook/e-destination.c: Added. This object encapsulates - a place to sent an email to, which can either be just a address as - a string ("trow@ximian.com"), a fancier string ("Jon Trowbridge - <trow@ximian.com>"), or an ECard and a specific address within - that ECard. - -2001-03-01 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h, - gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Used - ESelectionModelSimple and the changes to EReflow and EReflowSorted - to get multiple selection in the minicard view. - - * gui/widgets/test-reflow.c: Changed this to get it to compile - with the changes to EReflow. - -2001-02-21 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_search): Made - this pay attention to the return value of e_sexp_parse. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): Fixed a const - inconsistency here. - -2001-02-21 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book.c (pas_book_queue_get_supported_fields): - new function. - (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): track - change to idl. - (pas_book_respond_get_supported_fields): new function. - - * backend/pas/pas-book.h: add GetSupportedFields to the - PASOperation enum. Also, add a stringlist field to the PASRequest - struct. lastly, add a prototype for - pas_book_respond_get_supported_fields. - - * backend/pas/pas-backend.h: remove prototype for - pas_backend_get_supported_fields, and remove it from the vtable. - - * backend/pas/pas-backend.c (pas_backend_get_supported_fields): - remove. - (pas_backend_class_init): no vtable entry for get_supported_fields - anymore. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_get_supported_fields): new function. - (pas_backend_ldap_process_client_requests): add case for - GetSupportedFields. - (pas_backend_ldap_class_init): get_supported_fields isn't in - vtable anymore. - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_supported_fields): new function. - (pas_backend_file_process_client_requests): add case for - GetSupportedFields. - (pas_backend_file_class_init): get_supported_fields isn't in - vtable anymore. - - * backend/idl/addressbook.idl: Book::getSupportedFields now - returns void and add BookListener::notifySupportedFields. - - * backend/ebook/test-client.c (get_fields_cb): new function. - (auth_user_cb): track change to e_book_get_supported_fields. - - * backend/ebook/e-book.c - (e_book_do_response_get_supported_fields): new function. - (e_book_check_listener_queue): add case - GetSupportedFieldsResponse. - (e_book_get_supported_fields): switch to async model. - - * backend/ebook/e-book.h: switch e_book_get_supported_fields to an - async model. - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_get_supported_fields_response): new - function. - (impl_BookListener_response_get_supported_fields): new function. - (e_book_listener_get_epv): fill in epv's "notifySupportedFields" - - * backend/ebook/e-book-listener.h: add an async response for - GetSupportedFields and add a stringlist member to the - EBookListenerResponse struct. - -2001-02-20 Federico Mena Quintero <federico@ximian.com> - - * backend/pas/pas-book-factory.c (pas_book_factory_activate): - Moved the register_factory() code to here, since it was the only - thing being called anyways. - (PasBookFactoryPrivate): Added a "registered" flag. - (pas_book_factory_activate): Set the registered flag. - (pas_book_factory_destroy): Deactivate the factory when we go away. - -2001-02-20 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_get_supported_fields): new function. - - * backend/ebook/e-book.h: add e-book interface to getting - supported fields. - - * backend/ebook/test-client.c (auth_user_cb): shoe-horn in some - spew about supported fields. - -2001-02-19 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: Remove PISOCK_LIBDIR - -2001-02-19 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_create_entry): When creating the entry, - open up an ebook (corresponding to the local addressbook) and make - the entry use an EAddressCompletion. - (completion_handler): Added; this is the actual completion - handler, which manipulates the entry when the user selects - something from the drop-down. - - * gui/component/select-names/e-select-names-model.c: Various hacks - by clahey to unbreak e_select_names_model_add_item, - e_select_names_model_replace_item (which I added) and - e_select_names_model_remove_item. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_obj_count, - e_select_names_text_model_get_nth_obj): Make chunks of text that - correspond to ECards in the ESelectNamesModel be embedded objects. - (e_select_names_text_model_activate_obj): On activation, pop up a - contact editor for the embedded object's card. - (e_select_names_text_model_model_changed): Fixed to work with - ETextModel API changes. - (e_select_names_text_model_set_text): Make const correct. - (e_select_names_text_model_insert): Make const correct. - (e_select_names_text_model_insert_length): Make const correct. - - * backend/ebook/e-address-completion.h, - backend/ebook/e-address-completion.c: Added. EAddressCompletion - is a derived class of ECompletion that does asynchronous address - lookups for completions. - -2001-02-17 Chris Toshok <toshok@ximian.com> - - * backend/idl/addressbook.idl: add sequence<string> typedef, and - add getSupportedFields method. - - * backend/pas/pas-book.c - (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): new - function. - - * backend/pas/pas-backend.c (pas_backend_class_init): init - get_supported_fields = NULL. - (pas_backend_get_supported_fields): new function. - - * backend/pas/pas-backend.h: add prototype for - pas_backend_get_supported_fields. - - * backend/pas/pas-backend-file.c - (pas_backend_file_get_supported_fields): new function. - (pas_backend_file_class_init): fill in get_supported_fields. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_get_supported_fields): new function. - (pas_backend_ldap_class_init): fill in get_supported_fields. - -2001-02-14 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-ldap.c: Undefine E_STRING_PROP and - E_LIST_PROP here. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h (e_contact_editor_raise): Added - this function. - - * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h - (e_minicard_event): Added an editor field to the EMinicard object. - Made it so that if you double click on the same card twice, it - doesn't open a new window, but instead raises the old. - -2001-02-08 Iain Holmes <iain@ximian.com> - - * gui/component/addressbook-storage.c (addressbook_source_free): - Free the ldap.binddn. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_setup_menus): Free the dir strings. - -2001-02-08 Christopher James Lahey <clahey@ximian.com> - - * contact-editor/e-contact-editor.c (categories_clicked): Set the - header on the category dialog we pop up. - -2001-02-12 Kjartan Maraas <kmaraas@gnome.org> - - * backend/ebook/GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf.in: Translations. - * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in: - Marked strings for translation in this newly created file. - * gui/component/select-names/Makefile.am: Hook up the .oaf.in files in the - xml-i18n-tools framework. - * gui/component/Makefile.am: Same as above. - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Marked stuff for translation here - too. - -2001-02-11 Jason Leach <jasonleach@usa.net> - - * gui/component/addressbook.c: Removed an ancient #include - <libgnorba/gnorba.h> - -2001-02-11 Gediminas Paulauskas <menesis@delfi.lt> - - Really use xml-i18n-tools. - - * conduit/e-address-conduit-control-applet.desktop: removed. - * conduit/e-address-conduit-control-applet.desktop.in: added empty. - * conduit/Makefile.am: reflect above changes, merge translations. - - * contact-editor/e-contact-editor-strings.h, - contact-editor/fulladdr.glade.h, contact-editor/fullname-strings.h, - contact-editor/e-contact-editor-confirm-delete.glade.h, - gui/component/select-names/select-names.glade.h: - removed these files, xml-i18n-extract takes care of strings itself. - - * contact-editor/*.glade, - gui/component/select-names/select-names.glade, - gui/widgets/alphabet.glade, printing/e-contact-print.glade: - changed project options to not output_translatable_strings. - - * contact-editor/Makefile.am, gui/widgets/Makefile.am, - gui/component/select-names/Makefile.am, printing/Makefile.am: - do not include removed files in EXTRA_DIST. - -2001-02-07 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (check_for_evolve_person): flesh - out this check. #ifdef the entire thing OPENLDAP2, as it only - works with the new schema stuff in openldap 2.x (both on server - and client, so upgrade your server.) - -2001-02-07 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c: Added N_("* Click here to add - a contact *"). - -2001-02-07 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): only - set the DEBUG_LEVEL if we're OPENLDAP2. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (email_compare): return TRUE if - equal, FALSE otherwise. - (business_compare): same. - (homephone_compare): same. - (email_ber): return NULL if there are no elements in our list. - (homephone_ber): same. - (business_ber): same. - (build_mods_from_ecards): add smarts to handle list elements - properly (like email, business_phone, home_phone.) now we'll - properly send updates if any element in the list changes. - -2001-02-06 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/Makefile.am (INCLUDES): Added - -DEVOLUTION_DATADIR=\""$(datadir)"\". - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_setup_menus): Changed the local and system - directories. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (create_card_handler): doh, - didn't mean to commit this. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/evolveperson.schema: new file. this will eventually - form the suggested additions to an existing openldap server that, - along with support for inetorgperson, will allow people to store - all evolution attributes in ldap. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_init): don't - need the = NULL's since we g_new0. - (check_for_evolve_person): new function. - (pas_backend_ldap_connect): check to see if the evolvePerson - objectclass is there. - (build_mods_from_ecards): right now, just silently skip the extra - attributes if we don't support evolvePerson. - (add_objectclass_mod): new function, add both inetOrgPerson and - (if it's available) evolvePerson as objectclasses. - (pas_backend_ldap_process_authenticate_user): also check to see if - evolvePerson is there, if we couldn't do it (due to auth reasons) - in the connect method. - (prop_info): change the telephoneNumber LDAP attribute to be used - for evolution's business phone numbers. the primary phone number - will be a single valued attribute on evolvePerson. - (business_populate): new function. - (business_ber): new function. - (business_compare): new function. - -2001-02-05 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (create_card_handler): err, - allocate 2 char*s when i assign 2 char*s. - -2001-02-05 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (modify_card_handler): switch to - ldap_modify_ext_s if OPENLDAP2, as ldap_modify_s is deprecated. - (build_mods_from_ecards): don't include the mod if the value is "" - - this isn't valid on schema checking ldap servers. - (homephone_populate): new function. - (homephone_ber): new function. - (homephone_compare): new function. - (create_card_handler): add spew when adding cards so I can see - what's going on. -2001-02-05 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-config.c (table_add_elem): Save the - help_text in the closure. - -2001-02-05 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/Makefile.am (libeminicard_a_SOURCES): Added - gal-view-factory-minicard.c, gal-view-factory-minicard.h, - gal-view-minicard.c, and gal-view-minicard.h. - - * gui/widgets/gal-view-factory-minicard.c, - gui/widgets/gal-view-factory-minicard.h, - gui/widgets/gal-view-minicard.c, and - gui/widgets/gal-view-minicard.h: New classes for minicard view - type. - - * gui/widgets/e-addressbook-view.c: Deploy gal-view stuff - properly. - -2001-02-05 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (e_card_get_vcard): Make the Note field - be quoted printable. - -2001-01-27 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): This should be a close button, - not a cancel button. - -2001-02-04 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_activate_dialog): Call - e_select_names_set_default when appropriate. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Added support for - double clicking sending the selected contacts to the default - section. Added a set_default function. Made multiple selection - work. - -2001-01-29 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_config_source_label): #ifdef INCLUDE_FILE_SOURCE. - (table_add_elem): add help_text parameter and set up focus_in - events to display the help in the dialog's html area. - (focus_help): new function, calls put_html on the help text. - (addressbook_ldap_auth_item_new): add help texts. - (addressbook_source_item_new): add help texts. - (addressbook_source_dialog): add help texts. - -2001-01-27 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section): Remove the butt-ugly arrow icon and - replace it with a less invasive "->" icon. - -2001-01-25 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (build_mods_from_ecards): add - comment about the else block here. - (prop_info): add home_address, business_address, business_fax, - assistant, and isdn. - -2001-01-25 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): Made - this only add the initial VCard if it finds a file - "create-initial" in the directory it's creating the database in. - - * gui/component/addressbook-component.c (factory_fn): Added a - create_folder function. - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): Fixed an unused variable - warning. - -2001-01-25 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_setup_menus): Setup the view collection - properly and handle the "display_view" signal. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Consider the - placeholder in the path for the "Print" item. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Set the icon for - "/Toolbar/Find" to "24_find_contact.xpm". - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (set_pixmap): New. - (update_pixmaps): New function, setting the pixmaps for the items - of type "pixbuf", using `set_pixmap'. - (control_activate): Call it. - -2001-01-25 Not Zed <NotZed@Ximian.com> - - * backend/pas/pas-backend-ldap.c: esexp api change fixes. - - * backend/pas/pas-backend-file.c (entry_compare): Fix for e_sexp api changes. - (vcard_matches_search): esexp api fixes. - (pas_backend_file_search): Ouch, unref the e-sexp properly (not gtk object). - -2001-01-24 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (email_ber_func): make sure to - add the lengths here (include the \0? anyone?). - (build_mods_from_ecards): if we're filling in mod->mod_bvalues, - set mod_op |= LDAP_MOD_BVALUES. - -2001-01-23 Jason Leach <jasonleach@usa.net> - - (Fix #1225: advanced search cancel/close) - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): Set it up with Search and a - Cancel button, Search is still the default. - -2001-01-23 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): properly ref - the ecard. still need to kill some memory leaks. - -2001-01-22 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: remove vfs dependency - -2001-01-21 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (delete_record): Remove - deleted records from the pilot map so we don't have dupes in the future - -2001-01-19 Dan Winship <danw@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_right_click): - * gui/widgets/e-minicard.c (e_minicard_event): Update for - e_popup_menu_run prototype change. - -2001-01-19 Jason Leach <jasonleach@usa.net> - - (Adding a boolean "entry_changed" BonoboPropertyBag arg) - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): Use a gtk_object_set_data to set the - property to TRUE here. - - (entry_changed): New function, calls bonobo_control_set_property - if entry_changed hasn't been set to TRUE yet. - - (impl_SelectNames_get_entry_for_section): Connect "changed" on - each entry_widget to the new entry_changed() func. - -2001-01-19 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): always free - the delivery elements and correct embarrassingly stupid memory error - that was causing the addressbook conduit problems. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): ref/unref ourself when processing - in case someone we signal unrefs us. - - * conduit/address-conduit.c (sequence_complete): disconnect signals - when complete - -2001-01-17 Federico Mena Quintero <federico@ximian.com> - - * backend/pas/pas-book-factory.c (pas_book_factory_activate): Made - it return a gboolean; it was completely ignoring the return value - from register_factory(). - -2001-01-17 Larry Ewing <lewing@helixcode.com> - - * backend/ebook/.cvsignore: add evolution-gnomecard-importer. - - * backend/ebook/Makefile.am (oaf_DATA): don't require the pine - oainfo file until it is actually added to the repository. We need - to keep the build working for nightlies to work. - -2001-01-16 Jason Leach <jasonleach@usa.net> - - * backend/pas/pas-backend-file.c (INITIAL_VCARD): s/Helix - Code/Ximian/ for the initial contact card. - -2001-01-15 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (print_local): prevent segfaults and - buffer overflows - (print_remote): ditto - -2001-01-14 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: pass -module and -avoid-version to conduit - linker - -2001-01-12 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (factory_fn): Pass NULL as - the @copy_folder_fn arg to `evolution_shell_component_new'. - -2001-01-12 Miguel de Icaza <miguel@ximian.com> - - * gui/widgets/e-addressbook-view.c: added i18n for etable. - -2001-01-11 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_create_card): get a book view from - somewhere so we can give status messages - choose the first one in - the list. - (pas_backend_ldap_process_modify_card): same. - (pas_backend_ldap_process_remove_card): same. - (prop_info): add more properties, like home_phone, mobile, pager, - uri, org_unit, office, title, and manager. - -2001-01-09 Miguel de Icaza <miguel@gnu.org> - - * gui/widgets/Makefile.am (minicard_widget_test_LDADD): Put GNOME - libraries at the end to make the thing compile. - - * printing/Makefile.am: Order LDADD flags correctly so it compiles. - -2001-01-09 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - connect with the EAddressbookView's status_message signal. - (set_status_message): set the status message on the ShellView - Interface associated with our control. - (retrieve_shell_view_interface_from_control): new function. get - the shell view inteface associated with a control. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_class_init): register status_message signal. - (status_message): new function, emit our status_message signal. - (change_view_type): connect with the view->object's - "status_message" signal. - - * gui/widgets/e-addressbook-view.h (struct - _EAddressbookViewClass): add status_message signal. - -2001-01-09 Chris Toshok <toshok@helixcode.com> - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): register our status_message - signal. - (status_message): new function, emit our status_message signal. - (e_minicard_view_widget_realize): connect to the EMinicardView's - status_message signal. - - * gui/widgets/e-minicard-view-widget.h: add status_message signal. - - * gui/widgets/e-minicard-view.c (e_minicard_view_class_init): - register our status_message signal. - (e_minicard_view_init): init status_message_id. - (status_message): new function, emit our status_message signal. - (book_view_loaded): connect to the EBookView's status_message - signal. - (disconnect_signals): disconnect status_message_id. - - * gui/widgets/e-minicard-view.h: add status_mesage_id, and - status_message signal. - - * gui/widgets/e-addressbook-model.c (status_message): new - function, emit our status_message. - (e_addressbook_model_class_init): register our "status_message" - signal. - (book_view_loaded): connect to the EBookView's status_message - signal, so we can chain it to our parent. - (e_addressbook_model_init): init status_message_id. - (remove_book_view): disconnect status_message_id. - - * gui/widgets/e-addressbook-model.h: add status_message_id, and - status_message signal. - - * backend/pas/pas-backend-ldap.c change the objectclass we create - objects with to "inetOrgPerson" as it encompasses the fields we - use. - (create_dn_from_ecard): remove the mail/org handling from - here. we just prepend cn=$cn onto the base dn. - (create_card_handler): remove the NULL that build_mods_from_ecards - adds at the end, and insert our objectClass. - (modify_card_handler): call search_for_dn to get the ECardSimple - of the old card, since it might (and does in the current code) - doing a brute force search. - (search_for_dn): new function, to search for an entry by its dn. - right now we brute force (objectclass=*) under the base dn and - compare dn's. going to add a first pass that explodes the dn and - searches that way, using (objectclass=*) as a last resort. also, - here's where we'd put the extensibleMatch code if we want to go - that route. - - * backend/ebook/e-card.c (e_card_set_arg): if we're setting the - full name regenerate ecard->name. - -2001-01-04 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_authentication_response): new function. - (impl_BookListener_respond_authentication_result): new function. - (e_book_listener_get_epv): fill in - epv->notifyAuthenticationResult. - - * backend/ebook/e-book-listener.h: add AuthenticationResponse to - EBookListenerOperation. - - * backend/ebook/e-book.c (e_book_authenticate_user): new function. - - * backend/ebook/e-book.h: add prototype for - e_book_authenticate_user. - - * backend/idl/addressbook.idl (GNOME:Evolution:Addressbook:Book): - add authenticateUser method. - (GNOME:Evolution:Addressbook:BookListener): add - AuthenticationFailed and AuthenticationRequired to CallStatus. - also add notifyAuthenticationResult method. - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_authenticate_user): dummy - authenticate_user function that always succeeds. - (pas_backend_file_process_client_requests): respond to the - AuthenticateUser request. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_build_query): - gtk_object_unref(sexp) => s_exp_unref(sexp). - (pas_backend_ldap_process_authenticate_user): fill in to use - ldap_simple_bind_s. - (pas_backend_ldap_process_client_requests): respond to the - AuthenticateUser request. - - * backend/pas/pas-book.c (pas_book_queue_authenticate_user): new - function. - (impl_GNOME_Evolution_Addressbook_Book_authenticateUser): new - function. - (pas_book_respond_authenticate_user): new function. - (pas_book_get_epv): fill in epv->authenticateUser. - - * backend/pas/pas-book.h: add AuthenticateUser operation type, and - add user/passwd to the PASRequest struct. - - * gui/component/addressbook-storage.c - (addressbook_storage_get_source_by_uri): new function. should use - a hashtable, perhaps, but the lists will generally be small - anyway. - - * gui/component/addressbook-storage.h: add prototype for - addressbook_storage_get_source_by_uri. - - * gui/component/addressbook-config.c - (addressbook_source_dialog_set_source): fill in the binddn if the - auth page is shown. - - * gui/component/addressbook.c (book_open_cb): shoe-horn - authentication in here. if the source was configured to use - authentication, authenticate the user after opening the ebook. - also, be paranoid and clear out the password after authenticating. - (book_auth_cb): callback for auth. set the "book" arg on the - view->view here. - (passwd_cb): set the view's passwd that'll be used in - book_open_cb. - (addressbook_view_free): g_free view->passwd. - -2001-01-04 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-component.c, - gui/component/addressbook-component.h - (addressbook_component_get_shell_client): Added this function. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Added code for the - ability to switch between different folders. This doesn't work - yet. - - * gui/component/select-names/select-names.glade, - gui/component/select-names/select-names.glade.h: Added an option - menu to this dialog. - -2001-01-04 JP Rosevear <jpr@helixcode.com> - - * conduit/Makefile.am: Fix hard coded library names that were - accidentally committed (i'm looking at you miggie) - - * contact-editor/e-contact-editor.c (categories_clicked): Reflect - renaming. - - * contact-editor/e-contact-editor-categories.[hc]: These are - living in gal now - -2001-01-04 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_free): - Need to e_sexp_unref the the sexp, not gtk_object_unref it. - -2001-01-03 Michael Meeks <michael@helixcode.com> - - * gui/widgets/e-addressbook-model.c (get_view): check - capabilities is valid before doing a strstr. - -2001-01-03 Michael Meeks <michael@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_search): - g_strdup things we g_free. - -2001-01-02 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c (delete_cb): Make sure this - won't crash if the given contact is removed from the database - while this function is being called. - - * gui/widgets/e-minicard.c: Made sure this won't crash if the - given contact is removed from the database while the right click - menu is being displayed. - -2000-12-30 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook-config.c (edit_source_clicked): copy - the dialog's source, destroy the dialog after we're done, and make - sure to update both columns in the clist. - (add_source_clicked): copy the dialog's source, and destroy the - dialog when we're done. - (addressbook_source_dialog_destroy): free up all the dialog's - memory. - - * gui/component/addressbook.c (set_prop): allow file: uri's that - point to files, not just dirs that contain addressbook.db. The - rule is the addressbook file has to end in .db. - - * gui/component/addressbook-storage.c (file_source_foreach): - contactserver => contactfile. cut and paste error. - (addressbook_storage_init_source_uri): use file://%s to build the - uri. - - * gui/component/e-ldap-server-dialog.[ch]: forgot to remove these - in my last commit. - -2000-12-29 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (config_cb): new function, calling - our new config ui code. - (control_activate): no longer load evolution-addressbook-ldap.xml, - as it's not there. - - * gui/component/addressbook-component.c (owner_set_cb): - setup_ldap_storage => addressbook_storage_setup. - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): - remove e-ldap-storage.[ch] and add addressbook-storage.[ch]. - (glade_DATA): remove ldap-server-dialog.glade and add - addressbook-config.glade. - (EXTRA_DIST): same. - - * gui/component/addressbook-config.[ch]: add another dialog to - give a list of our sources and offer the Add/Delete/Edit - interface. This plugs into the previous dialog work (the source - editor.) - - * gui/component/addressbook-storage.[ch]: new files, containing - the remains of e-ldap-storage.[ch] and adding the new - AddressbookSource type and it's subordinates. Also, the xml - format has changed slightly and the file name is no longer - ~/evolution/ldap-servers.xml - it's - ~/evolution/addressbook-sources.xml. - - * gui/component/addressbook-config.glade: new file, new config - interface. - - * gui/component/ldap-server-dialog.glade: removed. - - * gui/component/e-ldap-storage.[ch]: removed. - -2000-12-28 Chris Toshok <toshok@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): add - addressbook-config.[ch]. - - * gui/component/addressbook-config.c, - gui/component/addressbook-config.h: new files, containing at the - moment a beautiful "new/edit source dialog" inspired by the - mail-config-gui code. It'll be ready for prime time after rev'ing - the .xml file the addressbook uses to store it's "other sources" - to include files, and the addition of the ldap auth stuff. - -2000-12-25 Miguel de Icaza <miguel@helixcode.com> - - * gui/widgets/e-minicard.c (e_minicard_realize): Set draw - background to FALSE. - - * gui/widgets/e-minicard-label.c (e_minicard_label_construct): ditto. - (e_minicard_label_construct): ditto - -2000-12-23 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fullname-strings.h, - contact-editor/fullname.glade: Added Ms. and Miss to the prefix - drop down box. Patch submitted by Martin Hicks <mort@bork.org>. - -2000-12-21 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (cursor_cb): Ref the cards that get put - in the change list - (next_changed_item): util function to get the real next changed item - (compute_status): really compute the status of the record - (local_record_from_uid): Set the id of the temporary card - (check_for_slow_setting): Make this check a little saner - (card_added): Only record the CardObjectChange if the card is not - archived - (card_changed): ditto - (card_removed): ditto - (set_status_cleared): actually clear the status - (for_each_modified): Clean out cruft and use next_changed_item - (add_record): Set the new id properly in our local card copy - (replace_record): handle the case where the record has been deleted - and we need to call add. need to update the changed_hash entry - (delete_record): Don't panic if the card is not found, its already - been deleted. - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): - The change_context no longer has a del_cards member - (pas_backend_file_book_view_free): ditto - (pas_backend_file_process_get_changes): ditto - (pas_backend_file_changes_foreach_key): just record the id - (pas_backend_file_changes): notify_remove needs an id not a vcard - -2000-12-20 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (match): Use my own wrapper - functions instead of trying to *directly* access the the data - structures my self - (post_sync): Put in hack to prevent syncing the same records twice - (local_record_from_uid): set the card id when creating a blank one - (add_record): Set the id of the card we have and don't go to the - server to get the latest version - -2000-12-19 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (ecard_from_remote_record): Convert - pilot strings to utf for the e-cards. - -2000-12-19 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (local_record_from_ecard): Convert ecard - strings to pilot encodings - -2000-12-19 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c (delete): Made it so that if - you select multiple contacts, the right click menu to delete - deletes them all. - -2000-12-18 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (ldap_error_to_response): always - use LDAP_NAME_ERROR (in the openldap1 case it's #defined to - NAME_ERROR). - (build_card_from_entry): ldap_get_values can return NULL. also, - openldap2 keeps us from getting at ldap->ld_errno, so we can't - tell if there was a decoding error like we used to. the double - free problem where ldap would free the ber if there was a decoding - problem might be fixed now.. further investigation is needed. - for now we leak in openldap2. - (ldap_search_handler): the ldap structure is opaque, so use - ldap_search_ext to give the extra information (the max responses, - timeout, etc.) in the openldap2 case. - -2000-12-13 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-ldap.c (ldap_error_to_response): Test - for the existance of LDAP_NAME_ERROR and if it exists as a macro, - use it instead of NAME_ERROR. - -2000-12-14 Michael Meeks <michael@helixcode.com> - - * gui/component/GNOME_Evolution_Addressbook.oafinfo: update cut - and paste description error. - -2000-12-13 Dan Winship <danw@helixcode.com> - - * gui/widgets/e-minicard-control.c (stream_read): NULL-terminate - the returned vcard so we don't sometimes end up with trailing - junk that makes libversit unhappy. - -2000-12-13 Iain Holmes <iain@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section): Make the -> into a GNOME stock image. - -2000-12-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_init): Connect to the "cursor_change" signal on - the ETable here instead of the ETableScrolled. - (remove_address): Added the col and event parameters to this - callback to match the added parameters to the double click signal. - (e_select_names_add_section): Connect to the "double_click" signal - on the ETable here instead of the ETableScrolled. - -2000-12-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (e_card_set_arg): When setting the "name" - argument, copy the incoming name. This fixes a crash. - -2000-12-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Made editing the name using - the full name button set the file as entry properly. Made it - so that the address parse that the user chooses after - clicking on the Full Address... button gets saved. - -2000-12-08 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c (full_name_clicked): Made it - so that the editor->name is set after the entry is changed. This - means that the reparse that the person chose is saved. - -2000-12-07 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Pass NULL - as the @toplevel_node_handler_id argument to - `evolution_storage_new'. - -2000-12-08 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Fixed some formatting. - - * contact-editor/e-contact-editor-categories.h: Removed an - unneeded #include. - - * gui/widgets/e-addressbook-view.c: Connect to the signals on the - ETable instead of the ETableScrolled. - -2000-12-07 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (local_record_from_uid): Pass "" rather - than NULL to e_card_new. - (local_record_from_ecard): Make sure ecard->name is valid - (check_for_slow_setting): Remove hard coded test value - (card_added): g_strdup the resul of e_card_get_id - (card_changed): ditto - -2000-12-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c: Got rid of code referencing - the ETableScrolled proxy functions. - -2000-12-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Moved the gal view menu stuff from - here to EAddressbookView. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h: New function to set up the menus - for the EAddressbookView. - -2000-12-06 JP Rosevear <jpr@helixcode.com> - - * conduit/Makefile.am: Another conduit build fix - -2000-12-05 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_changes_foreach_key): - Create an empty vcard with the appropriate id for deleted cards - - * conduit/address-conduit.c (ecard_from_remote_record): Ensure the - address fields are added sensibly - -2000-12-05 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Updated the - call to `evolution_storage_new()': pass NULL for - @toplevel_node_uri. - -2000-11-28 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (local_record_to_pilot_record): Return - a struct rather than a pointer to a struct - (view_cb): kill warning - (compare): local_record_to_pilot_record now returns a struct - (prepare): ditto - (free_prepare): remove as per gnome-pilot changes - (conduit_get_gpilot_conduit): don't listen for free_prepare signal - -2000-11-27 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: Remove "complete" field - - * conduit/address-conduit.c (print_local): Make it print useful debug - info - (print_remote): ditto - (local_record_from_ecard): Make sure phone numbers get out to the pilot - (ecard_from_remote_record): Set phone strings to "" if they are null - (sequence_complete): unref the book view - (view_cb): ref the book view - (free_prepare): do nothing - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_free): - Destroy the card lists with the rest of the view. - (pas_backend_file_changes): Don't destroy the card lists here - (pas_backend_file_book_view_free): Free the card/id lists in the - change context here, the correct place. - (pas_backend_file_changes): instead of here... - -2000-11-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Set view.change_context to NULL - in pas_backend_file_process_get_book_view. Changed - pas_backend_file_book_view_copy a bit. - - * backend/pas/pas-backend-ldap.c: Got rid of a warning. - -2000-11-18 Matt Bissiri <matt@bissiri.org> - - * gui/component/Makefile.am: - Add widgets/menus/libmenus.la to evolution_addressbook_LDADD - so that it will link properly now that gal-view-menus.[ch] - was moved from gal into evolution. - -2000-11-15 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): - Initialize destination struct with '0's. - -2000-11-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Changed the mime type from "text/vcard" - to "text/x-vcard". - -2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu> - - * backend/ebook/.cvsignore: Add idl-generated files. - * backend/ebook/e-book.c: (e_book_do_response_get_changes): - * backend/ebook/e-card.c: (e_card_send): - s/Evolution_/GNOME_Evolution_/g; - -2000-11-11 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Link in composer bonobo code. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added code to - send mail to an ECard or send an ECard as a VCard attachment. - - * contact-editor/e-contact-editor.c: Add verbs to send the contact - as a VCard or send mail to the contact. - - * gui/search/e-addressbook-search-dialog.c: Removed some unused - variables. - - * gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: - Added menu items to send the contact as a VCard or send mail to - the contact. - -2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu> - - * gui/component/addressbook.oafinfo: - * gui/component/select-names/evolution-addressbook-select-names.oafinfo: - Update the remaining "IDL:Evolution*" to "IDL:GNOME/Evolution*" - to sync up with yesterday's IDL re-scoping. - -2000-11-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-ldap.c: Fixed a warning. - - * gui/component/addressbook.c: Put in gal view menus for testing - purposes. - - * printing/e-contact-print-envelope.c: Fixed up envelope printing - a bit. Added code for printing return addresses. - -2000-11-09 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: Add changed_hash, change list and complete bool - - * conduit/address-conduit.c (local_record_from_ecard): Add empty field checks - (card_added): callback for book view - (card_changed): ditto - (card_removed): ditto - (sequence_complete): ditto - (view_cb): callback for the get changes call - (pre_sync): force synchronous loading of book view - (for_each): we already have the card so create the local record directly - (for_each_modified): Uncomment and fix - (delete_record): ditto - - * conduit/Makefile.am: link against gal for ebook - needs fixing - - * backend/ebook/e-book.c (e_book_do_response_get_changes): Properly respond - to a get_changes call - (e_book_check_listener_queue): define the get changes response operation - - * backend/ebook/e-book-listener.c (e_book_listener_queue_get_changes_response): - Queue up a get changes response - (impl_BookListener_respond_get_changes): Implement the get_changes method - (e_book_listener_get_epv): add get_changes implementation to epv - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): Only - copy the search_context and change_context elements if they actually exist - (pas_backend_file_changes): Hard code a path for now, only notify if - there is something to notify about - -2000-11-07 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-book.h: Update PASRequest structure - - * backend/pas/pas-book.c (impl_Evolution_Book_get_changes): update param name - (pas_book_queue_get_changes): Use PASRequest change_id slot - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): - Properly copy change_id and change_context - (pas_backend_file_book_view_free): Free change_id/change_context - (pas_backend_file_changes_foreach_key): Callback to figure out the - deleted cards - (pas_backend_file_changes): Use new e-dbhash stuff to implement. - Write out updated hash - - * backend/idl/addressbook.idl: Rename get_changes param - -2000-11-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Switched from EAddressbookSearch to - ESearchBar. - - * gui/widgets/Makefile.am, gui/widgets/e-addressbook-search.c, - gui/widgets/e-addressbook-search.h: Removed EAddressbookSearch. - This has been moved to filter/ and renamed ESearchBar. - - * printing/e-contact-print-envelope.c: Forgot to set the font. - This works for me now. - -2000-11-06 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/select-names/e-select-names-bonobo.c - (impl_SelectNames_get_entry_for_section): Duplicate the object - reference before returning. - -2000-11-05 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c, - gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: Add - menus items to the envelope printing stuff. - - * gui/component/addressbook.c: Hook up the search menu. - - * gui/widgets/e-addressbook-search.c, - gui/widgets/e-addressbook-search.h: Add the search menu. - - * printing/Makefile.am: Add e-contact-print-envelope.c and - e-contact-print-envelope.h. - - * printing/e-contact-print-envelope.c, - printing/e-contact-print-envelope.h: Added envelope printing. - -2000-11-03 Federico Mena Quintero <federico@helixcode.com> - - * gui/component/select-names/Makefile.am: Clean the idl-generated - files properly. - -2000-11-02 Christopher James Lahey <clahey@helixcode.com> - - * ename/.cvsignore, gui/minicard/.cvsignore: Removed these - unnecessary .cvsignores. - - * gui/component/addressbook.c: Switch to using EAddressbookSearch - instead of custom quick search widget. - - * gui/component/select-names/e-select-names.c: Made this do a - slightly better job of rendering names. - - * gui/widgets/Makefile.am: Added e-addressbook-search.c and - e-addressbook-search.h. - - * gui/widgets/e-addressbook-search.c, - gui/widgets/e-addressbook-search.h: New class that puts up an - entry and a combo box. - -2000-11-01 Dan Winship <danw@helixcode.com> - - * gui/component/e-ldap-storage.c (load_ldap_data): - (e_ldap_storage_add_server): Add "highlighted" flag to - evolution_storage_new_folder - -2000-10-31 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (cursor_cb): Let the warning make sense - (compute_pid): remove - (local_record_from_ecard): Create local record from ecard - not finished - (local_record_from_uid): Obtain local_record from uid with the proper - e-book way - (set_status_cleared): Add empty callback - (add_archive_record): kill - (delete_archive_record): kill - (archive_record): Add empty callback - (conduit_get_gpilot_conduit): Update signal connects - - * backend/pas/pas-backend-file.c (vcard_change_type): Function to determine - the type of change - not finished - (pas_backend_file_search_changes): Create a view and callback based on - how the cards have changed - (pas_backend_file_process_get_changes): Implement the get changes operation - for files - (pas_backend_file_process_client_requests): Add GetChanges method for - processing - - * backend/pas/pas-book.c (pas_book_queue_get_changes): Add changes to - the list - (impl_Evolution_Book_get_changes): implement object method - (pas_book_get_epv): Add get changes to epv - (pas_book_respond_get_changes): Respond to the get changes operation - - * backend/pas/pas-book.h: Add GetChanges PASOperation - - * backend/idl/addressbook.idl: add get_changes and respond_get_changes - methods - - * backend/ebook/e-book.c (e_book_get_changes): Client function - to a view of the changed objects - - * backend/ebook/e-book.h: New prototype - -2000-10-30 Kjartan Maraas <kmaraas@gnome.org> - - * backend/e-book/e-card.c: Fixed marking of strings - for translation. Use "_(" instead of "_ (". - * gui/component/addressbook-factory.c: Add missing - calls to bindtextdomain() and textdomain noticed by - Dan Winship. - * gui/component/addressbook.c: Marked string for translation. - -2000-10-27 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/Makefile.am, gui/search/Makefile.am, - printing/Makefile.am: Fixed these to include EXTRA_GNOME_CFLAGS. - - * gui/component/select-names/e-select-names-manager.c: Turned off - newlines in header fields. - -2000-10-26 Michael Meeks <michael@helixcode.com> - - * printing/e-contact-print.c (e_contact_print_letter_tab), - (complete_sequence, e_contact_do_print_phone_list, lowify): - unsigned charness. - -2000-10-25 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (ldap_op_process_current): only - call the handler if the if we're connected, and if we fail to - connect finish the op and post a message. - (pas_backend_ldap_connect): add debug spew if DEBUG is defined. - (modify_card_handler): LDAP_RES_SEARCH_ENTRY => LDAP_SUCCESS. - (modify_card_handler): only perform the ldap_modify_s if we have a - list of modifications. - (get_cursor_handler): use ldap_error_to_response here. - (pas_backend_ldap_load_uri): use LDAP_PORT instead of the constant - 389. - -2000-10-23 Dan Winship <danw@helixcode.com> - - * gui/component/select-names/Makefile.am (INCLUDES): - * gui/component/Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR - - * backend/pas/Makefile.am (INCLUDES): - * backend/ebook/Makefile.am (INCLUDES): Update GNOMELOCALEDIR. - -2000-10-23 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: Use new libeconduit calls and - abstraction - - * conduit/address-conduit.c: ditto - -2000-10-23 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (pre_sync): Use e_pilot_map_read - (post_sync): Use e_pilot_map_write - - * conduit/Makefile.am: Link libeconduit and not libical - -2000-10-20 Michael Meeks <michael@helixcode.com> - - * contact-editor/e-contact-editor.c (tb_save_and_close_cb): - - * gui/component/addressbook.c (toggle_view_as_cb): - -2000-10-20 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: New structure of file - similar - to calendar/todo conduits - - * conduit/address-conduit.c: ditto - - * conduit/address-conduit-config.h: Config stuff for conduit - - * conduit/.cvsignore: Update - - * conduit/Makefile.am: Build fixes - - * conduit/address-conduit-control-applet.desktop: Renamed - to e-address-conduit-control-applet.desktop - - * conduit/address.conduit.in: Renamed to e-address.conduit.in - -2000-10-19 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c (SPEC): Remove Family name - column since it's a bit weird. This also fixes the initial state - since all of the column choices were off by one. - -2000-10-19 Ettore Perazzoli <ettore@helixcode.com> - - * printing/Makefile.am (glade_DATA): Remove - `e-contact-print.glade.h'. - (EXTRA_DIST): Move here. - - * gui/component/Makefile.am (glade_DATA): Remove - `ldap-server-dialog.glade.h'. - (EXTRA_DIST): Move here. - -2000-10-19 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Change how the extension field acts when - converting delivery addresses to labels. - -2000-10-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added the - function e_card_delivery_address_to_label. - - * contact-editor/e-contact-editor-address.c: Fixed a potential - crash. - - * contact-editor/e-contact-editor.c: Made this save the changed - data to the string version of the address. - -2000-10-19 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (change_view_type): update to new - UI handler. - (update_view_type): split from (change_view_type). - (control_activate): add an update_view_type. - -2000-10-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Change NAME_OR_ORG to return the - email address if both name and organization are taken. - - * gui/component/select-names/e-select-names.c: Fixed up the spec - strings in this class. Removed the "cursor_mode" argument to - ETable since it's part of the spec now. - -2000-10-17 Iain Holmes <iain@helixcode.com> - - * contact-editor/contact-editor.glade: Change the initial dialog - visibility to FALSE - so the contact editor doesn't flash when it appears. - -2000-10-16 Iain Holmes <iain@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_activate_dialog): Only allow one dialog - per manager. - -2000-10-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fulladdr.glade: Fixed a typo. Made this look a - bit better. - -2000-10-15 Dan Winship <danw@helixcode.com> - - * gui/component/select-names/Makefile.am: - * gui/component/Makefile.am: Remove CPPFLAGS since they just - duplicate flags that were already in INCLUDES. - - * printing/Makefile.am (ecpsdir): - * gui/widgets/Makefile.am: - * contact-editor/Makefile.am: Move -D flags from CPPFLAGS to - INCLUDES so they don't override any CPPFLAGS set at configure - time. - -2000-10-14 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): if we are in - LDAP mode then merge in the extra few items, otherwise just merge - the standard thing; saves duplication. - -2000-10-14 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.oafinfo: Added - "evolution:shell-component-icon" property. - -2000-10-14 Iain Holmes <iain@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_manager_activate_dialog): Only allow one dialog - per id. - (e_select_names_manager_destroy): Destroy the hashtable. - (e_select_names_manager_init): Init the hashtable. - -2000-10-13 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h: - Rearranged these fields a bit more. - -2000-10-13 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/select-names/e-select-names.c, - gui/widgets/e-addressbook-view.c: Changed these for boolean - ascending attribute instead of int ascending attribute. Fixed - e-select-names to not use a column past the end of its array. - - * contact-editor/e-contact-editor-address.c, - contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h: - Rearranged the address editor dialog. - -2000-10-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed the column - elements, the no-headers attribute and added a cursor-mode=line - attribute. - - * gui/component/select-names/e-select-names.c, - gui/widgets/e-addressbook-view.c: Fixed the column elements here. - -2000-10-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/select-names/e-select-names.c, - gui/widgets/e-addressbook-view.c: Updated these to the new style - ETables. - -2000-10-06 Not Zed <NotZed@HelixCode.com> - - * gui/search/e-addressbook-search-dialog.c (get_widget): Removed - ondemand callback nonsense from rule_context_load(). - -2000-10-05 Michael Meeks <michael@helixcode.com> - - * contact-editor/e-contact-editor.c (create_ui): upd. - (e_contact_editor_init): upd. - - * gui/component/addressbook.c (control_activate_cb): upd. - (control_deactivate): kill. - (control_activate): upd. - -2000-09-22 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): update. - - * contact-editor/e-contact-editor.c (create_ui): upd. - -Fri Sep 29 07:33:54 2000 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Made it so - that minicard doesn't write out changes to the backend unless - something's actually changed. - -Tue Sep 26 16:28:47 2000 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Make sure that card->name and - card->full_name are always valid. - - * contact-editor/e-contact-editor.c: Removed some unused - variables. - -2000-09-22 Matt Bissiri <bissiri@eecs.umich.edu> - - * contact-editor/e-contact-editor-fullname.c (extract_info): If - (editor->name == NULL), store ptr to newly allocated ECardName in - editor->name, not just in a stack variable. This fixes a crash - which happened when you click "New", then click "Full Name...", - then enter name, then click "OK". - - * backend/ebook/e-card.c (e_card_name_to_string): Add - g_return_val_if_fail. - -2000-09-25 Jeffrey Stedfast <fejj@helixcode.com> - - * gui/widgets/Makefile.am: - * gui/component/Makefile.am: - * contact-editor/Makefile.am: - * printing/Makefile.am: Look for ename in /e-util/ename instead of - /addressbook/ename - - * backend/ebook/e-card.c: Updated to include e-util/ename/*.h - - * ename: Moved to /e-util so it could be shared - - * Makefile.am (SUBDIRS): took out ename - -2000-09-25 Nat Friedman <nat@helixcode.com> - - * ename/e-name-western-tables.h: Added a ton of new prefixes and - suffixes. - -2000-09-22 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): update. - - * contact-editor/e-contact-editor.c (create_ui): upd. - -2000-09-22 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c: lots of changes. flesh out the - remove/modify/create functions. add another flag for the property - table, PROP_DN, which makes it easy for us to determine when we - need to create a new DN for a record when we're modifying. also - add a ber_func to the table for PROP_TYPE_LIST fields, which fills - in the list of bvalues that we send to the ldap server. The - add/modify/delete stuff hasn't been tested yet, and it hopelessly - complex (yay ldap). - (ldap_search_handler): act synchronous when ldap_search responds - with -1. - (view_destroy): use pas_book_view_notify_status_message. - (ldap_op_process_current): same - (ldap_op_process): same - (poll_ldap): same - (ldap_search_handler): same - -2000-09-22 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-card-simple.h: add - E_CARD_SIMPLE_FIELD_FAMILY_NAME to the enum. - - * backend/ebook/e-card-simple.c (field_data): add - E_CARD_SIMPLE_FIELD_FAMILY_NAME. - (e_card_simple_get): add getter for FAMILY_NAME. - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Made addresses be quoted printable again - so that they will encode properly if they have carriage returns in - them. This is possible now because of a fix in libversit. - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book-view-listener.c, - backend/ebook/e-book-view-listener.h, backend/ebook/e-book-view.c, - backend/ebook/e-book-view.h, backend/idl/addressbook.idl, - backend/pas/pas-book-view.c, backend/pas/pas-book-view.h: Added a - function to set the status message associated with a given view. - This is not yet implemented in the gui. - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book.c, backend/ebook/e-book.h, - backend/idl/addressbook.idl, backend/pas/pas-backend-file.c, - backend/pas/pas-backend-ldap.c, backend/pas-backend.c, - backend/pas/pas-backend.h, backend/pas/pas-book.c, - backend/pas/pas-book.h: Added a function to query static - capabilities (capabilities that can be reported immediately) and - implemented them in the 2 servers. - - * gui/component/addressbook.c: Added a View All button and a Stop - button. Sorted out the new directory server stuff a bit. - - * gui/widgets/e-addressbook-model.c, - gui/widgets/e-addressbook-model.h: Cleaned up a bit. Added a stop - function. Check for capabilities before deciding whether to load - all cards when initially viewed. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h: Added stop and view all - functions. - - * gui/widgets/e-minicard-view-widget.c, - gui/widgets/e-minicard-view-widget.h, - gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h: - Added a stop function. Check for capabilities before deciding - whether to load all cards when initially viewed. - -2000-09-21 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): remove _UIHandler - -2000-09-21 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/load-pine-addressbook.c: Added a missing include - of ctype.h. - - * backend/pas/pas-backend-file.c: Fixed a problem where using a - GList was causing us to not be reentrant. We now use an EList - here and so now this is reentrant. This should fix the "wombat - crashes every time you run evolution" bug. - - * contact-editor/e-contact-editor.c: Fixed a type mismatch. - -2000-09-21 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/load-pine-addressbook.c: Make this work when a - field is spread across multiple lines. - -2000-09-20 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added a - wants_html field to cards. Uses "x-mozilla-html". - - * contact-editor/Makefile.am: Added definition of - EVOLUTION_DATADIR. - - * contact-editor/contact-editor.glade: Make Wants HTML check - button visible. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Make Wants HTML check button - active. Fix UI stuff to use XML. Set parent window of - confirm_delete dialog. - - * gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: Set - the parent window of the confirm_delete dialog. - -2000-09-20 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c: Fixed display of the minicards - when the addressbook was first loading. (It was overwriting a - string with NULL during init.) - -2000-09-19 Dan Winship <danw@helixcode.com> - - * gui/search/Makefile.am (ruledir): Use $(datadir), not - $(prefix)/share - -2000-09-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am, contact-editor/Makefile.am, - ename/Makefile.am, gui/component/Makefile.am, - gui/widgets/Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and - $(EXTRA_GNOME_LIBS). Removed unneeded libraries. - - * backend/ebook/e-card.c, backend/pas/pas-backend-file.c, - contact-editor/e-contact-editor-address.c, - contact-editor/e-contact-editor-categories.c, - contact-editor/e-contact-editor-categories.h, - contact-editor/e-contact-editor-fullname.c, - contact-editor/e-contact-editor.c, - contact-editor/e-contact-save-as.c, ename/e-address-western.c, - ename/test-ename-western-gtk.c, - gui/component/addressbook-factory.c, gui/component/addressbook.c, - gui/component/e-cardlist-model.h, gui/component/e-ldap-storage.c, - gui/component/select-names/e-select-names-bonobo.c, - gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-table-model.h, - gui/component/select-names/e-select-names-text-model.h, - gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h, - gui/search/e-addressbook-search-dialog.c, - gui/widgets/e-addressbook-model.h, - gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard-label.c, - gui/widgets/e-minicard-view-widget.c, - gui/widgets/e-minicard-view-widget.h, - gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h, - gui/widgets/e-minicard-widget.h, gui/widgets/e-minicard.c, - gui/widgets/test-minicard-label.c, gui/widgets/test-reflow.c, - printing/e-contact-print.c: Fixed the #include lines to deal - properly with gal. - -2000-09-15 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.h, - contact-editor/e-contact-save-as.h, - gui/widgets/e-addressbook-model.h, - gui/widgets/e-minicard-view-widget.h, - gui/widgets/e-minicard-view.h, gui/widgets/e-minicard.c, - gui/widgets/e-minicard.h: Fixed the paths of some .h #includes. - - * gui/component/addressbook.c: Removed all of the code to actually - create and display the correct view of the addressbook and moved - it to the new class gui/widgets/e-addressbook-view.c. - - * gui/widgets/Makefile.am: Added everything necessary for - e-addressbook-view.c and e-addressbook-view.h. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h: New class to deal with actual - display of addresses and switching between card view and table - view. - - * gui/widgets/e-minicard-view-widget.c: Made this deal more - gracefully with having the book set to NULL. - -2000-09-16 Michael Meeks <michael@helixcode.com> - - * gui/component/select-names/e-select-names.c: fix broken include. - - * gui/component/Makefile.am (INCLUDES): define datadir. - (evolution_addressbook_SOURCES): remove e-addressbook-model.[ch] - - * gui/component/addressbook.c (control_activate): use datadir. - -2000-09-16 Ettore Perazzoli <ettore@helixcode.com> - - * gui/widgets/Makefile.am (gladedir): Define. - (glade_DATA): Install `alphabet.glade'. - (EXTRA_DIST): Define. - - * gui/component/Makefile.am (glade_DATA): Remove `alphabet.glade'. - (EXTRA_DIST): Remove `alphabet.glade.h'. - - * gui/widgets/Makefile.am (libeminicard_a_SOURCES): Add - `e-addressbook-model.c' and `e-addressbook-model.h'. I hope this - is what Chris meant to do. - - * gui/component/Makefile.am (INCLUDES): Add - `-I$(top_srcdir)/addressbook/gui/widgets'. - (evolution_addressbook_SOURCES): Remove `e-addressbook-model.c' - and `e-addressbook-model.h'. - - * gui/component/select-names/e-select-names.c: #include - "e-addressbook-model.h" from "addressbook/gui/widgets" instead of - "addressbook/gui/component", as it has been moved there. - -2000-09-15 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c: split all the ldap operations - into 2 halves, a handler, and destructor, and create a structure - containing two function pointers and any data they need. this - allows us queue up pending operations (since the LDAP*'s are no - longer view specific. there's one per backend.) also, add - support for restarting async operations if the SERVER DOWN error - isn't communicated until sometime after the handler is called (as - is the case with the async search stuff.) - -2000-09-14 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook-factory.c (main): Call unicode_init - for e-font stuff. - -2000-09-14 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/Makefile.am, gui/widgets/Makefile.am: Added - $(GNOME_PRINT_LIBS) to all of the test files in these directories. - -2000-09-14 Michael Meeks <michael@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_LDADD): fix path. - - * gui/component/addressbook.c: update include. - - * gui/component/addressbook-factory.c: update include. - - * gui/widgets/e-minicard-view.h: update include. - - * gui/search/e-addressbook-search-dialog.c: update include path. - -2000-09-13 Michael Meeks <michael@helixcode.com> - - * contact-editor/e-contact-editor.c (e_contact_editor_init): hack. - (create_toolbar): ditto. - -2000-09-07 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c: Radicaly update UI handler code. - -2000-09-13 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/*, gui/minicard/*: Moved gui/minicard to - gui/widgets, except for e-reflow.c, e-reflow.h, e-reflow-sorted.c, - and e-reflow-sorted.h. - - * gui/widgets/Makefile.am: Added e-reflow to the INCLUDES list and - libereflow.a to a bunch of LDADD lines. - - * gui/component/Makefile.am (evolution_addressbook_LDADD): Added - libereflow.a here. - - * gui/Makefile.am (SUBDIRS): Replaced minicard with widgets. - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/select-names/Makefile.am: Add space after `-I' - when invoking `orbit-idl'. - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/Makefile.am (EXTRA_DIST): Remove `ui.xml'. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Fixed a crash error. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * ename/e-address-western.c: Fixed some warnings. - -2000-09-11 Jesse Pavel <jpavel@helixcode.com> - - * ename/e-address-western.c: fixed certain address parsing - problems. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fulladdr.glade: Made this a bit better balanced. - - * gui/component/addressbook.c: Make the toolbar button for find do - the same thing that the menu item for search does. - - * gui/search/e-addressbook-search-dialog.c: Made the top half of - this not expand. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Removed a bunch of redundant code. Made it so that when you set - an address label, it sets the delivery address as well. Added - functions to set and get the delivery address. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added code to - convert and address label to a delivery address. - - * contact-editor/Makefile.am: Added e-contact-editor-address.[ch], - fulladdr.glade, fulladdr.glade.h. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Switched from a label - to a button to show the parsed address. - - * contact-editor/e-contact-editor-address.c, - contact-editor/e-contact-editor-address.h: New class to implement - the parsed address dialog. - - * contact-editor/e-contact-editor-fullname.c, - contact-editor/e-contact-editor-fullname.h: Added const to the - _new function. - - * contact-editor/e-contact-editor.c: Implemented clicking on the - address button. - - * contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h: - New glade files for the parsed address dialog. - - * contact-editor/fullname-strings.h, fullname.glade: Changed these - accellabels to labels. - - * ename/Makefile.am: Added e-address-western.c. - - * ename/e-address-western.c: Fixed some warnings. - -2000-09-10 Christopher James Lahey <clahey@helixcode.com> - - * ename/e-address-western.c: Added by Jesse. - -2000-09-08 Lauris Kaplinski <lauris@helixcode.com> - - * gui/minicard/e-minicard-label.c (e_minicard_label_construct): - Use canvas default font - - * gui/minicard/e-minicard.c (e_minicard_realize): Ditto - (get_left_width): Ditto - -2000-09-08 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed a few warnings. - -2000-09-02 Lauris kaplinski <lauris@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: e_utf8 wrappers - - * contact-editor/e-contact-editor.c: e_utf8 wrappers - -2000-09-01 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/e-ldap-storage.c (load_ldap_data): Updated for the - extra arg now needed by `evolution_storage_new_folder()'. - (e_ldap_storage_add_server): Likewise. - -2000-08-31 Ettore Perazzoli <ettore@helixcode.com> - - * conduit/Makefile.am (INCLUDES): Add `BONOBO_GNOME_CFLAGS' and - `-I$(top_srcdir)'. - -2000-08-31 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Install load-gnomecard-addressbook - and load-pine-addressbook. - -2000-08-30 Lauris Kaplinski <lauris@helixcode.com> - - * printing/e-contact-print.c: Countless small changes for gnome-print 0.21+ - -2000-08-30 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook.oafinfo: Add a name to the minicard - viewer. - -2000-08-29 Dan Winship <danw@helixcode.com> - - * backend/ebook/e-book.c: - * backend/ebook/test-client.c: - * backend/ebook/test-client-list.c: - * backend/ebook/load-gnomecard-addressbook.c: - * backend/ebook/load-pine-addressbook.c: - * backend/pas/pas-book-factory.c: - * conduit/address-conduit.h: Remove USING_OAF checks - -2000-08-28 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Use the right argument name to turn - on grid lines. - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/minicard/Makefile.am: Comment out minicard-view-test - since its gnorba dependent - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/component/addressbook-component.c: Remove gnorba stuff - - * gui/minicard/e-minicard-control.c (e_minicard_control_factory_init): - ditto - - * gui/component/addressbook.c: ditto - - * gui/component/addressbook-factory.c: ditto - -2000-08-25 Christopher James Lahey <clahey@helixcode.com> - - * demo/* Removed the demo directory since it's no longer used. - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/minicard/Makefile.am: Remove gnorba stuff - - * gui/minicard/e-minicard-control.gnorba: Kill - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/component/addressbook.gnorba: Kill - - * gui/component/Makefile.am: Remove gnorba stuff - -2000-08-25 Dan Winship <danw@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_LDFLAGS): Add - -export-dynamic so libglade will be able to resolve custom widget - callbacks. - -2000-08-23 Lauris Kaplinski <lauris@helixcode.com> - - * backend/pas/pas-backend-file.c (func_contains): Use e_utf8_strstrcase - - * contact-editor/e-contact-editor-fullname.c (fill_in_field): Use e_utf8 wrapper - (extract_field): Same - - * contact-editor/e-contact-editor.c (full_name_clicked): Don't crash - - * ename/Makefile.am: Link demo with libeutil.la - - * ename/test-ename-western-gtk.c (full_changed_cb): Use e_utf8 wrapper - - * gui/component/addressbook.c (find_contact_cb): Use e_utf8 wrapper - (search_entry_activated): Same - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/e-addressbook-search-dialog.c: Fix an error in the - arguments to rule_context_load. - - * backend/ebook/e-card.c: Fix this to not mess up if the person - passes a VCard with a carriage return in the mailing address. - -2000-08-14 Not Zed <NotZed@HelixCode.com> - - * gui/search/addresstypes.xml: Fixed fullname->full_name for - search field. - - * gui/search/e-addressbook-search-dialog.c (get_widget): Check we - actually got any parts to build the dialogue with. - -2000-08-13 Not Zed <NotZed@HelixCode.com> - - * gui/component/addressbook-component.c (owner_set_cb): Set the - global_shell_client nastyhack when we know it. - This is only required to link with the filter code ... - - * gui/component/Makefile.am (evolution_addressbook_LDADD): Added - libfilter.a to the link line. - - * gui/search/Makefile.am (noinst_LIBRARIES): Change library name - from libaddressbooksearchdialog to libaddressbooksearch, as used - elsewhere. - - * gui/search/e-addressbook-search-dialog.c (get_widget): - Implement. - (get_query): Likewise. - (e_addressbook_search_dialog_destroy): Unref filter stuff when - done. - - * gui/component/addressbook.c (control_deactivate): Added chris's - patch to put the meny in - -2000-08-22 Lauris Kaplinski <lauris@helixcode.com> - - * contact-editor/e-contact-editor.c: Use e_utf8 wrappers everywhere - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/e-card.h: Started adding a time zone field to ECard. - - * gui/component/e-addressbook-model.c: Added - e_table_model_pre_change where appropriate. - - * gui/minicard/e-minicard-control.c: Added a ref and unref pair. - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Linked in the search dialog again. - It looks like some changes in the shell made this not work. - -2000-08-19 Christopher James Lahey <clahey@helixcode.com> - - * conduit/address-conduit.c, conduit/address-conduit.h: Changed - this to use ECardSimple. - - * contact-editor/e-contact-editor.c: Fixed a memory leak. - - * gui/component/addressbook.c: Added stuff to the right click - menu. Activated the new search dialog that doesn't quite work - yet. - - * gui/minicard/e-minicard-view.c: Fixed some run time warnings. - -2000-08-15 Larry Ewing <lewing@helixcode.com> - - * gui/minicard/e-minicard.c (e_minicard_event): use style colors - for the selected state. This doesn't properly redraw the minicard - when there is a style_change event, that is next. - (e_minicard_realize): use style colors. - -2000-08-14 Peter Williams <peterw@helixcode.com> - - * backend/pas/pas-backend-file.c: Include the proper db1/db.h - as in RedHat 7.0 -- patch from Kenny Graunke <kwg@teleport.com> - -2000-08-13 Chris Toshok <toshok@helixcode.com> - - * conduit/Makefile.am (libaddress_conduit_la_SOURCES): add - address-conduit.h - - * Makefile.am (CONDUIT_SUBDIR): only set subdir if - ENABLE_PILOT_CONDUITS is set. - -2000-08-13 Chris Toshok <toshok@helixcode.com> - - * Makefile.am (SUBDIRS): add conduit subdir. - -2000-08-13 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (conduit_get_gpilot_conduit): add - special oaf initialization hack so conduit can find wombat, and - accept all cookies so that we can actually talk to oaf. - -2000-08-13 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Fixed a typo that cause the - wrong field to be searched. - - * gui/component/select-names/e-select-names.c: Made the select - names dialog only display entries with email addresses. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade: Fixed a typo in the name of - the first phone entry. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/Makefile.am, - gui/search/e-addressbook-search-dialog.c, - gui/search/e-addressbook-search-dialog.h: A few small interface - fixes. - - * gui/component/Makefile.am: Link in the addressbook search - dialog. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * gui/Makefile.am: Added the search directory. - - * backend/ebook/e-book.c: Fixed a potential crash. - - * gui/minicard/e-reflow-sorted.h: Fixed an include line. - - * gui/search/.cvsignore, gui/search/Makefile.am: New files. - - * gui/search/e-addressbook-search-dialog.c: Fixed compilation. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * printing/Makefile.am: Ettore fixed compilation. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/.cvsignore: Added load-gnomecard-addressbook. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/e-addressbook-search-dialog.c, - gui/search/e-addressbook-search-dialog.h: Made this into a Gtk - object. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-book-view.c: Ref our book view listener. - - * gui/component/addressbook.c: Updated to use new minicard view - widget. - - * gui/minicard/Makefile.am: Added e-minicard-view-widget.c and - e-minicard-view-widget.h. - - * gui/minicard/e-minicard-view-widget.c, - gui/minicard/e-minicard-view-widget.h: New class that's just a - minicard view in an ECanvas. - - * gui/search/e-addressbook-search-dialog.c: New file for - implementing a search dialog. - -2000-08-11 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (transmit): implement code to encode - the first email address and send to the pilot. - (get_phone_label_by_flag): rename find_phone_label_for_flags to - this, and implement by calling get_phone_label_by_name. - -2000-08-11 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (ecard_from_remote_record): add code - for handling email addresses from pilot (which stores it as a - phone number entry. go figure.) - (check_for_slow_setting): #if 0 out, since we don't use it (yet). - (update_record): un #if 0 the code to handle the case where the - pilot info has changed for a local record. - (merge_ecard_with_remote_record): implement function, but for now - just return the existing (desktop) record - we still don't allow - merge from the pilot. - - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/addresstypes.xml: Changed a couple of input field - names. - -2000-08-10 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c: Remove prototype for - `setup_ldap_storage()', which shouldn't be here anyway. - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/, gui/search/addresstypes.xml: New search dialog for - addressbook. - -2000-08-10 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook-component.c (owner_set_cb): Update for - changed prototype, pass evolution_homedir arg to - setup_ldap_storage. - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Now takes - an evolution_homedir arg, uses that to generate the path to the - ldapservers.xml file, and stores the result in a static variable. - (e_ldap_storage_add_server, e_ldap_storage_remove_server): Use that - static variable rather than hardcoding the path to the file. - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Fixed any search to not crash on - missing phone numbers or email addresses. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-control.c: Added a button to save to - your addressbook. - -2000-08-09 Cody Russell <bratsche@gnome.org> - - * gui/component/addressbook.c: Make the toolbar honor the user's - gnomecc settings for detachable toolbars. - -2000-08-09 Nat Friedman <nat@helixcode.com> - - * ename/e-name-western-tables.h: Added some military prefixes. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Fixed a warning. - -2000-08-09 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Add the stock - print icon to the print item. - -2000-08-09 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Put the print - item in the right placeholder so that it gets the right position - in the "File" menu. - (control_deactivate): Updated accordingly. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c, gui/minicard/e-minicard.c: Changed - e_popup_menu_run call to match the new arguments. - - * gui/component/addressbook.oafinfo: Fixed this file to work - properly. - - * gui/minicard/e-minicard-control.c: Use the correct oafinfo ID - here. Also cleaned up the code a bit with the help of Michael - Meeks. - -2000-08-08 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-addressbook-model.c (e_addressbook_model_init): - use x-evolution-any-field. - - * gui/component/addressbook.c (search_entry_activated): use - x-evolution-any-field. - (change_view_type): same. - - * gui/minicard/e-minicard-view.c (e_minicard_view_init): set query - to x-evolution-any-field. - - * backend/pas/pas-backend-ldap.c (func_contains): support - x-evolution-any-field for matching any evolution supported field. - - * backend/pas/pas-backend-file.c (compare_email): switch to using - ECardSimple calls. - (compare_phone): same. - (compare_address): same. - (entry_compare): switch to using ECardSimple calls, and support a - 'x-evolution-any-field' wildcard field. - (vcard_matches_search): use an ECardSimple. - -2000-08-07 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Removed the next and prev - toolbar buttons since they don't do anything. - -2000-08-07 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor.c: Fixed the tab order to not - repeat the web page address field. - -2000-08-07 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Fixed the tab order for this - dialog. - -2000-08-05 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed a warning. - - * backend/ebook/e-card.c: Cast to (char *) in - e_card_load_cards_from_file since libversit isn't const correct. - - * backend/pas/pas-backend-file.c: Fixed a warning. - -2000-08-04 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): unref. - - * demo/addressbook.c (control_activate): unref. - -2000-08-02 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/e-addressbook-model.c: Emit "model_pre_change" - signal as appropriate. - -2000-08-02 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c: Adapted this to supply the - new append_row API of ETableModel. - -2000-07-31 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Changed the default set of columns. - -2000-07-29 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added load-gnomecard-addressbook - compilation. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added - e_card_load_cards_from_file helper function to load multiple cards - from a single file. - - * backend/ebook/load-gnomecard-addressbook.c: New file to load - vcard files. I think this is the format that gnomecard uses so if - you copy your gnomecard file to gnomecard.vcf and then run this - program in the same directory, it'll copy all your gnome contacts - into evolution. It needs to be changed to take a filename as a - parameter. Some fields (phone and address information, for - example) aren't displayed properly, but are saved. This is new - code, so some other than phone and address may be lost. - -2000-07-28 Ettore Perazzoli <ettore@helixcode.com> - - * backend/pas/Makefile.am: Add `pas-backend-ldap.c' and - `pas-backend-ldap.h' to `EXTRA_DIST' so they get distributed even - if the OpenLDAP support is not enabled. - -2000-07-27 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/load-pine-addressbook.c: Changed the URI to load - to. - -2000-07-26 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-widget-test.c: Fixed a warning. - -2000-07-26 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (view_destroy): wait to free the - view until we've taken care of freeing its internals. also, close - the ldap connection here. - (pas_backend_ldap_connect): rename p_b_l_ensure_connected to this, - since it's always called when we create a view. - (pas_backend_ldap_build_all_cards_list): open an ldap connection - in this function and close it at the end. - (poll_ldap): make sure to call ldap_unbind to close the view's - connection here. - (pas_backend_ldap_search): call pas_backend_ldap_connect here - - ldap_unbind will either be called from poll_ldap or from - view_destroy. - (pas_backend_ldap_get_vcard): the PASBackendLDAP no longer has an - LDAP*. - -2000-07-26 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_build_all_cards_list): add support for user settable scope. - (pas_backend_ldap_search): same. - (pas_backend_ldap_load_uri): same. - -2000-07-26 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook.oafinfo: lowercasify the - supported_mime_types - -2000-07-25 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-card-types.h: add enum for e-card pilot status. - - * conduit/address-conduit.c: #ifdef out all the archiving code with SUPPORT_ARCHIVING. - (purge): implement correctly - deleting ecards whose pilot status is DELETED. - (set_status): implement. - (set_pilot_id): add gtk_main call here to change commit_card into a synchronous - (delete_all): implement correctly - don't delete the records, just set their status to DELETED. - (local_record_from_ecard): get the current status from the ecard. - - * backend/ebook/e-card.c (e_card_get_vcard): add vcard support for pilot status. - (parse_pilot_status): new function. - (e_card_class_init): add pilot status object arg. - (e_card_set_arg): add pilot status support. - (e_card_get_arg): same. - (e_card_init): initialize pilot_status to 0. - -2000-07-25 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c: add comment headers to signals that - didn't have any. - -2000-07-25 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (start_address_server): use the user's - Contact db. not toshok's. - -2000-07-25 Michael Meeks <michael@helixcode.com> - - * backend/ebook/load-pine-addressbook.c (book_open_cb): check we - opened ok. - -2000-07-25 Seth Alves <alves@hungry.com> - - * ename/Makefile.am (libename_static_la_LDFLAGS): build static - version of the library for address conduit to use - - * backend/ebook/Makefile.am: build a static version of the library - to link into the conduit - -2000-07-25 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Added a #define for - "X-EVOLUTION-PILOTID". Added a parse_pilot_id to read pilot id's - in properly from VCards. Rearranged some field orders. Added a - get_arg case for ARG_PILOTID. Initialize pilot_id field to 0. - -2000-07-24 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-card.h: add pilot_id. - - * backend/ebook/e-card.c (e_card_get_vcard): add support for - X-EVOLUTION-PILOTD vcard field. - (e_card_class_init): add pilot_id arg. - (e_card_set_arg): handle pilot_id arg. - -2000-07-23 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book-view-listener.c: Remove the idle handler - when we're destroyed. - - * printing/e-contact-print.c: Fixed the spacing on the card - header. - -2000-07-20 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.oafinfo: Fixed the oaf info. - - * gui/minicard/.cvsignore, gui/minicard/Makefile.am, - gui/minicard/e-minicard-widget-test.c: Added a test for the - minicard widget. - - * gui/minicard/e-minicard-control.c: Fixed the mime type. - - * gui/minicard/e-minicard.c: Fixed some crashes if your parent - isn't a minicard view. - - * gui/minicard/e-minicard-control.oafinfo: Removed. - -2000-07-20 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (factory_fn): Update for - the new `evolution_shell_component_new()'. - -2000-07-19 Fatih Demir <kabalak@gmx.net> - - * conduit/address-conduit-control-applet.desktop: - Added the Turkish desktop entry. - -2000-07-18 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-control.c: Added "text/vCard" to the - list of mime types we support. - -2000-07-18 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/Makefile.am: Added - gui/minicard/e-minicard-control.c, - gui/minicard/e-minicard-control.h, - gui/minicard/e-minicard-widget.c, and - gui/minicard/e-minicard-widget.h. - - * gui/minicard/e-minicard-control.c, - gui/minicard/e-minicard-control.h, - gui/minicard/e-minicard-widget.c, - gui/minicard/e-minicard-widget.h: Got these to compile. - - * gui/minicard/e-minicard-control.gnorba, - gui/minicard/e-minicard-control.oafinfo: Copied directly from - bonobo-clock-control. These aren't done yet. - -2000-07-18 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-control.c, - gui/minicard/e-minicard-control.h, - gui/minicard/e-minicard-widget.c, - gui/minicard/e-minicard-widget.h: New files for using a minicard - as a widget or a bonobo control. - -2000-07-14 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-ldap-storage.c (ldap_server_foreach): duh. - don't save the port in the host slot either. - -2000-07-13 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-confirm-delete.glade, - contact-editor/e-contact-editor-confirm-delete.glade.h: Added - these. - -2000-07-13 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Switched the order of compilation of printing and - contact-editor. - - * contact-editor/Makefile.am: Added printing libraries and a - confirm delete dialog glade file. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Enabled the delete and print - functions as well as providing a confirm delete dialog to the - outside world. - - * gui/component/addressbook.c: Made the delete button on new cards - active. - - * gui/minicard/Makefile.am: Added printing libraries to a number - of test programs. - - * gui/minicard/e-minicard.c: Added print and delete to the right - click menu. Made the delete button on the card editor active. - - * printing/e-contact-print.c, printing/e-contact-print.h: Added a - function to print a single card. - -2000-07-12 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-ldap-storage.c (ldap_server_foreach): oops. fix - typo that was saving the port in the rootdn spot. - (save_ldap_data): make this a bit safer - writing to a new file - and renaming it. - (load_ldap_data): make this a bit smarter - if parsing the - ldapservers.xml file fails and there's a .new file there, - rename it. - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Do case insensitive compares. - - * addressbook/gui/component/addressbook.c: Make quick search - search both name and company name. - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Add icons to the toolbars. - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/Makefile.am: Added installation of arrow.png. - - * contact-editor/e-contact-editor.c: Use EVOLUTIONDIR #define. - -2000-07-11 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Removed an unused function - -2000-07-10 Dan Winship <danw@helixcode.com> - - * gui/component/select-names/Makefile.am (EXTRA_DIST): add idl - file to EXTRA_DIST - -2000-07-10 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Remove the - SelectNames test. - -2000-07-10 Peter Williams <peterw@curious-george.helixcode.com> - - * gui/component/select-names/e-select-names-model.c: (Clahey's fix) - Make multiple addresses be concatenated correctly. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c, - gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Switched from ETable - to ETableScrolled. - - * addressbook/gui/minicard/e-minicard.c: Don't display mailer or - "name or org" fields. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Added a field that gives the name if it exists and the company - name otherwise. - - * gui/component/e-addressbook-model.c: Formatting changes. - - * gui/component/select-names/e-select-names-table-model.c: Added - stripping of names and display of company name if name doesn't - exist. - - * gui/component/select-names/e-select-names.c: Fixed up the - display so that we display both name and email address. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-model.c: Fixed a small - off by one error that was causing an extra character to get - deleted sometimes. - -2000-07-09 Anders Carlsson <andersca@gnu.org> - - * gui/minicard/test-reflow.c (allocate_callback): Fix off by one bug with - scroll region setting. - (resize): Likewise. - (main): Put the contacts list in an EScrolledFrame instead of using a - separate GtkScrollbar. - - * gui/minicard/e-reflow.c (e_reflow_event): Don't change mouse cursor and - don't allow drags on dividers that aren't visible. - - * gui/component/addressbook.c (allocate_callback): Fix off by one bug with - scroll region setting. - (resize): Likewise. - (create_minicard_view): Put the contacts list in an EScrolledFrame instead of - using a separate GtkScrollbar. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Removed unused do_nothing_cb - function. - - * gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-manager.h: Made the OK - and Cancel buttons in the ESelectNames dialog we create work - properly. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h: Added - e_select_names_model_duplicate. - - * gui/component/select-names/e-select-names-text-model.c: Made the - text be set correctly if there's already data in the source when - the text model is created. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Removed handling of - the buttons (the user of this dialog will have to handle them.) - Added e_select_names_get_source. Fixed some typos. - -2000-07-09 Not Zed <NotZed@HelixCode.com> - - * gui/component/addressbook.c: Link the toolbar print button to - the print callback. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_clicked): Hitting OK or Cancel at least closes the - dialog now. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_create_entry): Set the returned entry to - use the ellipsis. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-factory.c: Include - e-select-names-factory.h. - - * gui/component/select-names/e-select-names-model.c: Handle a NULL - iterator properly in the replace function. - - * gui/component/select-names/e-select-names-table-model.c: Fill in - info properly in the value_at function. - - * gui/component/select-names/e-select-names-text-model.c: Don't - strlen a NULL text object. - - * gui/component/select-names/e-select-names.c: Close if the person - hits ok or cancel (doesn't yet actually undo changes if Cancel is - hit.) Handle removing addresses when they're double clicked on. - - * gui/component/select-names/select-names.glade, - gui/component/select-names/select-names.glade.h: Hid some unused - fields and changed the text at the top of the dialog. - -2000-07-08 Jeffrey Stedfast <fejj@helixcode.com> - - * gui/component/select-names/.cvsignore: Ignore dynamically - created source files - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): New function to set the properties. - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-factory.c (main): Start up the factory - for `Evolution::Addressbook::SelectNames'. - - * gui/component/select-names/evolution-addressbook-select-names.oafinfo: - New. - - * gui/component/select-names/e-select-names-factory.c: New. - * gui/component/select-names/e-select-names-factory.h: New. - - * gui/component/select-names/e-select-names-bonobo.c: New. - * gui/component/select-names/e-select-names-bonobo.h: New. - - * gui/component/addressbook-factory.c (main): Call - `e_select_names_factory_init()'. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_add_section): Made const-aware. - (e_select_names_manager_create_entry): Made const-aware. - (e_select_names_manager_activate_dialog): Made const-aware. - - * gui/component/select-names/Evolution-Addressbook-SelectNames.idl: - New. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c, - gui/component/e-addressbook-model.h: Added an "editable" argument. - - * gui/component/select-names/e-select-names.c: Set our - EAddressModel to not be editable. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names.c: Changed to line - mode. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-model.c: Implemented the - get_cards function. - - * gui/component/select-names/e-select-names.c: Implemented adding - cards through the interface. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c: Make the - entry widgets we create editable. - - * gui/component/select-names/e-select-names-model.c: Use - e_strsplit instead of g_strsplit. Fixed an off by 1 error. - - * gui/component/select-names/e-select-names-table-model.c: When - the model changes, send a model changed signal. - - * gui/component/select-names/e-select-names-text-model.c: Made - changing this work correctly if it's empty. Made change signals - propagate properly. Is a bit better about freeing iterators when - done. - - * gui/component/select-names/e-select-names.c: Made the finished - lists be in order instead of being sorted. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c (new_server_cb): Since - ELDAPServer->port is a char *, allocate a string with the number - 389 contained. - - * gui/component/addressbook.c: Make the select names test test the - new code instead of the old way of getting to an ESelectNames - dialog. - - * gui/component/select-names/e-select-names-manager.c: Coded - storing the model for each section, creating an entry and - returning it, and for activating the dialog. Wrote a bit of the - get_cards code, but not all of it. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h: Coded all of - the code needed to make ESelectNamesTextModel work (it doesn't - yet, but all the code should be there.) Removed - E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL. - - * gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-text-model.c: Changed - these to compensate for removal of - E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL. - - * gui/component/select-names/e-select-names-table-model.h, - gui/component/select-names/e-select-names-text-model.h: Fixed some - silly typos. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Added a parameter to - add_section that lets you specify the source ESelectNamesModel. - -2000-07-06 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-ldap-storage.h: add scope to ELDAPServer, and - make port a string. - - * gui/component/e-ldap-storage.c (load_ldap_data): don't load a - uri, load all the bits and pieces and build up the uri when - creating the folder, according to the openldap url format. - (ldap_server_foreach): store out each of the individual uri - pieces. - (e_ldap_storage_remove_server): free the new fields. - (get_string_value): if the text is empty, return the empty string - instead of NULL. - - * gui/component/e-ldap-server-dialog.c (extract_server_info): port is a string now. - (fill_in_server_info): port is a string now. - -2000-07-06 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Changed "FIXME: Save and - Close" to "Save and Close". Removed some toolbar items that will - never be used. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h: Added functions - to allow you to modify the model (not implemented yet.) - - * gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-table-model.h: Finished - this. Doesn't support changing the model at all. - - * gui/component/select-names/e-select-names-text-model.c: Finished - this. Changing the model by typing is done, but doesn't work - since none of the functions in the base model are implemented. - -2000-07-05 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (new_server_cb): call - e_ldap_storage_add_server call. - - * gui/component/ldap-server-dialog.glade: add name row. - - * gui/component/e-ldap-server-dialog.h: remove the ELDAPServer type. - - * gui/component/e-ldap-server-dialog.c (extract_server_info): add - support for the name-entry. - - * gui/component/e-ldap-server-dialog.c (fill_in_server_info): same. - - * gui/component/e-ldap-storage.h: add ELDAPServer type, and add - prototypes for e_ldap_storage_add_server and - e_ldap_storage_remove_server. - - * gui/component/e-ldap-storage.c (e_ldap_storage_add_server): new - function, add it to our hash table, add a shell folder, and save - out the metadata. - (ldap_server_foreach): add the ldap server info under a - "contactserver" node. - (setup_ldap_storage): create our hashtable. - -2000-07-05 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (set_prop): remove hack to read - "uri" file from local directory. - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): add - e-ldap-storage.{c,h} - - * gui/component/addressbook-component.c (owner_set_cb): call - setup_ldap_storage. - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Register - the LDAP storage and load the .xml file. - (load_ldap_data): function to load our xml file. - (save_ldap_data): function to save our xml file. - - * gui/component/e-ldap-storage.h: new file. - -2000-07-03 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-text-model.c, - gui/component/select-names/e-select-names.c: Fixed more compile - errors. - -2000-07-03 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/Makefile.am: Fixed compile error. - -2000-07-03 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Removed e-card-iterator.c, - e-card-iterator.h, e-card-list-iterator.c, e-card-list-iterator.h, - e-card-list.c, e-card-list.h. - - * backend/ebook/e-card-iterator.c, - backend/ebook/e-card-iterator.h, - backend/ebook/e-card-list-iterator.c, - backend/ebook/e-card-list-iterator.h, backend/ebook/e-card-list.c, - backend/ebook/e-card-list.h: Removed in favor or versions without - the -card in the e-util directory since these classes are not - specific to cards at all. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h, - backend/ebook/e-card.c, backend/ebook/e-card.h, - backend/ebook/load-pine-addressbook.c, backend/ebook/test-card.c, - backend/pas/pas-backend-file.c: Changed the references to - e-card-list.c and friends to e-list.c and friends. - - * contact-editor/e-contact-editor.c: Added #include - <e-contact-save-as.h> to fix a warning. - - * gui/component/Makefile.am: Moved a number of classes associated - with the select-names object to the new select-names directory. - - * gui/component/addressbook.c: Changed the reference to - e-select-names.h. - - * gui/component/e-select-names.c, gui/component/e-select-names.h, - gui/component/select-names.glade, - gui/component/select-names.glade.h: Moved these files into - select-names/. - - * gui/component/select-names/.cvsignore, - gui/component/select-names/Makefile.am, - gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-manager.h, - gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h, - gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-table-model.h, - gui/component/select-names/e-select-names-text-model.c, - gui/component/select-names/e-select-names-text-model.h, - gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h, - gui/component/select-names/recipient.glade, - gui/component/select-names/select-names.glade, - gui/component/select-names/select-names.glade.h: New files for - select names dialog (e-select-names.c, e-select-names.h, - select-names.glade, select-names.glade.h and recipient.glade moved - from gui/component/.) - -2000-06-29 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (owner_set_cb): Get an - EvolutionShellClient instead of an Evolution_Shell to match the - changes in libeshell. - -2000-06-28 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/, - gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-manager.h: New select - names manager interface (Not complete.) - -2000-06-26 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - addressbook/gui/component/e-cardlist-model.c: Added - value_to_string handlers. - - * demo/addressbook-widget.c, demo/demo.c: Removed usage of "x" and - "y" arguments. - - * addressbook/gui/component/addressbook.c: Activated Click To Add - and set the click to add message. - - * addressbook/gui/component/e-addressbook-model.c: Added - value_to_string and append_row handlers. - - * addressbook/gui/component/e-select-names.c: Added a column. - -2000-06-26 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (poll_ldap): remove spew. - (pas_backend_ldap_ensure_connected): duh, don't access a pointer - we know to be NULL. - (query_prop_to_ldap): rename map_e_card_prop_to_ldap to this. - easier to type. - -2000-06-21 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/test-minicard-label.c, - gui/minicard/test-minicard.c, gui/minicard/test-reflow.c: Remove - usage of "x" and "y" arguments. - -2000-06-18 <ettore@helixcode.com> - - * contact-editor/Makefile.am (INCLUDES): Use - `$(BONOBO_GNOME_CFLAGS)' so that we compile when Bonobo is not in - the default GNOME prefix. - -2000-06-17 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-label.c, - gui/minicard/e-minicard-label.h, gui/minicard/e-minicard.c: Made - the left column of minicards not get any wider than the widest - possible name. - -2000-06-13 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/Makefile.am (SHELL_OBJS): Removed. - (evolution_addressbook_LDADD): Link with - `$(top_builddir)/shell/libeshell.a'. - -2000-06-12 Federico Mena Quintero <federico@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Removed the - ETableModel thaw handler. - * gui/component/e-cardlist-model.c: Likewise. - -2000-06-11 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-select-names.c: Fixed the widget reparenting. - -2000-06-11 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/Makefile.am: Added glade files. - - * gui/component/addressbook.c: Added a test of the Select Names - functionality. - - * gui/component/e-addressbook-model.c: Made this class_init - function a bit cleaner. - - * gui/component/e-select-names.c: Tested this and fixed some - obvious errors. - - * gui/component/select-names.glade: The main window shouldn't be - visible by default. - -2000-06-11 Ettore Perazzoli <ettore@helixcode.com> - - * contact-editor/Makefile.am (contact_editor_test_LDADD): Link - with libemiscwidgets.a. - * gui/component/Makefile.am (evolution_addressbook_LDADD): Likewise. - * gui/minicard/Makefile.am (minicard_test_LDADD): Likewise. - (reflow_test_LDADD): Likewise. - (minicard_view_test_LDADD): Likewise. - -2000-06-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-cardlist-model.c: Renamed a bunch of functions - for better readability. - - * gui/component/e-select-names.c, gui/component/e-select-names.h: - This should be a working dialog now. - - * gui/component/select-names.glade: Changed the name & creation - function of the ETable here. - -2000-06-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names.glade, - gui/component/select-names.glade.h: Glade files for Select Names - dialog. - -2000-06-10 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Do e_card_simple_sync and - extract_info more often. - - * gui/component/addressbook.c: Added table printing code. - -2000-06-09 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (factory_fn): Pass NULL - for the new args @create_folder_fn and @remove_folder_fn. - -2000-06-08 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (create_view): Updated for - the new `EvolutionShellComponentCreateViewFn'. Return - `EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE' if @type is not - "contacts". - -2000-06-08 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Bind Save As to save the - current view of the contact as a vcard. - -2000-06-08 Federico Mena Quintero <federico@helixcode.com> - - * contact-editor/e-contact-editor.c (save_card): Doh, sync the - card simple and extract the card info. - -2000-06-08 Federico Mena Quintero <federico@helixcode.com> - - * contact-editor/e-contact-editor.h (EContactEditor): Now this - derives from GtkObject. It follows the same strategy as the - EventEditor in the calendar. - (EContactEditor): Added an is_new_card field so that we can know - whether to add() or commit() the card. - - * contact-editor/e-contact-editor.c (e_contact_editor_get_type): - Derive from GtkObject. - (e_contact_editor_class_init): Likewise. - (e_contact_editor_class_init): Added an "is_new_card" argument. - (e_contact_editor_set_arg): Handle ARG_IS_NEW_CARD. - (e_contact_editor_get_arg): Likewise. - (e_contact_editor_new): Take in an is_new_arg argument and set it - on the object. - (e_contact_editor_init): Load the app widget into the app field of - the EContactEditor structure. Create its UIHandler as well. - (e_contact_editor_class_init): New "add_card", "commit_card", and - "editor_closed" signals. - - * contact-editor/test-editor.c (main): Modified for the new API. - (editor_closed_cb): Tweaked for the new API. - Since this test program does not use Bonobo, it doesn't work, - though. - - * gui/component/addressbook.c (new_contact_cb): Use the new - contact editor API. - (table_double_click): Ditto. - - * gui/minicard/e-minicard-view.c (e_minicard_view_event): Use the - new contact editor API. - - * gui/minicard/e-minicard.c (e_minicard_event): Use the new - contact editor API. - -2000-06-08 Ettore Perazzoli <ettore@helixcode.com> - - * contact-editor/Makefile.am (contact_editor_test_LDADD): Remove - the `$(srcdir)/' prefix from `libecontacteditor.a' because [of - course] the library is built in the build directory, not in the - source directory. - * gui/minicard/Makefile.am (minicard_test_LDADD): Likewise with - `libeminicard.a'. - (minicard_label_test_LDADD): Likewise. - (reflow_test_LDADD): Likewise. - (minicard_view_test_LDADD): Likewise. - -2000-06-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Bind right click on the ETable to - "Save to VCard." - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Made phone/email/address - labels change correctly again. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-component.c: Made - evolution-addressbook shut down when the shell is done with it. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard.c: Made - double click only work on the first button. - -2000-06-01 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard.c: return TRUE if opening a contact - editor so that we don't get a "new dialog" contact editor. - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (new_contact_cb): Use the stock - cancel button for the dialog. - (table_double_click): Likewise. - (find_contact_cb): Likewise. - -2000-05-31 Miguel de Icaza <miguel@helixcode.com> - - * contact-editor/contact-editor.glade: Added accelerators for - the remaining items. - - Add spacing, beautify the dialogs. - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Put the toolbar - into a frame to make it look like standard GNOME toolbars. Also, - set `GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL' so that it does not do - evil things when its moved to the left or the right of the window. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-cardlist-model.c, - gui/component/e-cardlist-model.h: New files for card list. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Fixed a memory leak. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/alphabet.glade: Made the alphabet buttons not - focusable. - - * gui/minicard/e-minicard-view.c: Made the "123" button work. - - * gui/minicard/e-reflow-sorted.c: Made all buttons past the last - letter available work. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/alphabet.glade: Added a bit of space around the - alphabet bar. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/Makefile.am: Added alphabet.glade and - alphabet.glade.h. - - * gui/component/addressbook.c, gui/component/alphabet.glade, - gui/component/alphabet.glade.h: Added an alphabet bar. - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard-view.h, - gui/minicard/e-reflow-sorted.c, gui/minicard/e-reflow-sorted.h: - Added the ability to just to a particular spot in the reflow. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * printing/Makefile.am: Added BONOBO_GNOME_CFLAGS to CPPFLAGS. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-view.c: Made double clicking create a - new card. Set the empty message. - - * gui/minicard/e-minicard.c: Made sorting be case insensitive. - - * gui/minicard/e-reflow-sorted.c, e-reflow.c, e-reflow.h: Added a - message for when the reflow is empty. - - * printing/e-contact-print.c, printing/medbook.ecps: Made the - default printout be full page. Made sorting case insensitive. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book-view-listener.c, - backend/ebook/e-book-view-listener.h, backend/ebook/e-book-view.c, - backend/ebook/e-book-view.h, backend/idl/addressbook.idl, - backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c, - backend/pas/pas-book-factory.c, backend/pas/pas-book-view.c, - backend/pas/pas-book-view.h: Added "sequence_complete" signal. - - * printing/e-contact-print.c: Made printing wait for - "sequence_complete" signal and made it sort. - -2000-05-25 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c, - gui/component/e-addressbook-model.c, - gui/component/e-addressbook-model.h: Added double click to open - contact editor. - -2000-05-25 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Removed some columns. - -2000-05-25 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - New function. - (addressbook_factory): Use it. - - * Makefile.am (evolution_addressbook_LDADD): Link with - `evolution-shell-component.o' from the shell directory. - - * gui/component/addressbook-component.c: New. - * gui/component/addressbook-component.h: New. - -2000-05-23 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Switched printing and gui. - - * backend/ebook/e-book-view-listener.h, - backend/ebook/e-book-view.h, backend/ebook/e-book.h, - backend/ebook/e-card-cursor.h, backend/ebook/e-card-list.h, - backend/ebook/e-card-simple.h, backend/ebook/e-card.h: Fixed the - #defines to work elsewhere in evolution. - - * gui/component/Makefile.am: Added linking to libecontactprint. - - * gui/component/addressbook.c: Added a menu item to print the - current query. - - * printing/Makefile.am: Add linking to libebook and requirements. - Add installation of ecps files. - - * printing/e-contact-print.c, printing/e-contact-print.h: Changed - this to use real data from an EBook. - - * printing/test-print.c: Made this pass NULL, NULL to - e_contact_print_dialog_new so that it will compile. - -2000-05-23 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-save-as.c: Fixed some memory leaks. - -2000-05-23 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/Makefile.am: Added e-contact-editor-save-as.c and - e-contact-editor-save-as.h. - - * contact-editor/e-contact-save-as.c, - contact-editor/e-contact-save-as.h: New files that display a save - as dialog and then save the given card to that file. - - * gui/minicard/e-minicard.c: Call e_contact_save_as in a right - click menu. - -2000-05-19 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/e-addressbook-model.c: Added initialize_value and - value_is_empty callbacks. - -2000-05-19 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Fixed a bug that broke - address field support. - -2000-05-19 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Added support for arbitrary - fields in the contact editor. - -2000-05-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Fixed e_card_name_copy and - e_card_arbitrary_copy to deal correctly with a passed NULL. - - * contact-editor/Makefile.am: Removed imagesdir stuff. - - * contact-editor/arrow.png: Made this transparent. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Renamed some widgets - and added custom widgets for all of the images. - - * contact-editor/e-contact-editor.c: Worked on making this work - decently well with messed up glade files. Cleaned up a lot of code. - -2000-05-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Fixed the code to write out and read in - arbitrary fields. - -2000-05-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h, - backend/ebook/e-card-types.h, backend/ebook/e-card.c, - backend/ebook/e-card.h: Implemented "MAILER" field. Added - arbitrary field support. - - * contact-editor/e-contact-editor-categories.c: Fixed a warning. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Added E_CARD_SIMPLE_FIELD_MAILER. Not implemented yet. - -2000-05-16 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (construct_email_list): convert to use ECardSimple. - (poll_ldap): same. - -2000-05-16 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-book.h: add typedefs for the can_write - functions, and add parameters to pas_book_new. - - * backend/pas/pas-book.c (pas_book_construct): add can_write/can_write_card params. - (pas_book_new): same. - (impl_Evolution_Book_can_write): new function. - (impl_Evolution_Book_can_write_card): same. - (pas_book_get_epv): assign the can_write/can_write_card slots in the epv. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_can_write): new function. - (pas_backend_ldap_can_write_card): same. - (pas_backend_ldap_add_client): add can_write/can_write_card to pas_book_new call. - - * backend/pas/pas-backend-file.c (pas_backend_file_can_write_card): new function, calls can_write. - (pas_backend_file_can_write): same. - (can_write): return TRUE if we can write to the addressbook file. - (pas_backend_file_add_client): add can_write/can_write_card to pas_book_new call. - - * backend/idl/addressbook.idl (Evolution): add can_write and - can_write_card permission requests. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (e_card_get_vcard): Fixed a large memory leak. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (add_list_unique): Fixed another memory - leak. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/pas/pas-backend-file.c, - contact-editor/e-contact-editor.c, ename/e-name-western.c, - gui/component/addressbook.c, gui/minicard/e-minicard-view.c: Fixed - some memory leaks. - - * backend/ebook/e-card.c: Rearranged some code. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed a reference - leak. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed a compile - error. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Got rid of a - memory leak. Rearranged a couple functions. - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard-view.h: - Added some code to stop watching the EBook when the canvas is - destroyed (apparently the canvas is destroyed before our widget is - destroyed.) - -2000-05-14 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Use the correct - policy for resize. - -2000-05-14 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added libeutil for e-card's support - for categories. - - * backend/ebook/e-card-list.c, backend/ebook/e-card-list.h: Added - a function to get the length. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added categories - support (accessible either as "categories" or "category_list".) - - * contact-editor/Makefile.am: Added e-table and all of the - categories files. - - * contact-editor/categories.glade, - contact-editor/categories-strings.h, - contact-editor/e-contact-editor-categories.c, - contact-editor/e-contact-editor-categories.h: - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Rearranged this dialog. - - * contact-editor/e-contact-editor.c: Rearranged dialog a bit. - Added opening of categories dialog. - - * gui/component/Makefile.am: Rearranged libraries so that - libetable would be available for the contact editor categories - dialog. - - * gui/component/addressbook.c: Fix for new ETable resizing. Make - contact editor dialog resizable. - - * gui/minicard/Makefile.am: Added libetable contact editor - categories dialog. - - * gui/minicard/e-minicard.c: Make contact editor dialog resizable. - -2000-05-12 Miguel de Icaza <miguel@gnu.org> - - * contact-editor/fulname.glade: Use accelerators here. - -2000-05-13 Valek Filippov <frob@df.ru> - - * gui/component/ldap-server-dialog.glade: save translatable strings - * gui/component/ldap-server-dialog.glade.h: file with strings - * printing/e-contact-print.glade: save translatable strings - * printing/e-contact-print.glade.h: file with strings - -2000-05-11 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook.c (control_activate): Now that we - depend on recent gnome-libs we can make the toolbar detachable - again. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Make the table view be sorted by - name initially. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-book-factory.c: Send a proper response when you - can't find the ldap URI. - - * gui/component/addressbook.c: Cleaned up the open error dialog a - bit. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Added a dialog for when you can't - open an addressbook. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added e-book-types.h, e-card-pairs.h, - e-card-types.h. - - * backend/pas/Makefile.am: Added pas-backend-ldap.h. - - * contact-editor/Makefile.am: Added a proper EXTRA_DIST section. - Removed some old defines. - - * ename/Makefile.am: Added e-name-western-tables.h. - - * gui/component/Makefile.am: Added e-ldap-server-dialog.h. Added - a proper EXTRA_DIST section. - - * gui/minicard/e-reflow.c: Added a missed cast. - - * printing/Makefile.am: Added a proper EXTRA_DIST section. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Make sure that the canvas - doesn't intercept keyboard focus. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Use new art. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Replaced the Address - button with a label and rearranged the address area a bit. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard.c: Reenable editting. - - * gui/minicard/e-reflow-sorted.c: Make reflow flow on deletion. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Destroy the view object when - leaving the minicard view. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-reflow-sorted.c: Fixed reflow sorting to call - reflow_request when sorting on an item changes. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Make File As change if name or - company are changed pretty much anywhere. - - * gui/minicard/e-minicard.c: Turned off having minicard editing - effect anything since it's so crashy. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-ldap.c: Enabled a couple more fields - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Added a default card to all new - file backends. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c: Rearranged order of things - getting destroyed. - - * gui/minicard/e-minicard-view.c: Rearranged order of things - getting destroyed. Don't set attributes of non-null or destroyed - items. Destroy parent object when destroyed. Maintain ref_count - of items in list. - - * gui/minicard/e-minicard.c: Don't set attributes of non-null - items. - - * gui/minicard/e-reflow-sorted.c: Maintain ref_count of items in - list. - - * gui/minicard/e-reflow.c: Maintain ref_count of items in list. - Destroy parent object when destroyed. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed some indentation. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Changed Email to - Primary Email. - - * contact-editor/e-contact-editor.c: Added checkmarks to indicate - if data exists in the pull down menus for the phone, address, and - email fields. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed the string duplication - problem. Fixed the business/home address string mix up. - - * gui/component/addressbook.c: Made the minicard view the default - view. - -2000-05-08 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed this up a bit. Syncing - should work better now. - -2000-05-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard.c, - gui/minicard/e-minicard.h, gui/minicard/e-reflow-sorted.c, - gui/minicard/e-reflow-sorted.h: Made a minimal number of things be - destroyed and recreated when updating a field. - -2000-05-07 <toshok@the-dot-in.helixcode.com> - - * gui/minicard/e-minicard.c (remodel): make sure to free the - return value of e_card_simple_get. - - * gui/component/addressbook.c (teardown_table_view): destroy the - ECardSimple here, plug memory leak. - (create_table_view): use view->simple so we can destroy the - ECardSimple later on. - -2000-05-07 Chris Toshok <toshok@helixcode.com> - - * ename/e-name-western.c (e_name_western_extract_middle): comment - function, and fix an ABR. - -2000-05-07 Chris Toshok <toshok@helixcode.com> - - * ename/e-name-western.c (e_name_western_cleanup_string): comment - function, and fix an ABR. - -2000-05-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard.c: Added saving in minicard view. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Fixed an off by 2 error. - -2000-05-07 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (set_prop): don't create a new - ebook. instead, unload the current uri (if there is one) and load - the new one. - (addressbook_factory): create the ebook once. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c: Replaced some model_changed - calls with row_inserted calls. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c: - Removed some code that was notifying too many clients at the wrong - times. - - * gui/component/addressbook.c: Set view->book. Unreffed - view->book. Unreffed the model instead of destroying it. Removed - the /tmp/test.db stuff. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Make the addressbook create the - correct file uri. Added a default query. Initialize view->model - and view->view to NULL. - - * gui/component/e-addressbook-model.c, - gui/minicard/e-minicard-view.c: Only call get_book_view if both - book and query and non-null. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (control_deactivate): remove the - separator and toggle view items as well. - (toggle_view_as_cb): callback for the "/View/Toggle View" menu - item. - (get_query): getter for the query string that takes into account - the two view types. - (set_query): setter for the query string that takes into account - the two view types. - (set_book): setter for the EBook type - not really a setter, since - the book is kept in the AddressbookView, but this method actually - sets the "book" property on the current view. - (find_contact_cb): make use of get/set_query - (search_entry_activated): make use of set_query. - (control_activate): add a menu separator and an item to toggle - between view types. - (book_open_cb): make use of set_book. - (ebook_create): no longer needs to return the EBook, since we set - the book field in our view. - (teardown_minicard_view): destructor function for the minicard - specific ui. - (create_minicard_view): constructor function for the minicard - specific ui. - (teardown_table_view): destructor function for the e-table - specific ui. - (create_table_view): constructor function for the e-table specific - ui. - (change_view_type): destroy the old and create the new view ui, - change the label of the Toggle View menu item, and reset the book - and query on the new view type. - (addressbook_factory): create an all-encompassing vbox that the - view uses to create the bonobo control, which contains 1 widget - per ui specific view (the e-table in the table case, and another - vbox in the minicard case.) use change_view_type to create the - initial view. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book.c: Made a NULL callback just mean to not - call back. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Reordered fields. Added a get_const function to get a constant - string that persists until the simple is destroyed. - - * gui/component/Makefile.am: Added e-addressbook-model.c and - e-addressbook-model.h and all of the libraries and includes that - they are dependent on. - - * gui/component/addressbook-factory.c: Initialize e cursors. - - * gui/component/addressbook.c: Added inactive code to display an - ETable view of the addressbook. - - * gui/component/e-addressbook-model.c, - gui/component/e-addressbook-model.h: New files to implement an - ETable model with a EBook back end. - -2000-05-06 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Mostly finished ECardSimple. - - * contact-editor/e-contact-editor.c: Changed this to match with - some of the changes to ECardSimple. - - * gui/component/addressbook.c: Changed this to look for - "addressbook.db" in the given directory if it doesn't find the - file "uri". - - * gui/minicard/e-minicard.c, gui/minicard/e-minicard.h: Changed - this to use ECardSimple. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * gui/component/.cvsignore: ignore evolution-addressbook.pure - - * gui/component/Makefile.am: add support for generating - evolution-addressbook.pure. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_load_uri): if a - port isn't specified in the uri default to 389. - -2000-05-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Made this take a uri through its - property bag. - -2000-05-05 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added e-card-simple.c and - e-card-simple.h. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - New card wrapper class to simplify things. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Changed e-contact-editor to use - ECardSimple a bit. - -2000-05-03 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (control_deactivate): #ifdef - HAVE_LDAP the ldap specific stuff. - (null_cb): same. - (control_activate): same. - -2000-05-02 Ettore Perazzoli <ettore@helixcode.com> - - * backend/ebook/Makefile.am (INCLUDES): Add - `-I$(top_srcdir)/addressbook/ename'. - -2000-05-02 Matt Loper <matt@helixcode.com> - - * demo/Makefile.am: set G_LOG_DOMAIN. - * printing/Makefile.am: same. - -2000-05-01 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-book-factory.c: Add back in the - CORBA_Object_release. - - * backend/pas/pas-book.c: Properly duplicate and release the - listener passed to us. - -2000-05-01 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c: - Made uri slightly better managed. - - * backend/pas/pas-book-factory.c - (pas_book_factory_process_request): Remove this - CORBA_Object_release that causes things not to work. This is just - a temporary fix until we figure out what's actually wrong. - - * backend/pas/pas-book.c: Fixed a copy and paste error in a warning. - -2000-05-01 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Switched the subdirs order since backend depends on - ename. - -2000-05-01 Larry Ewing <lewing@helixcode.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_remove_client): - fix a typo in the for loop. - -2000-05-01 Michael Meeks <michael@helixcode.com> - - * backend/pas/pas-book-factory.c: include gtk. - -2000-04-30 Federico Mena Quintero <federico@helixcode.com> - - * backend/ebook/e-book-types.h (EBookStatus): Added new status - values for the IDL stuff. - - * backend/pas/pas-book-factory.h (PASBookFactoryClass): New - "last_book_gone" signal. - - * backend/pas/pas-book-factory.c - (pas_book_factory_launch_backend): Better error handling. - (pas_book_factory_process_queue): Let - pas_book_factory_process_request() free the request. - (pas_book_factory_process_request): Free the request here. - Perform better error handling. - (free_active_server_map_entry): Free an active server map entry; - free the URI key and unref the backend value. This function was - renamed; the old one was trying to CORBA_Object_unref() a GTK+ - object! - (remove_backends_entry): Free a backend table entry; free the URI - key. - (backend_last_client_gone_cb): Remove the backend from the active - server map and emit the "last_book_gone" signal if appropriate. - (pas_book_factory_get_n_backends): New function to query the - number of running backends in an addressbook factory. - - * backend/idl/addressbook.idl (BookListener::CallStatus): Added a - ProtocolNotSupported code. This is for when the addressbook - factory cannot find a provider for the requested URI. - - * backend/pas/pas-backend.h (PASBackendClass): New - "last_client_gone" signal. - (PASBackendClass): New get_uri virtual method. - - * backend/pas/pas-backend.c (pas_backend_load_uri): Return a - gboolean success code. - (pas_backend_add_client): Return a gboolean success code. - (pas_backend_last_client_gone): New function used by backend - implementations to notify upwards when the backend's last client - is destroyed. - (pas_backend_get_uri): New function to get the URI of a backend. - - * backend/pas/pas-backend-file.c (pas_backend_file_add_client): - Pass the backend as the closure data to the "destroy" handler of - the book. We cannot call pas_book_get_backend() in the callback - since the book's private data has already been destroyed when the - callback is invoked. Alternatively, we could move the private - data destruction step to the book's ::finalize() method. - (pas_backend_file_book_destroy_cb): Get the backend from the - callback's data, not from the book. - (pas_backend_file_remove_client): Remove the book from the list of - clients. When all clients go away, call - pas_backend_last_client_gone(). - (PASBackendFilePrivate): Added an uri field. - (pas_backend_file_get_uri): Implement the get_uri method. - (pas_backend_file_load_uri): Return a gboolean success code. - Also, store the URI in the private structure. - (pas_backend_file_add_client): Return a gboolean success code. - Also, call pas_backend_last_client_gone() if appropriate. - (pas_backend_file_destroy): Free the bf->priv->uri. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): - Pass the backend as the closure data to the "destroy" handler of - the book. See above for rationale. - (pas_backend_ldap_book_destroy_cb): Get the backend from the - callback's data. - (pas_backend_ldap_remove_client): Remove the book from the list of - clients. When all clients go away, call - pas_backend_last_client_gone(). - (pas_backend_ldap_load_uri): Return a gboolean success code. - (pas_backend_ldap_add_client): Return a gboolean success code. - Also, call pas_backend_last_client_gone() if appropriate. - (PASBackendLDAPPrivate): New uri field. - (pas_backend_ldap_get_uri): Implement the get_uri method. - (pas_backend_ldap_load_uri): Store the uri in the private - structure. - (pas_backend_ldap_destroy): Free the bl->priv->uri. - -2000-04-30 Chris Toshok <toshok@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): added - e-ldap-server-dialog.c - (glade_DATA): added ldap-server-dialog.glade - - * gui/component/ldap-server-dialog.glade: new file. - - * gui/component/e-ldap-server-dialog.h: new file. - - * gui/component/e-ldap-server-dialog.c: new file, contains logic - associated with ldap server dialog. - - * gui/component/addressbook.c (control_deactivate): remove the - directory server menu item. - (null_cb): do nothing callback for e_book_load_uri call. should - change to (at the very least) pop up a dialog if there was an - error. - (new_server_cb): new function - really just switches to a - particular ldap server, since the information isn't saved - anywhere. - (control_activate): add directory server menu item. - -2000-04-30 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-book.c (e_book_load_uri): create the book - listener here, since it's destroyed in unload_uri. - (e_book_construct): remove the book listener construction here. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/.cvsignore: Added load-pine-addressbook. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor.c, gui/minicard/e-minicard.c: Made - some fields invisible that were visible before. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Make file as not have the : after it if - it's empty. If there's no name, or file_as, fill in these fields - with defaults based on full_name or name respectively. - - * backend/ebook/load-pine-addressbook.c: New file to do import of - pine .addressbook files. - - * backend/pas/pas-backend-file.c: Made empty fields act as the - empty string for searches. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Made the File As field update - properly as you edit the name and company fields. Added the pull - down list of File As choices. Made sure that all fields will - be set to NULL if they are deleted to the empty string. - - * gui/minicard/e-minicard.c: Use the File As field instead of the - Full Name field for the header. Make identical compares on the - File As field do a compare on the uid. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-fullname.c, - contact-editor/fullname.glade: Fixed a string mismatch. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added ename includes and libs. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added - e_card_name_from_string. Added header for - e_card_delivery_address_from_string, even though it's not - implemented yet. - - * contact-editor/Makefile.am: Removed the ename includes since we - no longer use ename directly here. - - * contact-editor/e-contact-editor.c: Fixed this to properly save - the address labels displayed. Updated this to use the function - e_card_name_from_string instead of doing it by hand. - - * contact-editor/fullname-strings.h, - contact-editor/fullname.glade: Deleted an unused field. Changed - the set of prefixes and suffixes. - -2000-04-30 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_ensure_connected): add support for a rootdn in - the uri. - (pas_backend_ldap_build_all_cards_list): make use of the rootdn in - the call to ldap_search_s. - (pas_backend_ldap_search): same. - (pas_backend_ldap_load_uri): get the rootdn out of the passed in uri. - -2000-04-29 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added - e_card_phone_new e_card_delivery_address_new, - e_card_delivery_address_to_string, e_card_name_copy, - e_card_name_new, e_card_name_to_string, and made e_card_name_free - public. Removed some unused code. - - * backend/pas/pas-backend-file.c: Fixed a warning. - - * contact-editor/Makefile.am: Added e-contact-editor-fullname.[ch] - and fullname.glade. Added e-name libs and includes. - - * contact-editor/e-contact-editor-fullname.c, - contact-editor/e-contact-editor-fullname.h, - contact-editor/fullname-strings.h, contact-editor/fullname.glade: - New dialog for editing the fields of a name separately. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Create an - EContactEditorFullname when you click on the Full Name button. - Maintain a parsed name at all times. - - * gui/component/Makefile.am, gui/minicard/Makefile.am: Added - e-name libs. - -2000-04-28 Larry Ewing <lewing@helixcode.com> - - * backend/pas/pas-book-factory.c (register_factory): fix the - `USING_OAF' changes so that they work for when we are not using - oaf. - -2000-04-27 Ettore Perazzoli <ettore@helixcode.com> - - * ename/Makefile.am - (gnome_libs): Use `BONOBO_GNOME_LIBS'. - (INCLUDES): Add `-I$(srcdir)/..'. - - * backend/pas/pas-book-factory.c - (register_factory): New function to register the factory. - Implementation different according to `USING_OAF'. - (pas_book_factory_activate): Use `register_factory()'. - - * gui/component/addressbook.c: New #define `CONTROL_FACTORY_ID', - varying depending on whether we are `USING_OAF'. - (addressbook_factory_init): Use `CONTROL_FACTORY_ID'. - - * backend/ebook/test-client.c (init_corba): New function, - implemented differently according to the `USING_OAF' #define. - - * backend/ebook/e-book.c: New #define `CARDSERVER_OAF_ID'. - (e_book_construct): Work with OAF #if `USING_OAF'. - - * backend/ebook/Makefile.am (gnome_libs): Removed. - (corbadir): Removed. - (ebook_libs): Removed. - (test_client_LDADD): Just add `libebook.la'. - (test_card_LDADD): Likewise. - (test_client_list_LDADD): Likewise. - - * gui/component/addressbook-factory.c - (init_corba): New helper function, implemented differently - according to `USING_OAF'. - (main): Call `init_corba()'. - -2000-04-27 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added file as, - office, manager, assistant, spouse, and anniversary fields. These - all use "X-EVOLUTION-" fields in the VCards. - - * backend/pas/pas-backend-file.c: Added all the new fields (except - anniversary) to the list of fields. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Fixed some misnamed - fields and fixed the placement of the comments field. - - * contact-editor/e-contact-editor.c: Made the newly added fields - display properly. - - * Makefile.am: Added ename. - - * ename/e-name-western.h, ename/test-ename-western-gtk.c, - ename/test-ename-western.c: Fixed up some #includes. - - * ename/.cvsignore: Added .cvsignore. - -2000-04-26 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-types.h, backend/ebook/e-card.c, - backend/ebook/e-card.h: Added an address label field. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Got rid of some unused - fields. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Added the address label field. - Load only. Editing these fields seems to mess things up. - -2000-04-26 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Added proper handling of the - email field. - -2000-04-26 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-types.h, backend/ebook/e-card.c, - gui/minicard/e-minicard.c: Prefixed the ADDR_ flags. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Edited the glade file. - Removed all the fields that we don't use. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Made the phone fields work - properly. The address and email fields are temporarily turned off - until they can be made to work as the phone fields do. - -2000-04-25 Ettore Perazzoli <ettore@helixcode.com> - - * gui/minicard/Makefile.am (INCLUDES): Use - `$(BONOBO_GNOME_CFLAGS)'. - - * backend/pas/Makefile.am (idl_flags): Add `-I $(datadir)/idl' to - pick up IDL files in the installation prefix as well. - (INCLUDES): Use `$(BONOBO_GNOME_CFLAGS)'. - - * backend/ebook/Makefile.am (ORBIT_IDL): Use `-I $(datadir)/idl' - to get the IDLs from the installation prefix as well. - (INCLUDES): Add `$(BONOBO_GNOME_CFLAGS)'. - (test_client_LDADD): Use `$(BONOBO_GNOME_LIBS)' instead of - hardcoding `-lbonobo'! Also get rid of some other useless flags, - as `$(BONOBO_GNOME_LIBS)' really has all what we need. - (test_client_list_LDADD): Likewise. - (test_card_LDADD): Likewise. - -2000-04-18 Federico Mena Quintero <federico@helixcode.com> - - * gui/minicard/Makefile.am (INCLUDES): Use "e-minicard" as the log - domain. - - * gui/component/Makefile.am (INCLUDES): Use - "evolution-addressbook" as the log domain. - - * backend/pas/Makefile.am: Build libpas.a, not a shared library. - Do not install any header files. - (INCLUDES): Remove spurious include paths. - - * backend/pas/*.[ch]: Fix includes. - - * backend/ebook/Makefile.am: Do not install the test programs. - Fixed some include weirdness. - - * backend/ebook/*.[ch]: Fix includes. - - * contact-editor/Makefile.am (INCLUDES): Set the log domain to - "contact-editor". - (INCLUDES): Fix. - - * contact-editor/*.[ch]: Fix includes. - - * gui/minicard/*.[ch]: Fix includes. - - * ChangeLog: Started a ChangeLog here. diff --git a/addressbook/Makefile.am b/addressbook/Makefile.am deleted file mode 100644 index cc89ee5aeb..0000000000 --- a/addressbook/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -if ENABLE_PILOT_CONDUITS -CONDUIT_SUBDIR=conduit -endif - -SUBDIRS = \ - backend printing contact-editor gui $(CONDUIT_SUBDIR) - diff --git a/addressbook/backend/.cvsignore b/addressbook/backend/.cvsignore deleted file mode 100644 index 09980ae6ba..0000000000 --- a/addressbook/backend/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la diff --git a/addressbook/backend/Makefile.am b/addressbook/backend/Makefile.am deleted file mode 100644 index b2807b2480..0000000000 --- a/addressbook/backend/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = idl ebook pas diff --git a/addressbook/backend/ebook/.cvsignore b/addressbook/backend/ebook/.cvsignore deleted file mode 100644 index 9d1d6f19ae..0000000000 --- a/addressbook/backend/ebook/.cvsignore +++ /dev/null @@ -1,22 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -addressbook-stubs.c -addressbook-skels.c -addressbook-common.c -addressbook.h -test-card -test-client -test-client-list -load-pine-addressbook -load-gnomecard-addressbook -evolution-gnomecard-importer -Evolution-Composer-stubs.c -Evolution-Composer-skels.c -Evolution-Composer-common.c -Evolution-Composer.h -GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf diff --git a/addressbook/backend/ebook/GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf.in b/addressbook/backend/ebook/GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf.in deleted file mode 100644 index 69dfa90871..0000000000 --- a/addressbook/backend/ebook/GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf.in +++ /dev/null @@ -1,29 +0,0 @@ -<oaf_info> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_GnomeCard_ImporterFactory" - type="exe" - location="evolution-gnomecard-importer"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Factory to import GnomeCard files into Evolution."/> -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_GnomeCard_Importer" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_GnomeCard_ImporterFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/Importer:1.0"/> - </oaf_attribute> - - <oaf_attribute name="evolution:menu-name" type="string" - value="GnomeCard (.vcf, .gcrd)"/> - <oaf_attribute name="description" type="string" - _value="Imports GnomeCard files into Evolution."/> -</oaf_server> - -</oaf_info> diff --git a/addressbook/backend/ebook/Makefile.am b/addressbook/backend/ebook/Makefile.am deleted file mode 100644 index c729d71624..0000000000 --- a/addressbook/backend/ebook/Makefile.am +++ /dev/null @@ -1,164 +0,0 @@ -noinst_PROGRAMS = test-card test-client test-client-list - -bin_PROGRAMS = evolution-gnomecard-importer \ - load-pine-addressbook load-gnomecard-addressbook - -CORBA_SOURCE = \ - addressbook.h \ - addressbook-common.c \ - addressbook-stubs.c \ - addressbook-skels.c \ - Evolution-Composer.h \ - Evolution-Composer-common.c \ - Evolution-Composer-skels.c \ - Evolution-Composer-stubs.c - -idls = \ - $(srcdir)/../idl/addressbook.idl \ - $(srcdir)/../../../composer/Evolution-Composer.idl - -idl_flags = `$(GNOME_CONFIG) --cflags idl` -I $(datadir)/idl - -$(CORBA_SOURCE): $(idls) - $(ORBIT_IDL) -I $(srcdir) $(idls) $(idl_flags) - -INCLUDES = \ - -DGNOMELOCALEDIR=\""$(localedir)"\" \ - -DG_LOG_DOMAIN=\"EBook\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_srcdir)/addressbook/ename \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_builddir)/addressbook/ename \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/shell \ - $(BONOBO_GNOME_CFLAGS) \ - $(EXTRA_GNOME_CFLAGS) - -lib_LTLIBRARIES = libebook.la - -libebook_la_SOURCES = \ - $(CORBA_SOURCE) \ - e-book-listener.c \ - e-book-view-listener.c \ - e-book-view.c \ - e-book.c \ - e-book-util.c \ - e-card-cursor.c \ - e-card-simple.c \ - e-card.c \ - e-destination.c - -libebookincludedir = $(includedir)/evolution/ebook - -libebookinclude_HEADERS = \ - e-book-listener.h \ - e-book-types.h \ - e-book-view-listener.h \ - e-book-view.h \ - e-book.h \ - e-book-util.h \ - e-card-cursor.h \ - e-card-pairs.h \ - e-card-simple.h \ - e-card-types.h \ - e-card.h \ - e-destination.h - - -# -# make a static library for use by addressbook's conduit's shared library -# -noinst_LTLIBRARIES = libebook-static.la -libebook_static_la_SOURCES = $(libebook_la_SOURCES) -libebook_static_la_LDFLAGS = --all-static - - -test_client_SOURCES = \ - test-client.c - -test_client_LDADD = \ - libebook.la \ - $(BONOBO_GNOME_LIBS) \ - $(EXTRA_GNOME_LIBS) \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/e-util/libeutil.la - -test_client_list_SOURCES = \ - test-client-list.c - -test_client_list_LDADD = \ - libebook.la \ - $(BONOBO_GNOME_LIBS) \ - $(EXTRA_GNOME_LIBS) \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/e-util/libeutil.la - -test_card_SOURCES = \ - test-card.c - -test_card_LDADD = \ - libebook.la \ - $(BONOBO_GNOME_LIBS) \ - $(EXTRA_GNOME_LIBS) \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/e-util/libeutil.la - -evolution_gnomecard_importer_SOURCES = \ - evolution-gnomecard-importer.c -evolution_gnomecard_importer_LDADD = \ - libebook.la \ - $(BONOBO_GNOME_LIBS) \ - $(EXTRA_GNOME_LIBS) \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/e-util/libeutil.la \ - $(top_builddir)/shell/importer/libevolution-importer.la - -load_pine_addressbook_SOURCES = \ - load-pine-addressbook.c - -load_pine_addressbook_LDADD = \ - libebook.la \ - $(BONOBO_GNOME_LIBS) \ - $(EXTRA_GNOME_LIBS) \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/e-util/libeutil.la - - -load_gnomecard_addressbook_SOURCES = \ - load-gnomecard-addressbook.c - -load_gnomecard_addressbook_LDADD = \ - libebook.la \ - $(BONOBO_GNOME_LIBS) \ - $(EXTRA_GNOME_LIBS) \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/e-util/libeutil.la - - -BUILT_SOURCES = $(CORBA_SOURCE) -CLEANFILES += $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - -oafdir = $(datadir)/oaf -oaf_in_files = GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf.in -oaf_DATA = $(oaf_in_files:.oaf.in=.oaf) - -@XML_I18N_MERGE_OAF_RULE@ - -# add this back when you add the file to the archive ;) -# GNOME_Evolution_Addressbook_Pine_Importer.oafinfo - -EXTRA_DIST = $(oaf_in_files) $(oaf_DATA) - - - - diff --git a/addressbook/backend/ebook/TODO b/addressbook/backend/ebook/TODO deleted file mode 100644 index a69703cd92..0000000000 --- a/addressbook/backend/ebook/TODO +++ /dev/null @@ -1,2 +0,0 @@ -* Make sure open_book_progress does not use the EBook op queue; make - sure it works. diff --git a/addressbook/backend/ebook/e-book-listener.c b/addressbook/backend/ebook/e-book-listener.c deleted file mode 100644 index ee4107190b..0000000000 --- a/addressbook/backend/ebook/e-book-listener.c +++ /dev/null @@ -1,712 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Exports the BookListener interface. Maintains a queue of messages - * which come in on the interface. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <gtk/gtksignal.h> -#include "e-book-listener.h" - -static EBookStatus e_book_listener_convert_status (GNOME_Evolution_Addressbook_BookListener_CallStatus status); - -enum { - RESPONSES_QUEUED, - LAST_SIGNAL -}; - -static guint e_book_listener_signals [LAST_SIGNAL]; - -static BonoboObjectClass *e_book_listener_parent_class; -POA_GNOME_Evolution_Addressbook_BookListener__vepv e_book_listener_vepv; - -struct _EBookListenerPrivate { - GList *response_queue; - gint idle_id; -}; - -static gboolean -e_book_listener_check_queue (EBookListener *listener) -{ - if (listener->priv->response_queue != NULL) { - gtk_signal_emit (GTK_OBJECT (listener), - e_book_listener_signals [RESPONSES_QUEUED]); - } - - if (listener->priv->response_queue == NULL) { - listener->priv->idle_id = 0; - return FALSE; - } - - return TRUE; -} - -static void -e_book_listener_queue_response (EBookListener *listener, - EBookListenerResponse *response) -{ - listener->priv->response_queue = - g_list_append (listener->priv->response_queue, - response); - - if (listener->priv->idle_id == 0) { - listener->priv->idle_id = g_idle_add ( - (GSourceFunc) e_book_listener_check_queue, listener); - } -} - -/* Add, Remove, Modify */ -static void -e_book_listener_queue_generic_response (EBookListener *listener, - EBookListenerOperation op, - EBookStatus status) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = op; - resp->status = status; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_open_response (EBookListener *listener, - EBookStatus status, - GNOME_Evolution_Addressbook_Book book) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = OpenBookResponse; - resp->status = status; - resp->book = book; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_open_progress (EBookListener *listener, - const char *msg, - short percent) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = OpenProgressEvent; - resp->msg = g_strdup (msg); - resp->percent = percent; - - e_book_listener_queue_response (listener, resp); -} - - -static void -e_book_listener_queue_create_card_response (EBookListener *listener, - EBookStatus status, - const char *id) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = CreateCardResponse; - resp->status = status; - resp->id = g_strdup (id); - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_get_cursor_response (EBookListener *listener, - EBookStatus status, - GNOME_Evolution_Addressbook_CardCursor cursor) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = GetCursorResponse; - resp->status = status; - resp->cursor = cursor; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_get_view_response (EBookListener *listener, - EBookStatus status, - GNOME_Evolution_Addressbook_BookView book_view) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = GetBookViewResponse; - resp->status = status; - resp->book_view = book_view; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_get_changes_response (EBookListener *listener, - EBookStatus status, - GNOME_Evolution_Addressbook_BookView book_view) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = GetChangesResponse; - resp->status = status; - resp->book_view = book_view; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_link_status (EBookListener *listener, - gboolean connected) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = LinkStatusEvent; - resp->connected = connected; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_writable_status (EBookListener *listener, - gboolean writable) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = WritableStatusEvent; - resp->writable = writable; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_authentication_response (EBookListener *listener, - EBookStatus status) -{ - EBookListenerResponse *resp; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = AuthenticationResponse; - resp->status = status; - - e_book_listener_queue_response (listener, resp); -} - -static void -e_book_listener_queue_get_supported_fields_response (EBookListener *listener, - EBookStatus status, - const GNOME_Evolution_Addressbook_stringlist *fields) -{ - EBookListenerResponse *resp; - int i; - - resp = g_new0 (EBookListenerResponse, 1); - - resp->op = GetSupportedFieldsResponse; - resp->status = status; - resp->fields = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL); - - for (i = 0; i < fields->_length; i ++) { - e_list_append (resp->fields, g_strdup (fields->_buffer[i])); - } - - e_book_listener_queue_response (listener, resp); -} - -static void -impl_BookListener_respond_create_card (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const GNOME_Evolution_Addressbook_CardId id, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_create_card_response ( - listener, - e_book_listener_convert_status (status), - id); -} - -static void -impl_BookListener_respond_remove_card (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_generic_response ( - listener, RemoveCardResponse, - e_book_listener_convert_status (status)); -} - -static void -impl_BookListener_respond_modify_card (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_generic_response ( - listener, ModifyCardResponse, - e_book_listener_convert_status (status)); -} - -static void -impl_BookListener_respond_get_cursor (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const GNOME_Evolution_Addressbook_CardCursor cursor, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - GNOME_Evolution_Addressbook_CardCursor cursor_copy; - - cursor_copy = bonobo_object_dup_ref (cursor, ev); - - if (ev->_major != CORBA_NO_EXCEPTION) { - g_warning ("EBookListener: Exception while duplicating CardCursor!\n"); - return; - } - - e_book_listener_queue_get_cursor_response ( - listener, - e_book_listener_convert_status (status), - cursor_copy); -} - -static void -impl_BookListener_respond_get_view (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const GNOME_Evolution_Addressbook_BookView book_view, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - GNOME_Evolution_Addressbook_BookView book_view_copy; - - book_view_copy = bonobo_object_dup_ref (book_view, ev); - - if (ev->_major != CORBA_NO_EXCEPTION) { - g_warning ("EBookListener: Exception while duplicating BookView.\n"); - return; - } - - e_book_listener_queue_get_view_response ( - listener, - e_book_listener_convert_status (status), - book_view_copy); -} - -static void -impl_BookListener_respond_get_changes (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const GNOME_Evolution_Addressbook_BookView book_view, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - GNOME_Evolution_Addressbook_BookView book_view_copy; - - book_view_copy = bonobo_object_dup_ref (book_view, ev); - - if (ev->_major != CORBA_NO_EXCEPTION) { - g_warning ("EBookListener: Exception while duplicating BookView.\n"); - return; - } - - e_book_listener_queue_get_changes_response ( - listener, - e_book_listener_convert_status (status), - book_view_copy); -} - -static void -impl_BookListener_respond_open_book (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const GNOME_Evolution_Addressbook_Book book, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - GNOME_Evolution_Addressbook_Book book_copy; - - book_copy = bonobo_object_dup_ref (book, ev); - - if (ev->_major != CORBA_NO_EXCEPTION) { - g_warning ("EBookListener: Exception while duplicating Book!\n"); - return; - } - - e_book_listener_queue_open_response ( - listener, - e_book_listener_convert_status (status), - book_copy); -} - -static void -impl_BookListener_report_open_book_progress (PortableServer_Servant servant, - const CORBA_char *status_message, - const CORBA_short percent, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_open_progress ( - listener, status_message, percent); -} - -static void -impl_BookListener_respond_authentication_result (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_authentication_response ( - listener, status); -} - -static void -impl_BookListener_response_get_supported_fields (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const GNOME_Evolution_Addressbook_stringlist *fields, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_get_supported_fields_response ( - listener, status, fields); -} - -static void -impl_BookListener_report_connection_status (PortableServer_Servant servant, - const CORBA_boolean connected, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_link_status ( - listener, connected); -} - -static void -impl_BookListener_report_writable (PortableServer_Servant servant, - const CORBA_boolean writable, - CORBA_Environment *ev) -{ - EBookListener *listener = E_BOOK_LISTENER (bonobo_object_from_servant (servant)); - - e_book_listener_queue_writable_status (listener, writable); -} - -/** - * e_book_listener_check_pending: - * @listener: the #EBookListener - * - * Returns: the number of items on the response queue, - * or -1 if the @listener is isn't an #EBookListener. - */ -int -e_book_listener_check_pending (EBookListener *listener) -{ - g_return_val_if_fail (listener != NULL, -1); - g_return_val_if_fail (E_IS_BOOK_LISTENER (listener), -1); - - return g_list_length (listener->priv->response_queue); -} - -/** - * e_book_listener_pop_response: - * @listener: the #EBookListener for which a request is to be popped - * - * Returns: an #EBookListenerResponse if there are responses on the - * queue to be returned; %NULL if there aren't, or if the @listener - * isn't an EBookListener. - */ -EBookListenerResponse * -e_book_listener_pop_response (EBookListener *listener) -{ - EBookListenerResponse *resp; - GList *popped; - - g_return_val_if_fail (listener != NULL, NULL); - g_return_val_if_fail (E_IS_BOOK_LISTENER (listener), NULL); - - if (listener->priv->response_queue == NULL) - return NULL; - - resp = listener->priv->response_queue->data; - - popped = listener->priv->response_queue; - listener->priv->response_queue = - g_list_remove_link (listener->priv->response_queue, - listener->priv->response_queue); - g_list_free_1 (popped); - - return resp; -} - -static EBookStatus -e_book_listener_convert_status (const GNOME_Evolution_Addressbook_BookListener_CallStatus status) -{ - switch (status) { - case GNOME_Evolution_Addressbook_BookListener_Success: - return E_BOOK_STATUS_SUCCESS; - case GNOME_Evolution_Addressbook_BookListener_RepositoryOffline: - return E_BOOK_STATUS_REPOSITORY_OFFLINE; - case GNOME_Evolution_Addressbook_BookListener_PermissionDenied: - return E_BOOK_STATUS_PERMISSION_DENIED; - case GNOME_Evolution_Addressbook_BookListener_CardNotFound: - return E_BOOK_STATUS_CARD_NOT_FOUND; - case GNOME_Evolution_Addressbook_BookListener_ProtocolNotSupported: - return E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED; - case GNOME_Evolution_Addressbook_BookListener_OtherError: - return E_BOOK_STATUS_OTHER_ERROR; - default: - g_warning ("e_book_listener_convert_status: Unknown status " - "from card server: %d\n", (int) status); - return E_BOOK_STATUS_UNKNOWN; - - } -} - -static EBookListener * -e_book_listener_construct (EBookListener *listener) -{ - POA_GNOME_Evolution_Addressbook_BookListener *servant; - CORBA_Environment ev; - CORBA_Object obj; - - g_assert (listener != NULL); - g_assert (E_IS_BOOK_LISTENER (listener)); - - servant = (POA_GNOME_Evolution_Addressbook_BookListener *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &e_book_listener_vepv; - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_Addressbook_BookListener__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - - return NULL; - } - - CORBA_exception_free (&ev); - - obj = bonobo_object_activate_servant (BONOBO_OBJECT (listener), servant); - if (obj == CORBA_OBJECT_NIL) { - g_free (servant); - - return NULL; - } - - bonobo_object_construct (BONOBO_OBJECT (listener), obj); - - return listener; -} - -/** - * e_book_listener_new: - * @book: the #EBook for which the listener is to be bound - * - * Creates and returns a new #EBookListener for the book. - * - * Returns: a new #EBookListener - */ -EBookListener * -e_book_listener_new () -{ - EBookListener *listener; - EBookListener *retval; - - listener = gtk_type_new (E_BOOK_LISTENER_TYPE); - - retval = e_book_listener_construct (listener); - - if (retval == NULL) { - g_warning ("e_book_listener_new: Error constructing " - "EBookListener!\n"); - gtk_object_unref (GTK_OBJECT (listener)); - return NULL; - } - - return retval; -} - -static void -e_book_listener_init (EBookListener *listener) -{ - listener->priv = g_new0 (EBookListenerPrivate, 1); -} - -static void -e_book_listener_destroy (GtkObject *object) -{ - EBookListener *listener = E_BOOK_LISTENER (object); - GList *l; - - for (l = listener->priv->response_queue; l != NULL; l = l->next) { - EBookListenerResponse *resp = l->data; - - g_free (resp->msg); - g_free (resp->id); - - if (resp->book != CORBA_OBJECT_NIL) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - bonobo_object_release_unref (resp->book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_listener_destroy: " - "Exception destroying book " - "in response queue!\n"); - } - - CORBA_exception_free (&ev); - } - - if (resp->cursor != CORBA_OBJECT_NIL) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - bonobo_object_release_unref (resp->cursor, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_listener_destroy: " - "Exception destroying cursor " - "in response queue!\n"); - } - - CORBA_exception_free (&ev); - } - - if (resp->book_view != CORBA_OBJECT_NIL) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - bonobo_object_release_unref (resp->book_view, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_listener_destroy: " - "Exception destroying book_view " - "in response queue!\n"); - } - - CORBA_exception_free (&ev); - } - - g_free (resp); - } - g_list_free (listener->priv->response_queue); - - g_free (listener->priv); - - GTK_OBJECT_CLASS (e_book_listener_parent_class)->destroy (object); -} - -POA_GNOME_Evolution_Addressbook_BookListener__epv * -e_book_listener_get_epv (void) -{ - POA_GNOME_Evolution_Addressbook_BookListener__epv *epv; - - epv = g_new0 (POA_GNOME_Evolution_Addressbook_BookListener__epv, 1); - - epv->notifyOpenBookProgress = impl_BookListener_report_open_book_progress; - epv->notifyBookOpened = impl_BookListener_respond_open_book; - - epv->notifyCardCreated = impl_BookListener_respond_create_card; - epv->notifyCardRemoved = impl_BookListener_respond_remove_card; - epv->notifyCardModified = impl_BookListener_respond_modify_card; - - epv->notifyAuthenticationResult = impl_BookListener_respond_authentication_result; - epv->notifySupportedFields = impl_BookListener_response_get_supported_fields; - - epv->notifyCursorRequested = impl_BookListener_respond_get_cursor; - epv->notifyViewRequested = impl_BookListener_respond_get_view; - epv->notifyChangesRequested = impl_BookListener_respond_get_changes; - - epv->notifyConnectionStatus = impl_BookListener_report_connection_status; - epv->notifyWritable = impl_BookListener_report_writable; - - return epv; -} - -static void -e_book_listener_corba_class_init (void) -{ - e_book_listener_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv (); - e_book_listener_vepv.GNOME_Evolution_Addressbook_BookListener_epv = e_book_listener_get_epv (); -} - -static void -e_book_listener_class_init (EBookListenerClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - e_book_listener_parent_class = gtk_type_class (bonobo_object_get_type ()); - - e_book_listener_signals [RESPONSES_QUEUED] = - gtk_signal_new ("responses_queued", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookListenerClass, responses_queued), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, e_book_listener_signals, LAST_SIGNAL); - - object_class->destroy = e_book_listener_destroy; - - e_book_listener_corba_class_init (); -} - -/** - * e_book_listener_get_type: - */ -GtkType -e_book_listener_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "EBookListener", - sizeof (EBookListener), - sizeof (EBookListenerClass), - (GtkClassInitFunc) e_book_listener_class_init, - (GtkObjectInitFunc) e_book_listener_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (bonobo_object_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/ebook/e-book-listener.h b/addressbook/backend/ebook/e-book-listener.h deleted file mode 100644 index 84cdfecced..0000000000 --- a/addressbook/backend/ebook/e-book-listener.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * A client-side GtkObject which exposes the - * Evolution:BookListener interface. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __E_BOOK_LISTENER_H__ -#define __E_BOOK_LISTENER_H__ - -#include <libgnome/gnome-defs.h> -#include <bonobo/bonobo-object.h> -#include <ebook/addressbook.h> -#include <ebook/e-book-types.h> -#include <e-util/e-list.h> - -BEGIN_GNOME_DECLS - -typedef struct _EBookListener EBookListener; -typedef struct _EBookListenerClass EBookListenerClass; -typedef struct _EBookListenerPrivate EBookListenerPrivate; - -struct _EBookListener { - BonoboObject parent; - EBookListenerPrivate *priv; -}; - -struct _EBookListenerClass { - BonoboObjectClass parent; - - /* - * Signals - */ - void (*responses_queued) (void); -}; - -typedef enum { - /* Async responses */ - OpenBookResponse, - CreateCardResponse, - RemoveCardResponse, - ModifyCardResponse, - GetCursorResponse, - GetBookViewResponse, - GetChangesResponse, - AuthenticationResponse, - GetSupportedFieldsResponse, - - /* Async events */ - LinkStatusEvent, - WritableStatusEvent, - OpenProgressEvent, -} EBookListenerOperation; - -typedef struct { - EBookListenerOperation op; - - /* For most Response notifications */ - EBookStatus status; - - /* For OpenBookResponse */ - GNOME_Evolution_Addressbook_Book book; - - /* For GetCursorResponse */ - GNOME_Evolution_Addressbook_CardCursor cursor; - - /* For GetBookViewReponse */ - GNOME_Evolution_Addressbook_BookView book_view; - - /* For GetSupportedFields */ - EList *fields; - - /* For OpenProgressEvent */ - char *msg; - short percent; - - /* For LinkStatusEvent */ - gboolean connected; - - /* For WritableStatusEvent */ - gboolean writable; - - /* For Card[Added|Removed|Modified]Event */ - char *id; -} EBookListenerResponse; - -EBookListener *e_book_listener_new (void); -int e_book_listener_check_pending (EBookListener *listener); -EBookListenerResponse *e_book_listener_pop_response (EBookListener *listener); -GtkType e_book_listener_get_type (void); - -POA_GNOME_Evolution_Addressbook_BookListener__epv *e_book_listener_get_epv (void); - -#define E_BOOK_LISTENER_TYPE (e_book_listener_get_type ()) -#define E_BOOK_LISTENER(o) (GTK_CHECK_CAST ((o), E_BOOK_LISTENER_TYPE, EBookListener)) -#define E_BOOK_LISTENER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_LISTENER_TYPE, EBookListenerClass)) -#define E_IS_BOOK_LISTENER(o) (GTK_CHECK_TYPE ((o), E_BOOK_LISTENER_TYPE)) -#define E_IS_BOOK_LISTENER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_LISTENER_TYPE)) - -END_GNOME_DECLS - -#endif /* ! __E_BOOK_LISTENER_H__ */ diff --git a/addressbook/backend/ebook/e-book-types.h b/addressbook/backend/ebook/e-book-types.h deleted file mode 100644 index d7eee35ede..0000000000 --- a/addressbook/backend/ebook/e-book-types.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * A client-side GtkObject which exposes the - * Evolution:BookListener interface. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __E_BOOK_TYPES_H__ -#define __E_BOOK_TYPES_H__ - -#include <libgnome/gnome-defs.h> - -BEGIN_GNOME_DECLS - -typedef enum { - E_BOOK_STATUS_SUCCESS, - E_BOOK_STATUS_UNKNOWN, - E_BOOK_STATUS_REPOSITORY_OFFLINE, - E_BOOK_STATUS_PERMISSION_DENIED, - E_BOOK_STATUS_CARD_NOT_FOUND, - E_BOOK_STATUS_PROTOCOL_NOT_SUPPORTED, - E_BOOK_STATUS_CANCELLED, - E_BOOK_STATUS_OTHER_ERROR -} EBookStatus; - -typedef enum { - E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS, - E_BOOK_SIMPLE_QUERY_STATUS_CANCELLED, - E_BOOK_SIMPLE_QUERY_STATUS_OTHER_ERROR -} EBookSimpleQueryStatus; - -END_GNOME_DECLS - -#endif /* ! __E_BOOK_TYPES_H__ */ diff --git a/addressbook/backend/ebook/e-book-util.c b/addressbook/backend/ebook/e-book-util.c deleted file mode 100644 index aa7ead900f..0000000000 --- a/addressbook/backend/ebook/e-book-util.c +++ /dev/null @@ -1,443 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-book-util.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-util.h> -#include "e-book-util.h" - -gboolean -e_book_load_local_address_book (EBook *book, EBookCallback open_response, gpointer closure) -{ - gchar *filename; - gchar *uri; - gboolean rv; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (open_response != NULL, FALSE); - - filename = gnome_util_prepend_user_home ("evolution/local/Contacts/addressbook.db"); - uri = g_strdup_printf ("file://%s", filename); - - rv = e_book_load_uri (book, uri, open_response, closure); - - g_free (filename); - g_free (uri); - - return rv; -} - -/* - * - * Simple Query Stuff - * - */ - -typedef struct _SimpleQueryInfo SimpleQueryInfo; -struct _SimpleQueryInfo { - guint tag; - EBook *book; - gchar *query; - EBookSimpleQueryCallback cb; - gpointer closure; - EBookView *view; - guint add_tag; - guint seq_complete_tag; - GList *cards; -}; - -static void -book_add_simple_query (EBook *book, SimpleQueryInfo *info) -{ - GList *pending = gtk_object_get_data (GTK_OBJECT (book), "sq_pending"); - pending = g_list_prepend (pending, info); - gtk_object_set_data (GTK_OBJECT (book), "sq_pending", pending); -} - -static SimpleQueryInfo * -book_lookup_simple_query (EBook *book, guint tag) -{ - GList *pending = gtk_object_get_data (GTK_OBJECT (book), "sq_pending"); - while (pending) { - SimpleQueryInfo *sq = pending->data; - if (sq->tag == tag) - return sq; - pending = g_list_next (pending); - } - return NULL; -} - -static void -book_remove_simple_query (EBook *book, SimpleQueryInfo *info) -{ - GList *pending = gtk_object_get_data (GTK_OBJECT (book), "sq_pending"); - GList *i; - - for (i=pending; i != NULL; i = g_list_next (i)) { - if (i->data == info) { - pending = g_list_remove_link (pending, i); - g_list_free_1 (i); - break; - } - } - gtk_object_set_data (GTK_OBJECT (book), "sq_pending", pending); -} - -static guint -book_issue_tag (EBook *book) -{ - gpointer ptr = gtk_object_get_data (GTK_OBJECT (book), "sq_tag"); - guint tag = GPOINTER_TO_UINT (ptr); - if (tag == 0) - tag = 1; - gtk_object_set_data (GTK_OBJECT (book), "sq_tag", GUINT_TO_POINTER (tag+1)); - return tag; -} - -#ifdef USE_WORKAROUND -static GList *WORKAROUND_sq_queue = NULL; -static gboolean WORKAROUND_running_query = FALSE; -#endif - -static SimpleQueryInfo * -simple_query_new (EBook *book, const char *query, EBookSimpleQueryCallback cb, gpointer closure) -{ - SimpleQueryInfo *sq = g_new0 (SimpleQueryInfo, 1); - - sq->tag = book_issue_tag (book); - sq->book = book; - gtk_object_ref (GTK_OBJECT (book)); - sq->query = g_strdup_printf (query); - sq->cb = cb; - sq->closure = closure; - - /* Automatically add ourselves to the EBook's pending list. */ - book_add_simple_query (book, sq); - -#ifdef USE_WORKAROUND - /* Add ourselves to the queue. */ - WORKAROUND_sq_queue = g_list_append (WORKAROUND_sq_queue, sq); -#endif - - return sq; -} - -static void -simple_query_free (SimpleQueryInfo *sq) -{ - /* Remove ourselves from the EBook's pending list. */ - book_remove_simple_query (sq->book, sq); - -#ifdef USE_WORKAROUND - Glist *i; - - /* If we are still in the queue, remove ourselves. */ - for (i = WORKAROUND_sq_queue; i != NULL; i = g_list_next (i)) { - if (i->data == sq) { - WORKAROUND_sq_queue = g_list_remove_link (WORKAROUND_sq_queue, i); - g_list_free_1 (i); - break; - } - } -#endif - - g_free (sq->query); - - if (sq->add_tag) - gtk_signal_disconnect (GTK_OBJECT (sq->view), sq->add_tag); - if (sq->seq_complete_tag) - gtk_signal_disconnect (GTK_OBJECT (sq->view), sq->seq_complete_tag); - -#ifdef USE_WORKAROUND - if (sq->view) - WORKAROUND_running_query = FALSE; -#endif - - if (sq->view) - gtk_object_unref (GTK_OBJECT (sq->view)); - - if (sq->book) - gtk_object_unref (GTK_OBJECT (sq->book)); - - g_list_foreach (sq->cards, (GFunc) gtk_object_unref, NULL); - g_list_free (sq->cards); - - g_free (sq); -} - -static void -simple_query_card_added_cb (EBookView *view, const GList *cards, gpointer closure) -{ - SimpleQueryInfo *sq = closure; - - sq->cards = g_list_concat (sq->cards, g_list_copy ((GList *) cards)); - g_list_foreach ((GList *) cards, (GFunc) gtk_object_ref, NULL); -} - -static void -simple_query_sequence_complete_cb (EBookView *view, gpointer closure) -{ - SimpleQueryInfo *sq = closure; - - sq->cb (sq->book, E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS, sq->cards, sq->closure); - simple_query_free (sq); -} - -static void -simple_query_book_view_cb (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure) -{ - SimpleQueryInfo *sq = closure; - - if (status != E_BOOK_STATUS_SUCCESS) { - sq->cb (sq->book, E_BOOK_SIMPLE_QUERY_STATUS_OTHER_ERROR, NULL, sq->closure); - simple_query_free (sq); - return; - } - - sq->view = book_view; - gtk_object_ref (GTK_OBJECT (book_view)); - - sq->add_tag = gtk_signal_connect (GTK_OBJECT (sq->view), - "card_added", - GTK_SIGNAL_FUNC (simple_query_card_added_cb), - sq); - sq->seq_complete_tag = gtk_signal_connect (GTK_OBJECT (sq->view), - "sequence_complete", - GTK_SIGNAL_FUNC (simple_query_sequence_complete_cb), - sq); -} - -#ifdef USE_WORKAROUND -static gint -WORKAROUND_try_queue (gpointer foo) -{ - if (WORKAROUND_sq_queue) { - SimpleQueryInfo *sq; - GList *i; - - if (WORKAROUND_running_query) - return TRUE; - - WORKAROUND_running_query = TRUE; - sq = WORKAROUND_sq_queue->data; - - i = WORKAROUND_sq_queue; - WORKAROUND_sq_queue = g_list_remove_link (WORKAROUND_sq_queue, WORKAROUND_sq_queue); - g_list_free_1 (i); - - e_book_get_book_view (sq->book, sq->query, simple_query_book_view_cb, sq); - } - - return FALSE; -} -#endif - -guint -e_book_simple_query (EBook *book, const char *query, EBookSimpleQueryCallback cb, gpointer closure) -{ - SimpleQueryInfo *sq; - - g_return_val_if_fail (book && E_IS_BOOK (book), 0); - g_return_val_if_fail (query, 0); - g_return_val_if_fail (cb, 0); - - sq = simple_query_new (book, query, cb, closure); -#ifdef USE_WORKAROUND - gtk_timeout_add (50, WORKAROUND_try_queue, NULL); -#else - e_book_get_book_view (book, (gchar *) query, simple_query_book_view_cb, sq); -#endif - - return sq->tag; -} - -void -e_book_simple_query_cancel (EBook *book, guint tag) -{ - SimpleQueryInfo *sq; - - g_return_if_fail (book && E_IS_BOOK (book)); - - sq = book_lookup_simple_query (book, tag); - - if (sq) { - sq->cb (sq->book, E_BOOK_SIMPLE_QUERY_STATUS_CANCELLED, NULL, sq->closure); - simple_query_free (sq); - } else { - g_warning ("Simple query tag %d is unknown", tag); - } -} - -/* - * - * Specialized Queries - * - */ - -typedef struct _NameEmailQueryInfo NameEmailQueryInfo; -struct _NameEmailQueryInfo { - gchar *name; - gchar *email; - EBookSimpleQueryCallback cb; - gpointer closure; -}; - -static void -name_email_query_info_free (NameEmailQueryInfo *info) -{ - if (info) { - g_free (info->name); - g_free (info->email); - g_free (info); - } -} - -static void -name_and_email_cb (EBook *book, EBookSimpleQueryStatus status, const GList *cards, gpointer closure) -{ - NameEmailQueryInfo *info = closure; - GList *filtered_cards = NULL; - - while (cards) { - ECard *card = E_CARD (cards->data); - if ((info->name == NULL || e_card_name_match_string (card->name, info->name)) - && (info->email == NULL || e_card_email_match_string (card, info->email))) - filtered_cards = g_list_append (filtered_cards, card); - cards = g_list_next (cards); - } - - info->cb (book, status, filtered_cards, info->closure); - - g_list_free (filtered_cards); - - name_email_query_info_free (info); -} - -guint -e_book_name_and_email_query (EBook *book, - const gchar *name, - const gchar *email, - EBookSimpleQueryCallback cb, - gpointer closure) -{ - NameEmailQueryInfo *info; - gchar *email_query=NULL, *name_query=NULL, *query; - guint tag; - - g_return_val_if_fail (book && E_IS_BOOK (book), 0); - g_return_val_if_fail (cb != NULL, 0); - - if (name && !*name) - name = NULL; - if (email && !*email) - email = NULL; - - if (name == NULL && email == NULL) - return 0; - - /* Build our e-mail query. - * We only query against the username part of the address, to avoid not matching - * fred@foo.com and fred@mail.foo.com. While their may be namespace collisions - * in the usernames of everyone out there, it shouldn't be that bad. (Famous last words.) - */ - if (email) { - const gchar *t=email; - while (*t && *t != '@') - ++t; - if (*t == '@') { - email_query = g_strdup_printf ("(beginswith \"email\" \"%.*s@\")", t-email, email); - - } else { - email_query = g_strdup_printf ("(beginswith \"email\" \"%s\")", email); - } - } - - /* Build our name query. - * We only do name-query stuff if we don't have an e-mail address. Our basic assumption - * is that the username part of the email is good enough to keep the amount of stuff returned - * in the query relatively small. - */ - if (name && !email) { - gchar *name_cpy = g_strdup (name), *qjoined; - gchar **namev; - gint i, count=0; - - g_strstrip (name_cpy); - namev = g_strsplit (" ", name_cpy, 0); - for (i=0; namev[i]; ++i) { - if (*namev[i]) { - namev[i] = g_strdup_printf ("(contains \"file_as\" \"%s\")", namev[i]); - ++count; - } - } - - qjoined = g_strjoinv (" ", namev); - if (count > 1) { - name_query = g_strdup_printf ("(or %s)", qjoined); - } else { - name_query = qjoined; - qjoined = NULL; - } - - - g_free (name_cpy); - for (i=0; namev[i]; ++i) - if (*namev[i]) - g_free (namev[i]); - g_free (namev); - g_free (qjoined); - } - - /* Assemble our e-mail & name queries */ - if (email_query && name_query) { - query = g_strdup_printf ("(and %s %s)", email_query, name_query); - } else if (email_query) { - query = email_query; - email_query = NULL; - } else if (name_query) { - query = name_query; - name_query = NULL; - } else - return 0; - - info = g_new0 (NameEmailQueryInfo, 1); - info->name = g_strdup (name); - info->email = g_strdup (email); - info->cb = cb; - info->closure = closure; - - tag = e_book_simple_query (book, query, name_and_email_cb, info); - - g_free (email_query); - g_free (name_query); - g_free (query); - - return tag; -} diff --git a/addressbook/backend/ebook/e-book-util.h b/addressbook/backend/ebook/e-book-util.h deleted file mode 100644 index cf0103bfea..0000000000 --- a/addressbook/backend/ebook/e-book-util.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-book-util.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_BOOK_UTIL_H__ -#define __E_BOOK_UTIL_H__ - -#include <libgnome/gnome-defs.h> -#include "e-book.h" - -BEGIN_GNOME_DECLS - -/* Callbacks for asynchronous functions. */ -typedef void (*EBookSimpleQueryCallback) (EBook *book, EBookSimpleQueryStatus status, const GList *cards, gpointer closure); - -gboolean e_book_load_local_address_book (EBook *book, - EBookCallback open_response, - gpointer closure); - -/* Simple Query Interface. */ - -guint e_book_simple_query (EBook *book, - const char *query, - EBookSimpleQueryCallback cb, - gpointer closure); -void e_book_simple_query_cancel (EBook *book, - guint tag); - -/* Specialized Name/Email Queries */ - -guint e_book_name_and_email_query (EBook *book, - const char *name, - const char *email, - EBookSimpleQueryCallback cb, - gpointer closure); - -END_GNOME_DECLS - - -#endif /* __E_BOOK_UTIL_H__ */ - diff --git a/addressbook/backend/ebook/e-book-view-listener.c b/addressbook/backend/ebook/e-book-view-listener.c deleted file mode 100644 index 5f25e7f22a..0000000000 --- a/addressbook/backend/ebook/e-book-view-listener.c +++ /dev/null @@ -1,464 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Exports the BookViewListener interface. Maintains a queue of messages - * which come in on the interface. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <gtk/gtksignal.h> -#include "e-book-view-listener.h" -#include "e-book-view.h" -#include "e-card.h" - -enum { - RESPONSES_QUEUED, - LAST_SIGNAL -}; - -static guint e_book_view_listener_signals [LAST_SIGNAL]; - -static BonoboObjectClass *e_book_view_listener_parent_class; -POA_GNOME_Evolution_Addressbook_BookViewListener__vepv e_book_view_listener_vepv; - -struct _EBookViewListenerPrivate { - GList *response_queue; - gint idle_id; - - guint stopped : 1; -}; - -static gboolean -e_book_view_listener_check_queue (EBookViewListener *listener) -{ - static gint thrash = 0; - gint queue_len; - - if (listener->priv->stopped) { - listener->priv->idle_id = 0; - return TRUE; - } - - queue_len = g_list_length (listener->priv->response_queue); - - bonobo_object_ref (BONOBO_OBJECT (listener)); - if (listener->priv->response_queue != NULL) { - gtk_signal_emit (GTK_OBJECT (listener), - e_book_view_listener_signals [RESPONSES_QUEUED]); - } - - /* This means we didn't make any progress in dealing with what is on our - response queue. */ - if (queue_len == g_list_length (listener->priv->response_queue)) - ++thrash; - else - thrash = 0; - - if (thrash > 20) { - g_error ("e_book_view_listener_check_queue thrashing!"); - thrash = 0; - listener->priv->idle_id = 0; - return FALSE; - } - - if (listener->priv->response_queue == NULL) { - listener->priv->idle_id = 0; - bonobo_object_unref (BONOBO_OBJECT (listener)); - return FALSE; - } - bonobo_object_unref (BONOBO_OBJECT (listener)); - - return TRUE; -} - -static void -e_book_view_listener_queue_response (EBookViewListener *listener, - EBookViewListenerResponse *response) -{ - listener->priv->response_queue = - g_list_append (listener->priv->response_queue, - response); - - if (listener->priv->idle_id == 0) { - listener->priv->idle_id = g_idle_add ( - (GSourceFunc) e_book_view_listener_check_queue, listener); - } -} - -/* Add, Remove, Modify */ -static void -e_book_view_listener_queue_empty_event (EBookViewListener *listener, - EBookViewListenerOperation op) -{ - EBookViewListenerResponse *resp; - - if (listener->priv->stopped) - return; - - resp = g_new0 (EBookViewListenerResponse, 1); - - resp->op = op; - resp->id = NULL; - resp->cards = NULL; - resp->message = NULL; - - e_book_view_listener_queue_response (listener, resp); -} - -/* Add, Remove, Modify */ -static void -e_book_view_listener_queue_id_event (EBookViewListener *listener, - EBookViewListenerOperation op, - const char *id) -{ - EBookViewListenerResponse *resp; - - if (listener->priv->stopped) - return; - - resp = g_new0 (EBookViewListenerResponse, 1); - - resp->op = op; - resp->id = g_strdup (id); - resp->cards = NULL; - resp->message = NULL; - - e_book_view_listener_queue_response (listener, resp); -} - -/* Add, Remove, Modify */ -static void -e_book_view_listener_queue_sequence_event (EBookViewListener *listener, - EBookViewListenerOperation op, - const GNOME_Evolution_Addressbook_VCardList *cards) -{ - EBookViewListenerResponse *resp; - int i; - - if (listener->priv->stopped) - return; - - resp = g_new0 (EBookViewListenerResponse, 1); - - resp->op = op; - resp->id = NULL; - resp->cards = NULL; - resp->message = NULL; - - for ( i = 0; i < cards->_length; i++ ) { - resp->cards = g_list_append(resp->cards, e_card_new(cards->_buffer[i])); - } - - e_book_view_listener_queue_response (listener, resp); -} - -/* Status Message */ -static void -e_book_view_listener_queue_message_event (EBookViewListener *listener, - EBookViewListenerOperation op, - const char *message) -{ - EBookViewListenerResponse *resp; - - if (listener->priv->stopped) - return; - - resp = g_new0 (EBookViewListenerResponse, 1); - - resp->op = op; - resp->id = NULL; - resp->cards = NULL; - resp->message = g_strdup(message); - - e_book_view_listener_queue_response (listener, resp); -} - -static void -impl_BookViewListener_notify_card_added (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_VCardList *cards, - CORBA_Environment *ev) -{ - EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant)); - - e_book_view_listener_queue_sequence_event ( - listener, CardAddedEvent, cards); -} - -static void -impl_BookViewListener_notify_card_removed (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_CardId id, - CORBA_Environment *ev) -{ - EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant)); - - e_book_view_listener_queue_id_event ( - listener, CardRemovedEvent, (const char *) id); -} - -static void -impl_BookViewListener_notify_card_changed (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_VCardList *cards, - CORBA_Environment *ev) -{ - EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant)); - - e_book_view_listener_queue_sequence_event ( - listener, CardModifiedEvent, cards); -} - -static void -impl_BookViewListener_notify_sequence_complete (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant)); - - e_book_view_listener_queue_empty_event (listener, SequenceCompleteEvent); -} - -static void -impl_BookViewListener_notify_status_message (PortableServer_Servant servant, - const char *message, - CORBA_Environment *ev) -{ - EBookViewListener *listener = E_BOOK_VIEW_LISTENER (bonobo_object_from_servant (servant)); - - e_book_view_listener_queue_message_event (listener, StatusMessageEvent, message); -} - -/** - * e_book_view_listener_check_pending: - * @listener: the #EBookViewListener - * - * Returns: the number of items on the response queue, - * or -1 if the @listener is isn't an #EBookViewListener. - */ -int -e_book_view_listener_check_pending (EBookViewListener *listener) -{ - g_return_val_if_fail (listener != NULL, -1); - g_return_val_if_fail (E_IS_BOOK_VIEW_LISTENER (listener), -1); - - return g_list_length (listener->priv->response_queue); -} - -/** - * e_book_view_listener_pop_response: - * @listener: the #EBookViewListener for which a request is to be popped - * - * Returns: an #EBookViewListenerResponse if there are responses on the - * queue to be returned; %NULL if there aren't, or if the @listener - * isn't an EBookViewListener. - */ -EBookViewListenerResponse * -e_book_view_listener_pop_response (EBookViewListener *listener) -{ - EBookViewListenerResponse *resp; - GList *popped; - - g_return_val_if_fail (listener != NULL, NULL); - g_return_val_if_fail (E_IS_BOOK_VIEW_LISTENER (listener), NULL); - - if (listener->priv->response_queue == NULL) - return NULL; - - resp = listener->priv->response_queue->data; - - popped = listener->priv->response_queue; - listener->priv->response_queue = - g_list_remove_link (listener->priv->response_queue, - listener->priv->response_queue); - g_list_free_1 (popped); - - return resp; -} - -static EBookViewListener * -e_book_view_listener_construct (EBookViewListener *listener) -{ - POA_GNOME_Evolution_Addressbook_BookViewListener *servant; - CORBA_Environment ev; - CORBA_Object obj; - - g_assert (listener != NULL); - g_assert (E_IS_BOOK_VIEW_LISTENER (listener)); - - servant = (POA_GNOME_Evolution_Addressbook_BookViewListener *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &e_book_view_listener_vepv; - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_Addressbook_BookViewListener__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - - return NULL; - } - - CORBA_exception_free (&ev); - - obj = bonobo_object_activate_servant (BONOBO_OBJECT (listener), servant); - if (obj == CORBA_OBJECT_NIL) { - g_free (servant); - - return NULL; - } - - bonobo_object_construct (BONOBO_OBJECT (listener), obj); - - return listener; -} - -/** - * e_book_view_listener_new: - * @book: the #EBookView for which the listener is to be bound - * - * Creates and returns a new #EBookViewListener for the book. - * - * Returns: a new #EBookViewListener - */ -EBookViewListener * -e_book_view_listener_new () -{ - EBookViewListener *listener; - EBookViewListener *retval; - - listener = gtk_type_new (E_BOOK_VIEW_LISTENER_TYPE); - - retval = e_book_view_listener_construct (listener); - - if (retval == NULL) { - g_warning ("e_book_view_listener_new: Error constructing " - "EBookViewListener!\n"); - gtk_object_unref (GTK_OBJECT (listener)); - return NULL; - } - - return retval; -} - -static void -e_book_view_listener_init (EBookViewListener *listener) -{ - listener->priv = g_new0 (EBookViewListenerPrivate, 1); - listener->priv->response_queue = NULL; - listener->priv->idle_id = 0; - listener->priv->stopped = FALSE; -} - -void -e_book_view_listener_stop (EBookViewListener *listener) -{ - GList *l; - - if (listener->priv->stopped) - return; - - if (listener->priv->idle_id) { - g_source_remove(listener->priv->idle_id); - listener->priv->idle_id = 0; - } - - for (l = listener->priv->response_queue; l != NULL; l = l->next) { - EBookViewListenerResponse *resp = l->data; - - g_free(resp->id); - - g_list_foreach(resp->cards, (GFunc) gtk_object_unref, NULL); - g_list_free(resp->cards); - - g_free (resp->message); - - g_free (resp); - } - g_list_free (listener->priv->response_queue); - listener->priv->response_queue = NULL; - - listener->priv->stopped = TRUE; -} - -static void -e_book_view_listener_destroy (GtkObject *object) -{ - EBookViewListener *listener = E_BOOK_VIEW_LISTENER (object); - - e_book_view_listener_stop (listener); - g_free (listener->priv); - - GTK_OBJECT_CLASS (e_book_view_listener_parent_class)->destroy (object); -} - -POA_GNOME_Evolution_Addressbook_BookViewListener__epv * -e_book_view_listener_get_epv (void) -{ - POA_GNOME_Evolution_Addressbook_BookViewListener__epv *epv; - - epv = g_new0 (POA_GNOME_Evolution_Addressbook_BookViewListener__epv, 1); - - epv->notifyCardChanged = impl_BookViewListener_notify_card_changed; - epv->notifyCardRemoved = impl_BookViewListener_notify_card_removed; - epv->notifyCardAdded = impl_BookViewListener_notify_card_added; - epv->notifySequenceComplete = impl_BookViewListener_notify_sequence_complete; - epv->notifyStatusMessage = impl_BookViewListener_notify_status_message; - - return epv; -} - -static void -e_book_view_listener_corba_class_init (void) -{ - e_book_view_listener_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv (); - e_book_view_listener_vepv.GNOME_Evolution_Addressbook_BookViewListener_epv = e_book_view_listener_get_epv (); -} - -static void -e_book_view_listener_class_init (EBookViewListenerClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - e_book_view_listener_parent_class = gtk_type_class (bonobo_object_get_type ()); - - e_book_view_listener_signals [RESPONSES_QUEUED] = - gtk_signal_new ("responses_queued", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookViewListenerClass, responses_queued), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, e_book_view_listener_signals, LAST_SIGNAL); - - object_class->destroy = e_book_view_listener_destroy; - - e_book_view_listener_corba_class_init (); -} - -/** - * e_book_view_listener_get_type: - */ -GtkType -e_book_view_listener_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "EBookViewListener", - sizeof (EBookViewListener), - sizeof (EBookViewListenerClass), - (GtkClassInitFunc) e_book_view_listener_class_init, - (GtkObjectInitFunc) e_book_view_listener_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (bonobo_object_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/ebook/e-book-view-listener.h b/addressbook/backend/ebook/e-book-view-listener.h deleted file mode 100644 index 5d85d86c3a..0000000000 --- a/addressbook/backend/ebook/e-book-view-listener.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * A client-side GtkObject which exposes the - * Evolution:BookViewListener interface. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __E_BOOK_VIEW_LISTENER_H__ -#define __E_BOOK_VIEW_LISTENER_H__ - -#include <libgnome/gnome-defs.h> -#include <bonobo/bonobo-object.h> -#include <addressbook/backend/ebook/addressbook.h> - -BEGIN_GNOME_DECLS - -typedef struct _EBookViewListener EBookViewListener; -typedef struct _EBookViewListenerClass EBookViewListenerClass; -typedef struct _EBookViewListenerPrivate EBookViewListenerPrivate; - -struct _EBookViewListener { - BonoboObject parent; - EBookViewListenerPrivate *priv; -}; - -struct _EBookViewListenerClass { - BonoboObjectClass parent; - - /* - * Signals - */ - void (*responses_queued) (void); -}; - -typedef enum { - /* Async events */ - CardAddedEvent, - CardRemovedEvent, - CardModifiedEvent, - SequenceCompleteEvent, - StatusMessageEvent, -} EBookViewListenerOperation; - -typedef struct { - EBookViewListenerOperation op; - - /* For CardRemovedEvent */ - char *id; - - /* For Card[Added|Modified]Event */ - GList *cards; /* Of type ECard. */ - - /* For StatusMessageEvent */ - char *message; - -} EBookViewListenerResponse; - -EBookViewListener *e_book_view_listener_new (void); -int e_book_view_listener_check_pending (EBookViewListener *listener); -EBookViewListenerResponse *e_book_view_listener_pop_response (EBookViewListener *listener); -GtkType e_book_view_listener_get_type (void); -void e_book_view_listener_stop (EBookViewListener *listener); - -POA_GNOME_Evolution_Addressbook_BookViewListener__epv *e_book_view_listener_get_epv (void); - -#define E_BOOK_VIEW_LISTENER_TYPE (e_book_view_listener_get_type ()) -#define E_BOOK_VIEW_LISTENER(o) (GTK_CHECK_CAST ((o), E_BOOK_VIEW_LISTENER_TYPE, EBookViewListener)) -#define E_BOOK_VIEW_LISTENER_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_VIEW_LISTENER_TYPE, EBookViewListenerClass)) -#define E_IS_BOOK_VIEW_LISTENER(o) (GTK_CHECK_TYPE ((o), E_BOOK_VIEW_LISTENER_TYPE)) -#define E_IS_BOOK_VIEW_LISTENER_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_VIEW_LISTENER_TYPE)) - -END_GNOME_DECLS - -#endif /* ! __E_BOOK_VIEW_LISTENER_H__ */ diff --git a/addressbook/backend/ebook/e-book-view.c b/addressbook/backend/ebook/e-book-view.c deleted file mode 100644 index f20531a50a..0000000000 --- a/addressbook/backend/ebook/e-book-view.c +++ /dev/null @@ -1,308 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * The Evolution addressbook client object. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 1999, 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkmarshal.h> - -#include "addressbook.h" -#include "e-card-cursor.h" -#include "e-book-view-listener.h" -#include "e-book-view.h" - -GtkObjectClass *e_book_view_parent_class; - -struct _EBookViewPrivate { - GNOME_Evolution_Addressbook_BookView corba_book_view; - - EBookViewListener *listener; - - int responses_queued_id; -}; - -enum { - CARD_CHANGED, - CARD_REMOVED, - CARD_ADDED, - SEQUENCE_COMPLETE, - STATUS_MESSAGE, - LAST_SIGNAL -}; - -static guint e_book_view_signals [LAST_SIGNAL]; - -static void -e_book_view_do_added_event (EBookView *book_view, - EBookViewListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [CARD_ADDED], - resp->cards); - - g_list_foreach (resp->cards, (GFunc) gtk_object_unref, NULL); - g_list_free (resp->cards); -} - -static void -e_book_view_do_modified_event (EBookView *book_view, - EBookViewListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [CARD_CHANGED], - resp->cards); - - g_list_foreach (resp->cards, (GFunc) gtk_object_unref, NULL); - g_list_free (resp->cards); -} - -static void -e_book_view_do_removed_event (EBookView *book_view, - EBookViewListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [CARD_REMOVED], - resp->id); - - g_free(resp->id); -} - -static void -e_book_view_do_complete_event (EBookView *book_view, - EBookViewListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [SEQUENCE_COMPLETE]); -} - -static void -e_book_view_do_status_message_event (EBookView *book_view, - EBookViewListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book_view), e_book_view_signals [STATUS_MESSAGE], - resp->message); - g_free(resp->message); -} - - -/* - * Reading notices out of the EBookViewListener's queue. - */ -static void -e_book_view_check_listener_queue (EBookViewListener *listener, EBookView *book_view) -{ - EBookViewListenerResponse *resp; - - resp = e_book_view_listener_pop_response (listener); - - if (resp == NULL) - return; - - switch (resp->op) { - case CardAddedEvent: - e_book_view_do_added_event (book_view, resp); - break; - case CardModifiedEvent: - e_book_view_do_modified_event (book_view, resp); - break; - case CardRemovedEvent: - e_book_view_do_removed_event (book_view, resp); - break; - case SequenceCompleteEvent: - e_book_view_do_complete_event (book_view, resp); - break; - case StatusMessageEvent: - e_book_view_do_status_message_event (book_view, resp); - break; - default: - g_error ("EBookView: Unknown operation %d in listener queue!\n", - resp->op); - } - - g_free (resp); -} - -static gboolean -e_book_view_construct (EBookView *book_view, GNOME_Evolution_Addressbook_BookView corba_book_view, EBookViewListener *listener) -{ - CORBA_Environment ev; - g_return_val_if_fail (book_view != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK_VIEW (book_view), FALSE); - - /* - * Copy in the corba_book_view. - */ - CORBA_exception_init (&ev); - - book_view->priv->corba_book_view = bonobo_object_dup_ref(corba_book_view, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_view_construct: Exception duplicating corba_book_view.\n"); - CORBA_exception_free (&ev); - book_view->priv->corba_book_view = NULL; - return FALSE; - } - - CORBA_exception_free (&ev); - - /* - * Create our local BookListener interface. - */ - book_view->priv->listener = listener; - - bonobo_object_ref(BONOBO_OBJECT(book_view->priv->listener)); - book_view->priv->responses_queued_id = gtk_signal_connect (GTK_OBJECT (book_view->priv->listener), "responses_queued", - e_book_view_check_listener_queue, book_view); - - return TRUE; -} - -/** - * e_book_view_new: - */ -EBookView * -e_book_view_new (GNOME_Evolution_Addressbook_BookView corba_book_view, EBookViewListener *listener) -{ - EBookView *book_view; - - book_view = gtk_type_new (E_BOOK_VIEW_TYPE); - - if (! e_book_view_construct (book_view, corba_book_view, listener)) { - gtk_object_unref (GTK_OBJECT (book_view)); - return NULL; - } - - return book_view; -} - -static void -e_book_view_init (EBookView *book_view) -{ - book_view->priv = g_new0 (EBookViewPrivate, 1); - book_view->priv->corba_book_view = CORBA_OBJECT_NIL; - book_view->priv->listener = NULL; - book_view->priv->responses_queued_id = 0; -} - -static void -e_book_view_destroy (GtkObject *object) -{ - EBookView *book_view = E_BOOK_VIEW (object); - CORBA_Environment ev; - - if (book_view->priv->corba_book_view) { - CORBA_exception_init (&ev); - - bonobo_object_release_unref (book_view->priv->corba_book_view, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("EBookView: Exception while releasing BookView\n"); - } - - CORBA_exception_free (&ev); - } - - if (book_view->priv->listener) { - if (book_view->priv->responses_queued_id) - gtk_signal_disconnect(GTK_OBJECT(book_view->priv->listener), - book_view->priv->responses_queued_id); - e_book_view_listener_stop (book_view->priv->listener); - bonobo_object_unref (BONOBO_OBJECT(book_view->priv->listener)); - } - - g_free (book_view->priv); - - if (GTK_OBJECT_CLASS (e_book_view_parent_class)->destroy) - GTK_OBJECT_CLASS (e_book_view_parent_class)->destroy (object); -} - -static void -e_book_view_class_init (EBookViewClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - e_book_view_parent_class = gtk_type_class (gtk_object_get_type ()); - - e_book_view_signals [CARD_CHANGED] = - gtk_signal_new ("card_changed", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookViewClass, card_changed), - gtk_marshal_NONE__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); - - e_book_view_signals [CARD_ADDED] = - gtk_signal_new ("card_added", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookViewClass, card_added), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - - e_book_view_signals [CARD_REMOVED] = - gtk_signal_new ("card_removed", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookViewClass, card_removed), - gtk_marshal_NONE__POINTER, - GTK_TYPE_NONE, 1, - GTK_TYPE_POINTER); - - e_book_view_signals [SEQUENCE_COMPLETE] = - gtk_signal_new ("sequence_complete", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookViewClass, sequence_complete), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - e_book_view_signals [STATUS_MESSAGE] = - gtk_signal_new ("status_message", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookViewClass, status_message), - gtk_marshal_NONE__STRING, - GTK_TYPE_NONE, 1, - GTK_TYPE_STRING); - - gtk_object_class_add_signals (object_class, e_book_view_signals, - LAST_SIGNAL); - - klass->card_changed = NULL; - klass->card_added = NULL; - klass->card_removed = NULL; - klass->sequence_complete = NULL; - klass->status_message = NULL; - - object_class->destroy = e_book_view_destroy; -} - -/** - * e_book_view_get_type: - */ -GtkType -e_book_view_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "EBookView", - sizeof (EBookView), - sizeof (EBookViewClass), - (GtkClassInitFunc) e_book_view_class_init, - (GtkObjectInitFunc) e_book_view_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (gtk_object_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/ebook/e-book-view.h b/addressbook/backend/ebook/e-book-view.h deleted file mode 100644 index 35126d4fce..0000000000 --- a/addressbook/backend/ebook/e-book-view.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * The Evolution addressbook client object. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 1999, 2000, Helix Code, Inc. - */ - -#ifndef __E_BOOK_VIEW_H__ -#define __E_BOOK_VIEW_H__ - -#include <libgnome/gnome-defs.h> - -#include <addressbook/backend/ebook/e-card.h> -#include <addressbook/backend/ebook/e-book-view-listener.h> - -BEGIN_GNOME_DECLS - -typedef struct _EBookView EBookView; -typedef struct _EBookViewClass EBookViewClass; -typedef struct _EBookViewPrivate EBookViewPrivate; - -struct _EBookView { - GtkObject parent; - EBookViewPrivate *priv; -}; - -struct _EBookViewClass { - GtkObjectClass parent; - - /* - * Signals. - */ - void (* card_changed) (EBookView *book_view, const GList *cards); - void (* card_removed) (EBookView *book_view, const char *id); - void (* card_added) (EBookView *book_view, const GList *cards); - void (* sequence_complete) (EBookView *book_view); - void (* status_message) (EBookView *book_view, const char *message); -}; - -/* Creating a new addressbook. */ -EBookView *e_book_view_new (GNOME_Evolution_Addressbook_BookView corba_book_view, EBookViewListener *listener); - -GtkType e_book_view_get_type (void); -void e_book_view_get_book_view_listener (EBookView *book_view); - -#define E_BOOK_VIEW_TYPE (e_book_view_get_type ()) -#define E_BOOK_VIEW(o) (GTK_CHECK_CAST ((o), E_BOOK_VIEW_TYPE, EBookView)) -#define E_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_VIEW_TYPE, EBookViewClass)) -#define E_IS_BOOK_VIEW(o) (GTK_CHECK_TYPE ((o), E_BOOK_VIEW_TYPE)) -#define E_IS_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_VIEW_TYPE)) - -END_GNOME_DECLS - -#endif /* ! __E_BOOK_VIEW_H__ */ diff --git a/addressbook/backend/ebook/e-book.c b/addressbook/backend/ebook/e-book.c deleted file mode 100644 index a5231f8303..0000000000 --- a/addressbook/backend/ebook/e-book.c +++ /dev/null @@ -1,1258 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * The Evolution addressbook client object. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 1999, 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <gtk/gtksignal.h> -#include <gtk/gtkmarshal.h> -#include <libgnome/gnome-defs.h> -#include <liboaf/liboaf.h> - -#include "addressbook.h" -#include "e-card-cursor.h" -#include "e-book-listener.h" -#include "e-book.h" - -GtkObjectClass *e_book_parent_class; - -#define CARDSERVER_OAF_ID "OAFIID:GNOME_Evolution_Wombat_ServerFactory" - -typedef enum { - URINotLoaded, - URILoading, - URILoaded -} EBookLoadState; - -struct _EBookPrivate { - GNOME_Evolution_Addressbook_BookFactory book_factory; - EBookListener *listener; - - GNOME_Evolution_Addressbook_Book corba_book; - - EBookLoadState load_state; - - /* - * The operation queue. New operations are appended to the - * end of the queue. When responses come back from the PAS, - * the op structures are popped off the front of the queue. - */ - GList *pending_ops; - - guint op_tag; -}; - -enum { - OPEN_PROGRESS, - WRITABLE_STATUS, - LINK_STATUS, - LAST_SIGNAL -}; - -static guint e_book_signals [LAST_SIGNAL]; - -typedef struct { - guint tag; - gboolean active; - gpointer cb; - gpointer closure; - EBookViewListener *listener; -} EBookOp; - -/* - * Local response queue management. - */ -static guint -e_book_queue_op (EBook *book, - gpointer cb, - gpointer closure, - EBookViewListener *listener) -{ - EBookOp *op; - - op = g_new0 (EBookOp, 1); - op->tag = book->priv->op_tag++; - op->active = TRUE; - op->cb = cb; - op->closure = closure; - op->listener = listener; - - book->priv->pending_ops = - g_list_append (book->priv->pending_ops, op); - - return op->tag; -} - -static EBookOp * -e_book_pop_op (EBook *book) -{ - GList *popped; - EBookOp *op; - - if (book->priv->pending_ops == NULL) - return NULL; - - op = book->priv->pending_ops->data; - - popped = book->priv->pending_ops; - book->priv->pending_ops = - g_list_remove_link (book->priv->pending_ops, - book->priv->pending_ops); - - g_list_free_1 (popped); - - return op; -} - -static gboolean -e_book_cancel_op (EBook *book, guint tag) -{ - GList *iter; - gboolean cancelled = FALSE; - - for (iter = book->priv->pending_ops; iter != NULL && !cancelled; iter = g_list_next (iter)) { - EBookOp *op = iter->data; - if (op->tag == tag) { - op->active = FALSE; - cancelled = TRUE; - } - } - - return cancelled; -} - -static void -e_book_do_response_create_card (EBook *book, - EBookListenerResponse *resp) -{ - EBookOp *op; - - op = e_book_pop_op (book); - - if (op == NULL) { - g_warning ("e_book_do_response_create_card: Cannot find operation " - "in local op queue!\n"); - return; - } - - if (op->cb) - ((EBookIdCallback) op->cb) (book, resp->status, resp->id, op->closure); - g_free (resp->id); - g_free (op); -} - -static void -e_book_do_response_generic (EBook *book, - EBookListenerResponse *resp) -{ - EBookOp *op; - - op = e_book_pop_op (book); - - if (op == NULL) { - g_warning ("e_book_do_response_generic: Cannot find operation " - "in local op queue!\n"); - } - - if (op->cb) - ((EBookCallback) op->cb) (book, resp->status, op->closure); - - g_free (op); -} - -static void -e_book_do_response_get_cursor (EBook *book, - EBookListenerResponse *resp) -{ - CORBA_Environment ev; - EBookOp *op; - ECardCursor *cursor; - - op = e_book_pop_op (book); - - if (op == NULL) { - g_warning ("e_book_do_response_get_cursor: Cannot find operation " - "in local op queue!\n"); - return; - } - - cursor = e_card_cursor_new(resp->cursor); - - if (op->cb) { - if (op->active) - ((EBookCursorCallback) op->cb) (book, resp->status, cursor, op->closure); - else - ((EBookCursorCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure); - } - - /* - * Release the remote GNOME_Evolution_Addressbook_Book in the PAS. - */ - CORBA_exception_init (&ev); - - bonobo_object_release_unref (resp->cursor, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_do_response_get_cursor: Exception releasing " - "remote GNOME_Evolution_Addressbook_CardCursor interface!\n"); - } - - CORBA_exception_free (&ev); - - gtk_object_unref(GTK_OBJECT(cursor)); - - g_free (op); -} - - - -static void -e_book_do_response_get_view (EBook *book, - EBookListenerResponse *resp) -{ - CORBA_Environment ev; - EBookOp *op; - EBookView *book_view; - - op = e_book_pop_op (book); - - if (op == NULL) { - g_warning ("e_book_do_response_get_view: Cannot find operation " - "in local op queue!\n"); - return; - } - - book_view = e_book_view_new(resp->book_view, op->listener); - - /* Only execute the callback if the operation is still flagged as active (i.e. hasn't - been cancelled. This is mildly wasteful since we unnecessaryily create the - book_view, etc... but I'm leery of tinkering with the CORBA magic. */ - if (op->cb) { - if (op->active) - ((EBookBookViewCallback) op->cb) (book, resp->status, book_view, op->closure); - else - ((EBookBookViewCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure); - } - - /* - * Release the remote GNOME_Evolution_Addressbook_Book in the PAS. - */ - CORBA_exception_init (&ev); - - bonobo_object_release_unref (resp->book_view, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_do_response_get_view: Exception releasing " - "remote GNOME_Evolution_Addressbook_BookView interface!\n"); - } - - CORBA_exception_free (&ev); - - gtk_object_unref(GTK_OBJECT(book_view)); - bonobo_object_unref(BONOBO_OBJECT(op->listener)); - - g_free (op); -} - -static void -e_book_do_response_get_changes (EBook *book, - EBookListenerResponse *resp) -{ - CORBA_Environment ev; - EBookOp *op; - EBookView *book_view; - - op = e_book_pop_op (book); - - if (op == NULL) { - g_warning ("e_book_do_response_get_changes: Cannot find operation " - "in local op queue!\n"); - return; - } - - book_view = e_book_view_new (resp->book_view, op->listener); - - if (op->cb) { - if (op->active) - ((EBookBookViewCallback) op->cb) (book, resp->status, book_view, op->closure); - else - ((EBookBookViewCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure); - } - - /* - * Release the remote GNOME_Evolution_Addressbook_BookView in the PAS. - */ - CORBA_exception_init (&ev); - - bonobo_object_release_unref (resp->book_view, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_do_response_get_changes: Exception releasing " - "remote GNOME_Evolution_Addressbook_BookView interface!\n"); - } - - CORBA_exception_free (&ev); - - gtk_object_unref(GTK_OBJECT(book_view)); - bonobo_object_unref(BONOBO_OBJECT(op->listener)); - - g_free (op); -} - -static void -e_book_do_response_open (EBook *book, - EBookListenerResponse *resp) -{ - EBookOp *op; - - if (resp->status == E_BOOK_STATUS_SUCCESS) { - book->priv->corba_book = resp->book; - book->priv->load_state = URILoaded; - } - - op = e_book_pop_op (book); - - if (op == NULL) { - g_warning ("e_book_do_response_open: Cannot find operation " - "in local op queue!\n"); - return; - } - - if (op->cb) - ((EBookCallback) op->cb) (book, resp->status, op->closure); - g_free (op); -} - -static void -e_book_do_progress_event (EBook *book, - EBookListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book), e_book_signals [OPEN_PROGRESS], - resp->msg, resp->percent); - - g_free (resp->msg); -} - -static void -e_book_do_link_event (EBook *book, - EBookListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book), e_book_signals [LINK_STATUS], - resp->connected); -} - -static void -e_book_do_writable_event (EBook *book, - EBookListenerResponse *resp) -{ - gtk_signal_emit (GTK_OBJECT (book), e_book_signals [WRITABLE_STATUS], - resp->writable); -} - -static void -e_book_do_response_get_supported_fields (EBook *book, - EBookListenerResponse *resp) -{ - EBookOp *op; - - op = e_book_pop_op (book); - - if (op == NULL) { - g_warning ("e_book_do_response_get_supported_fields: Cannot find operation " - "in local op queue!\n"); - return; - } - - if (op->cb) { - if (op->active) - ((EBookFieldsCallback) op->cb) (book, resp->status, resp->fields, op->closure); - else - ((EBookFieldsCallback) op->cb) (book, E_BOOK_STATUS_CANCELLED, NULL, op->closure); - } - - g_free (op); -} - -/* - * Reading notices out of the EBookListener's queue. - */ -static void -e_book_check_listener_queue (EBookListener *listener, EBook *book) -{ - EBookListenerResponse *resp; - - resp = e_book_listener_pop_response (listener); - - if (resp == NULL) - return; - - switch (resp->op) { - case CreateCardResponse: - e_book_do_response_create_card (book, resp); - break; - case RemoveCardResponse: - case ModifyCardResponse: - case AuthenticationResponse: - e_book_do_response_generic (book, resp); - break; - case GetCursorResponse: - e_book_do_response_get_cursor (book, resp); - break; - case GetBookViewResponse: - e_book_do_response_get_view(book, resp); - break; - case GetChangesResponse: - e_book_do_response_get_changes(book, resp); - break; - case OpenBookResponse: - e_book_do_response_open (book, resp); - break; - case GetSupportedFieldsResponse: - e_book_do_response_get_supported_fields (book, resp); - break; - - case OpenProgressEvent: - e_book_do_progress_event (book, resp); - break; - case LinkStatusEvent: - e_book_do_link_event (book, resp); - break; - case WritableStatusEvent: - e_book_do_writable_event (book, resp); - break; - default: - g_error ("EBook: Unknown operation %d in listener queue!\n", - resp->op); - } - - g_free (resp); -} - -/** - * e_book_load_uri: - */ -gboolean -e_book_load_uri (EBook *book, - const char *uri, - EBookCallback open_response, - gpointer closure) -{ - CORBA_Environment ev; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (uri != NULL, FALSE); - g_return_val_if_fail (open_response != NULL, FALSE); - - if (book->priv->load_state != URINotLoaded) { - g_warning ("e_book_load_uri: Attempted to load a URI " - "on a book which already has a URI loaded!\n"); - return FALSE; - } - - /* - * Create our local BookListener interface. - */ - book->priv->listener = e_book_listener_new (); - if (book->priv->listener == NULL) { - g_warning ("e_book_load_uri: Could not create EBookListener!\n"); - return FALSE; - } - - gtk_signal_connect (GTK_OBJECT (book->priv->listener), "responses_queued", - e_book_check_listener_queue, book); - - /* - * Load the addressbook into the PAS. - */ - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookFactory_openBook ( - book->priv->book_factory, uri, - bonobo_object_corba_objref (BONOBO_OBJECT (book->priv->listener)), - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_load_uri: CORBA exception while opening addressbook!\n"); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - book->priv->load_state = URILoading; - - e_book_queue_op (book, open_response, closure, NULL); - - /* Now we play the waiting game. */ - - return TRUE; -} - -/** - * e_book_unload_uri: - */ -void -e_book_unload_uri (EBook *book) -{ - CORBA_Environment ev; - - g_return_if_fail (book != NULL); - g_return_if_fail (E_IS_BOOK (book)); - - /* - * FIXME: Make sure this works if the URI is still being - * loaded. - */ - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_unload_uri: No URI is loaded!\n"); - return; - } - - /* - * Release the remote GNOME_Evolution_Addressbook_Book in the PAS. - */ - CORBA_exception_init (&ev); - - bonobo_object_release_unref (book->priv->corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_unload_uri: Exception releasing " - "remote book interface!\n"); - } - - CORBA_exception_free (&ev); - - bonobo_object_unref (BONOBO_OBJECT (book->priv->listener)); - - book->priv->listener = NULL; - book->priv->load_state = URINotLoaded; -} - -char * -e_book_get_static_capabilities (EBook *book) -{ - CORBA_Environment ev; - char *temp; - char *ret_val; - - CORBA_exception_init (&ev); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_unload_uri: No URI is loaded!\n"); - return g_strdup(""); - } - - temp = GNOME_Evolution_Addressbook_Book_getStaticCapabilities(book->priv->corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_get_static_capabilities: Exception " - "during get_static_capabilities!\n"); - CORBA_exception_free (&ev); - return NULL; - } - - ret_val = g_strdup(temp); - CORBA_free(temp); - - CORBA_exception_free (&ev); - - return ret_val; -} - -guint -e_book_get_supported_fields (EBook *book, - EBookFieldsCallback cb, - gpointer closure) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_unload_uri: No URI is loaded!\n"); - return 0; - } - - GNOME_Evolution_Addressbook_Book_getSupportedFields(book->priv->corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_get_supported_fields: Exception " - "during get_supported_fields!\n"); - CORBA_exception_free (&ev); - return 0; - } - - CORBA_exception_free (&ev); - - return e_book_queue_op (book, cb, closure, NULL); -} - -static gboolean -e_book_construct (EBook *book) -{ - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - - /* - * Connect to the Personal Addressbook Server. - */ - - book->priv->book_factory = (GNOME_Evolution_Addressbook_BookFactory) - oaf_activate_from_id (CARDSERVER_OAF_ID, 0, NULL, NULL); - if (book->priv->book_factory == CORBA_OBJECT_NIL) { - g_warning ("e_book_construct: Could not obtain a handle " - "to the Personal Addressbook Server!\n"); - return FALSE; - } - - return TRUE; -} - -/** - * e_book_new: - */ -EBook * -e_book_new (void) -{ - EBook *book; - - book = gtk_type_new (E_BOOK_TYPE); - - if (! e_book_construct (book)) { - gtk_object_unref (GTK_OBJECT (book)); - return NULL; - } - - return book; -} - -/* User authentication. */ - -void -e_book_authenticate_user (EBook *book, - const char *user, - const char *passwd, - EBookCallback cb, - gpointer closure) -{ - CORBA_Environment ev; - - g_return_if_fail (book != NULL); - g_return_if_fail (E_IS_BOOK (book)); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_authenticate_user: No URI loaded!\n"); - return; - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_authenticateUser (book->priv->corba_book, - user, - passwd, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_authenticate_user: Exception authenticating user with the PAS!\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); - - e_book_queue_op (book, cb, closure, NULL); -} - -/* Fetching cards */ - -/** - * e_book_get_card: - */ -ECard * -e_book_get_card (EBook *book, - const char *id) -{ - char *vcard; - ECard *card; - - g_return_val_if_fail (book != NULL, NULL); - g_return_val_if_fail (E_IS_BOOK (book), NULL); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_get_card: No URI loaded!\n"); - return NULL; - } - - vcard = e_book_get_vcard (book, id); - - if (vcard == NULL) { - g_warning ("e_book_get_card: Got bogus VCard from PAS!\n"); - return NULL; - } - - card = e_card_new (vcard); - g_free(vcard); - - e_card_set_id(card, id); - - return card; -} - -/** - * e_book_get_vcard: - */ -char * -e_book_get_vcard (EBook *book, - const char *id) -{ - CORBA_Environment ev; - char *retval; - char *vcard; - - g_return_val_if_fail (book != NULL, NULL); - g_return_val_if_fail (E_IS_BOOK (book), NULL); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_get_vcard: No URI loaded!\n"); - return NULL; - } - - CORBA_exception_init (&ev); - - vcard = GNOME_Evolution_Addressbook_Book_getVCard (book->priv->corba_book, - (GNOME_Evolution_Addressbook_CardId) id, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_get_vcard: Exception getting VCard from PAS!\n"); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - if (vcard == NULL || strlen (vcard) == 0) { - g_warning ("e_book_get_vcard: Got NULL VCard from PAS!\n"); - return NULL; - } - - retval = g_strdup (vcard); - CORBA_free (vcard); - - return retval; -} - -/* Deleting cards. */ - -/** - * e_book_remove_card: - */ -gboolean -e_book_remove_card (EBook *book, - ECard *card, - EBookCallback cb, - gpointer closure) -{ - const char *id; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (card != NULL, FALSE); - g_return_val_if_fail (E_IS_CARD (card), FALSE); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_remove_card: No URI loaded!\n"); - return FALSE; - } - - id = e_card_get_id (card); - g_assert (id != NULL); - - return e_book_remove_card_by_id (book, id, cb, closure); -} - -/** - * e_book_remove_card_by_id: - */ -gboolean -e_book_remove_card_by_id (EBook *book, - const char *id, - EBookCallback cb, - gpointer closure) - -{ - CORBA_Environment ev; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (id != NULL, FALSE); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_remove_card_by_id: No URI loaded!\n"); - return FALSE; - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_removeCard ( - book->priv->corba_book, (const GNOME_Evolution_Addressbook_CardId) id, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_remove_card_by_id: CORBA exception " - "talking to PAS!\n"); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - e_book_queue_op (book, cb, closure, NULL); - - return TRUE; -} - -/* Adding cards. */ - -/** - * e_book_add_card: - */ -gboolean -e_book_add_card (EBook *book, - ECard *card, - EBookIdCallback cb, - gpointer closure) - -{ - char *vcard; - gboolean retval; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (card != NULL, FALSE); - g_return_val_if_fail (E_IS_CARD (card), FALSE); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_add_card: No URI loaded!\n"); - return FALSE; - } - - vcard = e_card_get_vcard (card); - - if (vcard == NULL) { - g_warning ("e_book_add_card: Cannot convert card to VCard string!\n"); - return FALSE; - } - - retval = e_book_add_vcard (book, vcard, cb, closure); - - g_free (vcard); - - return retval; -} - -/** - * e_book_add_vcard: - */ -gboolean -e_book_add_vcard (EBook *book, - const char *vcard, - EBookIdCallback cb, - gpointer closure) -{ - CORBA_Environment ev; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (vcard != NULL, FALSE); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_add_vcard: No URI loaded!\n"); - return FALSE; - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_addCard ( - book->priv->corba_book, (const GNOME_Evolution_Addressbook_VCard) vcard, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_add_vcard: Exception adding card to PAS!\n"); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - e_book_queue_op (book, (EBookCallback) cb, closure, NULL); - - return TRUE; -} - -/* Modifying cards. */ - -/** - * e_book_commit_card: - */ -gboolean -e_book_commit_card (EBook *book, - ECard *card, - EBookCallback cb, - gpointer closure) -{ - char *vcard; - gboolean retval; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (card != NULL, FALSE); - g_return_val_if_fail (E_IS_CARD (card), FALSE); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_commit_card: No URI loaded!\n"); - return FALSE; - } - - vcard = e_card_get_vcard (card); - - if (vcard == NULL) { - g_warning ("e_book_commit_card: Error " - "getting VCard for card!\n"); - return FALSE; - } - - retval = e_book_commit_vcard (book, vcard, cb, closure); - - g_free (vcard); - - return retval; -} - -/** - * e_book_commit_vcard: - */ -gboolean -e_book_commit_vcard (EBook *book, - const char *vcard, - EBookCallback cb, - gpointer closure) -{ - CORBA_Environment ev; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - g_return_val_if_fail (vcard != NULL, FALSE); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_commit_vcard: No URI loaded!\n"); - return FALSE; - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_modifyCard ( - book->priv->corba_book, (const GNOME_Evolution_Addressbook_VCard) vcard, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_commit_vcard: Exception " - "modifying card in PAS!\n"); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - e_book_queue_op (book, cb, closure, NULL); - - return TRUE; -} - -/** - * e_book_check_connection: - */ -gboolean -e_book_check_connection (EBook *book) -{ - CORBA_Environment ev; - - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (E_IS_BOOK (book), FALSE); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_check_connection: No URI loaded!\n"); - return FALSE; - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_checkConnection (book->priv->corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_check_connection: Exception " - "querying the PAS!\n"); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - return TRUE; -} - -guint -e_book_get_cursor (EBook *book, - gchar *query, - EBookCursorCallback cb, - gpointer closure) -{ - CORBA_Environment ev; - - g_return_val_if_fail (book != NULL, 0); - g_return_val_if_fail (E_IS_BOOK (book), 0); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_check_connection: No URI loaded!\n"); - return 0; - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_getCursor (book->priv->corba_book, query, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_get_all_cards: Exception " - "querying list of cards!\n"); - CORBA_exception_free (&ev); - return 0; - } - - CORBA_exception_free (&ev); - - return e_book_queue_op (book, cb, closure, NULL); - - return TRUE; -} - -guint -e_book_get_book_view (EBook *book, - const gchar *query, - EBookBookViewCallback cb, - gpointer closure) -{ - CORBA_Environment ev; - EBookViewListener *listener; - - g_return_val_if_fail (book != NULL, 0); - g_return_val_if_fail (E_IS_BOOK (book), 0); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_get_book_view: No URI loaded!\n"); - return 0; - } - - listener = e_book_view_listener_new(); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_getBookView (book->priv->corba_book, bonobo_object_corba_objref(BONOBO_OBJECT(listener)), query, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_get_book_view: Exception " - "getting book_view!\n"); - CORBA_exception_free (&ev); - return 0; - } - - CORBA_exception_free (&ev); - - return e_book_queue_op (book, cb, closure, listener); -} - -guint -e_book_get_changes (EBook *book, - gchar *changeid, - EBookBookViewCallback cb, - gpointer closure) -{ - CORBA_Environment ev; - EBookViewListener *listener; - - g_return_val_if_fail (book != NULL, 0); - g_return_val_if_fail (E_IS_BOOK (book), 0); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_get_changes: No URI loaded!\n"); - return FALSE; - } - - listener = e_book_view_listener_new(); - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_Book_getChanges (book->priv->corba_book, bonobo_object_corba_objref(BONOBO_OBJECT(listener)), changeid, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_changes: Exception " - "getting changes!\n"); - CORBA_exception_free (&ev); - return 0; - } - - CORBA_exception_free (&ev); - - return e_book_queue_op (book, cb, closure, listener); -} - -/** - * e_book_cancel - */ - -void -e_book_cancel (EBook *book, guint tag) -{ - g_return_if_fail (book != NULL); - g_return_if_fail (E_IS_BOOK (book)); - g_return_if_fail (tag != 0); - - /* In an attempt to be useful, we take a bit of extra care in reporting - errors. This might come in handy someday. */ - if (tag >= book->priv->op_tag) - g_warning ("Attempt to cancel unassigned operation (%u)", tag); - else if (! e_book_cancel_op (book, tag)) - g_warning ("Attempt to cancel unknown operation (%u)", tag); -} - -/** - * e_book_get_name: - */ -char * -e_book_get_name (EBook *book) -{ - CORBA_Environment ev; - char *retval; - char *name; - - g_return_val_if_fail (book != NULL, NULL); - g_return_val_if_fail (E_IS_BOOK (book), NULL); - - if (book->priv->load_state != URILoaded) { - g_warning ("e_book_get_name: No URI loaded!\n"); - return NULL; - } - - CORBA_exception_init (&ev); - - name = GNOME_Evolution_Addressbook_Book_getName (book->priv->corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("e_book_get_name: Exception getting name from PAS!\n"); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - if (name == NULL) { - g_warning ("e_book_get_name: Got NULL name from PAS!\n"); - return NULL; - } - - retval = g_strdup (name); - CORBA_free (name); - - return retval; -} - -static void -e_book_init (EBook *book) -{ - book->priv = g_new0 (EBookPrivate, 1); - book->priv->load_state = URINotLoaded; - book->priv->op_tag = 1; -} - -static void -e_book_destroy (GtkObject *object) -{ - EBook *book = E_BOOK (object); - CORBA_Environment ev; - - if (book->priv->load_state == URILoaded) - e_book_unload_uri (book); - - CORBA_exception_init (&ev); - - CORBA_Object_release (book->priv->book_factory, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("EBook: Exception while releasing BookFactory\n"); - - CORBA_exception_free (&ev); - CORBA_exception_init (&ev); - } - - g_free (book->priv); - - GTK_OBJECT_CLASS (e_book_parent_class)->destroy (object); -} - -static void -e_book_class_init (EBookClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - e_book_parent_class = gtk_type_class (gtk_object_get_type ()); - - e_book_signals [LINK_STATUS] = - gtk_signal_new ("link_status", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookClass, link_status), - gtk_marshal_NONE__BOOL, - GTK_TYPE_NONE, 1, - GTK_TYPE_BOOL); - - e_book_signals [WRITABLE_STATUS] = - gtk_signal_new ("writable_status", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EBookClass, writable_status), - gtk_marshal_NONE__BOOL, - GTK_TYPE_NONE, 1, - GTK_TYPE_BOOL); - - gtk_object_class_add_signals (object_class, e_book_signals, - LAST_SIGNAL); - - object_class->destroy = e_book_destroy; -} - -/** - * e_book_get_type: - */ -GtkType -e_book_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "EBook", - sizeof (EBook), - sizeof (EBookClass), - (GtkClassInitFunc) e_book_class_init, - (GtkObjectInitFunc) e_book_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (gtk_object_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/ebook/e-book.h b/addressbook/backend/ebook/e-book.h deleted file mode 100644 index ed635dcace..0000000000 --- a/addressbook/backend/ebook/e-book.h +++ /dev/null @@ -1,148 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * The Evolution addressbook client object. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 1999, 2000, Helix Code, Inc. - */ - -#ifndef __E_BOOK_H__ -#define __E_BOOK_H__ - -#include <libgnome/gnome-defs.h> - -#include <addressbook/backend/ebook/e-card.h> -#include <addressbook/backend/ebook/e-card-cursor.h> -#include <addressbook/backend/ebook/e-book-view.h> -#include <addressbook/backend/ebook/e-book-types.h> - -BEGIN_GNOME_DECLS - -typedef struct _EBook EBook; -typedef struct _EBookClass EBookClass; -typedef struct _EBookPrivate EBookPrivate; - -struct _EBook { - GtkObject parent; - EBookPrivate *priv; -}; - -struct _EBookClass { - GtkObjectClass parent; - - /* - * Signals. - */ - void (* open_progress) (EBook *book, const char *msg, short percent); - void (* link_status) (EBook *book, gboolean connected); - void (* writable_status) (EBook *book, gboolean writable); -}; - -/* Callbacks for asynchronous functions. */ -typedef void (*EBookCallback) (EBook *book, EBookStatus status, gpointer closure); -typedef void (*EBookOpenProgressCallback) (EBook *book, - const char *status_message, - short percent, - gpointer closure); -typedef void (*EBookIdCallback) (EBook *book, EBookStatus status, const char *id, gpointer closure); -typedef void (*EBookCursorCallback) (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure); -typedef void (*EBookBookViewCallback) (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure); -typedef void (*EBookFieldsCallback) (EBook *book, EBookStatus status, EList *fields, gpointer closure); - -/* Creating a new addressbook. */ -EBook *e_book_new (void); - -gboolean e_book_load_uri (EBook *book, - const char *uri, - EBookCallback open_response, - gpointer closure); -void e_book_unload_uri (EBook *book); - -char *e_book_get_static_capabilities (EBook *book); - -guint e_book_get_supported_fields (EBook *book, - EBookFieldsCallback cb, - gpointer closure); - - -/* User authentication. */ -void e_book_authenticate_user (EBook *book, - const char *user, - const char *passwd, - EBookCallback cb, - gpointer closure); - -/* Fetching cards. */ -ECard *e_book_get_card (EBook *book, - const char *id); -char *e_book_get_vcard (EBook *book, - const char *id); - -/* Deleting cards. */ -gboolean e_book_remove_card (EBook *book, - ECard *card, - EBookCallback cb, - gpointer closure); -gboolean e_book_remove_card_by_id (EBook *book, - const char *id, - EBookCallback cb, - gpointer closure); - -/* Adding cards. */ -gboolean e_book_add_card (EBook *book, - ECard *card, - EBookIdCallback cb, - gpointer closure); -gboolean e_book_add_vcard (EBook *book, - const char *vcard, - EBookIdCallback cb, - gpointer closure); - -/* Modifying cards. */ -gboolean e_book_commit_card (EBook *book, - ECard *card, - EBookCallback cb, - gpointer closure); -gboolean e_book_commit_vcard (EBook *book, - const char *vcard, - EBookCallback cb, - gpointer closure); - -/* Checking to see if we're connected to the card repository. */ -gboolean e_book_check_connection (EBook *book); -guint e_book_get_cursor (EBook *book, - char *query, - EBookCursorCallback cb, - gpointer closure); - -guint e_book_get_book_view (EBook *book, - const gchar *query, - EBookBookViewCallback cb, - gpointer closure); - -guint e_book_get_changes (EBook *book, - char *changeid, - EBookBookViewCallback cb, - gpointer closure); - -/* Cancel a pending operation. */ -void e_book_cancel (EBook *book, - guint tag); - - -/* Getting the name of the repository. */ -char *e_book_get_name (EBook *book); - -GtkType e_book_get_type (void); - -#define E_BOOK_TYPE (e_book_get_type ()) -#define E_BOOK(o) (GTK_CHECK_CAST ((o), E_BOOK_TYPE, EBook)) -#define E_BOOK_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_BOOK_TYPE, EBookClass)) -#define E_IS_BOOK(o) (GTK_CHECK_TYPE ((o), E_BOOK_TYPE)) -#define E_IS_BOOK_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_BOOK_TYPE)) - -END_GNOME_DECLS - -#endif /* ! __E_BOOK_H__ */ diff --git a/addressbook/backend/ebook/e-card-cursor.c b/addressbook/backend/ebook/e-card-cursor.c deleted file mode 100644 index cccc493352..0000000000 --- a/addressbook/backend/ebook/e-card-cursor.c +++ /dev/null @@ -1,235 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-card-cursor.c: Implements card cursors. - * - * Author: - * Christopher James Lahey <clahey@helixcode.com. - */ - -#include <config.h> -#include <gtk/gtkobject.h> -#include "addressbook.h" -#include "e-card-cursor.h" - -struct _ECardCursorPrivate { - GNOME_Evolution_Addressbook_CardCursor corba_cursor; -}; - -/* - * A pointer to our parent object class - */ -static GtkObjectClass *parent_class; - -/* - * Implemented GtkObject::destroy - */ -static void -e_card_cursor_destroy (GtkObject *object) -{ - ECardCursor *cursor = E_CARD_CURSOR (object); - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_CardCursor_unref( cursor->priv->corba_cursor, &ev ); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("e_card_cursor_destroy: Exception unreffing " - "corba cursor.\n"); - CORBA_exception_free (&ev); - CORBA_exception_init (&ev); - } - - CORBA_Object_release (cursor->priv->corba_cursor, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("e_card_cursor_destroy: Exception releasing " - "corba cursor.\n"); - } - - CORBA_exception_free (&ev); - - if ( cursor->priv ) - g_free ( cursor->priv ); - - GTK_OBJECT_CLASS (parent_class)->destroy (object); -} - -/** - * e_card_cursor_get_length: - * @cursor: the #ECardCursor whose length is being queried - * - * Returns: the number of items the cursor references, or -1 there's - * an error. - */ -long -e_card_cursor_get_length (ECardCursor *cursor) -{ - if ( cursor->priv->corba_cursor != CORBA_OBJECT_NIL ) { - CORBA_Environment ev; - long ret_val; - - CORBA_exception_init (&ev); - - ret_val = GNOME_Evolution_Addressbook_CardCursor_count (cursor->priv->corba_cursor, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("e_card_cursor_get_length: Exception during " - "get_length corba call.\n"); - ret_val = -1; - } - - CORBA_exception_free (&ev); - - return ret_val; - } - else - return -1; -} - -/** - * e_card_cursor_get_nth: - * @cursor: an #ECardCursor object - * @n: the index of the item requested - * - * Gets an #ECard based on an index. - * - * Returns: a new #ECard on success, or %NULL on failure. - */ -ECard * -e_card_cursor_get_nth (ECardCursor *cursor, - const long n) -{ - if ( cursor->priv->corba_cursor != CORBA_OBJECT_NIL ) { - CORBA_Environment en; - CORBA_char *vcard; - ECard *card; - - CORBA_exception_init (&en); - - vcard = GNOME_Evolution_Addressbook_CardCursor_getNth(cursor->priv->corba_cursor, n, &en); - - if (en._major != CORBA_NO_EXCEPTION) { - g_warning("e_card_cursor_get_nth: Exception during " - "get_nth corba call.\n"); - } - - CORBA_exception_free (&en); - - card = e_card_new (vcard); - - CORBA_free(vcard); - - return card; - } - else - return e_card_new(""); -} - -static void -e_card_cursor_class_init (ECardCursorClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - parent_class = gtk_type_class (gtk_object_get_type ()); - - object_class->destroy = e_card_cursor_destroy; -} - -static void -e_card_cursor_init (ECardCursor *cursor) -{ - cursor->priv = g_new(ECardCursorPrivate, 1); - cursor->priv->corba_cursor = CORBA_OBJECT_NIL; -} - -GtkType -e_card_cursor_get_type (void) -{ - static GtkType type = 0; - - if (!type){ - GtkTypeInfo info = { - "ECardCursor", - sizeof (ECardCursor), - sizeof (ECardCursorClass), - (GtkClassInitFunc) e_card_cursor_class_init, - (GtkObjectInitFunc) e_card_cursor_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (gtk_object_get_type (), &info); - } - - return type; -} - -/** - * e_card_cursor_construct: - * @cursor: an #ECardCursor object - * @corba_cursor: an #GNOME_Evolution_Addressbook_CardCursor - * - * Wraps an #GNOME_Evolution_Addressbook_CardCursor object inside the #ECardCursor - * @cursor object. - * - * Returns: a new #ECardCursor on success, or %NULL on failure. - */ -ECardCursor * -e_card_cursor_construct (ECardCursor *cursor, - GNOME_Evolution_Addressbook_CardCursor corba_cursor) -{ - CORBA_Environment ev; - g_return_val_if_fail (cursor != NULL, NULL); - g_return_val_if_fail (E_IS_CARD_CURSOR (cursor), NULL); - g_return_val_if_fail (corba_cursor != CORBA_OBJECT_NIL, NULL); - - CORBA_exception_init (&ev); - - /* - * Initialize cursor - */ - cursor->priv->corba_cursor = CORBA_Object_duplicate(corba_cursor, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("e_card_cursor_construct: Exception duplicating " - "corba cursor.\n"); - CORBA_exception_free (&ev); - CORBA_exception_init (&ev); - } - - GNOME_Evolution_Addressbook_CardCursor_ref(cursor->priv->corba_cursor, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("e_card_cursor_construct: Exception reffing " - "corba cursor.\n"); - } - - CORBA_exception_free (&ev); - - /* - * Success: return the GtkType we were given - */ - return cursor; -} - -/** - * e_card_cursor_new: - * @cursor: the #GNOME_Evolution_Addressbook_CardCursor to be wrapped - * - * Creates a new #ECardCursor, which wraps an #GNOME_Evolution_Addressbook_CardCursor - * object. - * - * Returns: a new #ECardCursor on success, or %NULL on failure. - */ -ECardCursor * -e_card_cursor_new (GNOME_Evolution_Addressbook_CardCursor corba_cursor) -{ - ECardCursor *cursor; - - cursor = gtk_type_new (e_card_cursor_get_type ()); - - return e_card_cursor_construct (cursor, - corba_cursor); -} diff --git a/addressbook/backend/ebook/e-card-cursor.h b/addressbook/backend/ebook/e-card-cursor.h deleted file mode 100644 index a4dad0ff5b..0000000000 --- a/addressbook/backend/ebook/e-card-cursor.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __E_CARD_CURSOR_H__ -#define __E_CARD_CURSOR_H__ - -#include <gtk/gtkobject.h> -#include <libgnome/gnome-defs.h> -#include <addressbook/backend/ebook/addressbook.h> -#include <addressbook/backend/ebook/e-card.h> - -BEGIN_GNOME_DECLS - -typedef struct _ECardCursor ECardCursor; -typedef struct _ECardCursorPrivate ECardCursorPrivate; -typedef struct _ECardCursorClass ECardCursorClass; - -struct _ECardCursor { - GtkObject parent; - ECardCursorPrivate *priv; -}; - -struct _ECardCursorClass { - GtkObjectClass parent; -}; - -/* Creating a new addressbook. */ -ECardCursor *e_card_cursor_new (GNOME_Evolution_Addressbook_CardCursor corba_cursor); -ECardCursor *e_card_cursor_construct (ECardCursor *cursor, - GNOME_Evolution_Addressbook_CardCursor corba_cursor); - -GtkType e_card_cursor_get_type (void); - -/* Fetching cards. */ -long e_card_cursor_get_length (ECardCursor *cursor); -ECard *e_card_cursor_get_nth (ECardCursor *cursor, - const long nth); -#define E_CARD_CURSOR_TYPE (e_card_cursor_get_type ()) -#define E_CARD_CURSOR(o) (GTK_CHECK_CAST ((o), E_CARD_CURSOR_TYPE, ECardCursor)) -#define E_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CARD_CURSOR_TYPE, ECardCursorClass)) -#define E_IS_CARD_CURSOR(o) (GTK_CHECK_TYPE ((o), E_CARD_CURSOR_TYPE)) -#define E_IS_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CARD_CURSOR_TYPE)) - -END_GNOME_DECLS - -#endif /* ! __E_CARD_CURSOR_H__ */ diff --git a/addressbook/backend/ebook/e-card-pairs.h b/addressbook/backend/ebook/e-card-pairs.h deleted file mode 100644 index 0f379d3477..0000000000 --- a/addressbook/backend/ebook/e-card-pairs.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* GnomeCard - a graphical contact manager. - * - * pairs.h: This file is part of GnomeCard. - * - * Copyright (C) 1999 The Free Software Foundation - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __E_CARD_PAIRS_H__ -#define __E_CARD_PAIRS_H__ - -#include <libversit/vcc.h> -#include <ebook/e-card.h> - - -#if 0 -struct pair -{ - char *str; - ECardPropertyType i ; -}; - -struct pair prop_lookup[] = { - { VCFullNameProp, PROP_FNAME }, - { VCNameProp, PROP_NAME }, - { VCPhotoProp, PROP_PHOTO }, - { VCBirthDateProp, PROP_BDAY }, - { VCAdrProp, PROP_DELADDR }, - { VCDeliveryLabelProp, PROP_DELLABEL }, - { VCTelephoneProp, PROP_PHONE }, - { VCEmailAddressProp, PROP_EMAIL }, - { VCMailerProp, PROP_MAILER }, - { VCTimeZoneProp, PROP_TIMEZN }, - { VCGeoProp, PROP_GEOPOS }, - { VCTitleProp, PROP_TITLE }, - { VCBusinessRoleProp, PROP_ROLE }, - { VCLogoProp, PROP_LOGO }, - { VCAgentProp, PROP_AGENT }, - { VCOrgProp, PROP_ORG }, - { VCCategoriesProp, PROP_CATEGORIES }, - { VCCommentProp, PROP_COMMENT }, - { VCLastRevisedProp, PROP_REV }, - { VCPronunciationProp, PROP_SOUND }, - { VCURLProp, PROP_URL }, - { VCUniqueStringProp, PROP_UID }, - { VCVersionProp, PROP_VERSION }, - { VCPublicKeyProp, PROP_KEY }, - { VCValueProp, PROP_VALUE }, - { VCEncodingProp, PROP_ENCODING }, - { VCQuotedPrintableProp, PROP_QUOTED_PRINTABLE }, - { VC8bitProp, PROP_8BIT }, - { VCBase64Prop, PROP_BASE64 }, - { VCLanguageProp, PROP_LANG }, - { VCCharSetProp, PROP_CHARSET }, - { NULL, PROP_NONE} }; - -struct pair photo_pairs[] = { - { VCGIFProp, PHOTO_GIF }, - { VCCGMProp, PHOTO_CGM }, - { VCWMFProp, PHOTO_WMF }, - { VCBMPProp, PHOTO_BMP }, - { VCMETProp, PHOTO_MET }, - { VCPMBProp, PHOTO_PMB }, - { VCDIBProp, PHOTO_DIB }, - { VCPICTProp, PHOTO_PICT }, - { VCTIFFProp, PHOTO_TIFF }, - { VCPDFProp, PHOTO_PDF }, - { VCPSProp, PHOTO_PS }, - { VCJPEGProp, PHOTO_JPEG }, - { VCMPEGProp, PHOTO_MPEG }, - { VCMPEG2Prop, PHOTO_MPEG2 }, - { VCAVIProp, PHOTO_AVI }, - { VCQuickTimeProp, PHOTO_QTIME }, - { NULL, 0 } }; - -struct pair email_pairs[] = { - { VCAOLProp, EMAIL_AOL }, - { VCAppleLinkProp, EMAIL_APPLE_LINK }, - { VCATTMailProp, EMAIL_ATT }, - { VCCISProp, EMAIL_CIS }, - { VCEWorldProp, EMAIL_EWORLD }, - { VCInternetProp, EMAIL_INET }, - { VCIBMMailProp, EMAIL_IBM }, - { VCMCIMailProp, EMAIL_MCI }, - { VCPowerShareProp, EMAIL_POWERSHARE }, - { VCProdigyProp, EMAIL_PRODIGY }, - { VCTLXProp, EMAIL_TLX }, - { VCX400Prop, EMAIL_X400 }, - { NULL, 0 } }; - -struct pair sound_pairs[] = { - { VCAIFFProp, SOUND_AIFF }, - { VCPCMProp, SOUND_PCM }, - { VCWAVEProp, SOUND_WAVE }, - { NULL, 0 } }; - -struct pair key_pairs[] = { - { VCX509Prop, KEY_X509 }, - { VCPGPProp, KEY_PGP }, - { NULL, 0 } }; - - -#endif -#endif /* ! __E_CARD_PAIRS_H__ */ diff --git a/addressbook/backend/ebook/e-card-simple.c b/addressbook/backend/ebook/e-card-simple.c deleted file mode 100644 index 6d5619d135..0000000000 --- a/addressbook/backend/ebook/e-card-simple.c +++ /dev/null @@ -1,1111 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@helixcode.com> - * Arturo Espinosa (arturo@nuclecu.unam.mx) - * Nat Friedman (nat@helixcode.com) - * - * Copyright (C) 2000 Helix Code, Inc. - * Copyright (C) 1999 The Free Software Foundation - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <gtk/gtkobject.h> - -#include <libversit/vcc.h> -#include "e-card-simple.h" - -/* Object argument IDs */ -enum { - ARG_0, - ARG_CARD, -}; - - -typedef enum _ECardSimpleInternalType ECardSimpleInternalType; -typedef struct _ECardSimpleFieldData ECardSimpleFieldData; - -enum _ECardSimpleInternalType { - E_CARD_SIMPLE_INTERNAL_TYPE_STRING, - E_CARD_SIMPLE_INTERNAL_TYPE_DATE, - E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS, - E_CARD_SIMPLE_INTERNAL_TYPE_PHONE, - E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL, - E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL, -}; - -struct _ECardSimpleFieldData { - ECardSimpleField field; - char *ecard_field; - char *name; - char *short_name; - int list_type_index; - ECardSimpleInternalType type; -}; - -/* This order must match the order in the .h. */ - -/* the ecard_field data below should only be used for TYPE_STRING, - TYPE_DATE, and TYPE_SPECIAL fields. that is, it's only valid for - e-cards for those types. it is used as a unique name for fields - for the get_supported functionality. */ -static ECardSimpleFieldData field_data[] = -{ - { E_CARD_SIMPLE_FIELD_FILE_AS, "file_as", "File As", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "Name", "Name", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_FAMILY_NAME, "family_name", "Family Name", "Family Name", 0, E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL }, - { E_CARD_SIMPLE_FIELD_EMAIL, "email", "Email", "Email", E_CARD_SIMPLE_EMAIL_ID_EMAIL, E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL }, - { E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, "primary_phone", "Primary", "Prim", E_CARD_SIMPLE_PHONE_ID_PRIMARY, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_ASSISTANT, "assistant_phone", "Assistant", "Assistant",E_CARD_SIMPLE_PHONE_ID_ASSISTANT, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, "business_phone", "Business", "Bus", E_CARD_SIMPLE_PHONE_ID_BUSINESS, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_CALLBACK, "callback_phone", "Callback", "Callback", E_CARD_SIMPLE_PHONE_ID_CALLBACK, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_COMPANY, "company_phone", "Company", "Comp", E_CARD_SIMPLE_PHONE_ID_COMPANY, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_HOME, "home_phone", "Home", "Home", E_CARD_SIMPLE_PHONE_ID_HOME, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_ORG, "org", "Organization", "Org", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_ADDRESS_BUSINESS, "business_address","Business", "Bus", E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS }, - { E_CARD_SIMPLE_FIELD_ADDRESS_HOME, "home_address", "Home", "Home", E_CARD_SIMPLE_ADDRESS_ID_HOME, E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS }, - { E_CARD_SIMPLE_FIELD_PHONE_MOBILE, "mobile_phone", "Mobile", "Mobile", E_CARD_SIMPLE_PHONE_ID_MOBILE, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_CAR, "car_phone", "Car", "Car", E_CARD_SIMPLE_PHONE_ID_CAR, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX, "business_fax", "Business Fax", "Bus Fax", E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX, "home_fax", "Home Fax", "Home Fax", E_CARD_SIMPLE_PHONE_ID_HOME_FAX, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2, "business_phone_2","Business 2", "Bus 2", E_CARD_SIMPLE_PHONE_ID_BUSINESS_2, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_HOME_2, "home_phone_2", "Home 2", "Home 2", E_CARD_SIMPLE_PHONE_ID_HOME_2, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_ISDN, "isdn", "ISDN", "ISDN", E_CARD_SIMPLE_PHONE_ID_ISDN, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_OTHER, "other_phone", "Other", "Other", E_CARD_SIMPLE_PHONE_ID_OTHER, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_OTHER_FAX, "other_fax", "Other Fax", "Other Fax", E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_PAGER, "pager", "Pager", "Pager", E_CARD_SIMPLE_PHONE_ID_PAGER, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_RADIO, "radio", "Radio", "Radio", E_CARD_SIMPLE_PHONE_ID_RADIO, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_TELEX, "telex", "Telex", "Telex", E_CARD_SIMPLE_PHONE_ID_TELEX, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_PHONE_TTYTTD, "tty", "TTY", "TTY", E_CARD_SIMPLE_PHONE_ID_TTYTTD, E_CARD_SIMPLE_INTERNAL_TYPE_PHONE }, - { E_CARD_SIMPLE_FIELD_ADDRESS_OTHER, "other_address", "Other", "Other", E_CARD_SIMPLE_ADDRESS_ID_OTHER, E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS }, - { E_CARD_SIMPLE_FIELD_EMAIL_2, "email_2", "Email 2", "Email 2", E_CARD_SIMPLE_EMAIL_ID_EMAIL_2, E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL }, - { E_CARD_SIMPLE_FIELD_EMAIL_3, "email_3", "Email 3", "Email 3", E_CARD_SIMPLE_EMAIL_ID_EMAIL_3, E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL }, - { E_CARD_SIMPLE_FIELD_URL, "url", "Web Site", "Url", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_ORG_UNIT, "org_unit", "Department", "Dep", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_OFFICE, "office", "Office", "Off", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_TITLE, "title", "Title", "Title", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_ROLE, "role", "Profession", "Prof", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_MANAGER, "manager", "Manager", "Man", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_ASSISTANT, "assistant", "Assistant", "Ass", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_NICKNAME, "nickname", "Nickname", "Nick", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_SPOUSE, "spouse", "Spouse", "Spouse", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_NOTE, "note", "Note", "Note", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_FBURL, "fburl", "Free-busy URL", "FBUrl", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_ANNIVERSARY, "anniversary", "Anniversary", "Anniv", 0, E_CARD_SIMPLE_INTERNAL_TYPE_DATE }, - { E_CARD_SIMPLE_FIELD_BIRTH_DATE, "birth_date", "Birth Date", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_DATE }, - { E_CARD_SIMPLE_FIELD_MAILER, "mailer", "", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, - { E_CARD_SIMPLE_FIELD_NAME_OR_ORG, "nameororg", "", "", 0, E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL }, - { E_CARD_SIMPLE_FIELD_CATEGORIES, "categories", "Categories", "Categories", 0, E_CARD_SIMPLE_INTERNAL_TYPE_STRING }, -}; -static int field_data_count = sizeof (field_data) / sizeof (field_data[0]); - -static void e_card_simple_init (ECardSimple *simple); -static void e_card_simple_class_init (ECardSimpleClass *klass); - -static void e_card_simple_destroy (GtkObject *object); -static void e_card_simple_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_card_simple_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); - -static void fill_in_info(ECardSimple *simple); - -ECardPhoneFlags phone_correspondences[] = { - 0xFF, /* E_CARD_SIMPLE_PHONE_ID_ASSISTANT, */ - E_CARD_PHONE_WORK | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_BUSINESS, */ - E_CARD_PHONE_WORK | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_BUSINESS_2, */ - E_CARD_PHONE_WORK | E_CARD_PHONE_FAX, /* E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX, */ - 0xFF, /* E_CARD_SIMPLE_PHONE_ID_CALLBACK, */ - E_CARD_PHONE_CAR | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_CAR, */ - 0xFF, /* E_CARD_SIMPLE_PHONE_ID_COMPANY, */ - E_CARD_PHONE_HOME | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_HOME, */ - E_CARD_PHONE_HOME | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_HOME_2, */ - E_CARD_PHONE_HOME | E_CARD_PHONE_FAX, /* E_CARD_SIMPLE_PHONE_ID_HOME_FAX, */ - E_CARD_PHONE_ISDN, /* E_CARD_SIMPLE_PHONE_ID_ISDN, */ - E_CARD_PHONE_CELL | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_MOBILE, */ - E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_OTHER, */ - 0xFF, /* E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, */ - E_CARD_PHONE_PAGER | E_CARD_PHONE_VOICE, /* E_CARD_SIMPLE_PHONE_ID_PAGER, */ - E_CARD_PHONE_PREF, /* E_CARD_SIMPLE_PHONE_ID_PRIMARY, */ - 0xFF, /* E_CARD_SIMPLE_PHONE_ID_RADIO, */ - 0xFF, /* E_CARD_SIMPLE_PHONE_ID_TELEX, */ - 0xFF, /* E_CARD_SIMPLE_PHONE_ID_TTYTTD, */ -}; - -char *phone_names[] = { - NULL, /* E_CARD_SIMPLE_PHONE_ID_ASSISTANT, */ - "Business", - "Business 2", - "Business Fax", - NULL, /* E_CARD_SIMPLE_PHONE_ID_CALLBACK, */ - "Car", - NULL, /* E_CARD_SIMPLE_PHONE_ID_COMPANY, */ - "Home", - "Home 2", - "Home Fax", - "ISDN", - "Mobile", - "Other", - NULL, /* E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, */ - "Pager", - "Primary", - NULL, /* E_CARD_SIMPLE_PHONE_ID_RADIO, */ - NULL, /* E_CARD_SIMPLE_PHONE_ID_TELEX, */ - NULL, /* E_CARD_SIMPLE_PHONE_ID_TTYTTD, */ -}; - -char *phone_short_names[] = { - NULL, /* E_CARD_SIMPLE_PHONE_ID_ASSISTANT, */ - "Bus", - "Bus 2", - "Bus Fax", - NULL, /* E_CARD_SIMPLE_PHONE_ID_CALLBACK, */ - "Car", - NULL, /* E_CARD_SIMPLE_PHONE_ID_COMPANY, */ - "Home", - "Home 2", - "Home Fax", - "ISDN", - "Mob", - "Other", - NULL, /* E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, */ - "Pag", - "Prim", - NULL, /* E_CARD_SIMPLE_PHONE_ID_RADIO, */ - NULL, /* E_CARD_SIMPLE_PHONE_ID_TELEX, */ - NULL, /* E_CARD_SIMPLE_PHONE_ID_TTYTTD, */ -}; - -ECardAddressFlags addr_correspondences[] = { - E_CARD_ADDR_WORK, /* E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, */ - E_CARD_ADDR_HOME, /* E_CARD_SIMPLE_ADDRESS_ID_HOME, */ - E_CARD_ADDR_POSTAL, /* E_CARD_SIMPLE_ADDRESS_ID_OTHER, */ -}; - -char *address_names[] = { - "Business", - "Home", - "Other", -}; - -/** - * e_card_simple_get_type: - * @void: - * - * Registers the &ECardSimple class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ECardSimple class. - **/ -GtkType -e_card_simple_get_type (void) -{ - static GtkType simple_type = 0; - - if (!simple_type) { - GtkTypeInfo simple_info = { - "ECardSimple", - sizeof (ECardSimple), - sizeof (ECardSimpleClass), - (GtkClassInitFunc) e_card_simple_class_init, - (GtkObjectInitFunc) e_card_simple_init, - NULL, /* reserved_1 */ - NULL, /* reserved_2 */ - (GtkClassInitFunc) NULL - }; - - simple_type = gtk_type_unique (gtk_object_get_type (), &simple_info); - } - - return simple_type; -} - -/** - * e_card_simple_new: - * @VCard: a string in vCard format - * - * Returns: a new #ECardSimple that wraps the @VCard. - */ -ECardSimple * -e_card_simple_new (ECard *card) -{ - ECardSimple *simple = E_CARD_SIMPLE(gtk_type_new(e_card_simple_get_type())); - gtk_object_set(GTK_OBJECT(simple), - "card", card, - NULL); - return simple; -} - -ECardSimple *e_card_simple_duplicate(ECardSimple *simple) -{ - char *vcard = e_card_simple_get_vcard(simple); - ECard *card = e_card_new(vcard); - ECardSimple *new_simple = e_card_simple_new(card); - g_free (vcard); - return new_simple; -} - -/** - * e_card_simple_get_id: - * @simple: an #ECardSimple - * - * Returns: a string representing the id of the simple, which is unique - * within its book. - */ -char * -e_card_simple_get_id (ECardSimple *simple) -{ - if (simple->card) - return e_card_get_id(simple->card); - else - return ""; -} - -/** - * e_card_simple_get_id: - * @simple: an #ECardSimple - * @id: a id in string format - * - * Sets the identifier of a simple, which should be unique within its - * book. - */ -void -e_card_simple_set_id (ECardSimple *simple, const char *id) -{ - if ( simple->card ) - e_card_set_id(simple->card, id); -} - -/** - * e_card_simple_get_vcard: - * @simple: an #ECardSimple - * - * Returns: a string in vcard format, which is wrapped by the @simple. - */ -char -*e_card_simple_get_vcard (ECardSimple *simple) -{ - if (simple->card) - return e_card_get_vcard(simple->card); - else - return g_strdup(""); -} - -static void -e_card_simple_class_init (ECardSimpleClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS(klass); - - gtk_object_add_arg_type ("ECardSimple::card", - GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD); - - object_class->destroy = e_card_simple_destroy; - object_class->get_arg = e_card_simple_get_arg; - object_class->set_arg = e_card_simple_set_arg; -} - -/* - * ECardSimple lifecycle management and vcard loading/saving. - */ - -static void -e_card_simple_destroy (GtkObject *object) -{ - ECardSimple *simple; - int i; - - simple = E_CARD_SIMPLE (object); - - if (simple->card) - gtk_object_unref(GTK_OBJECT(simple->card)); - g_list_foreach(simple->temp_fields, (GFunc) g_free, NULL); - g_list_free(simple->temp_fields); - simple->temp_fields = NULL; - - for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) - g_free(simple->phone[i]); - for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) - g_free(simple->email[i]); - for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) - g_free(simple->address[i]); -} - - -/* Set_arg handler for the simple */ -static void -e_card_simple_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ECardSimple *simple; - - simple = E_CARD_SIMPLE (object); - - switch (arg_id) { - case ARG_CARD: - if (simple->card) - gtk_object_unref(GTK_OBJECT(simple->card)); - g_list_foreach(simple->temp_fields, (GFunc) g_free, NULL); - g_list_free(simple->temp_fields); - simple->temp_fields = NULL; - if (GTK_VALUE_OBJECT(*arg)) - simple->card = E_CARD(GTK_VALUE_OBJECT(*arg)); - else - simple->card = NULL; - if(simple->card) - gtk_object_ref(GTK_OBJECT(simple->card)); - fill_in_info(simple); - break; - default: - return; - } -} - -/* Get_arg handler for the simple */ -static void -e_card_simple_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ECardSimple *simple; - - simple = E_CARD_SIMPLE (object); - - switch (arg_id) { - case ARG_CARD: - e_card_simple_sync_card(simple); - if (simple->card) - GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(simple->card); - else - GTK_VALUE_OBJECT (*arg) = NULL; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - - -/** - * e_card_simple_init: - */ -static void -e_card_simple_init (ECardSimple *simple) -{ - int i; - simple->card = NULL; - for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) - simple->phone[i] = NULL; - for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) - simple->email[i] = NULL; - for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) - simple->address[i] = NULL; - simple->temp_fields = NULL; -} - -static void -fill_in_info(ECardSimple *simple) -{ - ECard *card = simple->card; - if (card) { - EList *address_list; - EList *phone_list; - EList *email_list; - EList *delivery_list; - const ECardPhone *phone; - const char *email; - const ECardAddrLabel *address; - const ECardDeliveryAddress *delivery; - int i; - - EIterator *iterator; - - gtk_object_get(GTK_OBJECT(card), - "address_label", &address_list, - "address", &delivery_list, - "phone", &phone_list, - "email", &email_list, - NULL); - for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) { - e_card_phone_free(simple->phone[i]); - simple->phone[i] = NULL; - } - for (iterator = e_list_get_iterator(phone_list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - phone = e_iterator_get(iterator); - for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) { - if (((phone->flags & phone_correspondences[i]) == phone_correspondences[i]) && (simple->phone[i] == NULL)) { - simple->phone[i] = e_card_phone_copy(phone); - break; - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - - for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) { - g_free(simple->email[i]); - simple->email[i] = NULL; - } - for (iterator = e_list_get_iterator(email_list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - email = e_iterator_get(iterator); - for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) { - if ((simple->email[i] == NULL)) { - simple->email[i] = g_strdup(email); - break; - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { - e_card_address_label_free(simple->address[i]); - simple->address[i] = NULL; - } - for (iterator = e_list_get_iterator(address_list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - address = e_iterator_get(iterator); - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { - if (((address->flags & addr_correspondences[i]) == addr_correspondences[i]) && (simple->address[i] == NULL)) { - simple->address[i] = e_card_address_label_copy(address); - break; - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { - e_card_delivery_address_free(simple->delivery[i]); - simple->delivery[i] = NULL; - } - for (iterator = e_list_get_iterator(delivery_list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - delivery = e_iterator_get(iterator); - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { - if (((delivery->flags & addr_correspondences[i]) == addr_correspondences[i]) && (simple->delivery[i] == NULL)) { - simple->delivery[i] = e_card_delivery_address_copy(delivery); - break; - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - } -} - -void -e_card_simple_sync_card(ECardSimple *simple) -{ - ECard *card = simple->card; - if (card) { - EList *address_list; - EList *phone_list; - EList *email_list; - EList *delivery_list; - const ECardPhone *phone; - const ECardAddrLabel *address; - const ECardDeliveryAddress *delivery; - const char *email; - int i; - int iterator_next = 1; - - EIterator *iterator; - - gtk_object_get(GTK_OBJECT(card), - "address_label", &address_list, - "address", &delivery_list, - "phone", &phone_list, - "email", &email_list, - NULL); - - for (iterator = e_list_get_iterator(phone_list); e_iterator_is_valid(iterator); iterator_next ? e_iterator_next(iterator) : FALSE ) { - int i; - phone = e_iterator_get(iterator); - iterator_next = 1; - for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) { - if ((phone->flags & phone_correspondences[i]) == phone_correspondences[i]) { - if (simple->phone[i]) { - simple->phone[i]->flags = phone_correspondences[i]; - if (simple->phone[i]->number && *simple->phone[i]->number) { - e_iterator_set(iterator, simple->phone[i]); - } else { - e_iterator_delete(iterator); - iterator_next = 0; - } - e_card_phone_free(simple->phone[i]); - simple->phone[i] = NULL; - break; - } - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) { - if (simple->phone[i]) { - simple->phone[i]->flags = phone_correspondences[i]; - e_list_append(phone_list, simple->phone[i]); - e_card_phone_free(simple->phone[i]); - simple->phone[i] = NULL; - } - } - - for (iterator = e_list_get_iterator(email_list); e_iterator_is_valid(iterator); iterator_next ? e_iterator_next(iterator) : FALSE ) { - int i; - email = e_iterator_get(iterator); - iterator_next = 1; - for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) { - if (simple->email[i]) { - if (*simple->email[i]) { - e_iterator_set(iterator, simple->email[i]); - } else { - e_iterator_delete(iterator); - iterator_next = 0; - } - g_free(simple->email[i]); - simple->email[i] = NULL; - break; - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) { - if (simple->email[i]) { - e_list_append(email_list, simple->email[i]); - g_free(simple->email[i]); - simple->email[i] = NULL; - } - } - - for (iterator = e_list_get_iterator(address_list); e_iterator_is_valid(iterator); iterator_next ? e_iterator_next(iterator) : FALSE ) { - int i; - address = e_iterator_get(iterator); - iterator_next = 1; - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { - if ((address->flags & addr_correspondences[i]) == addr_correspondences[i]) { - if (simple->address[i]) { - simple->address[i]->flags = addr_correspondences[i]; - if (simple->address[i]->data && *simple->address[i]->data) { - e_iterator_set(iterator, simple->address[i]); - } else { - e_iterator_delete(iterator); - iterator_next = 0; - } - e_card_address_label_free(simple->address[i]); - simple->address[i] = NULL; - break; - } - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { - if (simple->address[i]) { - simple->address[i]->flags = addr_correspondences[i]; - e_list_append(address_list, simple->address[i]); - e_card_address_label_free(simple->address[i]); - simple->address[i] = NULL; - } - } - - for (iterator = e_list_get_iterator(delivery_list); e_iterator_is_valid(iterator); iterator_next ? e_iterator_next(iterator) : FALSE ) { - int i; - delivery = e_iterator_get(iterator); - iterator_next = 1; - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { - if ((delivery->flags & addr_correspondences[i]) == addr_correspondences[i]) { - if (simple->delivery[i]) { - simple->delivery[i]->flags = addr_correspondences[i]; - if (!e_card_delivery_address_is_empty(simple->delivery[i])) { - e_iterator_set(iterator, simple->delivery[i]); - } else { - e_iterator_delete(iterator); - iterator_next = 0; - } - e_card_delivery_address_free(simple->delivery[i]); - simple->delivery[i] = NULL; - break; - } - } - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) { - if (simple->delivery[i]) { - simple->delivery[i]->flags = addr_correspondences[i]; - e_list_append(delivery_list, simple->delivery[i]); - e_card_delivery_address_free(simple->delivery[i]); - simple->delivery[i] = NULL; - } - } - fill_in_info(simple); - } -} - -const ECardPhone *e_card_simple_get_phone (ECardSimple *simple, - ECardSimplePhoneId id) -{ - return simple->phone[id]; -} - -const char *e_card_simple_get_email (ECardSimple *simple, - ECardSimpleEmailId id) -{ - return simple->email[id]; -} - -const ECardAddrLabel *e_card_simple_get_address (ECardSimple *simple, - ECardSimpleAddressId id) -{ - return simple->address[id]; -} - -const ECardDeliveryAddress *e_card_simple_get_delivery_address (ECardSimple *simple, - ECardSimpleAddressId id) -{ - return simple->delivery[id]; -} - -void e_card_simple_set_phone (ECardSimple *simple, - ECardSimplePhoneId id, - const ECardPhone *phone) -{ - if (simple->phone[id]) - e_card_phone_free(simple->phone[id]); - simple->phone[id] = e_card_phone_copy(phone); -} - -void e_card_simple_set_email (ECardSimple *simple, - ECardSimpleEmailId id, - const char *email) -{ - if (simple->email[id]) - g_free(simple->email[id]); - simple->email[id] = g_strdup(email); -} - -void e_card_simple_set_address (ECardSimple *simple, - ECardSimpleAddressId id, - const ECardAddrLabel *address) -{ - if (simple->address[id]) - e_card_address_label_free(simple->address[id]); - simple->address[id] = e_card_address_label_copy(address); - if (simple->delivery[id]) - e_card_delivery_address_free(simple->delivery[id]); - simple->delivery[id] = e_card_delivery_address_from_label(simple->address[id]); -} - -void e_card_simple_set_delivery_address (ECardSimple *simple, - ECardSimpleAddressId id, - const ECardDeliveryAddress *delivery) -{ - if (simple->delivery[id]) - e_card_delivery_address_free(simple->delivery[id]); - simple->delivery[id] = e_card_delivery_address_copy(delivery); -} - -const char *e_card_simple_get_const (ECardSimple *simple, - ECardSimpleField field) -{ - char *ret_val = e_card_simple_get(simple, field); - if (ret_val) - simple->temp_fields = g_list_prepend(simple->temp_fields, ret_val); - return ret_val; -} - -char *e_card_simple_get (ECardSimple *simple, - ECardSimpleField field) -{ - ECardSimpleInternalType type = field_data[field].type; - const ECardAddrLabel *addr; - const ECardPhone *phone; - const char *string; - ECardDate *date; - ECardName *name; - switch(type) { - case E_CARD_SIMPLE_INTERNAL_TYPE_STRING: - gtk_object_get(GTK_OBJECT(simple->card), - field_data[field].ecard_field, &string, - NULL); - return g_strdup(string); - case E_CARD_SIMPLE_INTERNAL_TYPE_DATE: - gtk_object_get(GTK_OBJECT(simple->card), - field_data[field].ecard_field, &date, - NULL); - return NULL; /* FIXME!!!! */ - case E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS: - addr = e_card_simple_get_address(simple, - field_data[field].list_type_index); - if (addr) - return g_strdup(addr->data); - else - return NULL; - case E_CARD_SIMPLE_INTERNAL_TYPE_PHONE: - phone = e_card_simple_get_phone(simple, - field_data[field].list_type_index); - if (phone) - return g_strdup(phone->number); - else - return NULL; - case E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL: - string = e_card_simple_get_email(simple, - field_data[field].list_type_index); - return g_strdup(string); - case E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL: - switch (field) { - case E_CARD_SIMPLE_FIELD_NAME_OR_ORG: - gtk_object_get(GTK_OBJECT(simple->card), - "full_name", &string, - NULL); - if (string && *string) - return g_strdup(string); - gtk_object_get(GTK_OBJECT(simple->card), - "org", &string, - NULL); - if (string && *string) - return g_strdup(string); - string = e_card_simple_get_email(simple, - E_CARD_SIMPLE_EMAIL_ID_EMAIL); - return g_strdup(string); - case E_CARD_SIMPLE_FIELD_FAMILY_NAME: - gtk_object_get (GTK_OBJECT(simple->card), - "name", &name, - NULL); - return g_strdup (name->family); - default: - return NULL; - } - default: - return NULL; - } -} - -static char * -name_to_style(const ECardName *name, char *company, int style) -{ - char *string; - char *strings[4], **stringptr; - char *substring; - switch (style) { - case 0: - stringptr = strings; - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->given && *name->given) - *(stringptr++) = name->given; - *stringptr = NULL; - string = g_strjoinv(", ", strings); - break; - case 1: - stringptr = strings; - if (name->given && *name->given) - *(stringptr++) = name->given; - if (name->family && *name->family) - *(stringptr++) = name->family; - *stringptr = NULL; - string = g_strjoinv(" ", strings); - break; - case 2: - string = g_strdup(company); - break; - case 3: /* Fall Through */ - case 4: - stringptr = strings; - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->given && *name->given) - *(stringptr++) = name->given; - *stringptr = NULL; - substring = g_strjoinv(", ", strings); - if (!(company && *company)) - company = ""; - if (style == 3) - string = g_strdup_printf("%s (%s)", substring, company); - else - string = g_strdup_printf("%s (%s)", company, substring); - g_free(substring); - break; - default: - string = g_strdup(""); - } - return string; -} - -static int -file_as_get_style (ECardSimple *simple) -{ - char *filestring = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FILE_AS); - char *trystring; - char *full_name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FULL_NAME); - char *company = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_ORG); - ECardName *name = NULL; - int i; - int style; - style = 0; - if (!full_name) - full_name = g_strdup(""); - if (!company) - company = g_strdup(""); - if (filestring) { - - name = e_card_name_from_string(full_name); - - if (!name) { - goto end; - } - - style = -1; - - for (i = 0; i < 5; i++) { - trystring = name_to_style(name, company, i); - if (!strcmp(trystring, filestring)) { - g_free(trystring); - style = i; - goto end; - } - g_free(trystring); - } - } - end: - - g_free(filestring); - g_free(full_name); - g_free(company); - if (name) - e_card_name_free(name); - - return style; -} - -static void -file_as_set_style(ECardSimple *simple, int style) -{ - if (style != -1) { - char *string; - char *full_name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_FULL_NAME); - char *company = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_ORG); - ECardName *name; - - if (!full_name) - full_name = g_strdup(""); - if (!company) - company = g_strdup(""); - name = e_card_name_from_string(full_name); - if (name) { - string = name_to_style(name, company, style); - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_FILE_AS, string); - g_free(string); - } - g_free(full_name); - g_free(company); - e_card_name_free(name); - } -} - -void e_card_simple_set (ECardSimple *simple, - ECardSimpleField field, - const char *data) -{ - ECardSimpleInternalType type = field_data[field].type; - ECardAddrLabel *address; - ECardPhone *phone; - int style; - switch (field) { - case E_CARD_SIMPLE_FIELD_FULL_NAME: - case E_CARD_SIMPLE_FIELD_ORG: - style = file_as_get_style(simple); - gtk_object_set(GTK_OBJECT(simple->card), - field_data[field].ecard_field, data, - NULL); - file_as_set_style(simple, style); - break; - default: - switch(type) { - case E_CARD_SIMPLE_INTERNAL_TYPE_STRING: - gtk_object_set(GTK_OBJECT(simple->card), - field_data[field].ecard_field, data, - NULL); - break; - case E_CARD_SIMPLE_INTERNAL_TYPE_DATE: - break; /* FIXME!!!! */ - case E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS: - address = e_card_address_label_new(); - address->data = (char *) data; - e_card_simple_set_address(simple, - field_data[field].list_type_index, - address); - address->data = NULL; - e_card_address_label_free(address); - break; - case E_CARD_SIMPLE_INTERNAL_TYPE_PHONE: - phone = e_card_phone_new(); - phone->number = (char *) data; - e_card_simple_set_phone(simple, - field_data[field].list_type_index, - phone); - phone->number = NULL; - e_card_phone_free(phone); - break; - case E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL: - e_card_simple_set_email(simple, - field_data[field].list_type_index, - data); - break; - case E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL: - break; - } - break; - } -} - -ECardSimpleType e_card_simple_type (ECardSimple *simple, - ECardSimpleField field) -{ - ECardSimpleInternalType type = field_data[field].type; - switch(type) { - case E_CARD_SIMPLE_INTERNAL_TYPE_STRING: - case E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS: - case E_CARD_SIMPLE_INTERNAL_TYPE_PHONE: - case E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL: - default: - return E_CARD_SIMPLE_TYPE_STRING; - - case E_CARD_SIMPLE_INTERNAL_TYPE_DATE: - return E_CARD_SIMPLE_TYPE_DATE; - - case E_CARD_SIMPLE_INTERNAL_TYPE_SPECIAL: - return E_CARD_SIMPLE_TYPE_STRING; - } -} - -const char *e_card_simple_get_ecard_field (ECardSimple *simple, - ECardSimpleField field) -{ - return field_data[field].ecard_field; -} - -const char *e_card_simple_get_name (ECardSimple *simple, - ECardSimpleField field) -{ - return field_data[field].name; -} - -const char *e_card_simple_get_short_name (ECardSimple *simple, - ECardSimpleField field) -{ - return field_data[field].short_name; -} - -void e_card_simple_arbitrary_foreach (ECardSimple *simple, - ECardSimpleArbitraryCallback *callback, - gpointer closure) -{ - if (simple->card) { - EList *list; - EIterator *iterator; - gtk_object_get(GTK_OBJECT(simple->card), - "arbitrary", &list, - NULL); - for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ECardArbitrary *arbitrary = e_iterator_get(iterator); - if (callback) - (*callback) (arbitrary, closure); - } - } -} - -const ECardArbitrary *e_card_simple_get_arbitrary (ECardSimple *simple, - const char *key) -{ - if (simple->card) { - EList *list; - EIterator *iterator; - gtk_object_get(GTK_OBJECT(simple->card), - "arbitrary", &list, - NULL); - for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ECardArbitrary *arbitrary = e_iterator_get(iterator); - if (!strcasecmp(arbitrary->key, key)) - return arbitrary; - } - } - return NULL; -} - -/* Any of these except key can be NULL */ -void e_card_simple_set_arbitrary (ECardSimple *simple, - const char *key, - const char *type, - const char *value) -{ - if (simple->card) { - ECardArbitrary *new_arb; - EList *list; - EIterator *iterator; - gtk_object_get(GTK_OBJECT(simple->card), - "arbitrary", &list, - NULL); - for (iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ECardArbitrary *arbitrary = e_iterator_get(iterator); - if (!strcasecmp(arbitrary->key, key)) { - new_arb = e_card_arbitrary_new(); - new_arb->key = g_strdup(key); - new_arb->type = g_strdup(type); - new_arb->value = g_strdup(value); - e_iterator_set(iterator, new_arb); - e_card_arbitrary_free(new_arb); - return; - } - } - new_arb = e_card_arbitrary_new(); - new_arb->key = g_strdup(key); - new_arb->type = g_strdup(type); - new_arb->value = g_strdup(value); - e_list_append(list, new_arb); - e_card_arbitrary_free(new_arb); - } -} - -/* These map between the individual list types and ECardSimpleField */ -ECardSimpleField -e_card_simple_map_phone_to_field (ECardSimplePhoneId phone_id) -{ - int i; - - g_return_val_if_fail (phone_id < E_CARD_SIMPLE_PHONE_ID_LAST, 0); - - for (i = 0; i < field_data_count; i ++) - if (field_data[i].list_type_index == phone_id - && field_data[i].type == E_CARD_SIMPLE_INTERNAL_TYPE_PHONE) - return i; - - g_warning ("couldn't find phone id %d, returning 0 (which is almost assuredly incorrect)\n", phone_id); - - return 0; -} - -ECardSimpleField -e_card_simple_map_email_to_field (ECardSimpleEmailId email_id) -{ - int i; - - g_return_val_if_fail (email_id < E_CARD_SIMPLE_EMAIL_ID_LAST, 0); - - for (i = 0; i < field_data_count; i ++) - if (field_data[i].list_type_index == email_id - && field_data[i].type == E_CARD_SIMPLE_INTERNAL_TYPE_EMAIL) - return i; - - g_warning ("couldn't find email id %d, returning 0 (which is almost assuredly incorrect)\n", email_id); - return 0; -} - -ECardSimpleField -e_card_simple_map_address_to_field (ECardSimpleAddressId address_id) -{ - int i; - - g_return_val_if_fail (address_id < E_CARD_SIMPLE_ADDRESS_ID_LAST, 0); - - for (i = 0; i < field_data_count; i ++) - if (field_data[i].list_type_index == address_id - && field_data[i].type == E_CARD_SIMPLE_INTERNAL_TYPE_ADDRESS) - return i; - - g_warning ("couldn't find address id %d, returning 0 (which is almost assuredly incorrect)\n", address_id); - return 0; -} diff --git a/addressbook/backend/ebook/e-card-simple.h b/addressbook/backend/ebook/e-card-simple.h deleted file mode 100644 index 608e7488df..0000000000 --- a/addressbook/backend/ebook/e-card-simple.h +++ /dev/null @@ -1,218 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@helixcode.com> - * Arturo Espinosa - * Nat Friedman (nat@helixcode.com) - * - * Copyright (C) 2000 Helix Code, Inc. - * Copyright (C) 1999 The Free Software Foundation - */ - -#ifndef __E_CARD_SIMPLE_H__ -#define __E_CARD_SIMPLE_H__ - -#include <time.h> -#include <gtk/gtk.h> -#include <stdio.h> -#include <addressbook/backend/ebook/e-card.h> -#include <addressbook/backend/ebook/e-card-types.h> -#include <e-util/e-list.h> - -#define E_TYPE_CARD_SIMPLE (e_card_simple_get_type ()) -#define E_CARD_SIMPLE(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CARD_SIMPLE, ECardSimple)) -#define E_CARD_SIMPLE_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CARD_SIMPLE, ECardSimpleClass)) -#define E_IS_CARD_SIMPLE(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CARD_SIMPLE)) -#define E_IS_CARD_SIMPLE_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD_SIMPLE)) - -typedef enum _ECardSimplePhoneId ECardSimplePhoneId; -typedef enum _ECardSimpleEmailId ECardSimpleEmailId; -typedef enum _ECardSimpleAddressId ECardSimpleAddressId; -typedef enum _ECardSimpleType ECardSimpleType; -typedef enum _ECardSimpleField ECardSimpleField; - -enum _ECardSimplePhoneId { - E_CARD_SIMPLE_PHONE_ID_ASSISTANT, - E_CARD_SIMPLE_PHONE_ID_BUSINESS, - E_CARD_SIMPLE_PHONE_ID_BUSINESS_2, - E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX, - E_CARD_SIMPLE_PHONE_ID_CALLBACK, - E_CARD_SIMPLE_PHONE_ID_CAR, - E_CARD_SIMPLE_PHONE_ID_COMPANY, - E_CARD_SIMPLE_PHONE_ID_HOME, - E_CARD_SIMPLE_PHONE_ID_HOME_2, - E_CARD_SIMPLE_PHONE_ID_HOME_FAX, - E_CARD_SIMPLE_PHONE_ID_ISDN, - E_CARD_SIMPLE_PHONE_ID_MOBILE, - E_CARD_SIMPLE_PHONE_ID_OTHER, - E_CARD_SIMPLE_PHONE_ID_OTHER_FAX, - E_CARD_SIMPLE_PHONE_ID_PAGER, - E_CARD_SIMPLE_PHONE_ID_PRIMARY, - E_CARD_SIMPLE_PHONE_ID_RADIO, - E_CARD_SIMPLE_PHONE_ID_TELEX, - E_CARD_SIMPLE_PHONE_ID_TTYTTD, - E_CARD_SIMPLE_PHONE_ID_LAST -}; - -/* We need HOME and WORK email addresses here. */ -enum _ECardSimpleEmailId { - E_CARD_SIMPLE_EMAIL_ID_EMAIL, - E_CARD_SIMPLE_EMAIL_ID_EMAIL_2, - E_CARD_SIMPLE_EMAIL_ID_EMAIL_3, - E_CARD_SIMPLE_EMAIL_ID_LAST -}; - -/* Should this include (BILLING/SHIPPING)? */ -enum _ECardSimpleAddressId { - E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, - E_CARD_SIMPLE_ADDRESS_ID_HOME, - E_CARD_SIMPLE_ADDRESS_ID_OTHER, - E_CARD_SIMPLE_ADDRESS_ID_LAST -}; - -enum _ECardSimpleType { - E_CARD_SIMPLE_TYPE_STRING, - E_CARD_SIMPLE_TYPE_DATE, -}; - -enum _ECardSimpleField { - E_CARD_SIMPLE_FIELD_FILE_AS, - E_CARD_SIMPLE_FIELD_FULL_NAME, - E_CARD_SIMPLE_FIELD_FAMILY_NAME, - E_CARD_SIMPLE_FIELD_EMAIL, - E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, - E_CARD_SIMPLE_FIELD_PHONE_ASSISTANT, - E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, - E_CARD_SIMPLE_FIELD_PHONE_CALLBACK, - E_CARD_SIMPLE_FIELD_PHONE_COMPANY, - E_CARD_SIMPLE_FIELD_PHONE_HOME, - E_CARD_SIMPLE_FIELD_ORG, - E_CARD_SIMPLE_FIELD_ADDRESS_BUSINESS, - E_CARD_SIMPLE_FIELD_ADDRESS_HOME, - E_CARD_SIMPLE_FIELD_PHONE_MOBILE, - E_CARD_SIMPLE_FIELD_PHONE_CAR, - E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX, - E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX, - E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2, - E_CARD_SIMPLE_FIELD_PHONE_HOME_2, - E_CARD_SIMPLE_FIELD_PHONE_ISDN, - E_CARD_SIMPLE_FIELD_PHONE_OTHER, - E_CARD_SIMPLE_FIELD_PHONE_OTHER_FAX, - E_CARD_SIMPLE_FIELD_PHONE_PAGER, - E_CARD_SIMPLE_FIELD_PHONE_RADIO, - E_CARD_SIMPLE_FIELD_PHONE_TELEX, - E_CARD_SIMPLE_FIELD_PHONE_TTYTTD, - E_CARD_SIMPLE_FIELD_ADDRESS_OTHER, - E_CARD_SIMPLE_FIELD_EMAIL_2, - E_CARD_SIMPLE_FIELD_EMAIL_3, - E_CARD_SIMPLE_FIELD_URL, - E_CARD_SIMPLE_FIELD_ORG_UNIT, - E_CARD_SIMPLE_FIELD_OFFICE, - E_CARD_SIMPLE_FIELD_TITLE, - E_CARD_SIMPLE_FIELD_ROLE, - E_CARD_SIMPLE_FIELD_MANAGER, - E_CARD_SIMPLE_FIELD_ASSISTANT, - E_CARD_SIMPLE_FIELD_NICKNAME, - E_CARD_SIMPLE_FIELD_SPOUSE, - E_CARD_SIMPLE_FIELD_NOTE, - E_CARD_SIMPLE_FIELD_FBURL, - E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING = E_CARD_SIMPLE_FIELD_FBURL, - E_CARD_SIMPLE_FIELD_ANNIVERSARY, - E_CARD_SIMPLE_FIELD_BIRTH_DATE, - E_CARD_SIMPLE_FIELD_MAILER, - E_CARD_SIMPLE_FIELD_NAME_OR_ORG, - E_CARD_SIMPLE_FIELD_CATEGORIES, - E_CARD_SIMPLE_FIELD_LAST -}; - -typedef struct _ECardSimple ECardSimple; -typedef struct _ECardSimpleClass ECardSimpleClass; - -struct _ECardSimple { - GtkObject object; - ECard *card; - - GList *temp_fields; - - ECardPhone *phone[E_CARD_SIMPLE_PHONE_ID_LAST]; - char *email[E_CARD_SIMPLE_EMAIL_ID_LAST]; - ECardAddrLabel *address[E_CARD_SIMPLE_ADDRESS_ID_LAST]; - ECardDeliveryAddress *delivery[E_CARD_SIMPLE_ADDRESS_ID_LAST]; -}; - -struct _ECardSimpleClass { - GtkObjectClass parent_class; -}; - -typedef void (*ECardSimpleArbitraryCallback) (const ECardArbitrary *arbitrary, gpointer closure); -ECardSimple *e_card_simple_new (ECard *card); -char *e_card_simple_get_id (ECardSimple *simple); -void e_card_simple_set_id (ECardSimple *simple, - const gchar *character); -char *e_card_simple_get_vcard (ECardSimple *simple); -ECardSimple *e_card_simple_duplicate (ECardSimple *simple); -char *e_card_simple_get (ECardSimple *simple, - ECardSimpleField field); -const char *e_card_simple_get_const (ECardSimple *simple, - ECardSimpleField field); -void e_card_simple_set (ECardSimple *simple, - ECardSimpleField field, - const char *data); -ECardSimpleType e_card_simple_type (ECardSimple *simple, - ECardSimpleField field); - -const char *e_card_simple_get_ecard_field (ECardSimple *simple, - ECardSimpleField field); -const char *e_card_simple_get_name (ECardSimple *simple, - ECardSimpleField field); -const char *e_card_simple_get_short_name (ECardSimple *simple, - ECardSimpleField field); - - -/* Use these only if building lists of specific types. It should be - * easier to use the above if you consider a phone field to be the - * same as any other field. - */ -const ECardPhone *e_card_simple_get_phone (ECardSimple *simple, - ECardSimplePhoneId id); -const char *e_card_simple_get_email (ECardSimple *simple, - ECardSimpleEmailId id); -const ECardAddrLabel *e_card_simple_get_address (ECardSimple *simple, - ECardSimpleAddressId id); -const ECardDeliveryAddress *e_card_simple_get_delivery_address (ECardSimple *simple, - ECardSimpleAddressId id); -void e_card_simple_set_phone (ECardSimple *simple, - ECardSimplePhoneId id, - const ECardPhone *phone); -void e_card_simple_set_email (ECardSimple *simple, - ECardSimpleEmailId id, - const char *email); -void e_card_simple_set_address (ECardSimple *simple, - ECardSimpleAddressId id, - const ECardAddrLabel *address); -void e_card_simple_set_delivery_address (ECardSimple *simple, - ECardSimpleAddressId id, - const ECardDeliveryAddress *delivery); -void e_card_simple_arbitrary_foreach (ECardSimple *simple, - ECardSimpleArbitraryCallback *callback, - gpointer closure); -const ECardArbitrary *e_card_simple_get_arbitrary (ECardSimple *simple, - const char *key); -/* Any of these except key can be NULL */ -void e_card_simple_set_arbitrary (ECardSimple *simple, - const char *key, - const char *type, - const char *value); -void e_card_simple_sync_card (ECardSimple *simple); - -/* These map between the individual list types and ECardSimpleField */ -ECardSimpleField e_card_simple_map_phone_to_field (ECardSimplePhoneId phone_id); -ECardSimpleField e_card_simple_map_email_to_field (ECardSimpleEmailId email_id); -ECardSimpleField e_card_simple_map_address_to_field (ECardSimpleAddressId address_id); - -/* Standard Gtk function */ -GtkType e_card_simple_get_type (void); - -#endif /* ! __E_CARD_SIMPLE_H__ */ - - diff --git a/addressbook/backend/ebook/e-card-types.h b/addressbook/backend/ebook/e-card-types.h deleted file mode 100644 index 57aed690aa..0000000000 --- a/addressbook/backend/ebook/e-card-types.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Arturo Espinosa - * Nat Friedman (nat@helixcode.com) - * - * Copyright (C) 2000 Helix Code, Inc. - * Copyright (C) 1999 The Free Software Foundation - */ - -#ifndef __E_CARD_TYPES_H__ -#define __E_CARD_TYPES_H__ - -/* IDENTIFICATION PROPERTIES */ - -typedef struct { - char *prefix; /* Mr. */ - char *given; /* John */ - char *additional; /* Quinlan */ - char *family; /* Public */ - char *suffix; /* Esq. */ -} ECardName; - -typedef struct { - int year; - int month; - int day; -} ECardDate; - -/* TELECOMMUNICATIONS ADDRESSING PROPERTIES */ - -typedef enum { - E_CARD_PHONE_PREF = 1 << 0, - E_CARD_PHONE_WORK = 1 << 1, - E_CARD_PHONE_HOME = 1 << 2, - E_CARD_PHONE_VOICE = 1 << 3, - E_CARD_PHONE_FAX = 1 << 4, - E_CARD_PHONE_MSG = 1 << 5, - E_CARD_PHONE_CELL = 1 << 6, - E_CARD_PHONE_PAGER = 1 << 7, - E_CARD_PHONE_BBS = 1 << 8, - E_CARD_PHONE_MODEM = 1 << 9, - E_CARD_PHONE_CAR = 1 << 10, - E_CARD_PHONE_ISDN = 1 << 11, - E_CARD_PHONE_VIDEO = 1 << 12 -} ECardPhoneFlags; - -typedef struct { - ECardPhoneFlags flags; - char *number; -} ECardPhone; - -/* DELIVERY ADDRESSING PROPERTIES */ - -typedef enum { - E_CARD_ADDR_HOME = 1 << 0, - E_CARD_ADDR_WORK = 1 << 1, - E_CARD_ADDR_POSTAL = 1 << 2, - E_CARD_ADDR_PARCEL = 1 << 3, - E_CARD_ADDR_DOM = 1 << 4, - E_CARD_ADDR_INTL = 1 << 5 -} ECardAddressFlags; - -typedef struct { - ECardAddressFlags flags; - - char *po; - char *ext; - char *street; - char *city; - char *region; - char *code; - char *country; -} ECardDeliveryAddress; - -typedef struct { - ECardAddressFlags flags; - char *data; -} ECardAddrLabel; - -/* ARBITRARY PROPERTIES */ - -typedef struct { - char *key; - char *type; - char *value; -} ECardArbitrary; - -#endif /* __E_CARD_TYPES_H__ */ diff --git a/addressbook/backend/ebook/e-card.c b/addressbook/backend/ebook/e-card.c deleted file mode 100644 index ca160f0905..0000000000 --- a/addressbook/backend/ebook/e-card.c +++ /dev/null @@ -1,3673 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Arturo Espinosa (arturo@nuclecu.unam.mx) - * Nat Friedman (nat@helixcode.com) - * - * Copyright (C) 2000 Helix Code, Inc. - * Copyright (C) 1999 The Free Software Foundation - */ - -#include <config.h> -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <gtk/gtkobject.h> -#include <bonobo/bonobo-object-client.h> -#include <gal/util/e-util.h> - -#include <libversit/vcc.h> -#include "e-util/ename/e-name-western.h" -#include "e-util/ename/e-address-western.h" - -#include "e-card.h" -#include "e-card-pairs.h" - -#define is_a_prop_of(obj,prop) (isAPropertyOf ((obj),(prop))) -#define str_val(obj) (the_str = (vObjectValueType (obj))? fakeCString (vObjectUStringZValue (obj)) : calloc (1, 1)) -#define has(obj,prop) (vo = isAPropertyOf ((obj), (prop))) - -#define XEV_WANTS_HTML "X-MOZILLA-HTML" -#define XEV_ARBITRARY "X-EVOLUTION-ARBITRARY" - -/* Object argument IDs */ -enum { - ARG_0, - ARG_FILE_AS, - ARG_FULL_NAME, - ARG_NAME, - ARG_ADDRESS, - ARG_ADDRESS_LABEL, - ARG_PHONE, - ARG_EMAIL, - ARG_BIRTH_DATE, - ARG_URL, - ARG_ORG, - ARG_ORG_UNIT, - ARG_OFFICE, - ARG_TITLE, - ARG_ROLE, - ARG_MANAGER, - ARG_ASSISTANT, - ARG_NICKNAME, - ARG_SPOUSE, - ARG_ANNIVERSARY, - ARG_MAILER, - ARG_FBURL, - ARG_NOTE, - ARG_CATEGORIES, - ARG_CATEGORY_LIST, - ARG_WANTS_HTML, - ARG_WANTS_HTML_SET, - ARG_ARBITRARY, - ARG_ID, -}; - -#if 0 -static VObject *card_convert_to_vobject (ECard *crd); -#endif -static void parse(ECard *card, VObject *vobj); -static void e_card_init (ECard *card); -static void e_card_class_init (ECardClass *klass); - -static void e_card_destroy (GtkObject *object); -static void e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); - -static void assign_string(VObject *vobj, char **string); - -char *e_v_object_get_child_value(VObject *vobj, char *name); -static ECardDate e_card_date_from_string (char *str); - -static void parse_bday(ECard *card, VObject *object); -static void parse_full_name(ECard *card, VObject *object); -static void parse_file_as(ECard *card, VObject *object); -static void parse_name(ECard *card, VObject *object); -static void parse_email(ECard *card, VObject *object); -static void parse_phone(ECard *card, VObject *object); -static void parse_address(ECard *card, VObject *object); -static void parse_address_label(ECard *card, VObject *object); -static void parse_url(ECard *card, VObject *object); -static void parse_org(ECard *card, VObject *object); -static void parse_office(ECard *card, VObject *object); -static void parse_title(ECard *card, VObject *object); -static void parse_role(ECard *card, VObject *object); -static void parse_manager(ECard *card, VObject *object); -static void parse_assistant(ECard *card, VObject *object); -static void parse_nickname(ECard *card, VObject *object); -static void parse_spouse(ECard *card, VObject *object); -static void parse_anniversary(ECard *card, VObject *object); -static void parse_mailer(ECard *card, VObject *object); -static void parse_fburl(ECard *card, VObject *object); -static void parse_note(ECard *card, VObject *object); -static void parse_categories(ECard *card, VObject *object); -static void parse_wants_html(ECard *card, VObject *object); -static void parse_arbitrary(ECard *card, VObject *object); -static void parse_id(ECard *card, VObject *object); - -static ECardPhoneFlags get_phone_flags (VObject *vobj); -static void set_phone_flags (VObject *vobj, ECardPhoneFlags flags); -static ECardAddressFlags get_address_flags (VObject *vobj); -static void set_address_flags (VObject *vobj, ECardAddressFlags flags); - -typedef void (* ParsePropertyFunc) (ECard *card, VObject *object); - -struct { - char *key; - ParsePropertyFunc function; -} attribute_jump_array[] = -{ - { VCFullNameProp, parse_full_name }, - { "X-EVOLUTION-FILE-AS", parse_file_as }, - { VCNameProp, parse_name }, - { VCBirthDateProp, parse_bday }, - { VCEmailAddressProp, parse_email }, - { VCTelephoneProp, parse_phone }, - { VCAdrProp, parse_address }, - { VCDeliveryLabelProp, parse_address_label }, - { VCURLProp, parse_url }, - { VCOrgProp, parse_org }, - { "X-EVOLUTION-OFFICE", parse_office }, - { VCTitleProp, parse_title }, - { VCBusinessRoleProp, parse_role }, - { "X-EVOLUTION-MANAGER", parse_manager }, - { "X-EVOLUTION-ASSISTANT", parse_assistant }, - { "NICKNAME", parse_nickname }, - { "X-EVOLUTION-SPOUSE", parse_spouse }, - { "X-EVOLUTION-ANNIVERSARY", parse_anniversary }, - { VCMailerProp, parse_mailer }, - { "FBURL", parse_fburl }, - { VCNoteProp, parse_note }, - { "CATEGORIES", parse_categories }, - { XEV_WANTS_HTML, parse_wants_html }, - { XEV_ARBITRARY, parse_arbitrary }, - { VCUniqueStringProp, parse_id } -}; - -/** - * e_card_get_type: - * @void: - * - * Registers the &ECard class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ECard class. - **/ -GtkType -e_card_get_type (void) -{ - static GtkType card_type = 0; - - if (!card_type) { - GtkTypeInfo card_info = { - "ECard", - sizeof (ECard), - sizeof (ECardClass), - (GtkClassInitFunc) e_card_class_init, - (GtkObjectInitFunc) e_card_init, - NULL, /* reserved_1 */ - NULL, /* reserved_2 */ - (GtkClassInitFunc) NULL - }; - - card_type = gtk_type_unique (gtk_object_get_type (), &card_info); - } - - return card_type; -} - -/** - * e_card_new: - * @vcard: a string in vCard format - * - * Returns: a new #ECard that wraps the @vcard. - */ -ECard * -e_card_new (char *vcard) -{ - ECard *card = E_CARD(gtk_type_new(e_card_get_type())); - VObject *vobj = Parse_MIME(vcard, strlen(vcard)); - while(vobj) { - VObject *next; - parse(card, vobj); - next = nextVObjectInList(vobj); - cleanVObject(vobj); - vobj = next; - } - if (card->name == NULL) - card->name = e_card_name_new(); - if (card->file_as == NULL) - card->file_as = g_strdup(""); - if (card->fname == NULL) - card->fname = g_strdup(""); - return card; -} - -ECard *e_card_duplicate(ECard *card) -{ - char *vcard = e_card_get_vcard(card); - ECard *new_card = e_card_new(vcard); - g_free (vcard); - return new_card; -} - -/** - * e_card_get_id: - * @card: an #ECard - * - * Returns: a string representing the id of the card, which is unique - * within its book. - */ -char * -e_card_get_id (ECard *card) -{ - return card->id; -} - -/** - * e_card_get_id: - * @card: an #ECard - * @id: a id in string format - * - * Sets the identifier of a card, which should be unique within its - * book. - */ -void -e_card_set_id (ECard *card, const char *id) -{ - if ( card->id ) - g_free(card->id); - card->id = g_strdup(id); -} - -/** - * e_card_get_vcard: - * @card: an #ECard - * - * Returns: a string in vCard format, which is wrapped by the @card. - */ -char -*e_card_get_vcard (ECard *card) -{ - VObject *vobj; /*, *vprop; */ - char *temp, *ret_val; - - vobj = newVObject (VCCardProp); - - if ( card->file_as && *card->file_as ) - addPropValue(vobj, "X-EVOLUTION-FILE-AS", card->file_as); - else if (card->file_as) - addProp(vobj, "X-EVOLUTION-FILE_AS"); - - if ( card->fname ) - addPropValue(vobj, VCFullNameProp, card->fname); - else if (card->fname) - addProp(vobj, VCFullNameProp); - - if ( card->name && (card->name->prefix || card->name->given || card->name->additional || card->name->family || card->name->suffix) ) { - VObject *nameprop; - nameprop = addProp(vobj, VCNameProp); - if ( card->name->prefix ) - addPropValue(nameprop, VCNamePrefixesProp, card->name->prefix); - if ( card->name->given ) - addPropValue(nameprop, VCGivenNameProp, card->name->given); - if ( card->name->additional ) - addPropValue(nameprop, VCAdditionalNamesProp, card->name->additional); - if ( card->name->family ) - addPropValue(nameprop, VCFamilyNameProp, card->name->family); - if ( card->name->suffix ) - addPropValue(nameprop, VCNameSuffixesProp, card->name->suffix); - } - else if (card->name) - addProp(vobj, VCNameProp); - - - if ( card->address ) { - EIterator *iterator = e_list_get_iterator(card->address); - for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) { - VObject *addressprop; - ECardDeliveryAddress *address = (ECardDeliveryAddress *) e_iterator_get(iterator); - addressprop = addProp(vobj, VCAdrProp); - - set_address_flags (addressprop, address->flags); - if ( address->po ) - addPropValue(addressprop, VCPostalBoxProp, address->po); - if ( address->ext ) - addPropValue(addressprop, VCExtAddressProp, address->ext); - if ( address->street ) - addPropValue(addressprop, VCStreetAddressProp, address->street); - if ( address->city ) - addPropValue(addressprop, VCCityProp, address->city); - if ( address->region ) - addPropValue(addressprop, VCRegionProp, address->region); - if ( address->code ) - addPropValue(addressprop, VCPostalCodeProp, address->code); - if ( address->country ) - addPropValue(addressprop, VCCountryNameProp, address->country); - addProp(addressprop, VCQuotedPrintableProp); - } - gtk_object_unref(GTK_OBJECT(iterator)); - } - - if ( card->address_label ) { - EIterator *iterator = e_list_get_iterator(card->address_label); - for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) { - VObject *labelprop; - ECardAddrLabel *address_label = (ECardAddrLabel *) e_iterator_get(iterator); - if (address_label->data) - labelprop = addPropValue(vobj, VCDeliveryLabelProp, address_label->data); - else - labelprop = addProp(vobj, VCDeliveryLabelProp); - - set_address_flags (labelprop, address_label->flags); - addProp(labelprop, VCQuotedPrintableProp); - } - gtk_object_unref(GTK_OBJECT(iterator)); - } - - if ( card->phone ) { - EIterator *iterator = e_list_get_iterator(card->phone); - for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) { - VObject *phoneprop; - ECardPhone *phone = (ECardPhone *) e_iterator_get(iterator); - phoneprop = addPropValue(vobj, VCTelephoneProp, phone->number); - - set_phone_flags (phoneprop, phone->flags); - } - gtk_object_unref(GTK_OBJECT(iterator)); - } - - if ( card->email ) { - EIterator *iterator = e_list_get_iterator(card->email); - for ( ; e_iterator_is_valid(iterator) ;e_iterator_next(iterator) ) { - VObject *emailprop; - emailprop = addPropValue(vobj, VCEmailAddressProp, (char *) e_iterator_get(iterator)); - addProp (emailprop, VCInternetProp); - } - gtk_object_unref(GTK_OBJECT(iterator)); - } - - if ( card->bday ) { - ECardDate date; - char *value; - date = *card->bday; - date.year = MIN(date.year, 9999); - date.month = MIN(date.month, 12); - date.day = MIN(date.day, 31); - value = g_strdup_printf("%04d-%02d-%02d", date.year, date.month, date.day); - addPropValue(vobj, VCBirthDateProp, value); - g_free(value); - } - - if (card->url) - addPropValue(vobj, VCURLProp, card->url); - - if (card->org || card->org_unit) { - VObject *orgprop; - orgprop = addProp(vobj, VCOrgProp); - - if (card->org) - addPropValue(orgprop, VCOrgNameProp, card->org); - if (card->org_unit) - addPropValue(orgprop, VCOrgUnitProp, card->org_unit); - } - - if (card->office) - addPropValue(vobj, "X-EVOLUTION-OFFICE", card->office); - - if (card->title) - addPropValue(vobj, VCTitleProp, card->title); - - if (card->role) - addPropValue(vobj, VCBusinessRoleProp, card->role); - - if (card->manager) - addPropValue(vobj, "X-EVOLUTION-MANAGER", card->manager); - - if (card->assistant) - addPropValue(vobj, "X-EVOLUTION-ASSISTANT", card->assistant); - - if (card->nickname) - addPropValue(vobj, "NICKNAME", card->nickname); - - if (card->spouse) - addPropValue(vobj, "X-EVOLUTION-SPOUSE", card->spouse); - - if ( card->anniversary ) { - ECardDate date; - char *value; - date = *card->anniversary; - date.year = MIN(date.year, 9999); - date.month = MIN(date.month, 12); - date.day = MIN(date.day, 31); - value = g_strdup_printf("%04d-%02d-%02d", date.year, date.month, date.day); - addPropValue(vobj, "X-EVOLUTION-ANNIVERSARY", value); - g_free(value); - } - - if (card->mailer) { - addPropValue(vobj, VCMailerProp, card->mailer); - } - - if (card->fburl) - addPropValue(vobj, "FBURL", card->fburl); - - if (card->note) { - VObject *noteprop; - - noteprop = addPropValue(vobj, VCNoteProp, card->note); - addProp(noteprop, VCQuotedPrintableProp); - } - - if (card->categories) { - EIterator *iterator; - int length = 0; - char *string; - char *stringptr; - for (iterator = e_list_get_iterator(card->categories); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - length += strlen(e_iterator_get(iterator)) + 1; - } - string = g_new(char, length + 1); - stringptr = string; - *stringptr = 0; - for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - strcpy(stringptr, e_iterator_get(iterator)); - stringptr += strlen(stringptr); - *stringptr = ','; - stringptr++; - *stringptr = 0; - } - if (stringptr > string) { - stringptr --; - *stringptr = 0; - } - addPropValue (vobj, "CATEGORIES", string); - g_free(string); - } - - if (card->wants_html_set) { - addPropValue (vobj, XEV_WANTS_HTML, card->wants_html ? "TRUE" : "FALSE"); - } - - if (card->arbitrary) { - EIterator *iterator; - for (iterator = e_list_get_iterator(card->arbitrary); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ECardArbitrary *arbitrary = e_iterator_get(iterator); - VObject *arb_object; - if (arbitrary->value) { - arb_object = addPropValue (vobj, XEV_ARBITRARY, arbitrary->value); - } else { - arb_object = addProp (vobj, XEV_ARBITRARY); - } - if (arbitrary->type) { - addPropValue (arb_object, "TYPE", arbitrary->type); - } - if (arbitrary->key) { - addProp (arb_object, arbitrary->key); - } - } - } - - if (card->id) - addPropValue (vobj, VCUniqueStringProp, card->id); -#if 0 - - - if (crd->photo.prop.used) { - vprop = addPropSizedValue (vobj, VCPhotoProp, - crd->photo.data, crd->photo.size); - add_PhotoType (vprop, crd->photo.type); - add_CardProperty (vprop, &crd->photo.prop); - } - - if (crd->xtension.l) { - GList *node; - - for (node = crd->xtension.l; node; node = node->next) { - CardXProperty *xp = (CardXProperty *) node->data; - addPropValue (vobj, xp->name, xp->data); - add_CardProperty (vobj, &xp->prop); - } - } - - if (crd->timezn.prop.used) { - char *str; - - str = card_timezn_str (crd->timezn); - vprop = addPropValue (vobj, VCTimeZoneProp, str); - free (str); - add_CardProperty (vprop, &crd->timezn.prop); - } - - if (crd->geopos.prop.used) { - char *str; - - str = card_geopos_str (crd->geopos); - vprop = addPropValue (vobj, VCGeoLocationProp, str); - free (str); - add_CardProperty (vprop, &crd->geopos.prop); - } - - if (crd->logo.prop.used) { - vprop = addPropSizedValue (vobj, VCLogoProp, - crd->logo.data, crd->logo.size); - add_PhotoType (vprop, crd->logo.type); - add_CardProperty (vprop, &crd->logo.prop); - } - - if (crd->agent) - addVObjectProp (vobj, card_convert_to_vobject (crd->agent)); - - if (crd->sound.prop.used) { - if (crd->sound.type != SOUND_PHONETIC) - vprop = addPropSizedValue (vobj, VCPronunciationProp, - crd->sound.data, crd->sound.size); - else - vprop = addPropValue (vobj, VCPronunciationProp, - crd->sound.data); - - add_SoundType (vprop, crd->sound.type); - add_CardProperty (vprop, &crd->sound.prop); - } - - if (crd->key.prop.used) { - vprop = addPropValue (vobj, VCPublicKeyProp, crd->key.data); - add_KeyType (vprop, crd->key.type); - add_CardProperty (vprop, &crd->key.prop); - } -#endif - temp = writeMemVObject(NULL, NULL, vobj); - ret_val = g_strdup(temp); - free(temp); - cleanVObject(vobj); - return ret_val; -} - -static void -parse_file_as(ECard *card, VObject *vobj) -{ - if ( card->file_as ) - g_free(card->file_as); - assign_string(vobj, &(card->file_as)); -} - -static void -parse_name(ECard *card, VObject *vobj) -{ - if ( card->name ) { - e_card_name_free(card->name); - } - card->name = g_new(ECardName, 1); - - card->name->family = e_v_object_get_child_value (vobj, VCFamilyNameProp); - card->name->given = e_v_object_get_child_value (vobj, VCGivenNameProp); - card->name->additional = e_v_object_get_child_value (vobj, VCAdditionalNamesProp); - card->name->prefix = e_v_object_get_child_value (vobj, VCNamePrefixesProp); - card->name->suffix = e_v_object_get_child_value (vobj, VCNameSuffixesProp); -} - -static void -parse_full_name(ECard *card, VObject *vobj) -{ - if ( card->fname ) - g_free(card->fname); - assign_string(vobj, &(card->fname)); -} - -static void -parse_email(ECard *card, VObject *vobj) -{ - char *next_email; - EList *list; - - assign_string(vobj, &next_email); - gtk_object_get(GTK_OBJECT(card), - "email", &list, - NULL); - e_list_append(list, next_email); - g_free (next_email); -} - -static void -parse_bday(ECard *card, VObject *vobj) -{ - if ( vObjectValueType (vobj) ) { - char *str = fakeCString (vObjectUStringZValue (vobj)); - if ( card->bday ) - g_free(card->bday); - card->bday = g_new(ECardDate, 1); - *(card->bday) = e_card_date_from_string(str); - free(str); - } -} - -static void -parse_phone(ECard *card, VObject *vobj) -{ - ECardPhone *next_phone = g_new(ECardPhone, 1); - EList *list; - - assign_string(vobj, &(next_phone->number)); - next_phone->flags = get_phone_flags(vobj); - - gtk_object_get(GTK_OBJECT(card), - "phone", &list, - NULL); - e_list_append(list, next_phone); - e_card_phone_free (next_phone); -} - -static void -parse_address(ECard *card, VObject *vobj) -{ - ECardDeliveryAddress *next_addr = g_new(ECardDeliveryAddress, 1); - EList *list; - - next_addr->flags = get_address_flags (vobj); - next_addr->po = e_v_object_get_child_value (vobj, VCPostalBoxProp); - next_addr->ext = e_v_object_get_child_value (vobj, VCExtAddressProp); - next_addr->street = e_v_object_get_child_value (vobj, VCStreetAddressProp); - next_addr->city = e_v_object_get_child_value (vobj, VCCityProp); - next_addr->region = e_v_object_get_child_value (vobj, VCRegionProp); - next_addr->code = e_v_object_get_child_value (vobj, VCPostalCodeProp); - next_addr->country = e_v_object_get_child_value (vobj, VCCountryNameProp); - - gtk_object_get(GTK_OBJECT(card), - "address", &list, - NULL); - e_list_append(list, next_addr); - e_card_delivery_address_free (next_addr); -} - -static void -parse_address_label(ECard *card, VObject *vobj) -{ - ECardAddrLabel *next_addr = g_new(ECardAddrLabel, 1); - EList *list; - - next_addr->flags = get_address_flags (vobj); - assign_string(vobj, &next_addr->data); - - gtk_object_get(GTK_OBJECT(card), - "address_label", &list, - NULL); - e_list_append(list, next_addr); - e_card_address_label_free (next_addr); -} - -static void -parse_url(ECard *card, VObject *vobj) -{ - if (card->url) - g_free(card->url); - assign_string(vobj, &(card->url)); -} - -static void -parse_org(ECard *card, VObject *vobj) -{ - char *temp; - - temp = e_v_object_get_child_value(vobj, VCOrgNameProp); - if (temp) { - if (card->org) - g_free(card->org); - card->org = temp; - } - temp = e_v_object_get_child_value(vobj, VCOrgUnitProp); - if (temp) { - if (card->org_unit) - g_free(card->org_unit); - card->org_unit = temp; - } -} - -static void -parse_office(ECard *card, VObject *vobj) -{ - if ( card->office ) - g_free(card->office); - assign_string(vobj, &(card->office)); -} - -static void -parse_title(ECard *card, VObject *vobj) -{ - if ( card->title ) - g_free(card->title); - assign_string(vobj, &(card->title)); -} - -static void -parse_role(ECard *card, VObject *vobj) -{ - if (card->role) - g_free(card->role); - assign_string(vobj, &(card->role)); -} - -static void -parse_manager(ECard *card, VObject *vobj) -{ - if ( card->manager ) - g_free(card->manager); - assign_string(vobj, &(card->manager)); -} - -static void -parse_assistant(ECard *card, VObject *vobj) -{ - if ( card->assistant ) - g_free(card->assistant); - assign_string(vobj, &(card->assistant)); -} - -static void -parse_nickname(ECard *card, VObject *vobj) -{ - if (card->nickname) - g_free(card->nickname); - assign_string(vobj, &(card->nickname)); -} - -static void -parse_spouse(ECard *card, VObject *vobj) -{ - if ( card->spouse ) - g_free(card->spouse); - assign_string(vobj, &(card->spouse)); -} - -static void -parse_anniversary(ECard *card, VObject *vobj) -{ - if ( vObjectValueType (vobj) ) { - char *str = fakeCString (vObjectUStringZValue (vobj)); - if (card->anniversary) - g_free(card->anniversary); - card->anniversary = g_new(ECardDate, 1); - *(card->anniversary) = e_card_date_from_string(str); - free(str); - } -} - -static void -parse_mailer(ECard *card, VObject *vobj) -{ - if ( card->mailer ) - g_free(card->mailer); - assign_string(vobj, &(card->mailer)); -} - -static void -parse_fburl(ECard *card, VObject *vobj) -{ - g_free(card->fburl); - assign_string(vobj, &(card->fburl)); -} - -static void -parse_note(ECard *card, VObject *vobj) -{ - g_free(card->note); - assign_string(vobj, &(card->note)); -} - -static void -add_list_unique(ECard *card, EList *list, char *string) -{ - char *temp = e_strdup_strip(string); - EIterator *iterator; - - if (!*temp) { - g_free(temp); - return; - } - for ( iterator = e_list_get_iterator(list); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - if (!strcmp(e_iterator_get(iterator), temp)) { - break; - } - } - if (!e_iterator_is_valid(iterator)) { - e_list_append(list, temp); - } - g_free(temp); - gtk_object_unref(GTK_OBJECT(iterator)); -} - -static void -do_parse_categories(ECard *card, char *str) -{ - int length = strlen(str); - char *copy = g_new(char, length + 1); - int i, j; - EList *list; - gtk_object_get(GTK_OBJECT(card), - "category_list", &list, - NULL); - for (i = 0, j = 0; str[i]; i++, j++) { - switch (str[i]) { - case '\\': - i++; - if (str[i]) { - copy[j] = str[i]; - } else - i--; - break; - case ',': - copy[j] = 0; - add_list_unique(card, list, copy); - j = -1; - break; - default: - copy[j] = str[i]; - break; - } - } - copy[j] = 0; - add_list_unique(card, list, copy); - g_free(copy); -} - -static void -parse_categories(ECard *card, VObject *vobj) -{ - if ( vObjectValueType (vobj) ) { - char *str = fakeCString (vObjectUStringZValue (vobj)); - do_parse_categories(card, str); - free(str); - } -} - -static void -parse_wants_html(ECard *card, VObject *vobj) -{ - if ( vObjectValueType (vobj) ) { - char *str = fakeCString (vObjectUStringZValue (vobj)); - if (!strcasecmp(str, "true")) { - card->wants_html = TRUE; - card->wants_html_set = TRUE; - } - if (!strcasecmp(str, "false")) { - card->wants_html = FALSE; - card->wants_html_set = TRUE; - } - free(str); - } -} - -typedef union ValueItem { - const char *strs; - const wchar_t *ustrs; - unsigned int i; - unsigned long l; - void *any; - VObject *vobj; -} ValueItem; - -struct VObject { - VObject *next; - const char *id; - VObject *prop; - unsigned short valType; - ValueItem val; -}; - -static void -parse_arbitrary(ECard *card, VObject *vobj) -{ - ECardArbitrary *arbitrary = e_card_arbitrary_new(); - VObjectIterator iterator; - EList *list; - for ( initPropIterator (&iterator, vobj); moreIteration(&iterator); ) { - VObject *temp = nextVObject(&iterator); - const char *name = vObjectName(temp); - if (name && !strcmp(name, "TYPE")) { - g_free(arbitrary->type); - assign_string(temp, &(arbitrary->type)); - } else { - g_free(arbitrary->key); - arbitrary->key = g_strdup(name); - } - } - - assign_string(vobj, &(arbitrary->value)); - - gtk_object_get(GTK_OBJECT(card), - "arbitrary", &list, - NULL); - e_list_append(list, arbitrary); - e_card_arbitrary_free(arbitrary); -} - -static void -parse_id(ECard *card, VObject *vobj) -{ - if ( card->id ) - g_free(card->id); - assign_string(vobj, &(card->id)); -} - -static void -parse_attribute(ECard *card, VObject *vobj) -{ - ParsePropertyFunc function = g_hash_table_lookup(E_CARD_CLASS(GTK_OBJECT(card)->klass)->attribute_jump_table, vObjectName(vobj)); - if ( function ) - function(card, vobj); -} - -static void -parse(ECard *card, VObject *vobj) -{ - VObjectIterator iterator; - initPropIterator(&iterator, vobj); - while(moreIteration (&iterator)) { - parse_attribute(card, nextVObject(&iterator)); - } - if (!card->fname) { - card->fname = g_strdup(""); - } - if (!card->name) { - card->name = e_card_name_from_string(card->fname); - } - if (!card->file_as) { - ECardName *name = card->name; - char *strings[3], **stringptr; - char *string; - stringptr = strings; - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->given && *name->given) - *(stringptr++) = name->given; - *stringptr = NULL; - string = g_strjoinv(", ", strings); - card->file_as = string; - } -} - -static void -e_card_class_init (ECardClass *klass) -{ - int i; - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS(klass); - - klass->attribute_jump_table = g_hash_table_new(g_str_hash, g_str_equal); - - for ( i = 0; i < sizeof(attribute_jump_array) / sizeof(attribute_jump_array[0]); i++ ) { - g_hash_table_insert(klass->attribute_jump_table, attribute_jump_array[i].key, attribute_jump_array[i].function); - } - - gtk_object_add_arg_type ("ECard::file_as", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FILE_AS); - gtk_object_add_arg_type ("ECard::full_name", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FULL_NAME); - gtk_object_add_arg_type ("ECard::name", - GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_NAME); - gtk_object_add_arg_type ("ECard::address", - GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS); - gtk_object_add_arg_type ("ECard::address_label", - GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_ADDRESS_LABEL); - gtk_object_add_arg_type ("ECard::phone", - GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_PHONE); - gtk_object_add_arg_type ("ECard::email", - GTK_TYPE_OBJECT, GTK_ARG_READABLE, ARG_EMAIL); - gtk_object_add_arg_type ("ECard::birth_date", - GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BIRTH_DATE); - gtk_object_add_arg_type ("ECard::url", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_URL); - gtk_object_add_arg_type ("ECard::org", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG); - gtk_object_add_arg_type ("ECard::org_unit", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ORG_UNIT); - gtk_object_add_arg_type ("ECard::office", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_OFFICE); - gtk_object_add_arg_type ("ECard::title", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TITLE); - gtk_object_add_arg_type ("ECard::role", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ROLE); - gtk_object_add_arg_type ("ECard::manager", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_MANAGER); - gtk_object_add_arg_type ("ECard::assistant", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ASSISTANT); - gtk_object_add_arg_type ("ECard::nickname", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NICKNAME); - gtk_object_add_arg_type ("ECard::spouse", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_SPOUSE); - gtk_object_add_arg_type ("ECard::anniversary", - GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_ANNIVERSARY); - gtk_object_add_arg_type ("ECard::mailer", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_MAILER); - gtk_object_add_arg_type ("ECard::fburl", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FBURL); - gtk_object_add_arg_type ("ECard::note", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NOTE); - gtk_object_add_arg_type ("ECard::categories", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_CATEGORIES); - gtk_object_add_arg_type ("ECard::category_list", - GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CATEGORY_LIST); - gtk_object_add_arg_type ("ECard::wants_html", - GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_WANTS_HTML); - gtk_object_add_arg_type ("ECard::wants_html_set", - GTK_TYPE_BOOL, GTK_ARG_READABLE, ARG_WANTS_HTML); - gtk_object_add_arg_type ("ECard::arbitrary", - GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_ARBITRARY); - gtk_object_add_arg_type ("ECard::id", - GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_ID); - - - object_class->destroy = e_card_destroy; - object_class->get_arg = e_card_get_arg; - object_class->set_arg = e_card_set_arg; -} - -ECardPhone * -e_card_phone_new (void) -{ - ECardPhone *newphone = g_new(ECardPhone, 1); - - newphone->number = NULL; - newphone->flags = 0; - - return newphone; -} - -void -e_card_phone_free (ECardPhone *phone) -{ - if ( phone ) { - g_free(phone->number); - - g_free(phone); - } -} - -ECardPhone * -e_card_phone_copy (const ECardPhone *phone) -{ - if ( phone ) { - ECardPhone *phone_copy = g_new(ECardPhone, 1); - phone_copy->number = g_strdup(phone->number); - phone_copy->flags = phone->flags; - return phone_copy; - } else - return NULL; -} - -ECardDeliveryAddress * -e_card_delivery_address_new (void) -{ - ECardDeliveryAddress *newaddr = g_new(ECardDeliveryAddress, 1); - - newaddr->po = NULL; - newaddr->ext = NULL; - newaddr->street = NULL; - newaddr->city = NULL; - newaddr->region = NULL; - newaddr->code = NULL; - newaddr->country = NULL; - newaddr->flags = 0; - - return newaddr; -} - -void -e_card_delivery_address_free (ECardDeliveryAddress *addr) -{ - if ( addr ) { - g_free(addr->po); - g_free(addr->ext); - g_free(addr->street); - g_free(addr->city); - g_free(addr->region); - g_free(addr->code); - g_free(addr->country); - - g_free(addr); - } -} - -ECardDeliveryAddress * -e_card_delivery_address_copy (const ECardDeliveryAddress *addr) -{ - if ( addr ) { - ECardDeliveryAddress *addr_copy = g_new(ECardDeliveryAddress, 1); - addr_copy->po = g_strdup(addr->po ); - addr_copy->ext = g_strdup(addr->ext ); - addr_copy->street = g_strdup(addr->street ); - addr_copy->city = g_strdup(addr->city ); - addr_copy->region = g_strdup(addr->region ); - addr_copy->code = g_strdup(addr->code ); - addr_copy->country = g_strdup(addr->country); - addr_copy->flags = addr->flags; - return addr_copy; - } else - return NULL; -} - -gboolean -e_card_delivery_address_is_empty (const ECardDeliveryAddress *addr) -{ - return (((addr->po == NULL) || (*addr->po == 0)) && - ((addr->ext == NULL) || (*addr->ext == 0)) && - ((addr->street == NULL) || (*addr->street == 0)) && - ((addr->city == NULL) || (*addr->city == 0)) && - ((addr->region == NULL) || (*addr->region == 0)) && - ((addr->code == NULL) || (*addr->code == 0)) && - ((addr->country == NULL) || (*addr->country == 0))); -} - -ECardDeliveryAddress * -e_card_delivery_address_from_label(const ECardAddrLabel *label) -{ - ECardDeliveryAddress *addr = g_new(ECardDeliveryAddress, 1); - EAddressWestern *western = e_address_western_parse (label->data); - - addr->po = g_strdup (western->po_box ); - addr->ext = g_strdup (western->extended ); - addr->street = g_strdup (western->street ); - addr->city = g_strdup (western->locality ); - addr->region = g_strdup (western->region ); - addr->code = g_strdup (western->postal_code); - addr->country = g_strdup (western->country ); - addr->flags = label->flags; - - e_address_western_free(western); - - return addr; -} - -char * -e_card_delivery_address_to_string(const ECardDeliveryAddress *addr) -{ - char *strings[5], **stringptr = strings; - char *line1, *line22, *line2; - char *final; - if (addr->po && *addr->po) - *(stringptr++) = addr->po; - if (addr->street && *addr->street) - *(stringptr++) = addr->street; - *stringptr = NULL; - line1 = g_strjoinv(" ", strings); - stringptr = strings; - if (addr->region && *addr->region) - *(stringptr++) = addr->region; - if (addr->code && *addr->code) - *(stringptr++) = addr->code; - *stringptr = NULL; - line22 = g_strjoinv(" ", strings); - stringptr = strings; - if (addr->city && *addr->city) - *(stringptr++) = addr->city; - if (line22 && *line22) - *(stringptr++) = line22; - *stringptr = NULL; - line2 = g_strjoinv(", ", strings); - stringptr = strings; - if (line1 && *line1) - *(stringptr++) = line1; - if (addr->ext && *addr->ext) - *(stringptr++) = addr->ext; - if (line2 && *line2) - *(stringptr++) = line2; - if (addr->country && *addr->country) - *(stringptr++) = addr->country; - *stringptr = NULL; - final = g_strjoinv("\n", strings); - g_free(line1); - g_free(line22); - g_free(line2); - return final; -} - -ECardAddrLabel * -e_card_delivery_address_to_label (const ECardDeliveryAddress *addr) -{ - ECardAddrLabel *label; - label = e_card_address_label_new(); - label->flags = addr->flags; - label->data = e_card_delivery_address_to_string(addr); - - return label; -} - -ECardAddrLabel * -e_card_address_label_new (void) -{ - ECardAddrLabel *newaddr = g_new(ECardAddrLabel, 1); - - newaddr->data = NULL; - newaddr->flags = 0; - - return newaddr; -} - -void -e_card_address_label_free (ECardAddrLabel *addr) -{ - if ( addr ) { - g_free(addr->data); - - g_free(addr); - } -} - -ECardAddrLabel * -e_card_address_label_copy (const ECardAddrLabel *addr) -{ - if ( addr ) { - ECardAddrLabel *addr_copy = g_new(ECardAddrLabel, 1); - addr_copy->data = g_strdup(addr->data); - addr_copy->flags = addr->flags; - return addr_copy; - } else - return NULL; -} - -ECardName *e_card_name_new(void) -{ - ECardName *newname = g_new(ECardName, 1); - - newname->prefix = NULL; - newname->given = NULL; - newname->additional = NULL; - newname->family = NULL; - newname->suffix = NULL; - - return newname; -} - -void -e_card_name_free(ECardName *name) -{ - if (name) { - if ( name->prefix ) - g_free(name->prefix); - if ( name->given ) - g_free(name->given); - if ( name->additional ) - g_free(name->additional); - if ( name->family ) - g_free(name->family); - if ( name->suffix ) - g_free(name->suffix); - g_free ( name ); - } -} - -ECardName * -e_card_name_copy(const ECardName *name) -{ - if (name) { - ECardName *newname = g_new(ECardName, 1); - - newname->prefix = g_strdup(name->prefix); - newname->given = g_strdup(name->given); - newname->additional = g_strdup(name->additional); - newname->family = g_strdup(name->family); - newname->suffix = g_strdup(name->suffix); - - return newname; - } else - return NULL; -} - -char * -e_card_name_to_string(const ECardName *name) -{ - char *strings[6], **stringptr = strings; - - g_return_val_if_fail (name != NULL, NULL); - - if (name->prefix && *name->prefix) - *(stringptr++) = name->prefix; - if (name->given && *name->given) - *(stringptr++) = name->given; - if (name->additional && *name->additional) - *(stringptr++) = name->additional; - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->suffix && *name->suffix) - *(stringptr++) = name->suffix; - *stringptr = NULL; - return g_strjoinv(" ", strings); -} - -ECardName * -e_card_name_from_string(const char *full_name) -{ - ECardName *name = g_new(ECardName, 1); - ENameWestern *western = e_name_western_parse (full_name); - - name->prefix = g_strdup (western->prefix); - name->given = g_strdup (western->first ); - name->additional = g_strdup (western->middle); - name->family = g_strdup (western->last ); - name->suffix = g_strdup (western->suffix); - - e_name_western_free(western); - - return name; -} - - -/* This *so* doesn't belong here... at least not implemented in a - sucky way like this. But by getting it in here now, I can fix it - up w/o adding a new feature when we are in feature freeze. :-) */ - -/* This is very Anglocentric. Maybe it should be by locale? */ -static gchar *name_synonyms[][2] = { - { "Jon", "John" }, /* Ah, the hacker's perogative */ - { "Jon", "Jonathan" }, - { "Daniel", "Dan" }, - { "Joseph", "Joe" }, - { "Robert", "Rob" }, - { "Robert", "Bob" }, - { "Richard", "Rich" }, - { "Richard", "Dick" }, - { "William", "Will" }, - { "William", "Bill" }, - { "Anthony", "Tony" }, - { "Steven", "Steve" }, - { "Michael", "Mike" }, - { "Douglas", "Doug" }, - { "Sidney", "Sid" }, - { "Eric", "Erik" }, - { "Chris", "Christopher" }, - { "Chris", "Christine" }, - { "Chris", "Christy" }, - { "Elizabeth", "Liz" }, - { "Jeff", "Geoff" }, - { "Jeff", "Jeffrey" }, - { "Jeff", "Geoffrey" }, - { "Jim", "James" }, - { "Abigal", "Abby" }, - { "Amanda", "Amy" }, - { "Amanda", "Manda" }, - { "Di", "Diana" }, - { "Di", "Diane" }, - { "Maxine", "Max" }, - { "Rebecca", "Becca" }, - { "Rebecca", "Becky" }, - { "Jennifer", "Jen" }, - { "Jennifer", "Jenny" }, - /* We could go on and on... */ - { NULL, NULL } -}; - -static gboolean -name_fragment_match (const gchar *a, const gchar *b) -{ - gint i; - gboolean nickname_match = FALSE; - - if (!g_strcasecmp (a, b)) - return TRUE; - - /* Check for nicknames. Yes, the linear search blows. */ - for (i=0; name_synonyms[i][0]; ++i) { - if (!g_strcasecmp (name_synonyms[i][1], a)) { - a = name_synonyms[i][0]; - nickname_match = TRUE; - break; - } - } - - for (i=0; name_synonyms[i][0]; ++i) { - if (!g_strcasecmp (name_synonyms[i][1], b)) { - b = name_synonyms[i][0]; - nickname_match = TRUE; - break; - } - } - - return nickname_match && !g_strcasecmp (a, b); -} - -gboolean -e_card_name_match_string (const ECardName *name, const gchar *str) -{ - gchar *cpy, *name_str; - gchar **strv, **namev; - gint i, j, match_count; - gboolean matched = FALSE; - - g_return_val_if_fail (name != NULL, FALSE); - g_return_val_if_fail (str != NULL, FALSE); - - cpy = g_strdup (str); - strv = g_strsplit (cpy, " ", 0); - for (i=0; strv[i]; ++i) - g_strstrip (strv[i]); - - name_str = e_card_name_to_string (name); - namev = g_strsplit (name_str, " ", 0); - for (i=0; namev[i]; ++i) - g_strstrip (namev[i]); - - match_count = 0; - i = j = 0; - while (strv[i] && namev[j]) { - gint k1, k2; - - for (k1=0; strv[i+k1]; ++k1) { - if (name_fragment_match (strv[i+k1], namev[j])) - break; - } - - for (k2=0; namev[j+k2]; ++k2) { - if (name_fragment_match (strv[i], namev[j+k2])) - break; - } - - if (strv[i+k1] == NULL && namev[j+k2] == NULL) { - matched = FALSE; - goto cleanup_and_return; - } - - ++match_count; - - if (k1 < k2) { - i += k1+1; - ++j; - } else if (k2 < k1) { - ++i; - j += k2+1; - } else if (k1 == k2) { - i += k1+1; - j += k2+1; - } - } - - /* This rule could be made more precise. - As it is, it will say that "Joe Smith" will match the name - "Joe Allen Smith" (which is good), but "de Icaza" will match - either "Miguel de Icaza" as well as Miguel's shiftless - brother "Roger de Icaza". In this sort of a case, the match - threshold should go up to 3. */ - if (match_count >= 2) - matched = TRUE; - - - cleanup_and_return: - g_free (strv); - g_free (cpy); - g_free (namev); - g_free (name_str); - - return matched; -} - -ECardArbitrary * -e_card_arbitrary_new(void) -{ - ECardArbitrary *arbitrary = g_new(ECardArbitrary, 1); - arbitrary->key = NULL; - arbitrary->type = NULL; - arbitrary->value = NULL; - return arbitrary; -} - -ECardArbitrary * -e_card_arbitrary_copy(const ECardArbitrary *arbitrary) -{ - if (arbitrary) { - ECardArbitrary *arb_copy = g_new(ECardArbitrary, 1); - arb_copy->key = g_strdup(arbitrary->key); - arb_copy->type = g_strdup(arbitrary->type); - arb_copy->value = g_strdup(arbitrary->value); - return arb_copy; - } else - return NULL; -} - -void -e_card_arbitrary_free(ECardArbitrary *arbitrary) -{ - if (arbitrary) { - g_free(arbitrary->key); - g_free(arbitrary->type); - g_free(arbitrary->value); - } - g_free(arbitrary); -} - -/* EMail matching */ -static gboolean -e_card_email_match_single_string (const gchar *a, const gchar *b) -{ - const gchar *xa = NULL, *xb = NULL; - gboolean match = TRUE; - - for (xa=a; *xa && *xa != '@'; ++xa); - for (xb=b; *xb && *xb != '@'; ++xb); - - if (xa-a != xb-b || *xa != *xb || g_strncasecmp (a, b, xa-a)) - return FALSE; - - if (*xa == '\0') - return TRUE; - - /* Find the end of the string, then walk through backwards comparing. - This is so that we'll match joe@foobar.com and joe@mail.foobar.com. - */ - while (*xa) - ++xa; - while (*xb) - ++xb; - - while (match && *xa != '@' && *xb != '@') { - match = (*xa == *xb); - --xa; - --xb; - } - - match = match && ((*xa == *xb) || (*xa == '.') || (*xb == '.')); - - return match; -} - -gboolean -e_card_email_match_string (const ECard *card, const gchar *str) -{ - EIterator *iter; - - g_return_val_if_fail (card && E_IS_CARD (card), FALSE); - g_return_val_if_fail (str != NULL, FALSE); - - iter = e_list_get_iterator (card->email); - for (e_iterator_reset (iter); e_iterator_is_valid (iter); e_iterator_next (iter)) { - if (e_card_email_match_single_string (e_iterator_get (iter), str)) - return TRUE; - } - gtk_object_unref (GTK_OBJECT (iter)); - - return FALSE; -} - -/* - * ECard lifecycle management and vCard loading/saving. - */ - -static void -e_card_destroy (GtkObject *object) -{ - ECard *card = E_CARD(object); - g_free(card->id); - g_free(card->file_as); - g_free(card->fname); - if ( card->name ) - e_card_name_free(card->name); - g_free(card->bday); - - g_free(card->url); - g_free(card->org); - g_free(card->org_unit); - g_free(card->office); - g_free(card->title); - g_free(card->role); - g_free(card->manager); - g_free(card->assistant); - g_free(card->nickname); - g_free(card->spouse); - g_free(card->anniversary); - g_free(card->fburl); - g_free(card->note); - - if (card->categories) - gtk_object_unref(GTK_OBJECT(card->categories)); - if (card->email) - gtk_object_unref(GTK_OBJECT(card->email)); - if (card->phone) - gtk_object_unref(GTK_OBJECT(card->phone)); - if (card->address) - gtk_object_unref(GTK_OBJECT(card->address)); - if (card->address_label) - gtk_object_unref(GTK_OBJECT(card->address_label)); -} - - -/* Set_arg handler for the card */ -static void -e_card_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ECard *card; - - card = E_CARD (object); - - switch (arg_id) { - case ARG_FILE_AS: - g_free(card->file_as); - card->file_as = g_strdup(GTK_VALUE_STRING(*arg)); - if (card->file_as == NULL) - card->file_as = g_strdup(""); - break; - case ARG_FULL_NAME: - g_free(card->fname); - card->fname = g_strdup(GTK_VALUE_STRING(*arg)); - if (card->name) - e_card_name_free (card->name); - if (card->fname == NULL) - card->fname = g_strdup(""); - card->name = e_card_name_from_string (card->fname); - break; - case ARG_NAME: - if ( card->name ) - e_card_name_free(card->name); - card->name = e_card_name_copy(GTK_VALUE_POINTER(*arg)); - break; - case ARG_CATEGORIES: - if (card->categories) - gtk_object_unref(GTK_OBJECT(card->categories)); - card->categories = NULL; - if (GTK_VALUE_STRING(*arg)) - do_parse_categories(card, GTK_VALUE_STRING(*arg)); - break; - case ARG_CATEGORY_LIST: - if (card->categories) - gtk_object_unref(GTK_OBJECT(card->categories)); - card->categories = E_LIST(GTK_VALUE_OBJECT(*arg)); - if (card->categories) - gtk_object_ref(GTK_OBJECT(card->categories)); - break; - case ARG_BIRTH_DATE: - g_free(card->bday); - card->bday = GTK_VALUE_POINTER(*arg); - break; - case ARG_URL: - g_free(card->url); - card->url = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_ORG: - g_free(card->org); - card->org = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_ORG_UNIT: - g_free(card->org_unit); - card->org_unit = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_OFFICE: - g_free(card->office); - card->office = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_TITLE: - g_free(card->title); - card->title = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_ROLE: - g_free(card->role); - card->role = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_MANAGER: - g_free(card->manager); - card->manager = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_ASSISTANT: - g_free(card->assistant); - card->assistant = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_NICKNAME: - g_free(card->nickname); - card->nickname = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_SPOUSE: - g_free(card->spouse); - card->spouse = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_ANNIVERSARY: - g_free(card->anniversary); - card->anniversary = GTK_VALUE_POINTER(*arg); - break; - case ARG_MAILER: - g_free(card->mailer); - card->mailer = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_FBURL: - g_free(card->fburl); - card->fburl = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_NOTE: - g_free (card->note); - card->note = g_strdup(GTK_VALUE_STRING(*arg)); - break; - case ARG_WANTS_HTML: - card->wants_html = GTK_VALUE_BOOL(*arg); - card->wants_html_set = TRUE; - break; - case ARG_ARBITRARY: - if (card->arbitrary) - gtk_object_unref(GTK_OBJECT(card->arbitrary)); - card->arbitrary = E_LIST(GTK_VALUE_OBJECT(*arg)); - if (card->arbitrary) - gtk_object_ref(GTK_OBJECT(card->arbitrary)); - break; - case ARG_ID: - g_free(card->id); - card->id = g_strdup(GTK_VALUE_STRING(*arg)); - break; - default: - return; - } -} - -/* Get_arg handler for the card */ -static void -e_card_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ECard *card; - - card = E_CARD (object); - - switch (arg_id) { - case ARG_FILE_AS: - GTK_VALUE_STRING (*arg) = card->file_as; - break; - case ARG_FULL_NAME: - GTK_VALUE_STRING (*arg) = card->fname; - break; - case ARG_NAME: - GTK_VALUE_POINTER(*arg) = card->name; - break; - case ARG_ADDRESS: - if (!card->address) - card->address = e_list_new((EListCopyFunc) e_card_delivery_address_copy, - (EListFreeFunc) e_card_delivery_address_free, - NULL); - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->address); - break; - case ARG_ADDRESS_LABEL: - if (!card->address_label) - card->address_label = e_list_new((EListCopyFunc) e_card_address_label_copy, - (EListFreeFunc) e_card_address_label_free, - NULL); - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->address_label); - break; - case ARG_PHONE: - if (!card->phone) - card->phone = e_list_new((EListCopyFunc) e_card_phone_copy, - (EListFreeFunc) e_card_phone_free, - NULL); - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->phone); - break; - case ARG_EMAIL: - if (!card->email) - card->email = e_list_new((EListCopyFunc) g_strdup, - (EListFreeFunc) g_free, - NULL); - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->email); - break; - case ARG_CATEGORIES: - { - int i; - char ** strs; - int length; - EIterator *iterator; - if (!card->categories) - card->categories = e_list_new((EListCopyFunc) g_strdup, - (EListFreeFunc) g_free, - NULL); - length = e_list_length(card->categories); - strs = g_new(char *, length + 1); - for (iterator = e_list_get_iterator(card->categories), i = 0; e_iterator_is_valid(iterator); e_iterator_next(iterator), i++) { - strs[i] = (char *)e_iterator_get(iterator); - } - strs[i] = 0; - GTK_VALUE_STRING(*arg) = g_strjoinv(", ", strs); - g_free(strs); - } - break; - case ARG_CATEGORY_LIST: - if (!card->categories) - card->categories = e_list_new((EListCopyFunc) g_strdup, - (EListFreeFunc) g_free, - NULL); - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->categories); - break; - case ARG_BIRTH_DATE: - GTK_VALUE_POINTER(*arg) = card->bday; - break; - case ARG_URL: - GTK_VALUE_STRING(*arg) = card->url; - break; - case ARG_ORG: - GTK_VALUE_STRING(*arg) = card->org; - break; - case ARG_ORG_UNIT: - GTK_VALUE_STRING(*arg) = card->org_unit; - break; - case ARG_OFFICE: - GTK_VALUE_STRING(*arg) = card->office; - break; - case ARG_TITLE: - GTK_VALUE_STRING(*arg) = card->title; - break; - case ARG_ROLE: - GTK_VALUE_STRING(*arg) = card->role; - break; - case ARG_MANAGER: - GTK_VALUE_STRING(*arg) = card->manager; - break; - case ARG_ASSISTANT: - GTK_VALUE_STRING(*arg) = card->assistant; - break; - case ARG_NICKNAME: - GTK_VALUE_STRING(*arg) = card->nickname; - break; - case ARG_SPOUSE: - GTK_VALUE_STRING(*arg) = card->spouse; - break; - case ARG_ANNIVERSARY: - GTK_VALUE_POINTER(*arg) = card->anniversary; - break; - case ARG_MAILER: - GTK_VALUE_STRING(*arg) = card->mailer; - break; - case ARG_FBURL: - GTK_VALUE_STRING(*arg) = card->fburl; - break; - case ARG_NOTE: - GTK_VALUE_STRING(*arg) = card->note; - break; - case ARG_WANTS_HTML: - GTK_VALUE_BOOL(*arg) = card->wants_html; - break; - case ARG_WANTS_HTML_SET: - GTK_VALUE_BOOL(*arg) = card->wants_html_set; - break; - case ARG_ARBITRARY: - if (!card->arbitrary) - card->arbitrary = e_list_new((EListCopyFunc) e_card_arbitrary_copy, - (EListFreeFunc) e_card_arbitrary_free, - NULL); - - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(card->arbitrary); - break; - case ARG_ID: - GTK_VALUE_STRING(*arg) = card->id; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - - -/** - * e_card_init: - */ -static void -e_card_init (ECard *card) -{ - card->id = g_strdup(""); - - card->file_as = NULL; - card->fname = NULL; - card->name = NULL; - card->bday = NULL; - card->email = NULL; - card->phone = NULL; - card->address = NULL; - card->address_label = NULL; - card->url = NULL; - card->org = NULL; - card->org_unit = NULL; - card->office = NULL; - card->title = NULL; - card->role = NULL; - card->manager = NULL; - card->assistant = NULL; - card->nickname = NULL; - card->spouse = NULL; - card->anniversary = NULL; - card->mailer = NULL; - card->fburl = NULL; - card->note = NULL; - card->categories = NULL; - card->wants_html = FALSE; - card->wants_html_set = FALSE; - card->arbitrary = NULL; -#if 0 - - c = g_new0 (ECard, 1); - - c->fname = - c->mailer = - c->role = - c->comment = - c->categories = - c->uid = e_card_prop_str_empty (); - - c->photo.type = PHOTO_JPEG; - c->logo.type = PHOTO_JPEG; - c->rev.utc = -1; - c->sound.type = SOUND_PHONETIC; - c->key.type = KEY_PGP; - - c->categories.prop.encod = ENC_QUOTED_PRINTABLE; - c->comment.prop.encod = ENC_QUOTED_PRINTABLE; - - c->name.prop = c->photo.prop = c->bday.prop = c->timezn.prop = - c->geopos.prop = c->logo.prop = c->org.prop = c->rev.prop = - c->sound.prop = c->key.prop = c->deladdr.prop = c->dellabel.prop = - c->phone.prop = c->email.prop = c->xtension.prop = c->prop = e_card_prop_empty (); - - c->prop.type = PROP_CARD; - c->fname.prop.type = PROP_FNAME; - c->name.prop.type = PROP_NAME; - c->photo.prop.type = PROP_PHOTO; - c->bday.prop.type = PROP_BDAY; - - c->deladdr.prop.type = PROP_DELADDR_LIST; - c->dellabel.prop.type = PROP_DELLABEL_LIST; - c->phone.prop.type = PROP_PHONE_LIST; - c->email.prop.type = PROP_EMAIL_LIST; - c->xtension.prop.type = PROP_XTENSION_LIST; - c->mailer.prop.type = PROP_MAILER; - c->timezn.prop.type = PROP_TIMEZN; - c->geopos.prop.type = PROP_GEOPOS; - c->role.prop.type = PROP_ROLE; - c->logo.prop.type = PROP_LOGO; - c->org.prop.type = PROP_ORG; - c->categories.prop.type = PROP_CATEGORIES; - c->comment.prop.type = PROP_COMMENT; - c->rev.prop.type = PROP_REV; - c->sound.prop.type = PROP_SOUND; - c->uid.prop.type = PROP_UID; - c->key.prop.type = PROP_KEY; - - return c; -#endif -} - -GList * -e_card_load_cards_from_file(const char *filename) -{ - VObject *vobj = Parse_MIME_FromFileName((char *) filename); - GList *list = NULL; - while(vobj) { - VObject *next; - ECard *card = E_CARD(gtk_type_new(e_card_get_type())); - parse(card, vobj); - next = nextVObjectInList(vobj); - cleanVObject(vobj); - vobj = next; - list = g_list_prepend(list, card); - } - list = g_list_reverse(list); - return list; -} - -static void -assign_string(VObject *vobj, char **string) -{ - int type = vObjectValueType(vobj); - char *str; - - switch(type) { - case VCVT_STRINGZ: - *string = g_strdup (vObjectStringZValue(vobj)); - break; - case VCVT_USTRINGZ: - str = (vObjectValueType (vobj) ? fakeCString (vObjectUStringZValue (vobj)) : calloc(1, 1)); - *string = g_strdup(str); - free(str); - break; - default: - *string = g_strdup(""); - break; - } -} - -#if 0 -static void -e_card_str_free (CardStrProperty *sp) -{ - g_free (sp->str); - - e_card_prop_free (sp->prop); -} - -static void -e_card_photo_free (CardPhoto *photo) -{ - g_free (photo->data); - - e_card_prop_free (photo->prop); -} - -/** - * e_card_free: - */ -void -e_card_free (ECard *card) -{ - GList *l; - - g_return_if_fail (card != NULL); - - e_card_name_free (& card->name); - e_card_str_free (& card->fname); - - e_card_photo_free (card->photo); - - e_card_logo_free (card->logo); - e_card_org_free (card->org); - e_card_key_free (card->key); - e_card_sound_free (card->sound); - - e_card_prop_str_free (& card->mailer); - e_card_prop_str_free (& card->role); - e_card_prop_str_free (& card->categories); - e_card_prop_str_free (& card->comment); - e_card_prop_str_free (& card->uid); - - /* address is a little more complicated */ - card_prop_free (card->deladdr.prop); - while ((l = card->deladdr.l)) { - - e_card_deladdr_free ((CardDelAddr *) l->data); - - card->deladdr.l = g_list_remove_link (card->deladdr.l, l); - g_list_free (l); - } - - g_free (card); -} - -typedef struct -{ - char c; - int id; - - GList *sons; -} tree; - -extern CardProperty -e_card_prop_empty (void) -{ - CardProperty prop; - - prop.used = FALSE; - - prop.type = PROP_NONE; - prop.encod = ENC_7BIT; - prop.value = VAL_INLINE; - prop.charset = NULL; - prop.lang = NULL; - prop.grp = NULL; - prop.xtension = NULL; - - prop.user_data = NULL; - - return prop; -} - -static CardStrProperty -e_card_prop_str_empty (void) -{ - CardStrProperty strprop; - - strprop.prop = card_prop_empty (); - strprop.str = NULL; - - return strprop; -} - -/* Intended to check asserts. */ -extern int card_check_prop (ECardProperty prop) -{ - if (((prop.used == FALSE) || (prop.used == TRUE)) && - ((prop.type >= PROP_NONE) && (prop.type <= PROP_LAST)) && - ((prop.encod >= ENC_NONE) && (prop.encod <= ENC_LAST)) && - ((prop.value >= VAL_NONE) && (prop.value <= VAL_LAST))) - return TRUE; - - return FALSE; -} - -extern void -card_prop_free (CardProperty prop) -{ - GList *l; - - g_free (prop.charset); - g_free (prop.lang); - - for (l = prop.xtension; l; l = l->next) { - CardXAttribute *xa = (CardXAttribute *) l->data; - g_free (xa->name); - g_free (xa->data); - } - - g_list_free (l); - - prop.used = FALSE; -} - -e_card_deladdr_free (ECardDelAddr *c) -{ - card_prop_free (c->prop); - - g_free (p->pobox); - g_free (p->ext); - g_free (p->street); - g_free (p->city); - g_free (p->region); - g_free (p->code); - g_free (p->country); -} - -void -card_free (Card *crd) -{ -} - -static tree * -new_tree (char c, int id) -{ - tree *t; - - t = malloc (sizeof (tree)); - t->c = c; - t->id = id; - t->sons = NULL; - - return t; -} - -static void -add_branch (tree *t, char *str, int id) -{ - tree *tmp; - char *end; - - end = str + strlen (str) + 1; - - while (str != end) { - tmp = new_tree (*str, id); - t->sons = g_list_append (t->sons, (gpointer) tmp); - t = tmp; - - str ++; - } -} - -static tree * -add_to_tree (tree *t, struct pair p) -{ - GList *node; - char *c, *end; - tree *tmp; - - c = p.str; - end = c + strlen (c) + 1; - tmp = t; - - while (c != end) { - for (node = tmp->sons; node; node = node->next) - if (((tree *) node->data)->c == *c) { - break; - } - - if (node) { - tmp = (tree *) node->data; - tmp->id = 0; - c++; - } - else { - add_branch (tmp, c, p.id); - break; - } - } - - return t; -} - -static tree * -create_search_tree (void) -{ - tree *t; - int i; - - t = new_tree (0, 0); - for (i = 0; prop_lookup[i].str; i++) - t = add_to_tree (t, prop_lookup[i]); - - return t; -} - -static int -card_lookup_name (const char *c) -{ - static tree *search_tree = NULL; - GList *node; - tree *tmp; - const char *end; - - if (!search_tree) - search_tree = create_search_tree (); - - tmp = search_tree; - end = c + strlen (c) + 1; - - while (tmp->id == 0 && c != end) { - for (node = tmp->sons; node; node = node->next) - if (((tree *) node->data)->c == *c) { - break; - } - - if (node) { - tmp = (tree *) node->data; - c++; - } - else - return 0; - } - - return tmp->id; -} - -static enum PhotoType -get_photo_type (VObject *o) -{ - VObject *vo; - int i; - - for (i = 0; photo_pairs[i].str; i++) - if (has (o, photo_pairs[i].str)) - return photo_pairs[i].id; - - g_warning ("? < No PhotoType for Photo property. Falling back to JPEG."); - return PHOTO_JPEG; -} - -static CardProperty -get_CardProperty (VObject *o) -{ - VObjectIterator i; - CardProperty prop; - - prop = card_prop_empty (); - prop.used = TRUE; - - initPropIterator (&i, o); - while (moreIteration (&i)) { - VObject *vo = nextVObject (&i); - const char *n = vObjectName (vo); - int propid; - - propid = card_lookup_name (n); - - switch (propid) { - - case PROP_VALUE: - - if (has (vo, VCContentIDProp)) - prop.value = VAL_CID; - break; - - case PROP_ENCODING: - if (has (vo, VCQuotedPrintableProp)) - prop.encod = ENC_QUOTED_PRINTABLE; - else if (has (vo, VC8bitProp)) - prop.encod = ENC_8BIT; - else if (has (vo, VCBase64Prop)) - prop.encod = ENC_BASE64; - break; - - case PROP_QUOTED_PRINTABLE: - prop.encod = ENC_QUOTED_PRINTABLE; - break; - - case PROP_8BIT: - prop.encod = ENC_8BIT; - break; - - case PROP_BASE64: - prop.encod = ENC_BASE64; - break; - - case PROP_LANG: - if (vObjectValueType (vo)) { - prop.lang = - g_strdup (vObjectStringZValue (vo)); - } else - g_warning ("? < No value for LANG attribute."); - break; - - case PROP_CHARSET: - if (vObjectValueType (vo)) { - prop.charset = - g_strdup (vObjectStringZValue (vo)); - g_warning (prop.charset); - } else - g_warning ("? < No value for CHARSET attribute."); - break; - default: - { - CardXAttribute *c; - - c = malloc (sizeof (CardXAttribute)); - c->name = g_strdup (n); - - if (vObjectValueType (vo)) - c->data = - g_strdup (vObjectStringZValue (vo)); - else - c->data = NULL; - - prop.xtension = - g_list_append (prop.xtension, c); - } - } - } - - return prop; -} - -static gboolean -e_card_prop_has (VObject *o, - const char *id) -{ - g_assert (o != NULL); - g_assert (id != NULL); - - if (isAPropertyOf (o, id) == NULL) - return FALSE; - - return TRUE; -} - -static const char * -e_card_prop_get_str (VObject *o, - const char *id) -{ - VObject *strobj; - - g_assert (o != NULL); - g_assert (id != NULL); - - strobj = isAPropertyOf (o, id); - - if (strobj == NULL) - return g_strdup (""); - - if (vObjectValueType (strobj) != NULL) { - char *str; - char *g_str; - - str = fakeCString (vObjectStringZValue (strobj)); - g_str = g_strdup (str); - free (str); - - return g_str; - } - - return g_strdup (""); -} - -static ECardName * -e_card_get_name (VObject *o) -{ - CardName *name; - VObject *vo; - char *the_str; - - name = g_new0 (ECardName, 1); - - name->family = e_card_prop_get_substr (o, VCFamilyNameProp); - name->given = e_card_prop_get_substr (o, VCGivenNameProp); - name->additional = e_card_prop_get_substr (o, VCAdditionalNamesProp); - name->prefix = e_card_prop_get_substr (o, VCNamePrefixesProp); - name->suffix = e_card_prop_get_substr (o, VCNameSuffixesProp); - - return name; -} - -static CardDelLabel * -get_CardDelLabel (VObject *o) -{ - CardDelLabel *dellabel; - char *the_str; - - dellabel = malloc (sizeof (CardDelLabel)); - - dellabel->type = get_addr_type (o); - dellabel->data = g_strdup (str_val (o)); - - free (the_str); - return dellabel; -} - -static CardPhone * -get_CardPhone (VObject *o) -{ - CardPhone *ret; - char *the_str; - - ret = malloc (sizeof (CardPhone)); - ret->type = get_phone_type (o); - ret->data = g_strdup (str_val (o)); - - free (the_str); - - return ret; -} - -static CardEMail * -get_CardEMail (VObject *o) -{ - CardEMail *ret; - char *the_str; - - ret = malloc (sizeof (CardEMail)); - ret->type = get_email_type (o); - ret->data = g_strdup (str_val (o)); - - free (the_str); - - return ret; -} - -static CardTimeZone -strtoCardTimeZone (char *str) -{ - char s[3]; - CardTimeZone tz; - - if (*str == '-') { - tz.sign = -1; - str++; - } else - tz.sign = 1; - - tz.hours = 0; - tz.mins = 0; - - s[2] = 0; - if (strlen (str) > 2) { - s[0] = str[0]; - s[1] = str[1]; - tz.hours = atoi (s); - } else { - g_warning ("? < TimeZone value is too short."); - return tz; - } - - str += 2; - if (*str == ':') - str++; - - if (strlen (str) >= 2) { - s[0] = str[0]; - s[1] = str[1]; - tz.mins = atoi (s); - } else { - g_warning ("? < TimeZone value is too short."); - return tz; - } - - if (strlen (str) > 3) - g_warning ("? < TimeZone value is too long."); - - return tz; -} - -static CardGeoPos -strtoCardGeoPos (char *str) -{ - CardGeoPos gp; - char *s; - - gp.lon = 0; - gp.lat = 0; - - s = strchr (str, ','); - - if (! s) { - g_warning ("? < Bad format for GeoPos property."); - return gp; - } - - *s = 0; - s++; - - gp.lon = atof (str); - gp.lat = atof (s); - - return gp; -} - -static CardOrg * -e_card_vobject_to_org (VObject *o) -{ - VObject *vo; - char *the_str; - CardOrg *org; - - org = g_new0 (CardOrg, 1); - - if (has (o, VCOrgNameProp)) { - org.name = g_strdup (str_val (vo)); - free (the_str); - } - if (has (o, VCOrgUnitProp)) { - org.unit1 = g_strdup (str_val (vo)); - free (the_str); - } - if (has (o, VCOrgUnit2Prop)) { - org.unit2 = g_strdup (str_val (vo)); - free (the_str); - } - if (has (o, VCOrgUnit3Prop)) { - org.unit3 = g_strdup (str_val (vo)); - free (the_str); - } - if (has (o, VCOrgUnit4Prop)) { - org.unit4 = g_strdup (str_val (vo)); - free (the_str); - } - - return org; -} - -static CardXProperty * -get_XProp (VObject *o) -{ - char *the_str; - CardXProperty *ret; - - ret = malloc (sizeof (CardXProperty)); - ret->name = g_strdup (vObjectName (o)); - ret->data = g_strdup (str_val (o)); - free (the_str); - - return ret; -} - -static CardRev -strtoCardRev (char *str) -{ - char s[3], *t, *ss; - int len, i; - CardRev rev; - - rev.utc = 0; - len = strlen (str); - - if (str[len] == 'Z') { /* Is it UTC? */ - rev.utc = 1; - str[len] = 0; - } - - s[2] = 0; - t = strchr (str, 'T'); - if (t) { /* Take the Time */ - *t = 0; - t++; - if (strlen (t) > 2) { - s[0] = t[0]; - s[1] = t[1]; - rev.tm.tm_hour = atoi (s); - } else { - g_warning ("? < Rev value is too short."); - return rev; - } - - t += 2; - if (*t == ':') /* Ignore ':' separator */ - t++; - - if (strlen (t) > 2) { - s[0] = t[0]; - s[1] = t[1]; - rev.tm.tm_min = atoi (s); - } else { - g_warning ("? < Rev value is too short."); - return rev; - } - - t += 2; - if (*t == ':') - t++; - - if (strlen (t) > 2) { - s[0] = t[0]; - s[1] = t[1]; - rev.tm.tm_sec = atoi (s); - } else { - g_warning ("? < Rev value is too short."); - return rev; - } - - if (strlen (str) > 3) - g_warning ("? < Rev value is too long."); - - } else { - g_warning ("? < No time value for Rev property."); - } - - /* Now the date (the part before the T) */ - - if (strchr (str, '-')) { /* extended iso 8601 */ - for (ss = strtok (str, "-"), i = 0; ss; - ss = strtok (NULL, "-"), i++) - switch (i) { - case 0: - rev.tm.tm_year = atoi (ss); - break; - case 1: - rev.tm.tm_mon = atoi (ss); - break; - case 2: - rev.tm.tm_mday = atoi (ss); - break; - default: - g_warning ("? < Too many values for Rev property."); - } - - if (i < 2) - g_warning ("? < Too few values for Rev property."); - } else { - if (strlen (str) >= 8) { /* short representation */ - rev.tm.tm_mday = atoi (str + 6); - str[6] = 0; - rev.tm.tm_mon = atoi (str + 4); - str[4] = 0; - rev.tm.tm_year = atoi (str); - } else - g_warning ("? < Bad format for Rev property."); - } - - return rev; -} - -static enum KeyType -get_key_type (VObject *o) -{ - VObject *vo; - int i; - - for (i = 0; key_pairs[i].str; i++) - if (has (o, key_pairs[i].str)) - return key_pairs[i].id; - - g_warning ("? < No KeyType for Key property. Falling back to PGP."); - return KEY_PGP; -} - -static CardPhoto -get_CardPhoto (VObject *o) -{ - VObject *vo; - char *the_str; - CardPhoto photo; - - photo.type = get_photo_type (o); - - if (has (o, VCDataSizeProp)) { - photo.size = vObjectIntegerValue (vo); - photo.data = malloc (photo.size); - memcpy (photo.data, vObjectAnyValue (o), photo.size); - } else { - photo.size = strlen (str_val (o)) + 1; - photo.data = g_strdup (the_str); - free (the_str); - } - - return photo; -} - -static enum SoundType -get_sound_type (VObject *o) -{ - VObject *vo; - int i; - - for (i = 0; sound_pairs[i].str; i++) - if (has (o, sound_pairs[i].str)) - return sound_pairs[i].id; - - return SOUND_PHONETIC; -} - -static CardSound -get_CardSound (VObject *o) -{ - VObject *vo; - char *the_str; - CardSound sound; - - sound.type = get_sound_type (o); - - if (has (o, VCDataSizeProp)) { - sound.size = vObjectIntegerValue (vo); - sound.data = malloc (sound.size); - memcpy (sound.data, vObjectAnyValue (o), sound.size); - } else { - sound.size = strlen (str_val (o)); - sound.data = g_strdup (the_str); - free (the_str); - } - - return sound; -} - -/* Loads our card contents from a VObject */ -static ECard * -e_card_construct_from_vobject (ECard *card, - VObject *vcrd) -{ - VObjectIterator i; - Card *crd; - char *the_str; - - initPropIterator (&i, vcrd); - crd = card_new (); - - while (moreIteration (&i)) { - VObject *o = nextVObject (&i); - const char *n = vObjectName (o); - int propid; - CardProperty *prop = NULL; - - propid = card_lookup_name (n); - - switch (propid) { - case PROP_FNAME: - prop = &crd->fname.prop; - crd->fname.str = g_strdup (str_val (o)); - free (the_str); - break; - case PROP_NAME: - prop = &crd->name.prop; - crd->name = e_card_get_name (o); - break; - case PROP_PHOTO: - prop = &crd->photo.prop; - crd->photo = get_CardPhoto (o); - break; - case PROP_BDAY: - prop = &crd->bday.prop; - crd->bday = strtoCardBDay (str_val (o)); - free (the_str); - break; - case PROP_DELADDR: - { - CardDelAddr *c; - c = get_CardDelAddr (o); - prop = &c->prop; - crd->deladdr.l = g_list_append (crd->deladdr.l, c); - } - break; - case PROP_DELLABEL: - { - CardDelLabel *c; - c = get_CardDelLabel (o); - prop = &c->prop; - crd->dellabel.l = g_list_append (crd->dellabel.l, c); - } - break; - case PROP_PHONE: - { - CardPhone *c; - - c = get_CardPhone (o); - prop = &c->prop; - crd->phone.l = g_list_append (crd->phone.l, c); - } - break; - case PROP_EMAIL: - { - CardEMail *c; - - c = get_CardEMail (o); - prop = &c->prop; - crd->email.l = g_list_append (crd->email.l, c); - } - break; - case PROP_MAILER: - prop = &crd->mailer.prop; - crd->mailer.str = g_strdup (str_val (o)); - free (the_str); - break; - case PROP_TIMEZN: - prop = &crd->timezn.prop; - crd->timezn = strtoCardTimeZone (str_val (o)); - free (the_str); - break; - case PROP_GEOPOS: - prop = &crd->geopos.prop; - crd->geopos = strtoCardGeoPos (str_val (o)); - break; - case PROP_ROLE: - prop = &crd->role.prop; - crd->role.str = g_strdup (str_val (o)); - free (the_str); - break; - case PROP_LOGO: - prop = &crd->logo.prop; - crd->logo = get_CardPhoto (o); - break; - case PROP_AGENT: - crd->agent = card_create_from_vobject (o); - break; - case PROP_ORG: - prop = &crd->org.prop; - crd->org = get_CardOrg (o); - break; - case PROP_CATEGORIES: - prop = &crd->categories.prop; - crd->categories.str = g_strdup (str_val (o)); - crd->categories.prop.encod = ENC_QUOTED_PRINTABLE; - free (the_str); - break; - case PROP_COMMENT: - prop = &crd->comment.prop; - crd->comment.str = g_strdup (str_val (o)); - crd->comment.prop.encod = ENC_QUOTED_PRINTABLE; - free (the_str); - break; - case PROP_REV: - prop = &crd->rev.prop; - crd->rev = strtoCardRev (str_val (o)); - free (the_str); - break; - case PROP_SOUND: - prop = &crd->sound.prop; - crd->sound = get_CardSound (o); - break; - case PROP_VERSION: - { - char *str; - str = str_val (o); - if (strcmp (str, "2.1")) - g_warning ("? < Version doesn't match."); - free (the_str); - } - break; - case PROP_KEY: - prop = &crd->key.prop; - crd->key.type = get_key_type (o); - crd->key.data = g_strdup (str_val (o)); - free (the_str); - break; - default: - { - CardXProperty *c; - - c = get_XProp (o); - prop = &c->prop; - crd->xtension.l = g_list_append (crd->xtension.l, c); - } - break; - } - - if (prop) { - *prop = get_CardProperty (o); - prop->type = propid; - } - } - - return crd; -} - -/* Loads a card from a file */ -GList * -card_load (GList *crdlist, char *fname) -{ - VObject *vobj, *tmp; - - vobj = Parse_MIME_FromFileName (fname); - if (!vobj) { - g_warning ("Could not load the cardfile"); - return NULL; - } - - while (vobj) { - const char *n = vObjectName (vobj); - - if (strcmp (n, VCCardProp) == 0) { - crdlist = g_list_append (crdlist, (gpointer) - card_create_from_vobject (vobj)); - } - tmp = vobj; - vobj = nextVObjectInList (vobj); - cleanVObject (tmp); - } - - cleanVObject (vobj); - cleanStrTbl (); - return crdlist; -} - -static VObject * -add_strProp (VObject *o, const char *id, char *val) -{ - VObject *vo = NULL; - - if (val) - vo = addPropValue (o, id, val); - - return vo; -} - -static VObject * -add_CardProperty (VObject *o, CardProperty *prop) -{ - GList *node; - - switch (prop->encod) { - case ENC_BASE64: - addProp (o, VCBase64Prop); - break; - case ENC_QUOTED_PRINTABLE: - addProp (o, VCQuotedPrintableProp); - break; - case ENC_8BIT: - addProp (o, VC8bitProp); - break; - case ENC_7BIT: - /* Do nothing: 7BIT is the default. Avoids file clutter. */ - break; - default: - g_warning ("? < Card had invalid encoding type."); - } - - switch (prop->value) { - case VAL_CID: - addProp (o, VCContentIDProp); - break; - case VAL_INLINE: - /* Do nothing: INLINE is the default. Avoids file clutter. */ - break; - default: - g_warning ("? < Card had invalid value type."); - } - - for (node = prop->xtension; node; node = node->next) { - CardXAttribute *xa = (CardXAttribute *) node->data; - if (xa->data) - addPropValue (o, xa->name, xa->data); - else - addProp (o, xa->name); - } - - add_strProp (o, VCCharSetProp, prop->charset); - add_strProp (o, VCLanguageProp, prop->lang); - - return o; -} - -static VObject * -add_CardStrProperty (VObject *vobj, const char *id, CardStrProperty *strprop) -{ - VObject *vprop; - - if (strprop->prop.used) { - vprop = add_strProp (vobj, id, strprop->str); - add_CardProperty (vprop, &strprop->prop); - } - - return vobj; -} - -static VObject * -add_PhotoType (VObject *o, enum PhotoType photo_type) -{ - int i; - - for (i = 0; photo_pairs[i].str; i++) - if (photo_type == photo_pairs[i].id) { - addProp (o, photo_pairs[i].str); - return o; - } - - g_warning ("? > No PhotoType for Photo property. Falling back to JPEG."); - addProp (o, VCJPEGProp); - - return o; -} - -static VObject * -add_AddrType (VObject *o, int addr_type) -{ - int i; - - for (i = 0; addr_pairs[i].str; i++) - if (addr_type & addr_pairs[i].id) - addProp (o, addr_pairs[i].str); - - return o; -} - -static void -add_strAddrType (GString *string, int addr_type) -{ - int i, first = 1; - char *str; - - if (addr_type) { - g_string_append (string, " ("); - - for (i = 0; addr_pairs[i].str; i++) - if (addr_type & addr_pairs[i].id) { - if (!first) - g_string_append (string, ", "); - first = 0; - str = my_cap (addr_pairs[i].str); - g_string_append (string, str); - g_free (str); - } - - g_string_append_c (string, ')'); - } -} - -static VObject * -add_PhoneType (VObject *o, int phone_type) -{ - int i; - - for (i = 0; phone_pairs[i].str; i++) - if (phone_type & phone_pairs[i].id) - addProp (o, phone_pairs[i].str); - - return o; -} - -static void -add_strPhoneType (GString *string, int phone_type) -{ - int i, first = 1; - char *str; - - if (phone_type) { - g_string_append (string, " ("); - - for (i = 0; phone_pairs[i].str; i++) - if (phone_type & phone_pairs[i].id) { - if (!first) - g_string_append (string, ", "); - first = 0; - str = my_cap (phone_pairs[i].str); - g_string_append (string, str); - g_free (str); - } - - g_string_append_c (string, ')'); - } -} - -static VObject * -add_EMailType (VObject *o, enum EMailType email_type) -{ - int i; - - for (i = 0; email_pairs[i].str; i++) - if (email_type == email_pairs[i].id) { - addProp (o, email_pairs[i].str); - return o; - } - - g_warning ("? > No EMailType for EMail property. Falling back to INET."); - addProp (o, VCInternetProp); - - return o; -} - -static void -add_strEMailType (GString *string, int email_type) -{ - int i; - char *str; - - if (email_type) { - g_string_append (string, " ("); - - for (i = 0; email_pairs[i].str; i++) - if (email_type == email_pairs[i].id) { - str = my_cap (email_pairs[i].str); - g_string_append (string, str); - g_free (str); - break; - } - - g_string_append_c (string, ')'); - } -} - -static VObject * -add_KeyType (VObject *o, enum KeyType key_type) -{ - int i; - - for (i = 0; key_pairs[i].str; i++) - if (key_type == key_pairs[i].id) { - addProp (o, key_pairs[i].str); - return o; - } - - g_warning ("? > No KeyType for Key property. Falling back to PGP."); - addProp (o, VCPGPProp); - - return o; -} - -static void -add_strKeyType (GString *string, int key_type) -{ - int i; - char *str; - - if (key_type) { - g_string_append (string, " ("); - - for (i = 0; key_pairs[i].str; i++) - if (key_type == key_pairs[i].id) { - str = my_cap (key_pairs[i].str); - g_string_append (string, str); - g_free (str); - break; - } - - g_string_append_c (string, ')'); - } -} - -static VObject * -add_SoundType (VObject *o, enum SoundType sound_type) -{ - int i; - - for (i = 0; sound_pairs[i].str; i++) - if (sound_type == sound_pairs[i].id) { - addProp (o, sound_pairs[i].str); - return o; - } - - return o; -} - -char *card_timezn_str (CardTimeZone timezn) -{ - char *str; - - str = malloc (7); - snprintf (str, 7, (timezn.sign == -1)? "-%02d:%02d" : "%02d:%02d", - timezn.hours, timezn.mins); - return str; -} - -char *card_geopos_str (CardGeoPos geopos) -{ - char *str; - - str = malloc (15); - snprintf (str, 15, "%03.02f,%03.02f", geopos.lon, geopos.lat); - return str; -} - -static void add_CardStrProperty_to_string (GString *string, char *prop_name, - CardStrProperty *strprop) -{ - if (strprop->prop.used) { - if (prop_name) - g_string_append (string, prop_name); - - g_string_append (string, strprop->str); - } -} - -static void add_strProp_to_string (GString *string, char *prop_name, char *val) -{ - if (val) { - if (prop_name) - g_string_append (string, prop_name); - - g_string_append (string, val); - } -} - -static void addProp_to_string (GString *string, char *prop_name) -{ - if (prop_name) - g_string_append (string, prop_name); -} - -char * -card_to_string (Card *crd) -{ - GString *string; - char *ret; - - string = g_string_new (""); - - add_CardStrProperty_to_string (string, _("Card: "), &crd->fname); - if (crd->name.prop.used) { - addProp_to_string (string, N_("\nName: ")); - add_strProp_to_string (string, N_("\n Prefix: "), crd->name.prefix); - add_strProp_to_string (string, N_("\n Given: "), crd->name.given); - add_strProp_to_string (string, N_("\n Additional: "), crd->name.additional); - add_strProp_to_string (string, N_("\n Family: "), crd->name.family); - add_strProp_to_string (string, N_("\n Suffix: "), crd->name.suffix); - g_string_append_c (string, '\n'); - } - -/* if (crd->photo.prop.used) { - addPropSizedValue (string, _ ("\nPhoto: "), - crd->photo.data, crd->photo.size); - add_PhotoType (string, crd->photo.type); - }*/ - - if (crd->bday.prop.used) { - char *date_str; - - date_str = card_bday_str (crd->bday); - add_strProp_to_string (string, N_("\nBirth Date: "), date_str); - free (date_str); - } - - if (crd->deladdr.l) { - GList *node; - - for (node = crd->deladdr.l; node; node = node->next) { - CardDelAddr *deladdr = (CardDelAddr *) node->data; - - if (deladdr->prop.used) { - addProp_to_string (string, N_("\nAddress:")); - add_strAddrType (string, deladdr->type); - add_strProp_to_string (string, N_("\n Postal Box: "), deladdr->po); - add_strProp_to_string (string, N_("\n Ext: "), deladdr->ext); - add_strProp_to_string (string, N_("\n Street: "), deladdr->street); - add_strProp_to_string (string, N_("\n City: "), deladdr->city); - add_strProp_to_string (string, N_("\n Region: "), deladdr->region); - add_strProp_to_string (string, N_("\n Postal Code: "), deladdr->code); - add_strProp_to_string (string, N_("\n Country: "), deladdr->country); - } - } - - g_string_append_c (string, '\n'); - } - - if (crd->dellabel.l) { - GList *node; - - for (node = crd->dellabel.l; node; node = node->next) { - CardDelLabel *dellabel = (CardDelLabel *) node->data; - - add_strProp_to_string (string, N_("\nDelivery Label: "), - dellabel->data); - add_strAddrType (string, dellabel->type); - } - } - - if (crd->phone.l) { - GList *node; - char *sep; - - if (crd->phone.l->next) { - sep = " "; - g_string_append (string, N_("\nTelephones:\n")); - } else { - sep = " "; - g_string_append (string, N_("\nTelephone:")); - } - - for (node = crd->phone.l; node; node = node->next) { - CardPhone *phone = (CardPhone *) node->data; - - if (phone->prop.used) { - g_string_append (string, sep); - g_string_append (string, phone->data); - add_strPhoneType (string, phone->type); - g_string_append_c (string, '\n'); - } - } - - if (crd->phone.l->next) - g_string_append_c (string, '\n'); - } - - if (crd->email.l) { - GList *node; - char *sep; - - if (crd->email.l->next) { - sep = " "; - g_string_append (string, N_("\nE-mail:\n")); - } else { - sep = " "; - g_string_append (string, N_("\nE-mail:")); - } - - - for (node = crd->email.l; node; node = node->next) { - CardEMail *email = (CardEMail *) node->data; - - if (email->prop.used) { - g_string_append (string, sep); - g_string_append (string, email->data); - add_strEMailType (string, email->type); - g_string_append_c (string, '\n'); - } - } - - if (crd->email.l->next) - g_string_append_c (string, '\n'); - } - - add_CardStrProperty_to_string (string, N_("\nMailer: "), &crd->mailer); - - if (crd->timezn.prop.used) { - char *str; - - str = card_timezn_str (crd->timezn); - add_strProp_to_string (string, N_("\nTime Zone: "), str); - free (str); - } - - if (crd->geopos.prop.used) { - char *str; - - str = card_geopos_str (crd->geopos); - add_strProp_to_string (string, N_("\nGeo Location: "), str); - free (str); - } - - add_CardStrProperty_to_string (string, N_("\nBusiness Role: "), &crd->role); - -/* if (crd->logo.prop.used) { - addPropSizedValue (string, _ ("\nLogo: "), - crd->logo.data, crd->logo.size); - add_PhotoType (string, crd->logo.type); - }*/ - -/* if (crd->agent) - addstringectProp (string, card_convert_to_stringect (crd->agent));*/ - - if (crd->org.prop.used) { - addProp_to_string (string, N_("\nOrg: ")); - add_strProp_to_string (string, N_("\n Name: "), crd->org.name); - add_strProp_to_string (string, N_("\n Unit: "), crd->org.unit1); - add_strProp_to_string (string, N_("\n Unit2: "), crd->org.unit2); - add_strProp_to_string (string, N_("\n Unit3: "), crd->org.unit3); - add_strProp_to_string (string, N_("\n Unit4: "), crd->org.unit4); - g_string_append_c (string, '\n'); - } - - add_CardStrProperty_to_string (string, N_("\nCategories: "), &crd->categories); - add_CardStrProperty_to_string (string, N_("\nComment: "), &crd->comment); - -/* if (crd->sound.prop.used) { - if (crd->sound.type != SOUND_PHONETIC) - addPropSizedValue (string, _ ("\nPronunciation: "), - crd->sound.data, crd->sound.size); - else - add_strProp_to_string (string, _ ("\nPronunciation: "), - crd->sound.data); - - add_SoundType (string, crd->sound.type); - }*/ - - add_CardStrProperty_to_string (string, N_("\nUnique String: "), &crd->uid); - - if (crd->key.prop.used) { - add_strProp_to_string (string, N_("\nPublic Key: "), crd->key.data); - add_strKeyType (string, crd->key.type); - } - - ret = g_strdup (string->str); - g_string_free (string, TRUE); - - return ret; -} -#endif - -static ECardDate -e_card_date_from_string (char *str) -{ - ECardDate date; - int length; - - date.year = 0; - date.month = 0; - date.day = 0; - - length = strlen(str); - - if (length == 10 ) { - date.year = str[0] * 1000 + str[1] * 100 + str[2] * 10 + str[3] - '0' * 1111; - date.month = str[5] * 10 + str[6] - '0' * 11; - date.day = str[8] * 10 + str[9] - '0' * 11; - } else if ( length == 8 ) { - date.year = str[0] * 1000 + str[1] * 100 + str[2] * 10 + str[3] - '0' * 1111; - date.month = str[4] * 10 + str[5] - '0' * 11; - date.day = str[6] * 10 + str[7] - '0' * 11; - } - - return date; -} - -char * -e_v_object_get_child_value(VObject *vobj, char *name) -{ - char *ret_val; - VObjectIterator iterator; - initPropIterator(&iterator, vobj); - while(moreIteration (&iterator)) { - VObject *attribute = nextVObject(&iterator); - const char *id = vObjectName(attribute); - if ( ! strcmp(id, name) ) { - assign_string(attribute, &ret_val); - return ret_val; - } - } - ret_val = g_new(char, 1); - *ret_val = 0; - return ret_val; -} - -static ECardPhoneFlags -get_phone_flags (VObject *vobj) -{ - ECardPhoneFlags ret = 0; - int i; - - struct { - char *id; - ECardPhoneFlags flag; - } phone_pairs[] = { - { VCPreferredProp, E_CARD_PHONE_PREF }, - { VCWorkProp, E_CARD_PHONE_WORK }, - { VCHomeProp, E_CARD_PHONE_HOME }, - { VCVoiceProp, E_CARD_PHONE_VOICE }, - { VCFaxProp, E_CARD_PHONE_FAX }, - { VCMessageProp, E_CARD_PHONE_MSG }, - { VCCellularProp, E_CARD_PHONE_CELL }, - { VCPagerProp, E_CARD_PHONE_PAGER }, - { VCBBSProp, E_CARD_PHONE_BBS }, - { VCModemProp, E_CARD_PHONE_MODEM }, - { VCCarProp, E_CARD_PHONE_CAR }, - { VCISDNProp, E_CARD_PHONE_ISDN }, - { VCVideoProp, E_CARD_PHONE_VIDEO }, - }; - - for (i = 0; i < sizeof(phone_pairs) / sizeof(phone_pairs[0]); i++) { - if (isAPropertyOf (vobj, phone_pairs[i].id)) { - ret |= phone_pairs[i].flag; - } - } - - return ret; -} - -static void -set_phone_flags (VObject *vobj, ECardPhoneFlags flags) -{ - int i; - - struct { - char *id; - ECardPhoneFlags flag; - } phone_pairs[] = { - { VCPreferredProp, E_CARD_PHONE_PREF }, - { VCWorkProp, E_CARD_PHONE_WORK }, - { VCHomeProp, E_CARD_PHONE_HOME }, - { VCVoiceProp, E_CARD_PHONE_VOICE }, - { VCFaxProp, E_CARD_PHONE_FAX }, - { VCMessageProp, E_CARD_PHONE_MSG }, - { VCCellularProp, E_CARD_PHONE_CELL }, - { VCPagerProp, E_CARD_PHONE_PAGER }, - { VCBBSProp, E_CARD_PHONE_BBS }, - { VCModemProp, E_CARD_PHONE_MODEM }, - { VCCarProp, E_CARD_PHONE_CAR }, - { VCISDNProp, E_CARD_PHONE_ISDN }, - { VCVideoProp, E_CARD_PHONE_VIDEO }, - }; - - for (i = 0; i < sizeof(phone_pairs) / sizeof(phone_pairs[0]); i++) { - if (flags & phone_pairs[i].flag) { - addProp (vobj, phone_pairs[i].id); - } - } -} - -static ECardAddressFlags -get_address_flags (VObject *vobj) -{ - ECardAddressFlags ret = 0; - int i; - - struct { - char *id; - ECardAddressFlags flag; - } addr_pairs[] = { - { VCDomesticProp, E_CARD_ADDR_DOM }, - { VCInternationalProp, E_CARD_ADDR_INTL }, - { VCPostalProp, E_CARD_ADDR_POSTAL }, - { VCParcelProp, E_CARD_ADDR_PARCEL }, - { VCHomeProp, E_CARD_ADDR_HOME }, - { VCWorkProp, E_CARD_ADDR_WORK }, - }; - - for (i = 0; i < sizeof(addr_pairs) / sizeof(addr_pairs[0]); i++) { - if (isAPropertyOf (vobj, addr_pairs[i].id)) { - ret |= addr_pairs[i].flag; - } - } - - return ret; -} - -static void -set_address_flags (VObject *vobj, ECardAddressFlags flags) -{ - int i; - - struct { - char *id; - ECardAddressFlags flag; - } addr_pairs[] = { - { VCDomesticProp, E_CARD_ADDR_DOM }, - { VCInternationalProp, E_CARD_ADDR_INTL }, - { VCPostalProp, E_CARD_ADDR_POSTAL }, - { VCParcelProp, E_CARD_ADDR_PARCEL }, - { VCHomeProp, E_CARD_ADDR_HOME }, - { VCWorkProp, E_CARD_ADDR_WORK }, - }; - - for (i = 0; i < sizeof(addr_pairs) / sizeof(addr_pairs[0]); i++) { - if (flags & addr_pairs[i].flag) { - addProp (vobj, addr_pairs[i].id); - } - } -} - -#include <Evolution-Composer.h> - -#define COMPOSER_OAFID "OAFIID:GNOME_Evolution_Mail_Composer" - -void -e_card_send (ECard *card, ECardDisposition disposition) -{ - BonoboObjectClient *bonobo_server; - GNOME_Evolution_Composer composer_server; - CORBA_Environment ev; - - /* First, I obtain an object reference that represents the Composer. */ - bonobo_server = bonobo_object_activate (COMPOSER_OAFID, 0); - - g_return_if_fail (bonobo_server != NULL); - - composer_server = bonobo_object_corba_objref (BONOBO_OBJECT (bonobo_server)); - - CORBA_exception_init (&ev); - - if (disposition == E_CARD_DISPOSITION_AS_TO) { - GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; - CORBA_char *subject; - char *name; - EList *email; - EIterator *iterator; - GNOME_Evolution_Composer_Recipient *recipient; - /* Now I have to make a CORBA sequence that represents a recipient list with - one item, for the card. */ - to_list = GNOME_Evolution_Composer_RecipientList__alloc (); - to_list->_maximum = 1; - to_list->_length = 1; - to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (1); - - gtk_object_get(GTK_OBJECT(card), - "full_name", &name, - "email", &email, - NULL); - - recipient = &(to_list->_buffer[0]); - - iterator = e_list_get_iterator(email); - if (e_iterator_is_valid(iterator)) { - recipient->address = CORBA_string_dup(e_iterator_get(iterator)); - } else { - recipient->address = CORBA_string_dup(""); - } - gtk_object_unref(GTK_OBJECT(iterator)); - - recipient->name = CORBA_string_dup(name); - - cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - cc_list->_maximum = cc_list->_length = 0; - bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - bcc_list->_maximum = bcc_list->_length = 0; - - subject = CORBA_string_dup (""); - - GNOME_Evolution_Composer_setHeaders (composer_server, to_list, cc_list, bcc_list, subject, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't set the composer headers via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - if (CORBA_sequence_get_release (to_list) != FALSE) - CORBA_free (to_list->_buffer); - - CORBA_free (to_list); - CORBA_free (cc_list); - CORBA_free (bcc_list); - CORBA_free (subject); - } - - if (disposition == E_CARD_DISPOSITION_AS_ATTACHMENT) { - CORBA_char *content_type, *filename, *description, *attach_data; - CORBA_boolean show_inline; - char *tempstr; - char *name; - - gtk_object_get(GTK_OBJECT(card), - "full_name", &name, - NULL); - - content_type = CORBA_string_dup ("text/x-vcard"); - filename = CORBA_string_dup (""); - - tempstr = g_strdup_printf ("VCard for %s", name); - description = CORBA_string_dup (tempstr); - g_free (tempstr); - - show_inline = FALSE; - - tempstr = e_card_get_vcard(card); - attach_data = CORBA_string_dup (tempstr); - g_free(tempstr); - - GNOME_Evolution_Composer_attachData (composer_server, - content_type, filename, description, - show_inline, attach_data, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't attach data to the composer via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_free (content_type); - CORBA_free (filename); - CORBA_free (description); - CORBA_free (attach_data); - } - - GNOME_Evolution_Composer_show (composer_server, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); -} diff --git a/addressbook/backend/ebook/e-card.h b/addressbook/backend/ebook/e-card.h deleted file mode 100644 index 90d345b62c..0000000000 --- a/addressbook/backend/ebook/e-card.h +++ /dev/null @@ -1,167 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@helixcode.com> - * Arturo Espinosa - * Nat Friedman (nat@helixcode.com) - * - * Copyright (C) 2000 Helix Code, Inc. - * Copyright (C) 1999 The Free Software Foundation - */ - -#ifndef __E_CARD_H__ -#define __E_CARD_H__ - -#include <time.h> -#include <gtk/gtkobject.h> -#include <stdio.h> -#include <addressbook/backend/ebook/e-card-types.h> -#include <e-util/e-list.h> - -#define E_TYPE_CARD (e_card_get_type ()) -#define E_CARD(obj) (GTK_CHECK_CAST ((obj), E_TYPE_CARD, ECard)) -#define E_CARD_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_CARD, ECardClass)) -#define E_IS_CARD(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_CARD)) -#define E_IS_CARD_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_CARD)) - -typedef struct _ECard ECard; -typedef struct _ECardClass ECardClass; - -struct _ECard { - GtkObject object; - char *id; - - char *file_as; /* The File As field. */ - char *fname; /* The full name. */ - ECardName *name; /* The structured name. */ - EList *address; /* Delivery addresses (ECardDeliveryAddress *) */ - EList *address_label; /* Delivery address labels - * (ECardAddrLabel *) */ - - EList *phone; /* Phone numbers (ECardPhone *) */ - EList *email; /* Email addresses (char *) */ - char *url; /* The person's web page. */ - - ECardDate *bday; /* The person's birthday. */ - - char *note; - - - char *org; /* The person's organization. */ - char *org_unit; /* The person's organization unit. */ - char *office; /* The person's office. */ - char *role; /* The person's role w/in his org */ - char *title; /* The person's title w/in his org */ - - char *manager; - char *assistant; - - char *nickname; /* The person's nickname */ - - char *spouse; /* The person's spouse. */ - ECardDate *anniversary; /* The person's anniversary. */ - - char *mailer; /* Mailer */ - - char *fburl; /* Free Busy URL */ - - gint timezone; /* number of minutes from UTC as an int */ - - EList *categories; /* Categories. */ - - EList *arbitrary; /* Arbitrary fields. */ - - guint32 wants_html : 1; /* Wants html mail. */ - guint32 wants_html_set : 1; /* Wants html mail. */ - -#if 0 - ECardPhoto *logo; /* This person's org's logo. */ - - ECardPhoto *photo; /* A photo of the person. */ - - ECard *agent; /* A person who sereves as this - guy's agent/secretary/etc. */ - - - char *categories; /* A list of the categories to which - this card belongs. */ - - ECardSound *sound; - - ECardKey *key; /* The person's public key. */ - ECardTimeZone *timezn; /* The person's time zone. */ - ECardGeoPos *geopos; /* The person's long/lat. */ - - ECardRev *rev; /* The time this card was last - modified. */ - - EList xtension; -#endif -}; - -struct _ECardClass { - GtkObjectClass parent_class; - GHashTable *attribute_jump_table; -}; - - -/* Simple functions */ -ECard *e_card_new (char *vcard); -char *e_card_get_id (ECard *card); -void e_card_set_id (ECard *card, - const char *character); -char *e_card_get_vcard (ECard *card); -ECard *e_card_duplicate (ECard *card); - -/* ECardPhone manipulation */ -ECardPhone *e_card_phone_new (void); -ECardPhone *e_card_phone_copy (const ECardPhone *phone); -void e_card_phone_free (ECardPhone *phone); - -/* ECardDeliveryAddress manipulation */ -ECardDeliveryAddress *e_card_delivery_address_new (void); -ECardDeliveryAddress *e_card_delivery_address_copy (const ECardDeliveryAddress *addr); -void e_card_delivery_address_free (ECardDeliveryAddress *addr); -gboolean e_card_delivery_address_is_empty (const ECardDeliveryAddress *addr); -char *e_card_delivery_address_to_string (const ECardDeliveryAddress *addr); -ECardDeliveryAddress *e_card_delivery_address_from_label (const ECardAddrLabel *label); -ECardAddrLabel *e_card_delivery_address_to_label (const ECardDeliveryAddress *addr); - -/* ECardAddrLabel manipulation */ -ECardAddrLabel *e_card_address_label_new (void); -ECardAddrLabel *e_card_address_label_copy (const ECardAddrLabel *addr); -void e_card_address_label_free (ECardAddrLabel *addr); - -/* ECardName manipulation */ -ECardName *e_card_name_new (void); -ECardName *e_card_name_copy (const ECardName *name); -void e_card_name_free (ECardName *name); -char *e_card_name_to_string (const ECardName *name); -ECardName *e_card_name_from_string (const char *full_name); -gboolean e_card_name_match_string (const ECardName *name, - const gchar *str); - -/* ECardArbitrary manipulation */ -ECardArbitrary *e_card_arbitrary_new (void); -ECardArbitrary *e_card_arbitrary_copy (const ECardArbitrary *arbitrary); -void e_card_arbitrary_free (ECardArbitrary *arbitrary); - -/* ECard email manipulation */ -gboolean e_card_email_match_string (const ECard *card, - const gchar *str); - -/* Specialized functionality */ -GList *e_card_load_cards_from_file (const char *filename); - -enum _ECardDisposition { - E_CARD_DISPOSITION_AS_ATTACHMENT, - E_CARD_DISPOSITION_AS_TO, -}; -typedef enum _ECardDisposition ECardDisposition; -void e_card_send (ECard *card, - ECardDisposition disposition); - -/* Standard Gtk function */ -GtkType e_card_get_type (void); - -#endif /* ! __E_CARD_H__ */ diff --git a/addressbook/backend/ebook/e-destination.c b/addressbook/backend/ebook/e-destination.c deleted file mode 100644 index a44ce3ddc8..0000000000 --- a/addressbook/backend/ebook/e-destination.c +++ /dev/null @@ -1,313 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-destination.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include <string.h> -#include <gtk/gtkobject.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include "e-destination.h" - -struct _EDestinationPrivate { - ECard *card; - gint card_email_num; - - gchar *string; - gchar *string_email; - gchar *string_email_verbose; -}; - -static void e_destination_clear_card (EDestination *); -static void e_destination_clear_strings (EDestination *); - -static GtkObjectClass *parent_class; - -static void -e_destination_destroy (GtkObject *obj) -{ - EDestination *dest = E_DESTINATION (obj); - - e_destination_clear_card (dest); - e_destination_clear_strings (dest); - - g_free (dest->priv); - - if (parent_class->destroy) - parent_class->destroy (obj); -} - -static void -e_destination_class_init (EDestinationClass *klass) -{ - GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass); - - parent_class = GTK_OBJECT_CLASS (gtk_type_class (GTK_TYPE_OBJECT)); - - object_class->destroy = e_destination_destroy; -} - -static void -e_destination_init (EDestination *dest) -{ - dest->priv = g_new0 (struct _EDestinationPrivate, 1); -} - -GtkType -e_destination_get_type (void) -{ - static GtkType dest_type = 0; - - if (!dest_type) { - GtkTypeInfo dest_info = { - "EDestination", - sizeof (EDestination), - sizeof (EDestinationClass), - (GtkClassInitFunc) e_destination_class_init, - (GtkObjectInitFunc) e_destination_init, - NULL, NULL, /* reserved */ - (GtkClassInitFunc) NULL - }; - - dest_type = gtk_type_unique (gtk_object_get_type (), &dest_info); - } - - return dest_type; -} - -EDestination * -e_destination_new (void) -{ - return E_DESTINATION (gtk_type_new (E_TYPE_DESTINATION)); -} - -EDestination * -e_destination_copy (EDestination *dest) -{ - EDestination *new_dest; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - new_dest = e_destination_new (); - - new_dest->priv->card = dest->priv->card; - if (new_dest->priv->card) - gtk_object_ref (GTK_OBJECT (new_dest->priv->card)); - - new_dest->priv->card_email_num = dest->priv->card_email_num; - - new_dest->priv->string = g_strdup (dest->priv->string); - new_dest->priv->string_email = g_strdup (dest->priv->string_email); - new_dest->priv->string_email_verbose = g_strdup (dest->priv->string_email_verbose); - - return new_dest; -} - -gboolean -e_destination_is_empty (EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), TRUE); - - return !(dest->priv->card || (dest->priv->string && *dest->priv->string)); -} - -static void -e_destination_clear_card (EDestination *dest) -{ - if (dest->priv->card) - gtk_object_unref (GTK_OBJECT (dest->priv->card)); - dest->priv->card = NULL; - - dest->priv->card_email_num = -1; -} - -static void -e_destination_clear_strings (EDestination *dest) -{ - g_free (dest->priv->string); - g_free (dest->priv->string_email); - g_free (dest->priv->string_email_verbose); - - dest->priv->string = NULL; - dest->priv->string_email = NULL; - dest->priv->string_email_verbose = NULL; -} - -void -e_destination_set_card (EDestination *dest, ECard *card, gint email_num) -{ - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - g_return_if_fail (card && E_IS_CARD (card)); - - if (dest->priv->card != card) { - if (dest->priv->card) - gtk_object_unref (GTK_OBJECT (dest->priv->card)); - dest->priv->card = card; - gtk_object_ref (GTK_OBJECT (card)); - } - - dest->priv->card_email_num = email_num; - - e_destination_clear_strings (dest); -} - -void -e_destination_set_string (EDestination *dest, const gchar *string) -{ - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - g_return_if_fail (string != NULL); - - g_free (dest->priv->string); - dest->priv->string = g_strdup (string); -} - -ECard * -e_destination_get_card (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - return dest->priv->card; -} - -gint -e_destination_get_email_num (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), -1); - - return dest->priv->card_email_num; -} - -const gchar * -e_destination_get_string (const EDestination *dest) -{ - struct _EDestinationPrivate *priv; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ - - if (priv->string == NULL) { - - if (priv->card) { - - priv->string = e_card_name_to_string (priv->card->name); - if (priv->string) { - g_strstrip (priv->string); - if (*(priv->string) == '\0') { - g_free (priv->string); - priv->string = NULL; - } - } - - if (priv->string == NULL) - priv->string = g_strdup (e_destination_get_email (dest)); - - if (priv->string == NULL) - priv->string = g_strdup (_("???")); - } - } - - return priv->string; -} - -gint -e_destination_get_strlen (const EDestination *dest) -{ - const gchar *str; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), 0); - - str = e_destination_get_string (dest); - return str ? strlen (str) : 0; -} - -const gchar * -e_destination_get_email (const EDestination *dest) -{ - struct _EDestinationPrivate *priv; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ - - if (priv->string_email == NULL) { - - if (priv->card) { /* Pull the address out of the card. */ - - EIterator *iter = e_list_get_iterator (priv->card->email); - gint n = priv->card_email_num; - - if (n >= 0) { - while (n > 0) { - e_iterator_next (iter); - --n; - } - - if (e_iterator_is_valid (iter)) { - gconstpointer ptr = e_iterator_get (iter); - priv->string_email = g_strdup ((gchar *) ptr); - } - } - - } else if (priv->string) { /* Use the string as an e-mail address */ - return priv->string; - } - - /* else we just return NULL */ - } - - return priv->string_email; -} - -const gchar * -e_destination_get_email_verbose (const EDestination *dest) -{ - struct _EDestinationPrivate *priv; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ - - if (priv->string_email_verbose == NULL) { - - const gchar *email = e_destination_get_email (dest); - - if (priv->card) { - - priv->string_email_verbose = g_strdup_printf ("%s <%s>", - e_card_name_to_string (priv->card->name), - email); - } else { - - return email; - } - - } - - return priv->string_email_verbose; -} - - diff --git a/addressbook/backend/ebook/e-destination.h b/addressbook/backend/ebook/e-destination.h deleted file mode 100644 index d0af6b0d23..0000000000 --- a/addressbook/backend/ebook/e-destination.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-destination.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_DESTINATION_H__ -#define __E_DESTINATION_H__ - -#include <gtk/gtkobject.h> -#include <addressbook/backend/ebook/e-card.h> - -#define E_TYPE_DESTINATION (e_destination_get_type ()) -#define E_DESTINATION(o) (GTK_CHECK_CAST ((o), E_TYPE_DESTINATION, EDestination)) -#define E_DESTINATION_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), E_TYPE_DESTINATION, EDestinationClass)) -#define E_IS_DESTINATION(o) (GTK_CHECK_TYPE ((o), E_TYPE_DESTINATION)) -#define E_IS_DESTINATION_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_TYPE_DESTINATION)) - -typedef struct _EDestination EDestination; -typedef struct _EDestinationClass EDestinationClass; - -struct _EDestinationPrivate; - -struct _EDestination { - GtkObject object; - - struct _EDestinationPrivate *priv; -}; - -struct _EDestinationClass { - GtkObjectClass parent_class; -}; - -GtkType e_destination_get_type (void); - -EDestination *e_destination_new (void); -EDestination *e_destination_copy (EDestination *); - -gboolean e_destination_is_empty (EDestination *); - -void e_destination_set_card (EDestination *, ECard *card, gint email_num); -void e_destination_set_string (EDestination *, const gchar *string); - -ECard *e_destination_get_card (const EDestination *); -gint e_destination_get_email_num (const EDestination *); -const gchar *e_destination_get_string (const EDestination *); -gint e_destination_get_strlen (const EDestination *); /* a convenience function... */ - -const gchar *e_destination_get_email (const EDestination *); -const gchar *e_destination_get_email_verbose (const EDestination *); - - - -#endif /* __E_DESTINATION_H__ */ - diff --git a/addressbook/backend/ebook/evolution-gnomecard-importer.c b/addressbook/backend/ebook/evolution-gnomecard-importer.c deleted file mode 100644 index bb5e45cdd6..0000000000 --- a/addressbook/backend/ebook/evolution-gnomecard-importer.c +++ /dev/null @@ -1,214 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#include <config.h> -#include <stdio.h> - -#include <liboaf/liboaf.h> -#include <bonobo/bonobo-context.h> -#include <bonobo/bonobo-generic-factory.h> -#include <bonobo/bonobo-main.h> - -#include <e-book.h> - -#include <importer/evolution-importer.h> -#include <importer/GNOME_Evolution_Importer.h> - -#define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Addressbook_GnomeCard_ImporterFactory" - -static BonoboGenericFactory *factory = NULL; - -typedef struct { - char *filename; - GList *cardlist; - GList *iterator; - EBook *book; - gboolean ready; -} GnomeCardImporter; - -static void -add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure) -{ - ECard *card = E_CARD(closure); - char *vcard = e_card_get_vcard(card); - g_print ("Saved card: %s\n", vcard); - g_free(vcard); - gtk_object_unref(GTK_OBJECT(card)); -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - GnomeCardImporter *gci = (GnomeCardImporter *) closure; - - gci->cardlist = e_card_load_cards_from_file(gci->filename); - gci->ready = TRUE; -} - -static void -ebook_create (GnomeCardImporter *gci) -{ - gchar *path, *uri; - - gci->book = e_book_new (); - - if (!gci->book) { - printf ("%s: %s(): Couldn't create EBook, bailing.\n", - __FILE__, - __FUNCTION__); - return; - } - - path = g_concat_dir_and_file (g_get_home_dir (), - "evolution/local/Contacts/addressbook.db"); - uri = g_strdup_printf ("file://%s", path); - g_free (path); - - if (! e_book_load_uri (gci->book, uri, book_open_cb, gci)) { - printf ("error calling load_uri!\n"); - } - g_free(uri); -} - -/* EvolutionImporter methods */ -static void -process_item_fn (EvolutionImporter *importer, - CORBA_Object listener, - void *closure, - CORBA_Environment *ev) -{ - GnomeCardImporter *gci = (GnomeCardImporter *) closure; - ECard *card; - - if (gci->iterator == NULL) - gci->iterator = gci->cardlist; - - if (gci->ready == FALSE) { - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_NOT_READY, - gci->iterator ? TRUE : FALSE, - ev); - return; - } - - if (gci->iterator == NULL) { - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION, - FALSE, ev); - return; - } - - card = gci->iterator->data; - e_book_add_card (gci->book, card, add_card_cb, card); - - gci->iterator = gci->iterator->next; - - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_OK, - gci->iterator ? TRUE : FALSE, - ev); - if (ev->_major != CORBA_NO_EXCEPTION) { - g_warning ("Error notifying listeners."); - } - - return; -} - -static char *supported_extensions[3] = { - ".vcf", ".gcrd", NULL -}; - -static gboolean -support_format_fn (EvolutionImporter *importer, - const char *filename, - void *closure) -{ - char *ext; - int i; - - ext = strrchr (filename, '.'); - for (i = 0; supported_extensions[i] != NULL; i++) { - if (strcmp (supported_extensions[i], ext) == 0) - return TRUE; - } - - return FALSE; -} - -static void -importer_destroy_cb (GtkObject *object, - GnomeCardImporter *gci) -{ - gtk_main_quit (); -} - -static gboolean -load_file_fn (EvolutionImporter *importer, - const char *filename, - const char *folderpath, - void *closure) -{ - GnomeCardImporter *gci; - - gci = (GnomeCardImporter *) closure; - gci->filename = g_strdup (filename); - gci->cardlist = NULL; - gci->iterator = NULL; - gci->ready = FALSE; - ebook_create (gci); - - return TRUE; -} - -static BonoboObject * -factory_fn (BonoboGenericFactory *_factory, - void *closure) -{ - EvolutionImporter *importer; - GnomeCardImporter *gci; - - gci = g_new (GnomeCardImporter, 1); - importer = evolution_importer_new (support_format_fn, load_file_fn, - process_item_fn, NULL, gci); - - gtk_signal_connect (GTK_OBJECT (importer), "destroy", - GTK_SIGNAL_FUNC (importer_destroy_cb), gci); - - return BONOBO_OBJECT (importer); -} - -static void -importer_init (void) -{ - if (factory != NULL) - return; - - factory = bonobo_generic_factory_new (COMPONENT_FACTORY_IID, - factory_fn, NULL); - - if (factory == NULL) { - g_error ("Unable to create factory"); - } - - bonobo_running_context_auto_exit_unref (BONOBO_OBJECT (factory)); -} - -int -main (int argc, - char **argv) -{ - CORBA_ORB orb; - - gnome_init_with_popt_table ("Evolution-GnomeCard-Importer", - "0.0", argc, argv, oaf_popt_options, 0, - NULL); - orb = oaf_init (argc, argv); - if (bonobo_init (orb, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) { - g_error ("Could not initialize Bonobo."); - } - - importer_init (); - bonobo_main (); - - return 0; -} - - diff --git a/addressbook/backend/ebook/load-gnomecard-addressbook.c b/addressbook/backend/ebook/load-gnomecard-addressbook.c deleted file mode 100644 index 5d16a26a7c..0000000000 --- a/addressbook/backend/ebook/load-gnomecard-addressbook.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#include <config.h> -#include <stdio.h> -#include <glib.h> -#include <gtk/gtkmain.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> -#include <libgnomeui/gnome-init.h> -#include <bonobo/bonobo-main.h> -#include <liboaf/liboaf.h> - -#include "e-book.h" - -static CORBA_Environment ev; - -static void -init_bonobo (int argc, char **argv) -{ - if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) - g_error (_("Could not initialize Bonobo")); -} - -static void -add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure) -{ - ECard *card = E_CARD(closure); - char *vcard = e_card_get_vcard(card); - g_print ("Saved card: %s\n", vcard); - g_free(vcard); - gtk_object_unref(GTK_OBJECT(card)); -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - GList *list = e_card_load_cards_from_file("gnomecard.vcf"); - GList *iterator; - for (iterator = list; iterator; iterator = g_list_next(iterator)) { - ECard *card = iterator->data; - e_book_add_card(book, card, add_card_cb, card); - } - g_list_free(list); -} - -static guint -ebook_create (void) -{ - EBook *book; - gchar *path, *uri; - - book = e_book_new (); - - if (!book) { - printf ("%s: %s(): Couldn't create EBook, bailing.\n", - __FILE__, - __FUNCTION__); - return FALSE; - } - - - path = g_concat_dir_and_file (g_get_home_dir (), - "evolution/local/Contacts/addressbook.db"); - uri = g_strdup_printf ("file://%s", path); - g_free (path); - - if (! e_book_load_uri (book, uri, book_open_cb, NULL)) { - printf ("error calling load_uri!\n"); - } - g_free(uri); - - - return FALSE; -} - -int -main (int argc, char **argv) -{ - - CORBA_exception_init (&ev); - - gnome_init_with_popt_table("blah", "0.0", argc, argv, NULL, 0, NULL); - oaf_init (argc, argv); - init_bonobo (argc, argv); - - gtk_idle_add ((GtkFunction) ebook_create, NULL); - - bonobo_main (); - - return 0; -} diff --git a/addressbook/backend/ebook/load-pine-addressbook.c b/addressbook/backend/ebook/load-pine-addressbook.c deleted file mode 100644 index 2c18efb7c8..0000000000 --- a/addressbook/backend/ebook/load-pine-addressbook.c +++ /dev/null @@ -1,172 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#include <config.h> -#include <ctype.h> -#include <stdio.h> -#include <glib.h> -#include <gtk/gtkmain.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> -#include <libgnomeui/gnome-init.h> -#include <bonobo/bonobo-main.h> -#include <liboaf/liboaf.h> - -#include "e-book.h" - -static CORBA_Environment ev; - -static void -init_bonobo (int argc, char **argv) -{ - if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) - g_error (_("Could not initialize Bonobo")); -} - -static void -add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure) -{ - ECard *card = E_CARD(closure); - char *vcard = e_card_get_vcard(card); - g_print ("Saved card: %s\n", vcard); - g_free(vcard); - gtk_object_unref(GTK_OBJECT(card)); -} - -static void -parse_line (EBook *book, char *line) -{ - char **strings; - ECardName *name; - ECard *card; - EList *list; - - card = e_card_new(""); - strings = g_strsplit(line, "\t", 3); - if (strings[0] && strings[1] && strings[2]) { - name = e_card_name_from_string(strings[1]); - gtk_object_set(GTK_OBJECT(card), - "nickname", strings[0], - "full_name", strings[1], - "name", name, - NULL); - gtk_object_get(GTK_OBJECT(card), - "email", &list, - NULL); - e_list_append(list, strings[2]); - g_strfreev(strings); - e_book_add_card(book, card, add_card_cb, card); - } -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - FILE *fp = fopen (".addressbook", "r"); - char line[2 * 1024]; - int which = 0; - char *lastline = NULL; - - if (!fp) { - g_warning ("Can't find .addressbook"); - return; - } - - while(fgets(line + which * 1024, 1024, fp)) { - int length; - char *thisline = line + which * 1024; - length = strlen(thisline); - if (thisline[length - 1] == '\n') - line[--length] = 0; - if (lastline && *thisline && isspace(*thisline)) { - char *temp; - while(*thisline && isspace(*thisline)) - thisline ++; - temp = lastline; - lastline = g_strdup_printf("%s%s", lastline, thisline); - g_free(temp); - continue; - } - if (lastline) { - parse_line (book, lastline); - g_free(lastline); - } - lastline = g_strdup(thisline); - } - - if (lastline) { - parse_line (book, lastline); - g_free(lastline); - } -} - -static guint -ebook_create (void) -{ - EBook *book; - gchar *path, *uri; - - book = e_book_new (); - - if (!book) { - printf ("%s: %s(): Couldn't create EBook, bailing.\n", - __FILE__, - __FUNCTION__); - return FALSE; - } - - - path = g_concat_dir_and_file (g_get_home_dir (), - "evolution/local/Contacts/addressbook.db"); - uri = g_strdup_printf ("file://%s", path); - g_free (path); - - if (! e_book_load_uri (book, uri, book_open_cb, NULL)) { - printf ("error calling load_uri!\n"); - } - g_free(uri); - - - return FALSE; -} - -#if 0 -static char * -read_file (char *name) -{ - int len; - char buff[65536]; - char line[1024]; - FILE *f; - - f = fopen (name, "r"); - if (f == NULL) - g_error ("Unable to open %s!\n", name); - - len = 0; - while (fgets (line, sizeof (line), f) != NULL) { - strcpy (buff + len, line); - len += strlen (line); - } - - fclose (f); - - return g_strdup (buff); -} -#endif - -int -main (int argc, char **argv) -{ - - CORBA_exception_init (&ev); - - gnome_init_with_popt_table("blah", "0.0", argc, argv, NULL, 0, NULL); - oaf_init (argc, argv); - init_bonobo (argc, argv); - - gtk_idle_add ((GtkFunction) ebook_create, NULL); - - bonobo_main (); - - return 0; -} diff --git a/addressbook/backend/ebook/test-card.c b/addressbook/backend/ebook/test-card.c deleted file mode 100644 index a2f10e5aca..0000000000 --- a/addressbook/backend/ebook/test-card.c +++ /dev/null @@ -1,196 +0,0 @@ -#include <string.h> -#include <libgnome/gnome-defs.h> -#include <libgnomeui/gnome-init.h> -#include "e-card.h" - -#define TEST_VCARD \ -"BEGIN:VCARD -" \ -"FN:Nat -" \ -"N:Friedman;Nat;D;Mr. -" \ -"ORG:Helix Code, Inc. -" \ -"TITLE:Head Geek -" \ -"ROLE:Programmer/Executive -" \ -"BDAY:1977-08-06 -" \ -"TEL;WORK:617 679 1984 -" \ -"TEL;CELL:123 456 7890 -" \ -"EMAIL;INTERNET:nat@nat.org -" \ -"EMAIL;INTERNET:nat@helixcode.com -" \ -"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234; -" \ -"ADR;HOME;POSTAL;INTL:P.O. Box 202;;;Any Town 2;MI;12344-4321;USA -" \ -"END:VCARD -" \ -" -" - -static char * -read_file (char *name) -{ - int len; - char buff[65536]; - char line[1024]; - FILE *f; - - f = fopen (name, "r"); - if (f == NULL) - g_error ("Unable to open %s!\n", name); - - len = 0; - while (fgets (line, sizeof (line), f) != NULL) { - strcpy (buff + len, line); - len += strlen (line); - } - - fclose (f); - - return g_strdup (buff); -} - - - -int -main (int argc, char **argv) -{ - char *cardstr; - ECard *card; - - /* Fields */ - char *fname; - char *org; - char *org_unit; - char *title; - char *role; - char *nickname; - char *fburl; - ECardName *name; - EList *address; - EList *phone; - EList *email; - EIterator *iterator; - ECardDate *bday; - - gnome_init ("TestCard", "0.0", argc, argv); - - cardstr = NULL; - if (argc == 2) - cardstr = read_file (argv [1]); - - if (cardstr == NULL) - cardstr = TEST_VCARD; -#if 0 - { - int i; - for ( i = 0; i < 100000; i++ ) { - card = e_card_new (cardstr); - - gtk_object_unref (GTK_OBJECT (card)); - } - } -#endif - card = e_card_new (cardstr); - gtk_object_get(GTK_OBJECT(card), - "full_name", &fname, - "name", &name, - "address", &address, - "phone", &phone, - "email", &email, - "org", &org, - "org_unit", &org_unit, - "title", &title, - "role", &role, - "nickname", &nickname, - "fburl", &fburl, - "birth_date", &bday, - NULL); - if ( fname ) { - printf("Name : %s\n", fname); - g_free(fname); - } - if ( name ) { - printf("Full Name:\n"); - if ( name->prefix ) - printf(" prefix : %s\n", name->prefix); - if ( name->given ) - printf(" given : %s\n", name->given); - if ( name->additional ) - printf(" additional : %s\n", name->additional); - if ( name->family ) - printf(" family : %s\n", name->family); - if ( name->suffix ) - printf(" suffix : %s\n", name->suffix); - } - if ( org ) { - printf("Company : %s\n", org); - } - if ( org_unit ) { - printf("Department : %s\n", org_unit); - } - if ( title ) { - printf("Title : %s\n", title); - } - if ( role ) { - printf("Profession : %s\n", role); - } - if ( nickname ) { - printf("Nickname : %s\n", nickname); - } - if ( fburl ) { - printf("Free Busy URL : %s\n", fburl); - } - if ( bday ) { - printf("BDay : %4d-%02d-%02d\n", bday->year, bday->month, bday->day); - } - if ( email ) { - iterator = e_list_get_iterator(address); - for (; e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - printf("Email : %s\n", (char *) e_iterator_get(iterator)); - } - gtk_object_unref(GTK_OBJECT(iterator)); - } - if ( phone ) { - iterator = e_list_get_iterator(address); - for (; e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - ECardPhone *e_card_phone = (ECardPhone *) e_iterator_get(iterator); - printf("Phone ; %d : %s\n", e_card_phone->flags, e_card_phone->number); - } - gtk_object_unref(GTK_OBJECT(iterator)); - } - if ( address ) { - iterator = e_list_get_iterator(address); - for (; e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - ECardDeliveryAddress *del_address = (ECardDeliveryAddress *) e_iterator_get(iterator); - printf("Address ; %d:\n", del_address->flags); - if ( del_address->po ) - printf(" Po : %s\n", del_address->po); - if ( del_address->ext ) - printf(" Ext : %s\n", del_address->ext); - if ( del_address->street ) - printf(" Street : %s\n", del_address->street); - if ( del_address->city ) - printf(" City : %s\n", del_address->city); - if ( del_address->region ) - printf(" Region : %s\n", del_address->region); - if ( del_address->code ) - printf(" Code : %s\n", del_address->code); - if ( del_address->country ) - printf(" Country : %s\n", del_address->country); - } - gtk_object_unref(GTK_OBJECT(iterator)); - } - printf("%s", e_card_get_vcard(card)); - gtk_object_unref (GTK_OBJECT (card)); - - return 0; -} diff --git a/addressbook/backend/ebook/test-client-list.c b/addressbook/backend/ebook/test-client-list.c deleted file mode 100644 index 0de62d701c..0000000000 --- a/addressbook/backend/ebook/test-client-list.c +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#include <config.h> - -#include <glib.h> -#include <gtk/gtkmain.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-init.h> -#include <liboaf/liboaf.h> -#include <bonobo/bonobo-main.h> - -#include "e-book.h" - -CORBA_Environment ev; - -static void -init_bonobo (int argc, char **argv) -{ - gnome_init ("blah", "0.0", argc, argv); - oaf_init (argc, argv); - - if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) - g_error (_("Could not initialize Bonobo")); -} - -static void -get_cursor_cb (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure) -{ - long length = e_card_cursor_get_length(cursor); - long i; - - printf ("Length: %d\n", (int) length); - for ( i = 0; i < length; i++ ) { - ECard *card = e_card_cursor_get_nth(cursor, i); - char *vcard = e_card_get_vcard(card); - printf("[%s]\n", vcard); - g_free(vcard); - gtk_object_unref(GTK_OBJECT(card)); - } -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - printf ("Book opened.\n"); - e_book_get_cursor(book, "", get_cursor_cb, NULL); -} - -static guint -ebook_create (void) -{ - EBook *book; - - book = e_book_new (); - - if (! e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL)) { - printf ("error calling load_uri!\n"); - } - - - return FALSE; -} - -int -main (int argc, char **argv) -{ - - CORBA_exception_init (&ev); - init_bonobo (argc, argv); - - gtk_idle_add ((GtkFunction) ebook_create, NULL); - - bonobo_main (); - - return 0; -} diff --git a/addressbook/backend/ebook/test-client.c b/addressbook/backend/ebook/test-client.c deleted file mode 100644 index 36115d848a..0000000000 --- a/addressbook/backend/ebook/test-client.c +++ /dev/null @@ -1,199 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#include <config.h> -#include <glib.h> -#include <gtk/gtkmain.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-init.h> -#include <bonobo/bonobo-main.h> -#include <liboaf/liboaf.h> - -#include "e-book.h" - -#define TEST_VCARD \ -"BEGIN:VCARD -" \ -"FN:Nat -" \ -"N:Friedman;Nat;D;Mr. -" \ -"BDAY:1977-08-06 -" \ -"TEL;WORK:617 679 1984 -" \ -"TEL;CELL:123 456 7890 -" \ -"EMAIL;INTERNET:nat@nat.org -" \ -"EMAIL;INTERNET:nat@helixcode.com -" \ -"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234; -" \ -"END:VCARD -" \ -" -" - -static CORBA_Environment ev; -static char *cardstr; - -static void -init_bonobo (int argc, char **argv) -{ - if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) - g_error (_("Could not initialize Bonobo")); -} - -static void -get_cursor_cb (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure) -{ - long length = e_card_cursor_get_length(cursor); - long i; - - /* we just added a card, so the length should be >1 */ - printf ("\n%s: %s(): Number of cards is %ld\n", - __FILE__, __FUNCTION__, length); - if (length < 1) - printf ("*** Why isn't this above zero?? ***\n\n"); - - for ( i = 0; i < length; i++ ) { - ECard *card = e_card_cursor_get_nth(cursor, i); - char *vcard = e_card_get_vcard(card); - printf("Get all cards callback: [%s]\n", vcard); - g_free(vcard); - gtk_object_unref(GTK_OBJECT(card)); - } -} - -static void -add_card_cb (EBook *book, EBookStatus status, const gchar *id, gpointer closure) -{ - char *vcard; - ECard *card; - GTimer *timer; - - printf ("Status: %d\n", status); - - printf ("Id: %s\n", id); - - timer = g_timer_new (); - g_timer_start (timer); - card = e_book_get_card (book, id); - g_timer_stop (timer); - - vcard = e_card_get_vcard(card); - printf ("%g\n", g_timer_elapsed (timer, NULL)); - printf ("Card added: [%s]\n", vcard); - g_free(vcard); - gtk_object_unref(GTK_OBJECT(card)); - - printf ("Getting cards..\n"); - e_book_get_cursor(book, "", get_cursor_cb, NULL); - printf ("Done getting all cards.\n"); -} - -static void -get_fields_cb (EBook *book, EBookStatus status, EList *fields, gpointer closure) -{ - if (fields) { - EIterator *iter = e_list_get_iterator (fields); - - printf ("Supported fields:\n"); - - for (; e_iterator_is_valid (iter); e_iterator_next (iter)) { - printf (" %s\n", (char*)e_iterator_get (iter)); - } - - gtk_object_unref(GTK_OBJECT(fields)); - } - else { - printf ("No supported fields?\n"); - } - - e_book_add_vcard(book, cardstr, add_card_cb, NULL); -} - - -static void -auth_user_cb (EBook *book, EBookStatus status, gpointer closure) -{ - printf ("user authenticated\n"); - e_book_get_supported_fields (book, get_fields_cb, closure); -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - e_book_authenticate_user (book, "username", "password", auth_user_cb, NULL); -} - -static guint -ebook_create (void) -{ - EBook *book; - - book = e_book_new (); - - if (!book) { - printf ("%s: %s(): Couldn't create EBook, bailing.\n", - __FILE__, - __FUNCTION__); - return FALSE; - } - - - if (! e_book_load_uri (book, "file:/tmp/test.db", book_open_cb, NULL)) { - printf ("error calling load_uri!\n"); - } - - - return FALSE; -} - -static char * -read_file (char *name) -{ - int len; - char buff[65536]; - char line[1024]; - FILE *f; - - f = fopen (name, "r"); - if (f == NULL) - g_error ("Unable to open %s!\n", name); - - len = 0; - while (fgets (line, sizeof (line), f) != NULL) { - strcpy (buff + len, line); - len += strlen (line); - } - - fclose (f); - - return g_strdup (buff); -} - - -int -main (int argc, char **argv) -{ - - CORBA_exception_init (&ev); - - gnome_init_with_popt_table ("blah", "0.0", argc, argv, NULL, 0, NULL); - oaf_init (argc, argv); - init_bonobo (argc, argv); - - cardstr = NULL; - if (argc == 2) - cardstr = read_file (argv [1]); - - if (cardstr == NULL) - cardstr = TEST_VCARD; - - gtk_idle_add ((GtkFunction) ebook_create, NULL); - - bonobo_main (); - - return 0; -} diff --git a/addressbook/backend/idl/.cvsignore b/addressbook/backend/idl/.cvsignore deleted file mode 100644 index 09980ae6ba..0000000000 --- a/addressbook/backend/idl/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la diff --git a/addressbook/backend/idl/Makefile.am b/addressbook/backend/idl/Makefile.am deleted file mode 100644 index db61d2c30c..0000000000 --- a/addressbook/backend/idl/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -idldir = $(datadir)/idl - -idl_DATA = \ - addressbook.idl - -EXTRA_DIST = $(idl_DATA) diff --git a/addressbook/backend/idl/addressbook.idl b/addressbook/backend/idl/addressbook.idl deleted file mode 100644 index 877813e5d3..0000000000 --- a/addressbook/backend/idl/addressbook.idl +++ /dev/null @@ -1,170 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { -module Addressbook { - typedef string CardId; - typedef string VCard; - typedef sequence<VCard> VCardList; - typedef sequence<string> stringlist; - - interface CardCursor : Bonobo::Unknown { - long count (); - string getNth (in long n); - }; - - /* - * A book view is a live view of a book. It's either a view - * of all the cards in the book or a view of a query. When - * created, it will get a series of signal_card_added calls - * for all objects in the initial set. After that, it will - * get added, removed, or changed signals whenever the book - * changes (if it affects the set of viewed cards.) - */ - interface BookViewListener : Bonobo::Unknown { - void notifyCardAdded (in VCardList cards); - void notifyCardRemoved (in CardId id); - void notifyCardChanged (in VCardList cards); - void notifySequenceComplete (); - void notifyStatusMessage (in string message); - }; - - interface BookView : Bonobo::Unknown { - }; - - interface Book : Bonobo::Unknown { - /* - * Fetching cards in the addresbook. - */ - VCard getVCard (in CardId id); - - /* - * Permissions. the first form is general write - * permission (whether or not the user can add or - * remove or modify any entry in the addressbook.) - * - * if can_write returns TRUE, can_write_card can still - * return FALSE if the user doesn't have permission to - * modify/remove that specific card. - */ - boolean isWriteable (); - boolean isCardWriteable (in CardId Id); - - void authenticateUser (in string user, in string passwd); - - /* - * Adding and deleting cards in the book. - */ - void addCard (in VCard vcard); - void removeCard (in CardId Id); - - /* - * Modifying cards in the addressbook. - */ - void modifyCard (in VCard vcard); - - /* - * This function returns a cursor to the book - * listener. This is for people who want a snapshot - * of the addressbook. The syntax for the query - * string is not yet defined. - */ - void getCursor (in string query); - - /* - * These two functions return a book view to the book - * listener. This is for people who want a live view - * of the addressbook. - */ - void getBookView (in BookViewListener listener, in string query); - - void getChanges (in BookViewListener listener, in string change_id); - - void checkConnection (); - - void getSupportedFields (); - - string getStaticCapabilities (); - - string getName (); - }; - - interface BookListener : Bonobo::Unknown { - - enum CallStatus { - Success, - RepositoryOffline, - PermissionDenied, - CardNotFound, - ProtocolNotSupported, - AuthenticationFailed, - AuthenticationRequired, - UnsupportedField, - OtherError - }; - - void notifyCardCreated (in CallStatus status, in CardId Id); - - void notifyCardRemoved (in CallStatus status); - - void notifyCardModified (in CallStatus status); - - void notifyOpenBookProgress (in string status_message, in short percent); - - void notifyBookOpened (in CallStatus status, in Book book); - - void notifyCursorRequested (in CallStatus status, in CardCursor cursor); - - void notifyViewRequested (in CallStatus status, in BookView view); - - void notifyChangesRequested (in CallStatus status, in BookView view); - - void notifyAuthenticationResult (in CallStatus status); - - void notifySupportedFields (in CallStatus status, in stringlist fields); - - /** - * notifyConnectionStatus: - * - * Used to report changes in the connection to the - * contact repository. This is often a response to a - * call to check_connection() on the Book, but wombat - * is free to report the connection status without - * being asked. - */ - void notifyConnectionStatus (in boolean connected); - - /** - * notifyWritable: - * - * Used to report whether or not a backend can write - * to a given addressbook. All books default to - * read-only, so unless you receive a notification - * saying otherwise, treat the book as read-only. It - * is presumed that this notification will be sent - * early (just after a connection is opened, usually), - * but it may also be sent later, if/when the backend - * notices a change. - */ - void notifyWritable (in boolean writable); - }; - - interface BookFactory : Bonobo::Unknown { - exception ProtocolNotSupported {}; - - void openBook (in string uri, in BookListener listener) - raises (ProtocolNotSupported); - }; -}; -}; -}; - diff --git a/addressbook/backend/pas/.cvsignore b/addressbook/backend/pas/.cvsignore deleted file mode 100644 index 071cef99ae..0000000000 --- a/addressbook/backend/pas/.cvsignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -addressbook-stubs.c -addressbook-skels.c -addressbook-common.c -addressbook.h -*.lo -*.la diff --git a/addressbook/backend/pas/Makefile.am b/addressbook/backend/pas/Makefile.am deleted file mode 100644 index 5ed8753a39..0000000000 --- a/addressbook/backend/pas/Makefile.am +++ /dev/null @@ -1,56 +0,0 @@ -CORBA_SOURCE = \ - addressbook.h \ - addressbook-common.c \ - addressbook-stubs.c \ - addressbook-skels.c - -idls = \ - $(srcdir)/../idl/addressbook.idl - -idl_flags = `$(GNOME_CONFIG) --cflags idl` -I $(datadir)/idl - -$(CORBA_SOURCE): $(idls) - $(ORBIT_IDL) -I $(srcdir) $(srcdir)/../idl/addressbook.idl $(idl_flags) - -INCLUDES = \ - -DGNOMELOCALEDIR=\""$(localedir)"\" \ - -DG_LOG_DOMAIN=\"wombat-pas\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - $(BONOBO_GNOME_CFLAGS) \ - $(EXTRA_GNOME_CFLAGS) - -LDAP_BACKEND_SOURCES = pas-backend-ldap.c pas-backend-ldap.h - -if ENABLE_LDAP -LDAP_BACKEND = $(LDAP_BACKEND_SOURCES) -else -LDAP_BACKEND = -endif - -noinst_LIBRARIES = libpas.a - -libpas_a_SOURCES = \ - $(CORBA_SOURCE) \ - pas-book-factory.c \ - pas-book-factory.h \ - pas-book-view.c \ - pas-book-view.h \ - pas-book.c \ - pas-book.h \ - pas-backend-file.c \ - pas-backend-file.h \ - $(LDAP_BACKEND) \ - pas-backend.c \ - pas-backend.h \ - pas-card-cursor.c \ - pas-card-cursor.h - -BUILT_SOURCES = $(CORBA_SOURCE) -CLEANFILES += $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - -EXTRA_DIST = $(LDAP_BACKEND_SOURCES) diff --git a/addressbook/backend/pas/TODO b/addressbook/backend/pas/TODO deleted file mode 100644 index 0c77c1b200..0000000000 --- a/addressbook/backend/pas/TODO +++ /dev/null @@ -1,2 +0,0 @@ -* Implement pas_book_factory_activate -* Authentication
\ No newline at end of file diff --git a/addressbook/backend/pas/evolutionperson.schema b/addressbook/backend/pas/evolutionperson.schema deleted file mode 100644 index abd85fc01c..0000000000 --- a/addressbook/backend/pas/evolutionperson.schema +++ /dev/null @@ -1,166 +0,0 @@ -# -# Depends upon -# Definition of an X.500 Attribute Type and an Object Class to Hold -# Uniform Resource Identifiers (URIs) [RFC2079] -# (core.schema) -# -# A Summary of the X.500(96) User Schema for use with LDAPv3 [RFC2256] -# (core.schema) -# -# The COSINE and Internet X.500 Schema [RFC1274] (cosine.schema) -# -# The Internet Organizational Person Schema (inetorgperson) - -# primaryPhone -attributetype ( 666.666.666.1.1 - NAME 'primaryPhone' - DESC 'preferred phone number used to contact a person' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 - SINGLE-VALUE ) - -# carPhone -attributetype ( 666.666.666.1.2 - NAME 'carPhone' - DESC 'car phone telephone number of the person' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 - SINGLE-VALUE ) - -attributetype ( 666.666.666.1.3 - NAME ( 'homeFacsimileTelephoneNumber' 'homeFax' ) - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.22 ) - -attributetype ( 666.666.666.1.4 - NAME 'otherPhone' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.5 - NAME 'businessRole' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.6 - NAME 'managerName' - SUP name ) - -attributetype ( 666.666.666.1.7 - NAME 'assistantName' - SUP name ) - -# spouseName -# single valued (/me smirks) -attributetype ( 666.666.666.1.8 - NAME 'spouseName' - SUP name - SINGLE-VALUE ) - -attributetype ( 666.666.666.1.9 - NAME 'otherPostalAddress' - EQUALITY caseIgnoreListMatch - SUBSTR caseIgnoreListSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 ) - -attributetype ( 666.666.666.1.10 - NAME ( 'mailer' 'mua' ) - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32} ) - -attributetype ( 666.666.666.1.11 - NAME ( 'birthDate' 'dob' ) - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) - -attributetype ( 666.666.666.1.12 - NAME 'anniversary' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) - -attributetype ( 666.666.666.1.13 - NAME 'note' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1024} ) - -attributetype ( 666.666.666.1.14 - NAME 'evolutionArbitrary' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} ) - ) - -attributetype ( 666.666.666.1.15 - NAME 'fileAs' - SUP name ) - -attributetype ( 666.666.666.1.16 - NAME 'assistantPhone' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.17 - NAME 'companyPhone' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.18 - NAME 'callbackPhone' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.19 - NAME ( 'otherFacsimileTelephoneNumber' 'otherFax' ) - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.20 - NAME 'radio' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.21 - NAME 'telex' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.22 - NAME 'tty' - EQUALITY telephoneNumberMatch - SUBSTR telephoneNumberSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) - -attributetype ( 666.666.666.1.23 - NAME 'categories' - EQUALITY caseIgnoreMatch - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} ) - -# evolutionPerson -objectclass ( 666.666.666.2.1 - NAME 'evolutionPerson' - DESC 'Objectclass geared to Evolution Usage' - SUP inetOrgPerson - STRUCTURAL - MAY ( - fileAs $ primaryPhone $ carPhone $ homeFacsimileTelephoneNumber $ - otherPhone $ businessRole $ managerName $ assistantName $ assistantPhone $ - otherPostalAddress $ mailer $ birthDate $ anniversary $ spouseName $ - note $ companyPhone $ callbackPhone $ otherFacsimileTelephoneNumber $ - radio $ telex $ tty $ categories ) - ) diff --git a/addressbook/backend/pas/pas-backend-file.c b/addressbook/backend/pas/pas-backend-file.c deleted file mode 100644 index ec7bdfcd7f..0000000000 --- a/addressbook/backend/pas/pas-backend-file.c +++ /dev/null @@ -1,1605 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#include "config.h" -#include <stdio.h> -#include <unistd.h> -#include <fcntl.h> -#include <time.h> -#ifdef HAVE_DB_185_H -#include <db_185.h> -#else -#ifdef HAVE_DB1_DB_H -#include <db1/db.h> -#else -#include <db.h> -#endif -#endif - -#include <gtk/gtksignal.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-util.h> -#include <gal/util/e-util.h> -#include <gal/widgets/e-unicode.h> - -#include <ebook/e-card-simple.h> -#include <e-util/e-sexp.h> -#include <e-util/e-dbhash.h> -#include "pas-backend-file.h" -#include "pas-book.h" -#include "pas-card-cursor.h" - -#define PAS_BACKEND_FILE_VERSION_NAME "PAS-DB-VERSION" -#define PAS_BACKEND_FILE_VERSION "0.1" - -static PASBackendClass *pas_backend_file_parent_class; -typedef struct _PASBackendFileCursorPrivate PASBackendFileCursorPrivate; -typedef struct _PASBackendFileBookView PASBackendFileBookView; -typedef struct _PASBackendFileSearchContext PASBackendFileSearchContext; -typedef struct _PasBackendFileChangeContext PASBackendFileChangeContext; - -struct _PASBackendFilePrivate { - GList *clients; - gboolean loaded; - char *uri; - DB *file_db; - EList *book_views; - gboolean writable; -}; - -struct _PASBackendFileCursorPrivate { - PASBackend *backend; - PASBook *book; - - GList *elements; - guint32 num_elements; -}; - -struct _PASBackendFileBookView { - PASBookView *book_view; - gchar *search; - ESExp *search_sexp; - PASBackendFileSearchContext *search_context; - gchar *change_id; - PASBackendFileChangeContext *change_context; -}; - -struct _PASBackendFileSearchContext { - ECardSimple *card; -}; - -struct _PasBackendFileChangeContext { - DB *db; - - GList *add_cards; - GList *add_ids; - GList *mod_cards; - GList *mod_ids; - GList *del_ids; -}; - -static PASBackendFileBookView * -pas_backend_file_book_view_copy(const PASBackendFileBookView *book_view, void *closure) -{ - PASBackendFileBookView *new_book_view; - new_book_view = g_new (PASBackendFileBookView, 1); - new_book_view->book_view = book_view->book_view; - - new_book_view->search = g_strdup(book_view->search); - new_book_view->search_sexp = book_view->search_sexp; - if (new_book_view->search_sexp) - gtk_object_ref(GTK_OBJECT(new_book_view->search_sexp)); - if (book_view->search_context) { - new_book_view->search_context = g_new(PASBackendFileSearchContext, 1); - new_book_view->search_context->card = book_view->search_context->card; - } else - new_book_view->search_context = NULL; - - new_book_view->change_id = g_strdup(book_view->change_id); - if (book_view->change_context) { - new_book_view->change_context = g_new(PASBackendFileChangeContext, 1); - new_book_view->change_context->db = book_view->change_context->db; - new_book_view->change_context->add_cards = book_view->change_context->add_cards; - new_book_view->change_context->add_ids = book_view->change_context->add_ids; - new_book_view->change_context->mod_cards = book_view->change_context->mod_cards; - new_book_view->change_context->mod_ids = book_view->change_context->mod_ids; - new_book_view->change_context->del_ids = book_view->change_context->del_ids; - } else - new_book_view->change_context = NULL; - - return new_book_view; -} - -static void -pas_backend_file_book_view_free(PASBackendFileBookView *book_view, void *closure) -{ - g_free(book_view->search); - if (book_view->search_sexp) - e_sexp_unref (book_view->search_sexp); - g_free(book_view->search_context); - - g_free(book_view->change_id); - if (book_view->change_context) { - g_list_foreach (book_view->change_context->add_cards, (GFunc)g_free, NULL); - g_list_foreach (book_view->change_context->add_ids, (GFunc)g_free, NULL); - g_list_foreach (book_view->change_context->mod_cards, (GFunc)g_free, NULL); - g_list_foreach (book_view->change_context->mod_ids, (GFunc)g_free, NULL); - g_list_foreach (book_view->change_context->del_ids, (GFunc)g_free, NULL); - g_list_free (book_view->change_context->add_cards); - g_list_free (book_view->change_context->add_ids); - g_list_free (book_view->change_context->mod_cards); - g_list_free (book_view->change_context->mod_ids); - g_list_free (book_view->change_context->del_ids); - } - g_free(book_view->change_context); - - g_free(book_view); -} - -static long -get_length(PASCardCursor *cursor, gpointer data) -{ - PASBackendFileCursorPrivate *cursor_data = (PASBackendFileCursorPrivate *) data; - - return cursor_data->num_elements; -} - -static char * -get_nth(PASCardCursor *cursor, long n, gpointer data) -{ - PASBackendFileCursorPrivate *cursor_data = (PASBackendFileCursorPrivate *) data; - GList *nth_item = g_list_nth(cursor_data->elements, n); - - return g_strdup((char*)nth_item->data); -} - -static void -cursor_destroy(GtkObject *object, gpointer data) -{ - CORBA_Environment ev; - GNOME_Evolution_Addressbook_Book corba_book; - PASBackendFileCursorPrivate *cursor_data = (PASBackendFileCursorPrivate *) data; - - corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(cursor_data->book)); - - CORBA_exception_init(&ev); - - GNOME_Evolution_Addressbook_Book_unref(corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("cursor_destroy: Exception unreffing " - "corba book.\n"); - } - - CORBA_exception_free(&ev); - - g_list_foreach(cursor_data->elements, (GFunc)g_free, NULL); - g_list_free (cursor_data->elements); - - g_free(cursor_data); -} - -static void -view_destroy(GtkObject *object, gpointer data) -{ - PASBook *book = (PASBook *)data; - PASBackendFile *bf; - EIterator *iterator; - gboolean success = FALSE; - - bf = PAS_BACKEND_FILE(pas_book_get_backend(book)); - for (iterator = e_list_get_iterator(bf->priv->book_views); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const PASBackendFileBookView *view = e_iterator_get(iterator); - if (view->book_view == PAS_BOOK_VIEW(object)) { - e_iterator_delete(iterator); - success = TRUE; - break; - } - } - if (!success) - g_warning ("Failed to remove from book_views list"); - gtk_object_unref(GTK_OBJECT(iterator)); - - bonobo_object_unref(BONOBO_OBJECT(book)); -} - -static void -string_to_dbt(const char *str, DBT *dbt) -{ - dbt->data = (void*)str; - dbt->size = strlen (str) + 1; -} - -static char * -pas_backend_file_create_unique_id (char *vcard) -{ - /* use a 32 counter and the 32 bit timestamp to make an id. - it's doubtful 2^32 id's will be created in a second, so we - should be okay. */ - static guint c = 0; - return g_strdup_printf ("pas-id-%08lX%08X", time(NULL), c++); -} - -static gboolean -compare_email (ECardSimple *card, const char *str, - char *(*compare)(const char*, const char*)) -{ - int i; - - for (i = E_CARD_SIMPLE_EMAIL_ID_EMAIL; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) { - const char *email = e_card_simple_get_email (card, i); - - if (email && compare(email, str)) - return TRUE; - } - - return FALSE; -} - -static gboolean -compare_phone (ECardSimple *card, const char *str, - char *(*compare)(const char*, const char*)) -{ - int i; - - for (i = E_CARD_SIMPLE_PHONE_ID_ASSISTANT; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) { - const ECardPhone *phone = e_card_simple_get_phone (card, i); - - if (phone && compare(phone->number, str)) - return TRUE; - } - - return FALSE; -} - -static gboolean -compare_address (ECardSimple *card, const char *str, - char *(*compare)(const char*, const char*)) -{ - g_warning("address searching not implemented\n"); - return FALSE; -} - -static struct prop_info { - ECardSimpleField field_id; - const char *query_prop; - const char *ecard_prop; -#define PROP_TYPE_NORMAL 0x01 -#define PROP_TYPE_LIST 0x02 -#define PROP_TYPE_LISTITEM 0x03 - int prop_type; - gboolean (*list_compare)(ECardSimple *ecard, const char *str, - char *(*compare)(const char*, const char*)); - -} prop_info_table[] = { -#define NORMAL_PROP(f,q,e) {f, q, e, PROP_TYPE_NORMAL, NULL} -#define LIST_PROP(q,e,c) {0, q, e, PROP_TYPE_LIST, c} - - /* query prop, ecard prop, type, list compare function */ - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_FILE_AS, "file_as", "file_as" ), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "full_name" ), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_URL, "url", "url" ), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_MAILER, "mailer", "mailer"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ORG, "org", "org"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ORG_UNIT, "org_unit", "org_unit"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_OFFICE, "office", "office"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_TITLE, "title", "title"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ROLE, "role", "role"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_MANAGER, "manager", "manager"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_ASSISTANT, "assistant", "assistant"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_NICKNAME, "nickname", "nickname"), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_SPOUSE, "spouse", "spouse" ), - NORMAL_PROP ( E_CARD_SIMPLE_FIELD_NOTE, "note", "note"), - LIST_PROP ( "email", "email", compare_email ), - LIST_PROP ( "phone", "phone", compare_phone ), - LIST_PROP ( "address", "address", compare_address ), -}; -static int num_prop_infos = sizeof(prop_info_table) / sizeof(prop_info_table[0]); - -static ESExpResult * -entry_compare(PASBackendFileSearchContext *ctx, struct _ESExp *f, - int argc, struct _ESExpResult **argv, - char *(*compare)(const char*, const char*)) -{ - ESExpResult *r; - int truth = FALSE; - - if (argc == 2 - && argv[0]->type == ESEXP_RES_STRING - && argv[1]->type == ESEXP_RES_STRING) { - char *propname; - struct prop_info *info = NULL; - int i; - gboolean any_field; - - propname = argv[0]->value.string; - - any_field = !strcmp(propname, "x-evolution-any-field"); - for (i = 0; i < num_prop_infos; i ++) { - if (any_field - || !strcmp (prop_info_table[i].query_prop, propname)) { - info = &prop_info_table[i]; - - if (info->prop_type == PROP_TYPE_NORMAL) { - char *prop = NULL; - /* searches where the query's property - maps directly to an ecard property */ - - prop = e_card_simple_get (ctx->card, info->field_id); - - if (prop && compare(prop, argv[1]->value.string)) { - truth = TRUE; - } - if ((!prop) && compare("", argv[1]->value.string)) { - truth = TRUE; - } - } - else if (info->prop_type == PROP_TYPE_LIST) { - /* the special searches that match any of the list elements */ - truth = info->list_compare (ctx->card, argv[1]->value.string, compare); - } - - /* if we're looking at all fields and find a match, - or if we're just looking at this one field, - break. */ - if ((any_field && truth) - || !any_field) - break; - } - } - - } - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = truth; - - return r; -} - -static ESExpResult * -func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - PASBackendFileSearchContext *ctx = data; - - return entry_compare (ctx, f, argc, argv, (char *(*)(const char*, const char*)) e_utf8_strstrcase); -} - -static char * -is_helper (const char *s1, const char *s2) -{ - if (!strcmp(s1, s2)) - return (char*)s1; - else - return NULL; -} - -static ESExpResult * -func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - PASBackendFileSearchContext *ctx = data; - - return entry_compare (ctx, f, argc, argv, is_helper); -} - -static char * -endswith_helper (const char *s1, const char *s2) -{ - char *p; - if ((p = strstr(s1, s2)) - && (strlen(p) == strlen(s2))) - return p; - else - return NULL; -} - -static ESExpResult * -func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - PASBackendFileSearchContext *ctx = data; - - return entry_compare (ctx, f, argc, argv, endswith_helper); -} - -static char * -beginswith_helper (const char *s1, const char *s2) -{ - char *p; - if ((p = strstr(s1, s2)) - && (p == s1)) - return p; - else - return NULL; -} - -static ESExpResult * -func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - PASBackendFileSearchContext *ctx = data; - - return entry_compare (ctx, f, argc, argv, beginswith_helper); -} - -/* 'builtin' functions */ -static struct { - char *name; - ESExpFunc *func; - int type; /* set to 1 if a function can perform shortcut evaluation, or - doesn't execute everything, 0 otherwise */ -} symbols[] = { - { "contains", func_contains, 0 }, - { "is", func_is, 0 }, - { "beginswith", func_beginswith, 0 }, - { "endswith", func_endswith, 0 }, -}; - -static gboolean -vcard_matches_search (const PASBackendFileBookView *view, char *vcard_string) -{ - ESExpResult *r; - gboolean retval; - ECard *card; - - card = e_card_new (vcard_string); - view->search_context->card = e_card_simple_new (card); - gtk_object_unref(GTK_OBJECT(card)); - - /* if it's not a valid vcard why is it in our db? :) */ - if (!view->search_context->card) - return FALSE; - - r = e_sexp_eval(view->search_sexp); - - retval = (r && r->type == ESEXP_RES_BOOL && r->value.bool); - - - gtk_object_unref(GTK_OBJECT(view->search_context->card)); - - e_sexp_result_free(view->search_sexp, r); - - return retval; -} - -static void -pas_backend_file_search (PASBackendFile *bf, - PASBook *book, - const PASBackendFileBookView *cnstview) -{ - int db_error = 0; - GList *cards = NULL; - gint card_count = 0, card_threshold = 20, card_threshold_max = 200; - DB *db = bf->priv->file_db; - DBT id_dbt, vcard_dbt; - int i, file_version_name_len; - int esexp_error; - PASBackendFileBookView *view = (PASBackendFileBookView *)cnstview; - - if (!bf->priv->loaded) - return; - - if (view->search_sexp) - e_sexp_unref(view->search_sexp); - view->search_sexp = e_sexp_new(); - - for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) { - if (symbols[i].type == 1) { - e_sexp_add_ifunction(view->search_sexp, 0, symbols[i].name, - (ESExpIFunc *)symbols[i].func, view->search_context); - } else { - e_sexp_add_function(view->search_sexp, 0, symbols[i].name, - symbols[i].func, view->search_context); - } - } - - e_sexp_input_text(view->search_sexp, view->search, strlen(view->search)); - esexp_error = e_sexp_parse(view->search_sexp); - - file_version_name_len = strlen (PAS_BACKEND_FILE_VERSION_NAME); - - if (esexp_error == -1) { - pas_book_view_notify_complete (view->book_view); - return; - } - - db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST); - - while (db_error == 0) { - - /* don't include the version in the list of cards */ - if (id_dbt.size != file_version_name_len+1 - || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) { - char *vcard_string = vcard_dbt.data; - - /* check if the vcard matches the search sexp */ - if (vcard_matches_search (view, vcard_string)) { - cards = g_list_prepend (cards, g_strdup (vcard_string)); - ++card_count; - - /* If we've accumulated a number of matches, pass them off to the client. */ - if (card_count > card_threshold) { - pas_book_view_notify_add (view->book_view, cards); - /* Clean up the handed-off data. */ - g_list_foreach (cards, (GFunc)g_free, NULL); - g_list_free (cards); - cards = NULL; - card_count = 0; - - /* Yeah, this scheme is over-complicated. But I like it. */ - if (card_threshold <= card_threshold_max) { - card_threshold = MIN (2*card_threshold, card_threshold_max); - } - } - - } - } - - db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT); - } - - if (db_error == -1) { - g_warning ("pas_backend_file_search: error building list\n"); - } - - if (card_count) - pas_book_view_notify_add (view->book_view, cards); - - pas_book_view_notify_complete (view->book_view); - - /* - ** It's fine to do this now since the data has been handed off. - */ - g_list_foreach (cards, (GFunc)g_free, NULL); - g_list_free (cards); -} - -static void -pas_backend_file_changes_foreach_key (const char *key, gpointer user_data) -{ - PASBackendFileChangeContext *ctx = user_data; - DB *db = ctx->db; - DBT id_dbt, vcard_dbt; - int db_error = 0; - - string_to_dbt (key, &id_dbt); - db_error = db->get (db, &id_dbt, &vcard_dbt, 0); - - if (db_error == 1) { - char *id = id_dbt.data; - - ctx->del_ids = g_list_append (ctx->del_ids, strdup(id)); - } -} - -static void -pas_backend_file_changes (PASBackendFile *bf, - PASBook *book, - const PASBackendFileBookView *cnstview) -{ - int db_error = 0; - DBT id_dbt, vcard_dbt; - char *filename; - EDbHash *ehash; - GList *i, *v; - DB *db = bf->priv->file_db; - PASBackendFileBookView *view = (PASBackendFileBookView *)cnstview; - PASBackendFileChangeContext *ctx = cnstview->change_context; - - if (!bf->priv->loaded) - return; - - /* Find the changed ids - FIX ME, path should not be hard coded */ - filename = g_strdup_printf ("%s/evolution/local/Contacts/%s.db", g_get_home_dir (), view->change_id); - ehash = e_dbhash_new (filename); - g_free (filename); - - db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST); - - while (db_error == 0) { - - /* don't include the version in the list of cards */ - if (id_dbt.size != strlen(PAS_BACKEND_FILE_VERSION_NAME) + 1 - || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) { - char *id = id_dbt.data; - char *vcard_string = vcard_dbt.data; - - /* check what type of change has occurred, if any */ - switch (e_dbhash_compare (ehash, id, vcard_string)) { - case E_DBHASH_STATUS_SAME: - break; - case E_DBHASH_STATUS_NOT_FOUND: - ctx->add_cards = g_list_append (ctx->add_cards, strdup(vcard_string)); - ctx->add_ids = g_list_append (ctx->add_ids, strdup(id)); - break; - case E_DBHASH_STATUS_DIFFERENT: - ctx->mod_cards = g_list_append (ctx->mod_cards, strdup(vcard_string)); - ctx->mod_ids = g_list_append (ctx->mod_ids, strdup(id)); - break; - } - } - - db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT); - } - - e_dbhash_foreach_key (ehash, (EDbHashFunc)pas_backend_file_changes_foreach_key, view->change_context); - - /* Update the hash */ - for (i = ctx->add_ids, v = ctx->add_cards; i != NULL; i = i->next, v = v->next){ - char *id = i->data; - char *vcard = v->data; - e_dbhash_add (ehash, id, vcard); - } - for (i = ctx->mod_ids, v = ctx->mod_cards; i != NULL; i = i->next, v = v->next){ - char *id = i->data; - char *vcard = v->data; - e_dbhash_add (ehash, id, vcard); - } - for (i = ctx->del_ids; i != NULL; i = i->next){ - char *id = i->data; - e_dbhash_remove (ehash, id); - } - - e_dbhash_write (ehash); - e_dbhash_destroy (ehash); - - /* Send the changes */ - if (db_error == -1) { - g_warning ("pas_backend_file_changes: error building list\n"); - } else { - if (ctx->add_cards != NULL) - pas_book_view_notify_add (view->book_view, ctx->add_cards); - - if (ctx->mod_cards != NULL) - pas_book_view_notify_change (view->book_view, ctx->mod_cards); - - for (v = ctx->del_ids; v != NULL; v = v->next){ - char *id = v->data; - pas_book_view_notify_remove (view->book_view, id); - } - - pas_book_view_notify_complete (view->book_view); - } -} - -static char * -do_create(PASBackend *backend, - char *vcard_req, - char **vcard_ptr) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - DB *db = bf->priv->file_db; - DBT id_dbt, vcard_dbt; - int db_error; - char *id; - ECard *card; - char *vcard; - char *ret_val; - - id = pas_backend_file_create_unique_id (vcard_req); - - string_to_dbt (id, &id_dbt); - - card = e_card_new(vcard_req); - e_card_set_id(card, id); - vcard = e_card_get_vcard(card); - - string_to_dbt (vcard, &vcard_dbt); - - db_error = db->put (db, &id_dbt, &vcard_dbt, 0); - - if (0 == db_error) { - db_error = db->sync (db, 0); - if (db_error != 0) - g_warning ("db->sync failed.\n"); - ret_val = id; - - } - else { - ret_val = NULL; - } - - gtk_object_unref(GTK_OBJECT(card)); - card = NULL; - - if (vcard_ptr && ret_val) - *vcard_ptr = vcard; - else - g_free (vcard); - - return ret_val; -} - -static void -pas_backend_file_process_create_card (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - char *id; - char *vcard; - EIterator *iterator; - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - - id = do_create(backend, req->vcard, &vcard); - if (id) { - for (iterator = e_list_get_iterator(bf->priv->book_views); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const PASBackendFileBookView *view = e_iterator_get(iterator); - if (vcard_matches_search (view, vcard)) { - pas_book_view_notify_add_1 (view->book_view, vcard); - pas_book_view_notify_complete (view->book_view); - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - - pas_book_respond_create ( - book, - GNOME_Evolution_Addressbook_BookListener_Success, - id); - g_free(vcard); - g_free(id); - } - else { - /* XXX need a different call status for this case, i - think */ - pas_book_respond_create ( - book, - GNOME_Evolution_Addressbook_BookListener_CardNotFound, - ""); - } - - g_free(req->vcard); -} - -static void -pas_backend_file_process_remove_card (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - DB *db = bf->priv->file_db; - DBT id_dbt, vcard_dbt; - int db_error; - EIterator *iterator; - char *vcard_string; - - string_to_dbt (req->id, &id_dbt); - - db_error = db->get (db, &id_dbt, &vcard_dbt, 0); - if (0 != db_error) { - pas_book_respond_remove ( - book, - GNOME_Evolution_Addressbook_BookListener_CardNotFound); - g_free (req->id); - return; - } - - db_error = db->del (db, &id_dbt, 0); - if (0 != db_error) { - pas_book_respond_remove ( - book, - GNOME_Evolution_Addressbook_BookListener_CardNotFound); - g_free (req->id); - return; - } - - db_error = db->sync (db, 0); - if (db_error != 0) - g_warning ("db->sync failed.\n"); - - - vcard_string = vcard_dbt.data; - for (iterator = e_list_get_iterator (bf->priv->book_views); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const PASBackendFileBookView *view = e_iterator_get(iterator); - if (vcard_matches_search (view, vcard_string)) { - pas_book_view_notify_remove (view->book_view, req->id); - pas_book_view_notify_complete (view->book_view); - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - - pas_book_respond_remove ( - book, - GNOME_Evolution_Addressbook_BookListener_Success); - - g_free (req->id); -} - -static void -pas_backend_file_process_modify_card (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - DB *db = bf->priv->file_db; - DBT id_dbt, vcard_dbt; - int db_error; - EIterator *iterator; - ECard *card; - char *id; - char *old_vcard_string; - - /* create a new ecard from the request data */ - card = e_card_new(req->vcard); - id = e_card_get_id(card); - - string_to_dbt (id, &id_dbt); - - /* get the old ecard - the one that's presently in the db */ - db_error = db->get (db, &id_dbt, &vcard_dbt, 0); - if (0 != db_error) { - pas_book_respond_modify ( - book, - GNOME_Evolution_Addressbook_BookListener_CardNotFound); - g_free (req->id); - return; - } - old_vcard_string = g_strdup(vcard_dbt.data); - - string_to_dbt (req->vcard, &vcard_dbt); - - db_error = db->put (db, &id_dbt, &vcard_dbt, 0); - - if (0 == db_error) { - db_error = db->sync (db, 0); - if (db_error != 0) - g_warning ("db->sync failed.\n"); - - for (iterator = e_list_get_iterator(bf->priv->book_views); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - CORBA_Environment ev; - const PASBackendFileBookView *view = e_iterator_get(iterator); - gboolean old_match, new_match; - - CORBA_exception_init(&ev); - - bonobo_object_dup_ref(bonobo_object_corba_objref(BONOBO_OBJECT(view->book_view)), &ev); - - old_match = vcard_matches_search (view, old_vcard_string); - new_match = vcard_matches_search (view, req->vcard); - if (old_match && new_match) - pas_book_view_notify_change_1 (view->book_view, req->vcard); - else if (new_match) - pas_book_view_notify_add_1 (view->book_view, req->vcard); - else /* if (old_match) */ - pas_book_view_notify_remove (view->book_view, id); - pas_book_view_notify_complete (view->book_view); - - bonobo_object_release_unref(bonobo_object_corba_objref(BONOBO_OBJECT(view->book_view)), &ev); - } - gtk_object_unref(GTK_OBJECT(iterator)); - - pas_book_respond_modify ( - book, - GNOME_Evolution_Addressbook_BookListener_Success); - } - else { - pas_book_respond_modify ( - book, - GNOME_Evolution_Addressbook_BookListener_CardNotFound); - } - - g_free(old_vcard_string); - - gtk_object_unref(GTK_OBJECT(card)); - g_free (req->vcard); -} - -static void -pas_backend_file_build_all_cards_list(PASBackend *backend, - PASBackendFileCursorPrivate *cursor_data) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - DB *db = bf->priv->file_db; - int db_error; - DBT id_dbt, vcard_dbt; - - cursor_data->elements = NULL; - - db_error = db->seq(db, &id_dbt, &vcard_dbt, R_FIRST); - - while (db_error == 0) { - - /* don't include the version in the list of cards */ - if (id_dbt.size != strlen(PAS_BACKEND_FILE_VERSION_NAME) + 1 - || strcmp (id_dbt.data, PAS_BACKEND_FILE_VERSION_NAME)) { - - cursor_data->elements = g_list_append(cursor_data->elements, - g_strdup(vcard_dbt.data)); - - } - - db_error = db->seq(db, &id_dbt, &vcard_dbt, R_NEXT); - - } - - if (db_error == -1) { - g_warning ("pas_backend_file_build_all_cards_list: error building list\n"); - } - else { - cursor_data->num_elements = g_list_length (cursor_data->elements); - } -} - -static void -pas_backend_file_process_get_cursor (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - /* - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - DB *db = bf->priv->file_db; - DBT id_dbt, vcard_dbt; - */ - CORBA_Environment ev; - int db_error = 0; - PASBackendFileCursorPrivate *cursor_data; - PASCardCursor *cursor; - GNOME_Evolution_Addressbook_Book corba_book; - - cursor_data = g_new(PASBackendFileCursorPrivate, 1); - cursor_data->backend = backend; - cursor_data->book = book; - - pas_backend_file_build_all_cards_list(backend, cursor_data); - - corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book)); - - CORBA_exception_init(&ev); - - GNOME_Evolution_Addressbook_Book_ref(corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("pas_backend_file_process_get_cursor: Exception reffing " - "corba book.\n"); - } - - CORBA_exception_free(&ev); - - cursor = pas_card_cursor_new(get_length, - get_nth, - cursor_data); - - gtk_signal_connect(GTK_OBJECT(cursor), "destroy", - GTK_SIGNAL_FUNC(cursor_destroy), cursor_data); - - pas_book_respond_get_cursor ( - book, - (db_error == 0 - ? GNOME_Evolution_Addressbook_BookListener_Success - : GNOME_Evolution_Addressbook_BookListener_CardNotFound), - cursor); -} - -static void -pas_backend_file_process_get_book_view (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - CORBA_Environment ev; - PASBookView *book_view; - PASBackendFileBookView view; - PASBackendFileSearchContext ctx; - EIterator *iterator; - - g_return_if_fail (req->listener != NULL); - - bonobo_object_ref(BONOBO_OBJECT(book)); - - book_view = pas_book_view_new (req->listener); - - gtk_signal_connect(GTK_OBJECT(book_view), "destroy", - GTK_SIGNAL_FUNC(view_destroy), book); - - view.book_view = book_view; - view.search = req->search; - view.search_sexp = NULL; - view.search_context = &ctx; - view.change_context = NULL; - ctx.card = NULL; - - e_list_append(bf->priv->book_views, &view); - - pas_book_respond_get_book_view (book, - (book_view != NULL - ? GNOME_Evolution_Addressbook_BookListener_Success - : GNOME_Evolution_Addressbook_BookListener_CardNotFound /* XXX */), - book_view); - - iterator = e_list_get_iterator(bf->priv->book_views); - e_iterator_last(iterator); - pas_backend_file_search (bf, book, e_iterator_get(iterator)); - gtk_object_unref(GTK_OBJECT(iterator)); - - g_free(req->search); - CORBA_exception_init(&ev); - - bonobo_object_release_unref (req->listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("pas_backend_file_process_get_book_view: Exception unreffing " - "listener.\n"); - } - - CORBA_exception_free(&ev); -} - -static void -pas_backend_file_process_get_changes (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - CORBA_Environment ev; - PASBookView *book_view; - PASBackendFileBookView view; - PASBackendFileChangeContext ctx; - EIterator *iterator; - - g_return_if_fail (req->listener != NULL); - - bonobo_object_ref(BONOBO_OBJECT(book)); - - book_view = pas_book_view_new (req->listener); - - gtk_signal_connect(GTK_OBJECT(book_view), "destroy", - GTK_SIGNAL_FUNC(view_destroy), book); - - pas_book_respond_get_changes (book, - (book_view != NULL - ? GNOME_Evolution_Addressbook_BookListener_Success - : GNOME_Evolution_Addressbook_BookListener_CardNotFound /* XXX */), - book_view); - - view.book_view = book_view; - view.change_id = req->change_id; - view.change_context = &ctx; - ctx.db = bf->priv->file_db; - ctx.add_cards = NULL; - ctx.add_ids = NULL; - ctx.mod_cards = NULL; - ctx.mod_ids = NULL; - ctx.del_ids = NULL; - view.search = NULL; - view.search_sexp = NULL; - view.search_context = NULL; - - e_list_append(bf->priv->book_views, &view); - - iterator = e_list_get_iterator(bf->priv->book_views); - e_iterator_last(iterator); - pas_backend_file_changes (bf, book, e_iterator_get(iterator)); - gtk_object_unref(GTK_OBJECT(iterator)); - - g_free(req->search); - CORBA_exception_init(&ev); - bonobo_object_release_unref (req->listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("pas_backend_file_process_get_changed: Exception unreffing " - "listener.\n"); - } - - CORBA_exception_free(&ev); -} - -static void -pas_backend_file_process_check_connection (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - - pas_book_report_connection (book, bf->priv->file_db != NULL); -} - -static char * -pas_backend_file_extract_path_from_uri (const char *uri) -{ - g_assert (strncasecmp (uri, "file:", 5) == 0); - - return g_strdup (uri + 5); -} - -static void -pas_backend_file_process_authenticate_user (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - pas_book_respond_authenticate_user (book, - GNOME_Evolution_Addressbook_BookListener_Success); -} - -static void -pas_backend_file_process_get_supported_fields (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - EList *fields = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL); - ECardSimple *card; - int i; - - /* we support everything, so instantiate an e-card, and loop - through all fields, adding their ecard_fields. */ - - card = e_card_simple_new (e_card_new ("")); - - for (i = 0; i < E_CARD_SIMPLE_FIELD_LAST; i ++) - e_list_append (fields, e_card_simple_get_ecard_field (card, i)); - - gtk_object_unref (GTK_OBJECT (card)); - - pas_book_respond_get_supported_fields (book, - GNOME_Evolution_Addressbook_BookListener_Success, - fields); -} - -static gboolean -can_write (PASBackend *backend) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - char *path = pas_backend_file_extract_path_from_uri (bf->priv->uri); - gboolean retval; - - retval = (access (path, W_OK) != -1); - - g_free (path); - - return retval; -} - -static gboolean -pas_backend_file_can_write (PASBook *book) -{ - PASBackend* backend = pas_book_get_backend (book); - - return can_write(backend); -} - -static gboolean -pas_backend_file_can_write_card (PASBook *book, - const char *id) -{ - PASBackend* backend = pas_book_get_backend (book); - - return can_write(backend); -} - -static void -pas_backend_file_process_client_requests (PASBook *book) -{ - PASBackend *backend; - PASRequest *req; - - backend = pas_book_get_backend (book); - - req = pas_book_pop_request (book); - if (req == NULL) - return; - - switch (req->op) { - case CreateCard: - pas_backend_file_process_create_card (backend, book, req); - break; - - case RemoveCard: - pas_backend_file_process_remove_card (backend, book, req); - break; - - case ModifyCard: - pas_backend_file_process_modify_card (backend, book, req); - break; - - case CheckConnection: - pas_backend_file_process_check_connection (backend, book, req); - break; - - case GetCursor: - pas_backend_file_process_get_cursor (backend, book, req); - break; - - case GetBookView: - pas_backend_file_process_get_book_view (backend, book, req); - break; - - case GetChanges: - pas_backend_file_process_get_changes (backend, book, req); - break; - - case AuthenticateUser: - pas_backend_file_process_authenticate_user (backend, book, req); - break; - - case GetSupportedFields: - pas_backend_file_process_get_supported_fields (backend, book, req); - break; - } - - g_free (req); -} - -static void -pas_backend_file_book_destroy_cb (PASBook *book, gpointer data) -{ - PASBackendFile *backend; - - backend = PAS_BACKEND_FILE (data); - - pas_backend_remove_client (PAS_BACKEND (backend), book); -} - -static char * -pas_backend_file_get_vcard (PASBook *book, const char *id) -{ - PASBackendFile *bf; - DBT id_dbt, vcard_dbt; - DB *db; - int db_error; - - bf = PAS_BACKEND_FILE (pas_book_get_backend (book)); - db = bf->priv->file_db; - - string_to_dbt (id, &id_dbt); - - db_error = db->get (db, &id_dbt, &vcard_dbt, 0); - if (db_error == 0) { - /* success */ - return g_strdup (vcard_dbt.data); - } - else if (db_error == 1) { - /* key was not in file */ - return g_strdup (""); /* XXX */ - } - else /* if (db_error < 0)*/ { - /* error */ - return g_strdup (""); /* XXX */ - } -} - -static gboolean -pas_backend_file_upgrade_db (PASBackendFile *bf, char *old_version) -{ - if (!strcmp (old_version, "0.0")) { - /* 0.0 is the same as 0.1, we just need to add the version */ - DB *db = bf->priv->file_db; - DBT version_name_dbt, version_dbt; - int db_error; - - string_to_dbt (PAS_BACKEND_FILE_VERSION_NAME, &version_name_dbt); - string_to_dbt (PAS_BACKEND_FILE_VERSION, &version_dbt); - - db_error = db->put (db, &version_name_dbt, &version_dbt, 0); - if (db_error == 0) - return TRUE; - else - return FALSE; - } - else { - g_warning ("unsupported version '%s' found in PAS backend file\n", - old_version); - return FALSE; - } -} - -static gboolean -pas_backend_file_maybe_upgrade_db (PASBackendFile *bf) -{ - DB *db = bf->priv->file_db; - DBT version_name_dbt, version_dbt; - int db_error; - char *version; - gboolean ret_val = TRUE; - - string_to_dbt (PAS_BACKEND_FILE_VERSION_NAME, &version_name_dbt); - - db_error = db->get (db, &version_name_dbt, &version_dbt, 0); - if (db_error == 0) { - /* success */ - version = g_strdup (version_dbt.data); - } - else { - /* key was not in file */ - version = g_strdup ("0.0"); - } - - if (strcmp (version, PAS_BACKEND_FILE_VERSION)) - ret_val = pas_backend_file_upgrade_db (bf, version); - - g_free (version); - - return ret_val; -} - -#define INITIAL_VCARD "BEGIN:VCARD\n\ -X-EVOLUTION-FILE-AS:Ximian, Inc.\n\ -LABEL;WORK;QUOTED-PRINTABLE:401 Park Drive 3 West=0ABoston, MA 02215=0AUSA\n\ -TEL;WORK;VOICE:(617) 236-0442\n\ -TEL;WORK;FAX:(617) 236-8630\n\ -EMAIL;INTERNET:hello@ximian.com\n\ -URL:http://www.ximian.com/\n\ -ORG:Ximian, Inc.;\n\ -NOTE:Welcome to the Ximian Addressbook.\n\ -END:VCARD" - -static gboolean -pas_backend_file_load_uri (PASBackend *backend, - const char *uri) -{ - PASBackendFile *bf = PAS_BACKEND_FILE (backend); - char *filename; - gboolean writable = FALSE; - GList *l; - - g_assert (bf->priv->loaded == FALSE); - - filename = pas_backend_file_extract_path_from_uri (uri); - - bf->priv->file_db = dbopen (filename, O_RDWR, 0666, DB_HASH, NULL); - if (bf->priv->file_db) { - writable = TRUE; - } - else { - /* try to open the file read-only */ - bf->priv->file_db = dbopen (filename, O_RDONLY, 0666, DB_HASH, NULL); - - if (!bf->priv->file_db) { - /* lastly, try and create the file */ - bf->priv->file_db = dbopen (filename, O_RDWR | O_CREAT, 0666, DB_HASH, NULL); - - if (bf->priv->file_db) { - char *create_initial_file; - char *dir; - - dir = g_dirname(filename); - create_initial_file = g_concat_dir_and_file(dir, "create-initial"); - - if (g_file_exists(create_initial_file)) { - char *id; - id = do_create(backend, INITIAL_VCARD, NULL); - g_free (id); - } - - g_free(create_initial_file); - g_free(dir); - - writable = TRUE; - } - } - } - - g_free (filename); - - if (bf->priv->file_db != NULL) { - if (pas_backend_file_maybe_upgrade_db (bf)) - bf->priv->loaded = TRUE; - /* XXX what if we fail to upgrade it? */ - - g_free(bf->priv->uri); - bf->priv->uri = g_strdup (uri); - } else - return FALSE; - - /* report the writable status of the book to all its clients */ - for (l = bf->priv->clients; l; l = g_list_next (l)) { - PASBook *book = l->data; - - pas_book_report_writable (book, writable); - } - - bf->priv->writable = writable; - - return TRUE; -} - -/* Get_uri handler for the addressbook file backend */ -static const char * -pas_backend_file_get_uri (PASBackend *backend) -{ - PASBackendFile *bf; - - bf = PAS_BACKEND_FILE (backend); - - g_return_val_if_fail (bf->priv->loaded, NULL); - g_assert (bf->priv->uri != NULL); - - return bf->priv->uri; -} - -static gboolean -pas_backend_file_add_client (PASBackend *backend, - GNOME_Evolution_Addressbook_BookListener listener) -{ - PASBackendFile *bf; - PASBook *book; - - g_assert (backend != NULL); - g_assert (PAS_IS_BACKEND_FILE (backend)); - - bf = PAS_BACKEND_FILE (backend); - - book = pas_book_new ( - backend, listener, - pas_backend_file_get_vcard, - pas_backend_file_can_write, - pas_backend_file_can_write_card); - - if (!book) { - if (!bf->priv->clients) - pas_backend_last_client_gone (backend); - - return FALSE; - } - - gtk_signal_connect (GTK_OBJECT (book), "destroy", - pas_backend_file_book_destroy_cb, backend); - - gtk_signal_connect (GTK_OBJECT (book), "requests_queued", - pas_backend_file_process_client_requests, NULL); - - bf->priv->clients = g_list_prepend ( - bf->priv->clients, book); - - if (bf->priv->loaded) { - pas_book_respond_open ( - book, GNOME_Evolution_Addressbook_BookListener_Success); - if (bf->priv->writable) - pas_book_report_writable (book, bf->priv->writable); - } else { - /* Open the book. */ - pas_book_respond_open ( - book, GNOME_Evolution_Addressbook_BookListener_Success); - if (bf->priv->writable) - pas_book_report_writable (book, bf->priv->writable); - } - - return TRUE; -} - -static void -pas_backend_file_remove_client (PASBackend *backend, - PASBook *book) -{ - PASBackendFile *bf; - GList *l; - PASBook *lbook; - - g_return_if_fail (backend != NULL); - g_return_if_fail (PAS_IS_BACKEND_FILE (backend)); - g_return_if_fail (book != NULL); - g_return_if_fail (PAS_IS_BOOK (book)); - - bf = PAS_BACKEND_FILE (backend); - - /* Find the book in the list of clients */ - - for (l = bf->priv->clients; l; l = l->next) { - lbook = PAS_BOOK (l->data); - - if (lbook == book) - break; - } - - g_assert (l != NULL); - - /* Disconnect */ - - bf->priv->clients = g_list_remove_link (bf->priv->clients, l); - g_list_free_1 (l); - - /* When all clients go away, notify the parent factory about it so that - * it may decide whether to kill the backend or not. - */ - if (!bf->priv->clients) - pas_backend_last_client_gone (backend); -} - -static char * -pas_backend_file_get_static_capabilities (PASBackend *backend) -{ - return g_strdup("local"); -} - -static gboolean -pas_backend_file_construct (PASBackendFile *backend) -{ - g_assert (backend != NULL); - g_assert (PAS_IS_BACKEND_FILE (backend)); - - if (! pas_backend_construct (PAS_BACKEND (backend))) - return FALSE; - - return TRUE; -} - -/** - * pas_backend_file_new: - */ -PASBackend * -pas_backend_file_new (void) -{ - PASBackendFile *backend; - - backend = gtk_type_new (pas_backend_file_get_type ()); - - if (! pas_backend_file_construct (backend)) { - gtk_object_unref (GTK_OBJECT (backend)); - - return NULL; - } - - return PAS_BACKEND (backend); -} - -static void -pas_backend_file_destroy (GtkObject *object) -{ - PASBackendFile *bf; - - bf = PAS_BACKEND_FILE (object); - - gtk_object_unref(GTK_OBJECT(bf->priv->book_views)); - g_free (bf->priv->uri); - - GTK_OBJECT_CLASS (pas_backend_file_parent_class)->destroy (object); -} - -static void -pas_backend_file_class_init (PASBackendFileClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - PASBackendClass *parent_class; - - pas_backend_file_parent_class = gtk_type_class (pas_backend_get_type ()); - - parent_class = PAS_BACKEND_CLASS (klass); - - /* Set the virtual methods. */ - parent_class->load_uri = pas_backend_file_load_uri; - parent_class->get_uri = pas_backend_file_get_uri; - parent_class->add_client = pas_backend_file_add_client; - parent_class->remove_client = pas_backend_file_remove_client; - parent_class->get_static_capabilities = pas_backend_file_get_static_capabilities; - - object_class->destroy = pas_backend_file_destroy; -} - -static void -pas_backend_file_init (PASBackendFile *backend) -{ - PASBackendFilePrivate *priv; - - priv = g_new0 (PASBackendFilePrivate, 1); - priv->loaded = FALSE; - priv->clients = NULL; - priv->book_views = e_list_new((EListCopyFunc) pas_backend_file_book_view_copy, (EListFreeFunc) pas_backend_file_book_view_free, NULL); - priv->uri = NULL; - priv->writable = FALSE; - - backend->priv = priv; -} - -/** - * pas_backend_file_get_type: - */ -GtkType -pas_backend_file_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "PASBackendFile", - sizeof (PASBackendFile), - sizeof (PASBackendFileClass), - (GtkClassInitFunc) pas_backend_file_class_init, - (GtkObjectInitFunc) pas_backend_file_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (pas_backend_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/pas/pas-backend-file.h b/addressbook/backend/pas/pas-backend-file.h deleted file mode 100644 index 4da9a29cc5..0000000000 --- a/addressbook/backend/pas/pas-backend-file.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __PAS_BACKEND_FILE_H__ -#define __PAS_BACKEND_FILE_H__ - -#include <libgnome/gnome-defs.h> -#include "pas-backend.h" - -typedef struct _PASBackendFilePrivate PASBackendFilePrivate; - -typedef struct { - PASBackend parent_object; - PASBackendFilePrivate *priv; -} PASBackendFile; - -typedef struct { - PASBackendClass parent_class; -} PASBackendFileClass; - -PASBackend *pas_backend_file_new (void); -GtkType pas_backend_file_get_type (void); - -#define PAS_BACKEND_FILE_TYPE (pas_backend_file_get_type ()) -#define PAS_BACKEND_FILE(o) (GTK_CHECK_CAST ((o), PAS_BACKEND_FILE_TYPE, PASBackendFile)) -#define PAS_BACKEND_FILE_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BACKEND_TYPE, PASBackendFileClass)) -#define PAS_IS_BACKEND_FILE(o) (GTK_CHECK_TYPE ((o), PAS_BACKEND_FILE_TYPE)) -#define PAS_IS_BACKEND_FILE_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BACKEND_FILE_TYPE)) - -#endif /* ! __PAS_BACKEND_FILE_H__ */ - diff --git a/addressbook/backend/pas/pas-backend-ldap.c b/addressbook/backend/pas/pas-backend-ldap.c deleted file mode 100644 index c8cd900f87..0000000000 --- a/addressbook/backend/pas/pas-backend-ldap.c +++ /dev/null @@ -1,2397 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Author: - * Chris Toshok (toshok@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#define DEBUG - -#include "config.h" -#include <fcntl.h> -#include <time.h> -#include <lber.h> -#include <gtk/gtksignal.h> - -#ifdef DEBUG -#define LDAP_DEBUG -#define LDAP_DEBUG_ADD -#endif -#include <ldap.h> -#ifdef DEBUG -#undef LDAP_DEBUG -#endif - -#if LDAP_VENDOR_VERSION > 20000 -#define OPENLDAP2 -#else -#define OPENLDAP1 -#endif - -#if 0 -#ifdef OPENLDAP1 -#define LDAP_NAME_ERROR(x) NAME_ERROR(x) -#endif -#endif - -#ifdef OPENLDAP2 -#include "ldap_schema.h" -#endif - -#include <e-util/e-sexp.h> -#include <ebook/e-card-simple.h> - -#include "pas-backend-ldap.h" -#include "pas-book.h" -#include "pas-card-cursor.h" - - -#define LDAP_MAX_SEARCH_RESPONSES 100 - -/* the objectClasses we need */ -#define TOP "top" -#define PERSON "person" -#define ORGANIZATIONALPERSON "organizationalPerson" -#define INETORGPERSON "inetOrgPerson" -#define EVOLUTIONPERSON "evolutionPerson" - -static gchar *query_prop_to_ldap(gchar *query_prop); - -static PASBackendClass *pas_backend_ldap_parent_class; -typedef struct _PASBackendLDAPCursorPrivate PASBackendLDAPCursorPrivate; -typedef struct _PASBackendLDAPBookView PASBackendLDAPBookView; -typedef struct LDAPOp LDAPOp; - -struct _PASBackendLDAPPrivate { - char *uri; - gboolean connected; - GList *clients; - gchar *ldap_host; - gchar *ldap_rootdn; - int ldap_port; - int ldap_scope; - GList *book_views; - - LDAP *ldap; - - EList *supported_fields; - - /* whether or not there's support for the objectclass we need - to store all our additional fields */ - gboolean evolutionPersonSupported; - gboolean evolutionPersonChecked; - - gboolean writable; - - /* whether or not there's a request in process on our LDAP* */ - LDAPOp *current_op; - GList *pending_ops; - int op_idle; -}; - -struct _PASBackendLDAPCursorPrivate { - PASBackend *backend; - PASBook *book; - - GList *elements; - long num_elements; -}; - -struct _PASBackendLDAPBookView { - PASBookView *book_view; - PASBackendLDAPPrivate *blpriv; - gchar *search; - int search_idle; - int search_msgid; - LDAPOp *search_op; -}; - -typedef gboolean (*LDAPOpHandler)(PASBackend *backend, LDAPOp *op); -typedef void (*LDAPOpDtor)(PASBackend *backend, LDAPOp *op); - -struct LDAPOp { - LDAPOpHandler handler; - LDAPOpDtor dtor; - PASBackend *backend; - PASBook *book; - PASBookView *view; -}; - -static void ldap_op_init (LDAPOp *op, PASBackend *backend, PASBook *book, PASBookView *view, LDAPOpHandler handler, LDAPOpDtor dtor); -static void ldap_op_process_current (PASBackend *backend); -static void ldap_op_process (LDAPOp *op); -static void ldap_op_restart (LDAPOp *op); -static gboolean ldap_op_process_on_idle (PASBackend *backend); -static void ldap_op_finished (LDAPOp *op); - -static ECardSimple *build_card_from_entry (LDAP *ldap, LDAPMessage *e); - -static void email_populate (ECardSimple *card, char **values); -struct berval** email_ber (ECardSimple *card); -gboolean email_compare (ECardSimple *ecard1, ECardSimple *ecard2); - -static void homephone_populate (ECardSimple *card, char **values); -struct berval** homephone_ber (ECardSimple *card); -gboolean homephone_compare (ECardSimple *ecard1, ECardSimple *ecard2); - -static void business_populate (ECardSimple *card, char **values); -struct berval** business_ber (ECardSimple *card); -gboolean business_compare (ECardSimple *ecard1, ECardSimple *ecard2); - -struct prop_info { - ECardSimpleField field_id; - char *query_prop; - char *ldap_attr; -#define PROP_TYPE_STRING 0x01 -#define PROP_TYPE_LIST 0x02 -#define PROP_DN 0x04 -#define PROP_EVOLVE 0x08 - int prop_type; - - /* the remaining items are only used for the TYPE_LIST props */ - - /* used when reading from the ldap server populates ECard with the values in **values. */ - void (*populate_ecard_func)(ECardSimple *card, char **values); - /* used when writing to an ldap server. returns a NULL terminated array of berval*'s */ - struct berval** (*ber_func)(ECardSimple *card); - /* used to compare list attributes */ - gboolean (*compare_func)(ECardSimple *card1, ECardSimple *card2); - -} prop_info[] = { - -#define LIST_PROP(fid,q,a,ctor,ber,cmp) {fid, q, a, PROP_TYPE_LIST, ctor, ber, cmp} -#define E_LIST_PROP(fid,q,a,ctor,ber,cmp) {fid, q, a, PROP_TYPE_LIST | PROP_EVOLVE, ctor, ber, cmp} -#define STRING_PROP(fid,q,a) {fid, q, a, PROP_TYPE_STRING} -#define E_STRING_PROP(fid,q,a) {fid, q, a, PROP_TYPE_STRING | PROP_EVOLVE} - - - /* name fields */ - STRING_PROP (E_CARD_SIMPLE_FIELD_FULL_NAME, "full_name", "cn" ), - STRING_PROP (E_CARD_SIMPLE_FIELD_FAMILY_NAME, "family_name", "sn" ), - - /* email addresses */ - LIST_PROP (E_CARD_SIMPLE_FIELD_EMAIL, "email", "mail", email_populate, email_ber, email_compare), - - /* phone numbers */ - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, "primary_phone", "primaryPhone"), - LIST_PROP (E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, "business_phone", "telephoneNumber", business_populate, business_ber, business_compare), - LIST_PROP (E_CARD_SIMPLE_FIELD_PHONE_HOME, "home_phone", "homePhone", homephone_populate, homephone_ber, homephone_compare), - STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_MOBILE, "mobile_phone", "mobile"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_CAR, "car_phone", "carPhone"), - STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX, "business_fax", "facsimileTelephoneNumber"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_HOME_FAX, "home_fax", "homeFacsimileTelephoneNumber"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_OTHER, "other_phone", "otherPhone"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_OTHER, "other_fax", "otherFacsimileTelephoneNumber"), - STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_ISDN, "isdn", "internationaliSDNNumber"), - STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_PAGER, "pager", "pager"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_RADIO, "radio", "radio"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_TELEX, "telex", "telex"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_ASSISTANT, "assistant_phone", "assistantPhone"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_COMPANY, "company_phone", "companyPhone"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_CALLBACK, "callback_phone", "callbackPhone"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_PHONE_TTYTTD, "tty", "tty"), - - /* org information */ - STRING_PROP (E_CARD_SIMPLE_FIELD_ORG, "org", "o"), - STRING_PROP (E_CARD_SIMPLE_FIELD_ORG_UNIT, "org_unit", "ou"), - STRING_PROP (E_CARD_SIMPLE_FIELD_OFFICE, "office", "roomNumber"), - STRING_PROP (E_CARD_SIMPLE_FIELD_TITLE, "title", "title"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_ROLE, "role", "businessRole"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_MANAGER, "manager", "managerName"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_ASSISTANT, "assistant", "assistantName"), - - /* addresses */ - STRING_PROP (E_CARD_SIMPLE_FIELD_ADDRESS_BUSINESS, "business_address", "postalAddress"), - STRING_PROP (E_CARD_SIMPLE_FIELD_ADDRESS_HOME, "home_address", "homePostalAddress"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_ADDRESS_OTHER, "other_address", "otherPostalAddress"), - - /* misc fields */ - STRING_PROP (E_CARD_SIMPLE_FIELD_URL, "url", "labeledURI"), - /* map nickname to displayName */ - STRING_PROP (E_CARD_SIMPLE_FIELD_NICKNAME, "nickname", "displayName"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_SPOUSE, "spouse", "spouseName"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_NOTE, "note", "note"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_ANNIVERSARY, "anniversary", "anniversary"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_BIRTH_DATE, "birth_date", "birthDate"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_MAILER, "mailer", "mailer"), - - E_STRING_PROP (E_CARD_SIMPLE_FIELD_FILE_AS, "file_as", "fileAs"), - E_STRING_PROP (E_CARD_SIMPLE_FIELD_CATEGORIES, "categories", "categories"), - -/* E_CARD_SIMPLE_FIELD_FBURL, */ -/* E_CARD_SIMPLE_FIELD_NAME_OR_ORG, */ - - -#undef E_STRING_PROP -#undef STRING_PROP -#undef E_LIST_PROP -#undef LIST_PROP -}; - -static int num_prop_infos = sizeof(prop_info) / sizeof(prop_info[0]); - -static void -view_destroy(GtkObject *object, gpointer data) -{ - CORBA_Environment ev; - GNOME_Evolution_Addressbook_Book corba_book; - PASBook *book = (PASBook *)data; - PASBackendLDAP *bl; - GList *list; - - bl = PAS_BACKEND_LDAP(pas_book_get_backend(book)); - for (list = bl->priv->book_views; list; list = g_list_next(list)) { - PASBackendLDAPBookView *view = list->data; - if (view->book_view == PAS_BOOK_VIEW(object)) { - if (view->search_idle != 0) { - /* we have a search running on the - ldap connection. remove the idle - handler and anbandon the msg id */ - g_source_remove(view->search_idle); - pas_book_view_notify_status_message (view->book_view, "Abandoning pending search"); - if (view->search_msgid != -1) - ldap_abandon (bl->priv->ldap, view->search_msgid); - - /* if the search op is the current op, - finish it. else, remove it from the - list and nuke it ourselves. */ - if (view->search_op == bl->priv->current_op) - ldap_op_finished (view->search_op); - else { - bl->priv->pending_ops = g_list_remove (bl->priv->pending_ops, - view->search_op); - view->search_op->dtor (view->search_op->backend, - view->search_op); - } - } - g_free (view->search); - g_free (view); - bl->priv->book_views = g_list_remove_link(bl->priv->book_views, list); - g_list_free_1(list); - break; - } - } - - corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book)); - - CORBA_exception_init(&ev); - - GNOME_Evolution_Addressbook_Book_unref(corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("view_destroy: Exception unreffing " - "corba book.\n"); - } - - CORBA_exception_free(&ev); -} - -static void -add_to_supported_fields (PASBackendLDAP *bl, char **attrs, GHashTable *attr_hash) -{ - int i; - for (i = 0; attrs[i]; i ++) { - char *query_prop = g_hash_table_lookup (attr_hash, attrs[i]); - - if (query_prop) { - e_list_append (bl->priv->supported_fields, g_strdup(query_prop)); - - /* handle the list attributes here */ - if (!strcmp (query_prop, "email")) { - e_list_append (bl->priv->supported_fields, g_strdup("email_2")); - e_list_append (bl->priv->supported_fields, g_strdup("email_3")); - } - else if (!strcmp (query_prop, "business_phone")) { - e_list_append (bl->priv->supported_fields, g_strdup("business_phone_2")); - } - else if (!strcmp (query_prop, "home_phone")) { - e_list_append (bl->priv->supported_fields, g_strdup("home_phone_2")); - } - } - } -} - -static void -add_oc_attributes_to_supported_fields (PASBackendLDAP *bl, LDAPObjectClass *oc) -{ - int i; - GHashTable *attr_hash = g_hash_table_new (g_str_hash, g_str_equal); - - for (i = 0; i < num_prop_infos; i ++) - g_hash_table_insert (attr_hash, prop_info[i].ldap_attr, prop_info[i].query_prop); - - if (oc->oc_at_oids_must) - add_to_supported_fields (bl, oc->oc_at_oids_must, attr_hash); - - if (oc->oc_at_oids_may) - add_to_supported_fields (bl, oc->oc_at_oids_may, attr_hash); - - g_hash_table_destroy (attr_hash); -} - -static void -check_schema_support (PASBackendLDAP *bl) -{ - char *attrs[2]; - LDAPMessage *resp; - LDAP *ldap = bl->priv->ldap; - - bl->priv->evolutionPersonChecked = TRUE; - - bl->priv->supported_fields = e_list_new ((EListCopyFunc)g_strdup, (EListFreeFunc)g_free, NULL); - - attrs[0] = "objectClasses"; - attrs[1] = NULL; - - if (ldap_search_ext_s (ldap, "cn=Subschema", LDAP_SCOPE_BASE, - "(objectClass=subschema)", attrs, 0, - NULL, NULL, NULL, 0, &resp) == LDAP_SUCCESS) { - char **values; - - values = ldap_get_values (ldap, resp, "objectClasses"); - - if (values) { - int i; - for (i = 0; values[i]; i ++) { - int j; - int code; - const char *err; - LDAPObjectClass *oc = ldap_str2objectclass (values[i], &code, &err, 0); - - if (!oc) - continue; - - for (j = 0; oc->oc_names[j]; j++) - if (!g_strcasecmp (oc->oc_names[j], EVOLUTIONPERSON)) { - g_print ("support found on ldap server for objectclass evolutionPerson\n"); - bl->priv->evolutionPersonSupported = TRUE; - - add_oc_attributes_to_supported_fields (bl, oc); - } - else if (!g_strcasecmp (oc->oc_names[j], INETORGPERSON) - || !g_strcasecmp (oc->oc_names[j], ORGANIZATIONALPERSON) - || !g_strcasecmp (oc->oc_names[j], PERSON)) { - add_oc_attributes_to_supported_fields (bl, oc); - } - - ldap_objectclass_free (oc); - } - } - } -} - -static void -pas_backend_ldap_connect (PASBackendLDAP *bl) -{ - PASBackendLDAPPrivate *blpriv = bl->priv; - - /* close connection first if it's open first */ - if (blpriv->ldap) - ldap_unbind (blpriv->ldap); - - blpriv->ldap = ldap_open (blpriv->ldap_host, blpriv->ldap_port); -#ifdef DEBUG - { - int debug_level = ~0; - ldap_set_option (blpriv->ldap, LDAP_OPT_DEBUG_LEVEL, &debug_level); - } -#endif - - if (NULL != blpriv->ldap) { - ldap_simple_bind_s(blpriv->ldap, - NULL /*binddn*/, NULL /*passwd*/); - blpriv->connected = TRUE; - } - else { - g_warning ("pas_backend_ldap_connect failed for " - "'ldap://%s:%d/%s'\n", - blpriv->ldap_host, - blpriv->ldap_port, - blpriv->ldap_rootdn ? blpriv->ldap_rootdn : ""); - blpriv->connected = FALSE; - } - - /* check to see if evolutionPerson is supported, if we can (me - might not be able to if we can't authenticate. if we - can't, try again in auth_user.) */ - check_schema_support (bl); -} - -static void -ldap_op_init (LDAPOp *op, PASBackend *backend, - PASBook *book, PASBookView *view, - LDAPOpHandler handler, LDAPOpDtor dtor) -{ - op->backend = backend; - op->book = book; - op->view = view; - op->handler = handler; - op->dtor = dtor; -} - -static void -ldap_op_process_current (PASBackend *backend) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - LDAPOp *op = bl->priv->current_op; - - if (!bl->priv->connected) { - if (op->view) - pas_book_view_notify_status_message (op->view, "Connecting to LDAP server"); - pas_backend_ldap_connect(bl); - } - - if (bl->priv->connected) { - if (op->handler (backend, op)) - ldap_op_finished (op); - } - else { - if (op->view) - pas_book_view_notify_status_message (op->view, "Unable to connect to LDAP server"); - - ldap_op_finished (op); - } -} - -static void -ldap_op_process (LDAPOp *op) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (op->backend); - - if (bl->priv->current_op) { - /* operation in progress. queue this op for later and return. */ - if (op->view) - pas_book_view_notify_status_message (op->view, "Waiting for connection to ldap server..."); - bl->priv->pending_ops = g_list_append (bl->priv->pending_ops, op); - } - else { - /* nothing going on, do this op now */ - bl->priv->current_op = op; - ldap_op_process_current (op->backend); - } -} - -static gboolean -ldap_op_process_on_idle (PASBackend *backend) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - - bl->priv->op_idle = 0; - - ldap_op_process_current (backend); - - return FALSE; -} - -static void -ldap_op_restart (LDAPOp *op) -{ - PASBackend *backend = op->backend; - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - - g_return_if_fail (op == bl->priv->current_op); - - bl->priv->op_idle = g_idle_add((GSourceFunc)ldap_op_process_on_idle, backend); -} - -static void -ldap_op_finished (LDAPOp *op) -{ - PASBackend *backend = op->backend; - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - - g_return_if_fail (op == bl->priv->current_op); - - op->dtor (backend, op); - - if (bl->priv->pending_ops) { - bl->priv->current_op = bl->priv->pending_ops->data; - bl->priv->pending_ops = g_list_remove_link (bl->priv->pending_ops, bl->priv->pending_ops); - - bl->priv->op_idle = g_idle_add((GSourceFunc)ldap_op_process_on_idle, backend); - } - else { - bl->priv->current_op = NULL; - } -} - -static int -ldap_error_to_response (int ldap_error) -{ - if (ldap_error == LDAP_SUCCESS) - return GNOME_Evolution_Addressbook_BookListener_Success; - else if (LDAP_NAME_ERROR (ldap_error)) - return GNOME_Evolution_Addressbook_BookListener_CardNotFound; - else if (ldap_error == LDAP_INSUFFICIENT_ACCESS) - return GNOME_Evolution_Addressbook_BookListener_PermissionDenied; - else if (ldap_error == LDAP_SERVER_DOWN) - return GNOME_Evolution_Addressbook_BookListener_RepositoryOffline; - else - return GNOME_Evolution_Addressbook_BookListener_OtherError; -} - - -static char * -create_dn_from_ecard (ECardSimple *card, const char *root_dn) -{ - char *cn, *cn_part = NULL; - char *dn; - gboolean need_comma = FALSE; - - cn = e_card_simple_get (card, E_CARD_SIMPLE_FIELD_FULL_NAME); - if (cn) { - cn_part = g_strdup_printf ("cn=%s%s", cn, need_comma ? "," : ""); - } - else { - cn_part = g_strdup (""); - } - - dn = g_strdup_printf ("%s%s%s", cn_part, - (root_dn && strlen(root_dn)) ? "," : "", - (root_dn && strlen(root_dn)) ? root_dn: ""); - - g_free (cn_part); - - g_print ("generated dn: %s\n", dn); - - return dn; -} - -static void -free_mods (GPtrArray *mods) -{ - int i = 0; - LDAPMod *mod; - - while ((mod = g_ptr_array_index (mods, i++))) { - int j; - g_free (mod->mod_type); - - if (mod->mod_op & LDAP_MOD_BVALUES) { - for (j = 0; mod->mod_bvalues[j]; j++) { - g_free (mod->mod_bvalues[j]->bv_val); - g_free (mod->mod_bvalues[j]); - } - } - else { - for (j = 0; mod->mod_values[j]; j++) - g_free (mod->mod_values[j]); - } - g_free (mod); - } - - g_ptr_array_free (mods, TRUE /* XXX ? */); -} - -static GPtrArray* -build_mods_from_ecards (PASBackendLDAP *bl, ECardSimple *current, ECardSimple *new, gboolean *new_dn_needed) -{ - gboolean adding = (current == NULL); - GPtrArray *result = g_ptr_array_new(); - int i; - - if (new_dn_needed) - *new_dn_needed = FALSE; - - /* we walk down the list of properties we can deal with (that - big table at the top of the file) */ - - for (i = 0; i < num_prop_infos; i ++) { - gboolean include; - gboolean new_prop_present = FALSE; - gboolean current_prop_present = FALSE; - struct berval** new_prop_bers = NULL; - char *new_prop = NULL; - char *current_prop = NULL; - - /* XXX if it's an evolutionPerson prop and the ldap - server doesn't support that objectclass, skip it. */ - if (prop_info[i].prop_type & PROP_EVOLVE && !bl->priv->evolutionPersonSupported) - continue; - - /* get the value for the new card, and compare it to - the value in the current card to see if we should - update it -- if adding is TRUE, short circuit the - check. */ - if (prop_info[i].prop_type & PROP_TYPE_STRING) { - new_prop = e_card_simple_get (new, prop_info[i].field_id); - new_prop_present = (new_prop != NULL); - } - else { - new_prop_bers = prop_info[i].ber_func (new); - new_prop_present = (new_prop_bers != NULL); - } - - /* need to set INCLUDE to true if the field needs to - show up in the ldap modify request */ - if (adding) { - /* if we're creating a new card, include it if the - field is there at all */ - if (prop_info[i].prop_type & PROP_TYPE_STRING) - include = (new_prop_present && *new_prop); /* empty strings cause problems */ - else - include = new_prop_present; - } - else { - /* if we're modifying an existing card, - include it if the current field value is - different than the new one, if it didn't - exist previously, or if it's been - removed. */ - if (prop_info[i].prop_type & PROP_TYPE_STRING) { - current_prop = e_card_simple_get (current, prop_info[i].field_id); - current_prop_present = (current_prop != NULL); - - if (new_prop && current_prop) - include = *new_prop && strcmp (new_prop, current_prop); - else - include = (!!new_prop != !!current_prop); - } - else { - int j; - struct berval **current_prop_bers = prop_info[i].ber_func (current); - - current_prop_present = (current_prop_bers != NULL); - - /* free up the current_prop_bers */ - if (current_prop_bers) { - for (j = 0; current_prop_bers[j]; j++) { - g_free (current_prop_bers[j]->bv_val); - g_free (current_prop_bers[j]); - } - g_free (current_prop_bers); - } - - include = !prop_info[i].compare_func (new, current); - } - } - - if (include) { - LDAPMod *mod = g_new (LDAPMod, 1); - - /* the included attribute has changed - we - need to update the dn if it's one of the - attributes we compute the dn from. */ - if (new_dn_needed) - *new_dn_needed |= prop_info[i].prop_type & PROP_DN; - - if (adding) { - mod->mod_op = LDAP_MOD_ADD; - } - else { - if (!new_prop_present) - mod->mod_op = LDAP_MOD_DELETE; - else if (!current_prop_present) - mod->mod_op = LDAP_MOD_ADD; - else - mod->mod_op = LDAP_MOD_REPLACE; - } - - mod->mod_type = g_strdup (prop_info[i].ldap_attr); - - if (prop_info[i].prop_type & PROP_TYPE_STRING) { - mod->mod_values = g_new (char*, 2); - mod->mod_values[0] = new_prop; - mod->mod_values[1] = NULL; - } - else { /* PROP_TYPE_LIST */ - mod->mod_op |= LDAP_MOD_BVALUES; - mod->mod_bvalues = new_prop_bers; - } - - g_ptr_array_add (result, mod); - } - - } - - /* NULL terminate the list of modifications */ - g_ptr_array_add (result, NULL); - - return result; -} - -static void -add_objectclass_mod (PASBackendLDAP *bl, GPtrArray *mod_array) -{ - LDAPMod *objectclass_mod; - - objectclass_mod = g_new (LDAPMod, 1); - objectclass_mod->mod_op = LDAP_MOD_ADD; - objectclass_mod->mod_type = g_strdup ("objectClass"); - objectclass_mod->mod_values = g_new (char*, bl->priv->evolutionPersonSupported ? 6 : 5); - objectclass_mod->mod_values[0] = g_strdup (TOP); - objectclass_mod->mod_values[1] = g_strdup (PERSON); - objectclass_mod->mod_values[2] = g_strdup (ORGANIZATIONALPERSON); - objectclass_mod->mod_values[3] = g_strdup (INETORGPERSON); - if (bl->priv->evolutionPersonSupported) { - objectclass_mod->mod_values[4] = g_strdup (EVOLUTIONPERSON); - objectclass_mod->mod_values[5] = NULL; - } - else { - objectclass_mod->mod_values[4] = NULL; - } - g_ptr_array_add (mod_array, objectclass_mod); -} - -typedef struct { - LDAPOp op; - char *vcard; -} LDAPCreateOp; - -static gboolean -create_card_handler (PASBackend *backend, LDAPOp *op) -{ - LDAPCreateOp *create_op = (LDAPCreateOp*)op; - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - ECard *new_ecard; - ECardSimple *new_card; - char *dn; - int response; - int ldap_error; - GPtrArray *mod_array; - LDAPMod **ldap_mods; - LDAP *ldap; - - printf ("vcard = %s\n", create_op->vcard); - - new_ecard = e_card_new (create_op->vcard); - new_card = e_card_simple_new (new_ecard); - - dn = create_dn_from_ecard (new_card, bl->priv->ldap_rootdn); - - ldap = bl->priv->ldap; - - /* build our mods */ - mod_array = build_mods_from_ecards (bl, NULL, new_card, NULL); - -#if 0 - if (!mod_array) { - /* there's an illegal field in there. report - UnsupportedAttribute back */ - g_free (dn); - - gtk_object_unref (GTK_OBJECT(new_card)); - - pas_book_respond_create (create_op->op.book, - GNOME_Evolution_Addressbook_BookListener_UnsupportedField, - dn); - - return TRUE; - } -#endif - - /* remove the NULL at the end */ - g_ptr_array_remove (mod_array, NULL); - - /* add our objectclass(es) */ - add_objectclass_mod (bl, mod_array); - - /* then put the NULL back */ - g_ptr_array_add (mod_array, NULL); - -#ifdef LDAP_DEBUG_ADD - { - int i; - printf ("Sending the following to the server as ADD\n"); - - for (i = 0; g_ptr_array_index(mod_array, i); i ++) { - LDAPMod *mod = g_ptr_array_index(mod_array, i); - if (mod->mod_op & LDAP_MOD_DELETE) - printf ("del "); - else if (mod->mod_op & LDAP_MOD_REPLACE) - printf ("rep "); - else - printf ("add "); - if (mod->mod_op & LDAP_MOD_BVALUES) - printf ("ber "); - else - printf (" "); - - printf (" %s:\n", mod->mod_type); - - if (mod->mod_op & LDAP_MOD_BVALUES) { - int j; - for (j = 0; mod->mod_bvalues[j] && mod->mod_bvalues[j]->bv_val; j++) - printf ("\t\t'%s'\n", mod->mod_bvalues[j]->bv_val); - } - else { - int j; - - for (j = 0; mod->mod_values[j]; j++) - printf ("\t\t'%s'\n", mod->mod_values[j]); - } - } - } -#endif - - ldap_mods = (LDAPMod**)mod_array->pdata; - - if (op->view) - pas_book_view_notify_status_message (op->view, "Adding card to LDAP server"); - - /* actually perform the ldap add */ - ldap_error = ldap_add_s (ldap, dn, ldap_mods); - - if (op->view) - pas_book_view_notify_status_message (op->view, ""); - - if (ldap_error != LDAP_SUCCESS) - ldap_perror (ldap, "ldap_add_s"); - - /* and clean up */ - free_mods (mod_array); - g_free (dn); - - gtk_object_unref (GTK_OBJECT(new_card)); - - /* and lastly respond */ - response = ldap_error_to_response (ldap_error); - pas_book_respond_create (create_op->op.book, - response, - dn); - - /* we're synchronous */ - return TRUE; -} - -static void -create_card_dtor (PASBackend *backend, LDAPOp *op) -{ - LDAPCreateOp *create_op = (LDAPCreateOp*)op; - - g_free (create_op->vcard); - g_free (create_op); -} - -static void -pas_backend_ldap_process_create_card (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - LDAPCreateOp *create_op = g_new (LDAPCreateOp, 1); - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - PASBookView *book_view = NULL; - - if (bl->priv->book_views) { - PASBackendLDAPBookView *v = bl->priv->book_views->data; - book_view = v->book_view; - } - - ldap_op_init ((LDAPOp*)create_op, backend, book, - book_view, - create_card_handler, create_card_dtor); - - create_op->vcard = req->vcard; - - ldap_op_process ((LDAPOp*)create_op); -} - - -typedef struct { - LDAPOp op; - char *id; -} LDAPRemoveOp; - -static gboolean -remove_card_handler (PASBackend *backend, LDAPOp *op) -{ - LDAPRemoveOp *remove_op = (LDAPRemoveOp*)op; - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - int response; - int ldap_error; - - ldap_error = ldap_delete_s (bl->priv->ldap, remove_op->id); - if (ldap_error != LDAP_SUCCESS) - ldap_perror (bl->priv->ldap, "ldap_delete_s"); - - response = ldap_error_to_response (ldap_error); - - pas_book_respond_remove (remove_op->op.book, - response); - - /* we're synchronous */ - return TRUE; -} - -static void -remove_card_dtor (PASBackend *backend, LDAPOp *op) -{ - LDAPRemoveOp *remove_op = (LDAPRemoveOp*)op; - - g_free (remove_op->id); - g_free (remove_op); -} - -static void -pas_backend_ldap_process_remove_card (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - LDAPRemoveOp *remove_op = g_new (LDAPRemoveOp, 1); - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - PASBookView *book_view = NULL; - - if (bl->priv->book_views) { - PASBackendLDAPBookView *v = bl->priv->book_views->data; - book_view = v->book_view; - } - - ldap_op_init ((LDAPOp*)remove_op, backend, book, - book_view, - remove_card_handler, remove_card_dtor); - - remove_op->id = req->id; - - ldap_op_process ((LDAPOp*)remove_op); -} - - -typedef struct { - LDAPOp op; - char *vcard; -} LDAPModifyOp; - -static ECardSimple * -search_for_dn (PASBackendLDAP *bl, const char *dn) -{ -#if 0 - char **attrs; -#endif - char *query; - LDAP *ldap = bl->priv->ldap; - LDAPMessage *res, *e; - ECardSimple *result = NULL; - -#if 0 - /* this is broken because if we (say) modify the cn and can't - modify the dn (because it overlaps), we lose the ability to - search by that component of the dn. */ - attrs = ldap_explode_dn (dn, 0); - query = g_strdup_printf ("(%s)", attrs[0]); - printf ("searching for %s\n", query); -#else - query = g_strdup ("(objectclass=*)"); -#endif - - if (ldap_search_s (ldap, - bl->priv->ldap_rootdn, - bl->priv->ldap_scope, - query, - NULL, 0, &res) != -1) { - e = ldap_first_entry (ldap, res); - while (NULL != e) { - if (!strcmp (ldap_get_dn (ldap, e), dn)) { - printf ("found it\n"); - result = build_card_from_entry (ldap, e); - break; - } - e = ldap_next_entry (ldap, e); - } - - ldap_msgfree(res); - } - - g_free (query); - return result; -} - -static gboolean -modify_card_handler (PASBackend *backend, LDAPOp *op) -{ - LDAPModifyOp *modify_op = (LDAPModifyOp*)op; - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - ECard *new_ecard; - char *id; - int response; - int ldap_error = LDAP_SUCCESS; - GPtrArray *mod_array; - LDAPMod **ldap_mods; - LDAP *ldap; - ECardSimple *current_card; - - new_ecard = e_card_new (modify_op->vcard); - id = e_card_get_id(new_ecard); - - ldap = bl->priv->ldap; - - current_card = search_for_dn (bl, id); - - if (current_card) { - ECardSimple *new_card = e_card_simple_new (new_ecard); - gboolean need_new_dn; - - /* build our mods */ - mod_array = build_mods_from_ecards (bl, current_card, new_card, &need_new_dn); - if (mod_array->len > 0) { - ldap_mods = (LDAPMod**)mod_array->pdata; - - /* actually perform the ldap modify */ - ldap_error = ldap_modify_ext_s (ldap, id, ldap_mods, NULL, NULL); - if (ldap_error != LDAP_SUCCESS) - ldap_perror (ldap, "ldap_modify_s"); - } - else { - g_print ("modify list empty. no modification sent\n"); - } - - /* and clean up */ - free_mods (mod_array); - gtk_object_unref (GTK_OBJECT(new_card)); - gtk_object_unref (GTK_OBJECT(current_card)); - } - else { - g_print ("didn't find original card\n"); - } - - response = ldap_error_to_response (ldap_error); - pas_book_respond_modify (modify_op->op.book, - response); - - /* we're synchronous */ - return TRUE; -} - -static void -modify_card_dtor (PASBackend *backend, LDAPOp *op) -{ - LDAPModifyOp *modify_op = (LDAPModifyOp*)op; - - g_free (modify_op->vcard); - g_free (modify_op); -} - -static void -pas_backend_ldap_process_modify_card (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - LDAPModifyOp *modify_op = g_new (LDAPModifyOp, 1); - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - PASBookView *book_view = NULL; - - if (bl->priv->book_views) { - PASBackendLDAPBookView *v = bl->priv->book_views->data; - book_view = v->book_view; - } - - ldap_op_init ((LDAPOp*)modify_op, backend, book, - book_view, - modify_card_handler, modify_card_dtor); - - modify_op->vcard = req->vcard; - - ldap_op_process ((LDAPOp*)modify_op); -} - - -typedef struct { - LDAPOp op; - PASBook *book; -} LDAPGetCursorOp; - -static long -get_length(PASCardCursor *cursor, gpointer data) -{ - PASBackendLDAPCursorPrivate *cursor_data = (PASBackendLDAPCursorPrivate *) data; - - return cursor_data->num_elements; -} - -static char * -get_nth(PASCardCursor *cursor, long n, gpointer data) -{ - PASBackendLDAPCursorPrivate *cursor_data = (PASBackendLDAPCursorPrivate *) data; - - g_return_val_if_fail (n < cursor_data->num_elements, NULL); - - return (char*)g_list_nth (cursor_data->elements, n); -} - -static void -cursor_destroy(GtkObject *object, gpointer data) -{ - CORBA_Environment ev; - GNOME_Evolution_Addressbook_Book corba_book; - PASBackendLDAPCursorPrivate *cursor_data = (PASBackendLDAPCursorPrivate *) data; - - corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(cursor_data->book)); - - CORBA_exception_init(&ev); - - GNOME_Evolution_Addressbook_Book_unref(corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("cursor_destroy: Exception unreffing " - "corba book.\n"); - } - - CORBA_exception_free(&ev); - - /* free the ldap specific cursor information */ - g_list_foreach (cursor_data->elements, (GFunc)g_free, NULL); - g_list_free (cursor_data->elements); - - g_free(cursor_data); -} - -static void -pas_backend_ldap_build_all_cards_list(PASBackend *backend, - PASBackendLDAPCursorPrivate *cursor_data) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - LDAP *ldap = bl->priv->ldap; - int ldap_error; - LDAPMessage *res, *e; - - if ((ldap_error = ldap_search_s (ldap, - bl->priv->ldap_rootdn, - bl->priv->ldap_scope, - "(objectclass=*)", - NULL, 0, &res)) == -1) { - g_warning ("ldap error '%s' in " - "pas_backend_ldap_build_all_cards_list\n", - ldap_err2string(ldap_error)); - } - - cursor_data->elements = NULL; - - cursor_data->num_elements = ldap_count_entries (ldap, res); - - e = ldap_first_entry(ldap, res); - - while (NULL != e) { - - /* for now just make a list of the dn's */ -#if 0 - for ( a = ldap_first_attribute( ldap, e, &ber ); a != NULL; - a = ldap_next_attribute( ldap, e, ber ) ) { - } -#else - cursor_data->elements = g_list_prepend(cursor_data->elements, - g_strdup(ldap_get_dn(ldap, e))); -#endif - - e = ldap_next_entry(ldap, e); - } - - ldap_msgfree(res); -} - - -static gboolean -get_cursor_handler (PASBackend *backend, LDAPOp *op) -{ - LDAPGetCursorOp *cursor_op = (LDAPGetCursorOp*)op; - CORBA_Environment ev; - int ldap_error = 0; - PASCardCursor *cursor; - GNOME_Evolution_Addressbook_Book corba_book; - PASBackendLDAPCursorPrivate *cursor_data; - PASBook *book = cursor_op->book; - - cursor_data = g_new(PASBackendLDAPCursorPrivate, 1); - cursor_data->backend = backend; - cursor_data->book = book; - - pas_backend_ldap_build_all_cards_list(backend, cursor_data); - - corba_book = bonobo_object_corba_objref(BONOBO_OBJECT(book)); - - CORBA_exception_init(&ev); - - GNOME_Evolution_Addressbook_Book_ref(corba_book, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("pas_backend_file_process_get_cursor: Exception reffing " - "corba book.\n"); - } - - CORBA_exception_free(&ev); - - cursor = pas_card_cursor_new(get_length, - get_nth, - cursor_data); - - gtk_signal_connect(GTK_OBJECT(cursor), "destroy", - GTK_SIGNAL_FUNC(cursor_destroy), cursor_data); - - pas_book_respond_get_cursor (book, - ldap_error_to_response (ldap_error), - cursor); - - /* we're synchronous */ - return TRUE; -} - -static void -get_cursor_dtor (PASBackend *backend, LDAPOp *op) -{ - g_free (op); -} - -static void -pas_backend_ldap_process_get_cursor (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - LDAPGetCursorOp *op = g_new (LDAPGetCursorOp, 1); - - ldap_op_init ((LDAPOp*)op, backend, book, NULL, get_cursor_handler, get_cursor_dtor); - - ldap_op_process ((LDAPOp*)op); -} - - -/* List property functions */ -static void -email_populate(ECardSimple *card, char **values) -{ - int i; - - for (i = 0; values[i] && i < 3; i ++) { - e_card_simple_set_email (card, i, values[i]); - } -} - -struct berval** -email_ber(ECardSimple *card) -{ - struct berval** result; - const char *emails[3]; - int i, j, num; - - num = 0; - for (i = 0; i < 3; i ++) { - emails[i] = e_card_simple_get_email (card, E_CARD_SIMPLE_EMAIL_ID_EMAIL + i); - if (emails[i]) - num++; - } - - if (num == 0) - return NULL; - - result = g_new (struct berval*, num + 1); - - for (i = 0; i < num; i ++) - result[i] = g_new (struct berval, 1); - - j = 0; - for (i = 0; i < 3; i ++) { - if (emails[i]) { - result[j]->bv_val = g_strdup (emails[i]); - result[j++]->bv_len = strlen (emails[i]); - } - } - - result[num] = NULL; - - return result; -} - -gboolean -email_compare (ECardSimple *ecard1, ECardSimple *ecard2) -{ - const char *email1, *email2; - int i; - - for (i = 0; i < 3; i ++) { - gboolean equal; - email1 = e_card_simple_get_email (ecard1, E_CARD_SIMPLE_EMAIL_ID_EMAIL + i); - email2 = e_card_simple_get_email (ecard2, E_CARD_SIMPLE_EMAIL_ID_EMAIL + i); - - if (email1 && email2) - equal = !strcmp (email1, email2); - else - equal = (!!email1 == !!email2); - - if (!equal) - return equal; - } - - return TRUE; -} - -static void -homephone_populate(ECardSimple *card, char **values) -{ - if (values[0]) - e_card_simple_set (card, E_CARD_SIMPLE_FIELD_PHONE_HOME, values[0]); - if (values[1]) - e_card_simple_set (card, E_CARD_SIMPLE_FIELD_PHONE_HOME_2, values[1]); -} - -struct berval** -homephone_ber(ECardSimple *card) -{ - struct berval** result; - const char *homephones[3]; - int i, j, num; - - num = 0; - if ((homephones[0] = e_card_simple_get (card, E_CARD_SIMPLE_FIELD_PHONE_HOME))) - num++; - if ((homephones[1] = e_card_simple_get (card, E_CARD_SIMPLE_FIELD_PHONE_HOME_2))) - num++; - - if (num == 0) - return NULL; - - result = g_new (struct berval*, num + 1); - - for (i = 0; i < num; i ++) - result[i] = g_new (struct berval, 1); - - j = 0; - for (i = 0; i < 2; i ++) { - if (homephones[i]) { - result[j]->bv_val = g_strdup (homephones[i]); - result[j++]->bv_len = strlen (homephones[i]); - } - } - - result[num] = NULL; - - return result; -} - -gboolean -homephone_compare (ECardSimple *ecard1, ECardSimple *ecard2) -{ - int phone_ids[2] = { E_CARD_SIMPLE_FIELD_PHONE_HOME, E_CARD_SIMPLE_FIELD_PHONE_HOME_2 }; - const char *phone1, *phone2; - int i; - - for (i = 0; i < 2; i ++) { - gboolean equal; - phone1 = e_card_simple_get (ecard1, phone_ids[i]); - phone2 = e_card_simple_get (ecard2, phone_ids[i]); - - if (phone1 && phone2) - equal = !strcmp (phone1, phone2); - else - equal = (!!phone1 == !!phone2); - - if (!equal) - return equal; - } - - return TRUE; -} - -static void -business_populate(ECardSimple *card, char **values) -{ - if (values[0]) - e_card_simple_set (card, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, values[0]); - if (values[1]) - e_card_simple_set (card, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2, values[1]); -} - -struct berval** -business_ber(ECardSimple *card) -{ - struct berval** result; - const char *business_phones[3]; - int i, j, num; - - num = 0; - if ((business_phones[0] = e_card_simple_get (card, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS))) - num++; - if ((business_phones[1] = e_card_simple_get (card, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2))) - num++; - - if (num == 0) - return NULL; - - result = g_new (struct berval*, num + 1); - - for (i = 0; i < num; i ++) - result[i] = g_new (struct berval, 1); - - j = 0; - for (i = 0; i < 2; i ++) { - if (business_phones[i]) { - result[j]->bv_val = g_strdup (business_phones[i]); - result[j++]->bv_len = strlen (business_phones[i]); - } - } - - result[num] = NULL; - - return result; -} - -gboolean -business_compare (ECardSimple *ecard1, ECardSimple *ecard2) -{ - int phone_ids[2] = { E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_2 }; - const char *phone1, *phone2; - int i; - - for (i = 0; i < 2; i ++) { - gboolean equal; - phone1 = e_card_simple_get (ecard1, phone_ids[i]); - phone2 = e_card_simple_get (ecard2, phone_ids[i]); - - if (phone1 && phone2) - equal = !strcmp (phone1, phone2); - else - equal = (!!phone1 == !!phone2); - - if (!equal) - return equal; - } - - return TRUE; -} - -static ESExpResult * -func_and(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - char ** strings; - - if (argc > 0) { - int i; - - strings = g_new(char*, argc+3); - strings[0] = g_strdup ("(&"); - strings[argc+3 - 2] = g_strdup (")"); - strings[argc+3 - 1] = NULL; - - for (i = 0; i < argc; i ++) { - GList *list_head = *list; - strings[argc - i] = (*list)->data; - *list = g_list_remove_link(*list, *list); - g_list_free_1(list_head); - } - - *list = g_list_prepend(*list, g_strjoinv(" ", strings)); - - for (i = 0 ; i < argc + 2; i ++) - g_free (strings[i]); - - g_free (strings); - } - - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_or(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - char ** strings; - - if (argc > 0) { - int i; - - strings = g_new(char*, argc+3); - strings[0] = g_strdup ("(|"); - strings[argc+3 - 2] = g_strdup (")"); - strings[argc+3 - 1] = NULL; - for (i = 0; i < argc; i ++) { - GList *list_head = *list; - strings[argc - i] = (*list)->data; - *list = g_list_remove_link(*list, *list); - g_list_free_1(list_head); - } - - *list = g_list_prepend(*list, g_strjoinv(" ", strings)); - - for (i = 0 ; i < argc + 2; i ++) - g_free (strings[i]); - - g_free (strings); - } - - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_not(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - /* just replace the head of the list with the NOT of it. */ - if (argc > 0) { - char *term = (*list)->data; - (*list)->data = g_strdup_printf("(!%s)", term); - g_free (term); - } - - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_contains(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - if (argc == 2 - && argv[0]->type == ESEXP_RES_STRING - && argv[1]->type == ESEXP_RES_STRING) { - char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; - gboolean one_star = FALSE; - - if (strlen(str) == 0) - one_star = TRUE; - - if (!strcmp (propname, "x-evolution-any-field")) { - int i; - int query_length; - char *big_query; - char *header, *footer; - char *match_str; - - header = g_malloc0((num_prop_infos - 1) * 2 + 1); - footer = g_malloc0(num_prop_infos + 1); - for (i = 0; i < num_prop_infos - 1; i ++) { - strcat (header, "(|"); - strcat (footer, ")"); - } - - match_str = g_strdup_printf("=*%s%s)", - str, one_star ? "" : "*"); - - query_length = strlen (header); - - for (i = 0; i < num_prop_infos; i ++) { - query_length += 1 + strlen(prop_info[i].ldap_attr) + strlen (match_str); - } - - big_query = g_malloc0(query_length + 1); - strcat (big_query, header); - for (i = 0; i < num_prop_infos; i ++) { - strcat (big_query, "("); - strcat (big_query, prop_info[i].ldap_attr); - strcat (big_query, match_str); - } - strcat (big_query, footer); - - *list = g_list_prepend(*list, big_query); - - g_free (match_str); - g_free (header); - g_free (footer); - } - else { - char *ldap_attr = query_prop_to_ldap(propname); - - if (ldap_attr) - *list = g_list_prepend(*list, - g_strdup_printf("(%s=*%s%s)", - ldap_attr, - str, - one_star ? "" : "*")); - } - } - - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_is(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - if (argc == 2 - && argv[0]->type == ESEXP_RES_STRING - && argv[1]->type == ESEXP_RES_STRING) { - char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; - char *ldap_attr = query_prop_to_ldap(propname); - - if (ldap_attr) - *list = g_list_prepend(*list, - g_strdup_printf("(%s=%s)", - ldap_attr, str)); - } - - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_beginswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - if (argc == 2 - && argv[0]->type == ESEXP_RES_STRING - && argv[1]->type == ESEXP_RES_STRING) { - char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; - char *ldap_attr = query_prop_to_ldap(propname); - gboolean one_star = FALSE; - - if (strlen(str) == 0) - one_star = TRUE; - - if (ldap_attr) - *list = g_list_prepend(*list, - g_strdup_printf("(%s=%s*)", - ldap_attr, - str)); - } - - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -static ESExpResult * -func_endswith(struct _ESExp *f, int argc, struct _ESExpResult **argv, void *data) -{ - GList **list = data; - ESExpResult *r; - - if (argc == 2 - && argv[0]->type == ESEXP_RES_STRING - && argv[1]->type == ESEXP_RES_STRING) { - char *propname = argv[0]->value.string; - char *str = argv[1]->value.string; - char *ldap_attr = query_prop_to_ldap(propname); - gboolean one_star = FALSE; - - if (strlen(str) == 0) - one_star = TRUE; - - if (ldap_attr) - *list = g_list_prepend(*list, - g_strdup_printf("(%s=*%s)", - ldap_attr, - str)); - } - - r = e_sexp_result_new(f, ESEXP_RES_BOOL); - r->value.bool = FALSE; - - return r; -} - -/* 'builtin' functions */ -static struct { - char *name; - ESExpFunc *func; - int type; /* set to 1 if a function can perform shortcut evaluation, or - doesn't execute everything, 0 otherwise */ -} symbols[] = { - { "and", func_and, 0 }, - { "or", func_or, 0 }, - { "not", func_not, 0 }, - { "contains", func_contains, 0 }, - { "is", func_is, 0 }, - { "beginswith", func_beginswith, 0 }, - { "endswith", func_endswith, 0 }, -}; - -static gchar * -pas_backend_ldap_build_query (gchar *query) -{ - ESExp *sexp; - ESExpResult *r; - gchar *retval; - GList *list = NULL; - int i; - - sexp = e_sexp_new(); - - for(i=0;i<sizeof(symbols)/sizeof(symbols[0]);i++) { - if (symbols[i].type == 1) { - e_sexp_add_ifunction(sexp, 0, symbols[i].name, - (ESExpIFunc *)symbols[i].func, &list); - } else { - e_sexp_add_function(sexp, 0, symbols[i].name, - symbols[i].func, &list); - } - } - - e_sexp_input_text(sexp, query, strlen(query)); - e_sexp_parse(sexp); - - r = e_sexp_eval(sexp); - - e_sexp_result_free(sexp, r); - e_sexp_unref (sexp); - - if (list->next) { - g_warning ("conversion to ldap query string failed"); - retval = NULL; - g_list_foreach (list, (GFunc)g_free, NULL); - } - else { - retval = list->data; - } - - g_list_free (list); - return retval; -} - -static gchar * -query_prop_to_ldap(gchar *query_prop) -{ - int i; - - for (i = 0; i < num_prop_infos; i ++) - if (!strcmp (query_prop, prop_info[i].query_prop)) - return prop_info[i].ldap_attr; - - return NULL; -} - - -typedef struct { - LDAPOp op; - char *ldap_query; - PASBackendLDAP *bl; - PASBackendLDAPBookView *view; -} LDAPSearchOp; - -static ECardSimple * -build_card_from_entry (LDAP *ldap, LDAPMessage *e) -{ - ECard *ecard = E_CARD(gtk_type_new(e_card_get_type())); - ECardSimple *card = e_card_simple_new (ecard); - char *dn = ldap_get_dn(ldap, e); - char *attr; - BerElement *ber = NULL; - - g_print ("build_card_from_entry, dn = %s\n", dn); - e_card_simple_set_id (card, dn); - - for (attr = ldap_first_attribute (ldap, e, &ber); attr; - attr = ldap_next_attribute (ldap, e, ber)) { - int i; - struct prop_info *info = NULL; - - for (i = 0; i < num_prop_infos; i ++) - if (!strcmp (attr, prop_info[i].ldap_attr)) - info = &prop_info[i]; - - if (info) { - char **values; - values = ldap_get_values (ldap, e, attr); - - if (values) { - if (info->prop_type & PROP_TYPE_STRING) { - /* if it's a normal property just set the string */ - e_card_simple_set (card, info->field_id, values[0]); - - } - else if (info->prop_type & PROP_TYPE_LIST) { - /* if it's a list call the ecard-populate function, - which calls gtk_object_set to set the property */ - info->populate_ecard_func(card, - values); - } - - ldap_value_free (values); - } - } - } - -#ifndef OPENLDAP2 - /* if ldap->ld_errno == LDAP_DECODING_ERROR there was an - error decoding an attribute, and we shouldn't free ber, - since the ldap library already did it. */ - if (ldap->ld_errno != LDAP_DECODING_ERROR && ber) - ber_free (ber, 0); -#endif - - e_card_simple_sync_card (card); - - return card; -} - -static gboolean -poll_ldap (LDAPSearchOp *op) -{ - PASBackendLDAPBookView *view = op->view; - PASBackendLDAP *bl = op->bl; - LDAP *ldap = bl->priv->ldap; - int rc; - LDAPMessage *res, *e; - GList *cards = NULL; - static int received = 0; - - pas_book_view_notify_status_message (view->book_view, "Polling for LDAP search result"); - - rc = ldap_result (ldap, view->search_msgid, 0, NULL, &res); - - if (rc == -1 && received == 0) { - pas_book_view_notify_status_message (view->book_view, "Restarting search"); - /* connection went down and we never got any. */ - bl->priv->connected = FALSE; - - /* this will reopen the connection */ - ldap_op_restart ((LDAPOp*)op); - return FALSE; - } - - if (rc != LDAP_RES_SEARCH_ENTRY) { - view->search_idle = 0; - pas_book_view_notify_complete (view->book_view); - ldap_op_finished ((LDAPOp*)op); - received = 0; - pas_book_view_notify_status_message (view->book_view, "Search complete"); - return FALSE; - } - - received = 1; - - e = ldap_first_entry(ldap, res); - - while (NULL != e) { - ECardSimple *card = build_card_from_entry (ldap, e); - - cards = g_list_append (cards, e_card_simple_get_vcard (card)); - - gtk_object_unref (GTK_OBJECT(card)); - - e = ldap_next_entry(ldap, e); - } - - if (cards) { - pas_book_view_notify_add (view->book_view, cards); - - g_list_foreach (cards, (GFunc)g_free, NULL); - g_list_free (cards); - cards = NULL; - } - - ldap_msgfree(res); - - return TRUE; -} - -static gboolean -ldap_search_handler (PASBackend *backend, LDAPOp *op) -{ - LDAPSearchOp *search_op = (LDAPSearchOp*) op; - - if (op->view) - pas_book_view_notify_status_message (op->view, "Searching..."); - - /* it might not be NULL if we've been restarted */ - if (search_op->ldap_query == NULL) - search_op->ldap_query = pas_backend_ldap_build_query(search_op->view->search); - - if (search_op->ldap_query != NULL) { - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - PASBackendLDAPBookView *view = search_op->view; - LDAP *ldap = bl->priv->ldap; - int ldap_err; - - ldap_err = ldap_search_ext (ldap, bl->priv->ldap_rootdn, - bl->priv->ldap_scope, - search_op->ldap_query, - NULL, 0, - NULL, /* XXX */ - NULL, /* XXX */ - NULL, - LDAP_MAX_SEARCH_RESPONSES, &view->search_msgid); - - if (ldap_err != LDAP_SUCCESS) { - pas_book_view_notify_status_message (view->book_view, ldap_err2string(ldap_err)); - return TRUE; /* act synchronous in this case */ - } - - if (view->search_msgid == -1) { - pas_book_view_notify_status_message (view->book_view, ldap_err2string(ldap_err)); - return TRUE; /* act synchronous in this case */ - } - else { - view->search_idle = g_idle_add((GSourceFunc)poll_ldap, search_op); - } - - /* we're async */ - return FALSE; - } - else { - /* error doing the conversion to an ldap query, let's - end this now by acting like we're synchronous. */ - g_warning ("LDAP problem converting search query %s\n", search_op->view->search); - return TRUE; - } -} - -static void -ldap_search_dtor (PASBackend *backend, LDAPOp *op) -{ - LDAPSearchOp *search_op = (LDAPSearchOp*) op; - - g_free (search_op->ldap_query); - g_free (search_op); -} - -static void -pas_backend_ldap_search (PASBackendLDAP *bl, - PASBook *book, - PASBackendLDAPBookView *view) -{ - LDAPSearchOp *op = g_new (LDAPSearchOp, 1); - - ldap_op_init ((LDAPOp*)op, PAS_BACKEND(bl), book, view->book_view, ldap_search_handler, ldap_search_dtor); - - op->ldap_query = NULL; - op->view = view; - op->bl = bl; - - /* keep track of the search op so we can delete it from the - list if the view is destroyed */ - view->search_op = (LDAPOp*)op; - - ldap_op_process ((LDAPOp*)op); -} - -static void -pas_backend_ldap_process_get_book_view (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - CORBA_Environment ev; - PASBookView *book_view; - PASBackendLDAPBookView *view; - - g_return_if_fail (req->listener != NULL); - - book_view = pas_book_view_new (req->listener); - - bonobo_object_ref(BONOBO_OBJECT(book)); - gtk_signal_connect(GTK_OBJECT(book_view), "destroy", - GTK_SIGNAL_FUNC(view_destroy), book); - - view = g_new0(PASBackendLDAPBookView, 1); - view->book_view = book_view; - view->search = g_strdup(req->search); - view->blpriv = bl->priv; - - bl->priv->book_views = g_list_prepend(bl->priv->book_views, view); - - pas_book_respond_get_book_view (book, - (book_view != NULL - ? GNOME_Evolution_Addressbook_BookListener_Success - : GNOME_Evolution_Addressbook_BookListener_CardNotFound /* XXX */), - book_view); - - pas_backend_ldap_search (bl, book, view); - - g_free (req->search); - CORBA_exception_init(&ev); - bonobo_object_release_unref(req->listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("pas_backend_file_process_get_book_view: Exception reffing " - "corba book.\n"); - } - CORBA_exception_free(&ev); - -} - -static void -pas_backend_ldap_process_check_connection (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - - pas_book_report_connection (book, bl->priv->connected); -} - -static void -pas_backend_ldap_process_authenticate_user (PASBackend *backend, - PASBook *book, - PASRequest *req) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - int ldap_error = ldap_simple_bind_s(bl->priv->ldap, - req->user, - req->passwd); - - pas_book_respond_authenticate_user (book, - ldap_error_to_response (ldap_error)); - - bl->priv->writable = (ldap_error == LDAP_SUCCESS); - pas_book_report_writable (book, bl->priv->writable); - - if (!bl->priv->evolutionPersonChecked) - check_schema_support (bl); -} - -static void -pas_backend_ldap_process_get_supported_fields (PASBackend *backend, - PASBook *book, - PASRequest *req) - -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - - pas_book_respond_get_supported_fields (book, - GNOME_Evolution_Addressbook_BookListener_Success, - bl->priv->supported_fields); -} - -static gboolean -pas_backend_ldap_can_write (PASBook *book) -{ - return TRUE; /* XXX */ -} - -static gboolean -pas_backend_ldap_can_write_card (PASBook *book, - const char *id) -{ - return TRUE; /* XXX */ -} - -static void -pas_backend_ldap_process_client_requests (PASBook *book) -{ - PASBackend *backend; - PASRequest *req; - - backend = pas_book_get_backend (book); - - req = pas_book_pop_request (book); - if (req == NULL) - return; - - switch (req->op) { - case CreateCard: - pas_backend_ldap_process_create_card (backend, book, req); - break; - - case RemoveCard: - pas_backend_ldap_process_remove_card (backend, book, req); - break; - - case ModifyCard: - pas_backend_ldap_process_modify_card (backend, book, req); - break; - - case CheckConnection: - pas_backend_ldap_process_check_connection (backend, book, req); - break; - - case GetCursor: - pas_backend_ldap_process_get_cursor (backend, book, req); - break; - - case GetBookView: - pas_backend_ldap_process_get_book_view (backend, book, req); - break; - - case GetChanges: - /* FIXME: Code this. */ - break; - - case AuthenticateUser: - pas_backend_ldap_process_authenticate_user (backend, book, req); - break; - - case GetSupportedFields: - pas_backend_ldap_process_get_supported_fields (backend, book, req); - break; - } - - g_free (req); -} - -static void -pas_backend_ldap_book_destroy_cb (PASBook *book, gpointer data) -{ - PASBackendLDAP *backend; - - backend = PAS_BACKEND_LDAP (data); - - pas_backend_remove_client (PAS_BACKEND (backend), book); -} - -static char * -pas_backend_ldap_get_vcard (PASBook *book, const char *id) -{ - PASBackendLDAP *bl; - int ldap_error = LDAP_SUCCESS; /* XXX */ - - bl = PAS_BACKEND_LDAP (pas_book_get_backend (book)); - - /* XXX use ldap_search */ - - if (ldap_error == LDAP_SUCCESS) { - /* success */ - return g_strdup (""); - } - else { - return g_strdup (""); - } -} - -static gboolean -pas_backend_ldap_load_uri (PASBackend *backend, - const char *uri) -{ - PASBackendLDAP *bl = PAS_BACKEND_LDAP (backend); - LDAPURLDesc *lud; - int ldap_error; - - g_assert (bl->priv->connected == FALSE); - - ldap_error = ldap_url_parse ((char*)uri, &lud); - if (ldap_error == LDAP_SUCCESS) { - g_free(bl->priv->uri); - bl->priv->uri = g_strdup (uri); - bl->priv->ldap_host = g_strdup(lud->lud_host); - bl->priv->ldap_port = lud->lud_port; - /* if a port wasn't specified, default to LDAP_PORT */ - if (bl->priv->ldap_port == 0) - bl->priv->ldap_port = LDAP_PORT; - bl->priv->ldap_rootdn = g_strdup(lud->lud_dn); - bl->priv->ldap_scope = lud->lud_scope; - - ldap_free_urldesc(lud); - - pas_backend_ldap_connect (bl); - if (bl->priv->ldap == NULL) - return FALSE; - else - return TRUE; - } else - return FALSE; -} - -/* Get_uri handler for the addressbook LDAP backend */ -static const char * -pas_backend_ldap_get_uri (PASBackend *backend) -{ - PASBackendLDAP *bl; - - bl = PAS_BACKEND_LDAP (backend); - return bl->priv->uri; -} - -static gboolean -pas_backend_ldap_add_client (PASBackend *backend, - GNOME_Evolution_Addressbook_BookListener listener) -{ - PASBackendLDAP *bl; - PASBook *book; - - g_assert (backend != NULL); - g_assert (PAS_IS_BACKEND_LDAP (backend)); - - bl = PAS_BACKEND_LDAP (backend); - - book = pas_book_new ( - backend, listener, - pas_backend_ldap_get_vcard, - pas_backend_ldap_can_write, - pas_backend_ldap_can_write_card); - - if (!book) { - if (!bl->priv->clients) - pas_backend_last_client_gone (backend); - - return FALSE; - } - - gtk_signal_connect (GTK_OBJECT (book), "destroy", - pas_backend_ldap_book_destroy_cb, backend); - - gtk_signal_connect (GTK_OBJECT (book), "requests_queued", - pas_backend_ldap_process_client_requests, NULL); - - bl->priv->clients = g_list_prepend ( - bl->priv->clients, book); - - if (bl->priv->connected) { - pas_book_respond_open ( - book, GNOME_Evolution_Addressbook_BookListener_Success); - } else { - /* Open the book. */ - pas_book_respond_open ( - book, GNOME_Evolution_Addressbook_BookListener_Success); - } - - pas_book_report_writable (book, bl->priv->writable); - - return TRUE; -} - -static void -pas_backend_ldap_remove_client (PASBackend *backend, - PASBook *book) -{ - PASBackendLDAP *bl; - GList *l; - PASBook *lbook; - - g_return_if_fail (backend != NULL); - g_return_if_fail (PAS_IS_BACKEND_LDAP (backend)); - g_return_if_fail (book != NULL); - g_return_if_fail (PAS_IS_BOOK (book)); - - bl = PAS_BACKEND_LDAP (backend); - - /* Find the book in the list of clients */ - - for (l = bl->priv->clients; l; l = l->next) { - lbook = PAS_BOOK (l->data); - - if (lbook == book) - break; - } - - g_assert (l != NULL); - - /* Disconnect */ - - bl->priv->clients = g_list_remove_link (bl->priv->clients, l); - g_list_free_1 (l); - - /* When all clients go away, notify the parent factory about it so that - * it may decide whether to kill the backend or not. - */ - if (!bl->priv->clients) - pas_backend_last_client_gone (backend); -} - -static char * -pas_backend_ldap_get_static_capabilites (PASBackend *backend) -{ - return g_strdup("net"); -} - -static gboolean -pas_backend_ldap_construct (PASBackendLDAP *backend) -{ - g_assert (backend != NULL); - g_assert (PAS_IS_BACKEND_LDAP (backend)); - - if (! pas_backend_construct (PAS_BACKEND (backend))) - return FALSE; - - return TRUE; -} - -/** - * pas_backend_ldap_new: - */ -PASBackend * -pas_backend_ldap_new (void) -{ - PASBackendLDAP *backend; - - backend = gtk_type_new (pas_backend_ldap_get_type ()); - - if (! pas_backend_ldap_construct (backend)) { - gtk_object_unref (GTK_OBJECT (backend)); - - return NULL; - } - - return PAS_BACKEND (backend); -} - -static void -call_dtor (LDAPOp *op, gpointer data) -{ - op->dtor (op->backend, op); -} - -static void -pas_backend_ldap_destroy (GtkObject *object) -{ - PASBackendLDAP *bl; - - bl = PAS_BACKEND_LDAP (object); - - g_list_foreach (bl->priv->pending_ops, (GFunc)call_dtor, NULL); - g_list_free (bl->priv->pending_ops); - - if (bl->priv->supported_fields) - gtk_object_unref (GTK_OBJECT (bl->priv->supported_fields)); - - g_free (bl->priv->uri); - - GTK_OBJECT_CLASS (pas_backend_ldap_parent_class)->destroy (object); -} - -static void -pas_backend_ldap_class_init (PASBackendLDAPClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - PASBackendClass *parent_class; - - pas_backend_ldap_parent_class = gtk_type_class (pas_backend_get_type ()); - - parent_class = PAS_BACKEND_CLASS (klass); - - /* Set the virtual methods. */ - parent_class->load_uri = pas_backend_ldap_load_uri; - parent_class->get_uri = pas_backend_ldap_get_uri; - parent_class->add_client = pas_backend_ldap_add_client; - parent_class->remove_client = pas_backend_ldap_remove_client; - parent_class->get_static_capabilities = pas_backend_ldap_get_static_capabilites; - - object_class->destroy = pas_backend_ldap_destroy; -} - -static void -pas_backend_ldap_init (PASBackendLDAP *backend) -{ - PASBackendLDAPPrivate *priv; - - priv = g_new0 (PASBackendLDAPPrivate, 1); - - backend->priv = priv; -} - -/** - * pas_backend_ldap_get_type: - */ -GtkType -pas_backend_ldap_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "PASBackendLDAP", - sizeof (PASBackendLDAP), - sizeof (PASBackendLDAPClass), - (GtkClassInitFunc) pas_backend_ldap_class_init, - (GtkObjectInitFunc) pas_backend_ldap_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (pas_backend_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/pas/pas-backend-ldap.h b/addressbook/backend/pas/pas-backend-ldap.h deleted file mode 100644 index a59cdf3857..0000000000 --- a/addressbook/backend/pas/pas-backend-ldap.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __PAS_BACKEND_LDAP_H__ -#define __PAS_BACKEND_LDAP_H__ - -#include <libgnome/gnome-defs.h> -#include "pas-backend.h" - -typedef struct _PASBackendLDAPPrivate PASBackendLDAPPrivate; - -typedef struct { - PASBackend parent_object; - PASBackendLDAPPrivate *priv; -} PASBackendLDAP; - -typedef struct { - PASBackendClass parent_class; -} PASBackendLDAPClass; - -PASBackend *pas_backend_ldap_new (void); -GtkType pas_backend_ldap_get_type (void); - -#define PAS_BACKEND_LDAP_TYPE (pas_backend_ldap_get_type ()) -#define PAS_BACKEND_LDAP(o) (GTK_CHECK_CAST ((o), PAS_BACKEND_LDAP_TYPE, PASBackendLDAP)) -#define PAS_BACKEND_LDAP_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BACKEND_TYPE, PASBackendLDAPClass)) -#define PAS_IS_BACKEND_LDAP(o) (GTK_CHECK_TYPE ((o), PAS_BACKEND_LDAP_TYPE)) -#define PAS_IS_BACKEND_LDAP_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BACKEND_LDAP_TYPE)) - -#endif /* ! __PAS_BACKEND_LDAP_H__ */ - diff --git a/addressbook/backend/pas/pas-backend.c b/addressbook/backend/pas/pas-backend.c deleted file mode 100644 index 22b7184813..0000000000 --- a/addressbook/backend/pas/pas-backend.c +++ /dev/null @@ -1,178 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <gtk/gtkobject.h> -#include <gtk/gtksignal.h> -#include "pas-backend.h" - -#define CLASS(o) PAS_BACKEND_CLASS (GTK_OBJECT (o)->klass) - -/* Signal IDs */ -enum { - LAST_CLIENT_GONE, - LAST_SIGNAL -}; - -static guint pas_backend_signals[LAST_SIGNAL]; - - -gboolean -pas_backend_construct (PASBackend *backend) -{ - return TRUE; -} - -gboolean -pas_backend_load_uri (PASBackend *backend, - const char *uri) -{ - g_return_val_if_fail (backend != NULL, FALSE); - g_return_val_if_fail (PAS_IS_BACKEND (backend), FALSE); - g_return_val_if_fail (uri != NULL, FALSE); - - g_assert (CLASS (backend)->load_uri != NULL); - - return (* CLASS (backend)->load_uri) (backend, uri); -} - -/** - * pas_backend_get_uri: - * @backend: An addressbook backend. - * - * Queries the URI that an addressbook backend is serving. - * - * Return value: URI for the backend. - **/ -const char * -pas_backend_get_uri (PASBackend *backend) -{ - g_return_val_if_fail (backend != NULL, NULL); - g_return_val_if_fail (PAS_IS_BACKEND (backend), NULL); - - g_assert (CLASS (backend)->get_uri != NULL); - - return (* CLASS (backend)->get_uri) (backend); -} - -/** - * pas_backend_add_client: - * @backend: An addressbook backend. - * @listener: Listener for notification to the client. - * - * Adds a client to an addressbook backend. - * - * Return value: TRUE on success, FALSE on failure to add the client. - */ -gboolean -pas_backend_add_client (PASBackend *backend, - GNOME_Evolution_Addressbook_BookListener listener) -{ - g_return_val_if_fail (backend != NULL, FALSE); - g_return_val_if_fail (PAS_IS_BACKEND (backend), FALSE); - g_return_val_if_fail (listener != CORBA_OBJECT_NIL, FALSE); - - g_assert (CLASS (backend)->add_client != NULL); - - return CLASS (backend)->add_client (backend, listener); -} - -void -pas_backend_remove_client (PASBackend *backend, - PASBook *book) -{ - g_return_if_fail (backend != NULL); - g_return_if_fail (PAS_IS_BACKEND (backend)); - g_return_if_fail (book != NULL); - g_return_if_fail (PAS_IS_BOOK (book)); - - g_assert (CLASS (backend)->remove_client != NULL); - - CLASS (backend)->remove_client (backend, book); -} - -char * -pas_backend_get_static_capabilities (PASBackend *backend) -{ - g_return_val_if_fail (backend != NULL, NULL); - g_return_val_if_fail (PAS_IS_BACKEND (backend), NULL); - - g_assert (CLASS (backend)->get_static_capabilities != NULL); - - return CLASS (backend)->get_static_capabilities (backend); -} - -/** - * pas_backend_last_client_gone: - * @backend: An addressbook backend. - * - * Emits the "last_client_gone" signal for the specified backend. Should - * only be called from backend implementations if the backend really does - * not have any more clients. - **/ -void -pas_backend_last_client_gone (PASBackend *backend) -{ - g_return_if_fail (backend != NULL); - g_return_if_fail (PAS_IS_BACKEND (backend)); - - gtk_signal_emit (GTK_OBJECT (backend), pas_backend_signals[LAST_CLIENT_GONE]); -} - -static void -pas_backend_init (PASBackend *backend) -{ -} - -static void -pas_backend_class_init (PASBackendClass *klass) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass *) klass; - - pas_backend_signals[LAST_CLIENT_GONE] = - gtk_signal_new ("last_client_gone", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (PASBackendClass, last_client_gone), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, pas_backend_signals, LAST_SIGNAL); - - klass->add_client = NULL; - klass->remove_client = NULL; - klass->get_static_capabilities = NULL; -} - -/** - * pas_backend_get_type: - */ -GtkType -pas_backend_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "PASBackend", - sizeof (PASBackend), - sizeof (PASBackendClass), - (GtkClassInitFunc) pas_backend_class_init, - (GtkObjectInitFunc) pas_backend_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (gtk_object_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/pas/pas-backend.h b/addressbook/backend/pas/pas-backend.h deleted file mode 100644 index be08d48950..0000000000 --- a/addressbook/backend/pas/pas-backend.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * An abstract class which defines the API to a given backend. - * There will be one PASBackend object for every URI which is loaded. - * - * Two people will call into the PASBackend API: - * - * 1. The PASBookFactory, when it has been asked to load a book. - * It will create a new PASBackend if one is not already running - * for the requested URI. It will call pas_backend_add_client to - * add a new client to an existing PASBackend server. - * - * 2. A PASBook, when a client has requested an operation on the - * GNOME_Evolution_Addressbook_Book interface. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __PAS_BACKEND_H__ -#define __PAS_BACKEND_H__ - -#include <libgnome/gnome-defs.h> -#include <gtk/gtkobject.h> -#include <pas/addressbook.h> - -typedef struct _PASBackend PASBackend; -typedef struct _PASBackendPrivate PASBackendPrivate; - -#include <pas/pas-book.h> - -struct _PASBackend { - GtkObject parent_object; - PASBackendPrivate *priv; -}; - -typedef struct { - GtkObjectClass parent_class; - - /* Virtual methods */ - gboolean (*load_uri) (PASBackend *backend, const char *uri); - const char *(* get_uri) (PASBackend *backend); - gboolean (*add_client) (PASBackend *backend, GNOME_Evolution_Addressbook_BookListener listener); - void (*remove_client) (PASBackend *backend, PASBook *book); - char *(*get_static_capabilities) (PASBackend *backend); - - /* Notification signals */ - void (* last_client_gone) (PASBackend *backend); -} PASBackendClass; - -typedef PASBackend * (*PASBackendFactoryFn) (void); - -gboolean pas_backend_construct (PASBackend *backend); -gboolean pas_backend_load_uri (PASBackend *backend, - const char *uri); -const char *pas_backend_get_uri (PASBackend *backend); - -gboolean pas_backend_add_client (PASBackend *backend, - GNOME_Evolution_Addressbook_BookListener listener); -void pas_backend_remove_client (PASBackend *backend, - PASBook *book); -char *pas_backend_get_static_capabilities (PASBackend *backend); - -void pas_backend_last_client_gone (PASBackend *backend); - -GtkType pas_backend_get_type (void); - -#define PAS_BACKEND_TYPE (pas_backend_get_type ()) -#define PAS_BACKEND(o) (GTK_CHECK_CAST ((o), PAS_BACKEND_TYPE, PASBackend)) -#define PAS_BACKEND_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BACKEND_TYPE, PASBackendClass)) -#define PAS_IS_BACKEND(o) (GTK_CHECK_TYPE ((o), PAS_BACKEND_TYPE)) -#define PAS_IS_BACKEND_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BACKEND_TYPE)) - -#endif /* ! __PAS_BACKEND_H__ */ - diff --git a/addressbook/backend/pas/pas-book-factory.c b/addressbook/backend/pas/pas-book-factory.c deleted file mode 100644 index 052205b81d..0000000000 --- a/addressbook/backend/pas/pas-book-factory.c +++ /dev/null @@ -1,610 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <ctype.h> - -#include <gtk/gtksignal.h> -#include <liboaf/liboaf.h> -#include "addressbook.h" -#include "pas-book-factory.h" - -#define PAS_BOOK_FACTORY_OAF_ID "OAFIID:GNOME_Evolution_Wombat_ServerFactory" - -static BonoboObjectClass *pas_book_factory_parent_class; -POA_GNOME_Evolution_Addressbook_BookFactory__vepv pas_book_factory_vepv; - -typedef struct { - char *uri; - GNOME_Evolution_Addressbook_BookListener listener; -} PASBookFactoryQueuedRequest; - -struct _PASBookFactoryPrivate { - gint idle_id; - GHashTable *backends; - GHashTable *active_server_map; - GList *queued_requests; - - /* Whether the factory has been registered with OAF yet */ - guint registered : 1; -}; - -/* Signal IDs */ -enum { - LAST_BOOK_GONE, - LAST_SIGNAL -}; - -static guint factory_signals[LAST_SIGNAL]; - -static char * -pas_book_factory_canonicalize_uri (const char *uri) -{ - /* FIXME: What do I do here? */ - - return g_strdup (uri); -} - -static char * -pas_book_factory_extract_proto_from_uri (const char *uri) -{ - char *proto; - char *p; - - p = strchr (uri, ':'); - - if (p == NULL) - return NULL; - - proto = g_malloc0 (p - uri + 1); - - strncpy (proto, uri, p - uri); - - return proto; -} - -/** - * pas_book_factory_register_backend: - * @factory: - * @proto: - * @backend: - */ -void -pas_book_factory_register_backend (PASBookFactory *factory, - const char *proto, - PASBackendFactoryFn backend) -{ - g_return_if_fail (factory != NULL); - g_return_if_fail (PAS_IS_BOOK_FACTORY (factory)); - g_return_if_fail (proto != NULL); - g_return_if_fail (backend != NULL); - - if (g_hash_table_lookup (factory->priv->backends, proto) != NULL) { - g_warning ("pas_book_factory_register_backend: " - "Proto \"%s\" already registered!\n", proto); - } - - g_hash_table_insert (factory->priv->backends, - g_strdup (proto), backend); -} - -/** - * pas_book_factory_get_n_backends: - * @factory: An addressbook factory. - * - * Queries the number of running addressbook backends in an addressbook factory. - * - * Return value: Number of running backends. - **/ -int -pas_book_factory_get_n_backends (PASBookFactory *factory) -{ - g_return_val_if_fail (factory != NULL, -1); - g_return_val_if_fail (PAS_IS_BOOK_FACTORY (factory), -1); - - return g_hash_table_size (factory->priv->active_server_map); -} - -/* Callback used when a backend loses its last connected client */ -static void -backend_last_client_gone_cb (PASBackend *backend, gpointer data) -{ - PASBookFactory *factory; - const char *uri; - gpointer orig_key; - gboolean result; - char *orig_uri; - - factory = PAS_BOOK_FACTORY (data); - - /* Remove the backend from the active server map */ - - uri = pas_backend_get_uri (backend); - g_assert (uri != NULL); - - result = g_hash_table_lookup_extended (factory->priv->active_server_map, uri, - &orig_key, NULL); - g_assert (result != FALSE); - - orig_uri = orig_key; - - g_hash_table_remove (factory->priv->active_server_map, orig_uri); - g_free (orig_uri); - - gtk_object_unref (GTK_OBJECT (backend)); - - /* Notify upstream if there are no more backends */ - - if (g_hash_table_size (factory->priv->active_server_map) == 0) - gtk_signal_emit (GTK_OBJECT (factory), factory_signals[LAST_BOOK_GONE]); -} - -static PASBackendFactoryFn -pas_book_factory_lookup_backend_factory (PASBookFactory *factory, - const char *uri) -{ - PASBackendFactoryFn backend_fn; - char *proto; - char *canonical_uri; - - g_assert (factory != NULL); - g_assert (PAS_IS_BOOK_FACTORY (factory)); - g_assert (uri != NULL); - - canonical_uri = pas_book_factory_canonicalize_uri (uri); - if (canonical_uri == NULL) - return NULL; - - proto = pas_book_factory_extract_proto_from_uri (canonical_uri); - if (proto == NULL) { - g_free (canonical_uri); - return NULL; - } - - backend_fn = g_hash_table_lookup (factory->priv->backends, proto); - - g_free (proto); - g_free (canonical_uri); - - return backend_fn; -} - -static PASBackend * -pas_book_factory_launch_backend (PASBookFactory *factory, - GNOME_Evolution_Addressbook_BookListener listener, - const char *uri) -{ - PASBackendFactoryFn backend_factory; - PASBackend *backend; - - backend_factory = pas_book_factory_lookup_backend_factory ( - factory, uri); - - if (!backend_factory) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - GNOME_Evolution_Addressbook_BookListener_notifyBookOpened ( - listener, - GNOME_Evolution_Addressbook_BookListener_ProtocolNotSupported, - CORBA_OBJECT_NIL, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - g_message ("pas_book_factory_launch_backend(): could not notify " - "the listener"); - - CORBA_exception_free (&ev); - return NULL; - } - - backend = (* backend_factory) (); - if (!backend) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - GNOME_Evolution_Addressbook_BookListener_notifyBookOpened ( - listener, - GNOME_Evolution_Addressbook_BookListener_OtherError, - CORBA_OBJECT_NIL, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - g_message ("pas_book_factory_launch_backend(): could not notify " - "the listener"); - - CORBA_exception_free (&ev); - return NULL; - } - - g_hash_table_insert (factory->priv->active_server_map, - g_strdup (uri), - backend); - - gtk_signal_connect (GTK_OBJECT (backend), "last_client_gone", - backend_last_client_gone_cb, - factory); - - return backend; -} - -static void -pas_book_factory_process_request (PASBookFactory *factory, - PASBookFactoryQueuedRequest *request) -{ - PASBackend *backend; - char *uri; - GNOME_Evolution_Addressbook_BookListener listener; - CORBA_Environment ev; - - uri = request->uri; - listener = request->listener; - g_free (request); - - /* Look up the backend and create one if needed */ - - backend = g_hash_table_lookup (factory->priv->active_server_map, uri); - - if (!backend) { - backend = pas_book_factory_launch_backend (factory, listener, uri); - if (!backend) - goto out; - - if (!pas_backend_add_client (backend, listener)) - goto out; - - pas_backend_load_uri (backend, uri); - - goto out; - } - - pas_backend_add_client (backend, listener); - - out: - g_free (uri); - - CORBA_exception_init (&ev); - CORBA_Object_release (listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - g_message ("pas_book_factory_process_request(): could not release the listener"); - - CORBA_exception_free (&ev); -} - -static gboolean -pas_book_factory_process_queue (PASBookFactory *factory) -{ - /* Process pending Book-creation requests. */ - if (factory->priv->queued_requests != NULL) { - PASBookFactoryQueuedRequest *request; - GList *l; - - l = factory->priv->queued_requests; - request = l->data; - - pas_book_factory_process_request (factory, request); - - factory->priv->queued_requests = g_list_remove_link ( - factory->priv->queued_requests, l); - g_list_free_1 (l); - } - - if (factory->priv->queued_requests == NULL) { - - factory->priv->idle_id = 0; - return FALSE; - } - - return TRUE; -} - -static void -pas_book_factory_queue_request (PASBookFactory *factory, - const char *uri, - const GNOME_Evolution_Addressbook_BookListener listener) -{ - PASBookFactoryQueuedRequest *request; - GNOME_Evolution_Addressbook_BookListener listener_copy; - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - listener_copy = CORBA_Object_duplicate (listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("PASBookFactory: Could not duplicate BookListener!\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); - - request = g_new0 (PASBookFactoryQueuedRequest, 1); - request->listener = listener_copy; - request->uri = g_strdup (uri); - - factory->priv->queued_requests = - g_list_prepend (factory->priv->queued_requests, request); - - if (! factory->priv->idle_id) { - factory->priv->idle_id = - g_idle_add ((GSourceFunc) pas_book_factory_process_queue, factory); - } -} - - -static void -impl_GNOME_Evolution_Addressbook_BookFactory_openBook (PortableServer_Servant servant, - const CORBA_char *uri, - const GNOME_Evolution_Addressbook_BookListener listener, - CORBA_Environment *ev) -{ - PASBookFactory *factory = - PAS_BOOK_FACTORY (bonobo_object_from_servant (servant)); - PASBackendFactoryFn backend_factory; - - backend_factory = pas_book_factory_lookup_backend_factory (factory, uri); - - if (backend_factory == NULL) { - GNOME_Evolution_Addressbook_BookListener_notifyBookOpened ( - listener, - GNOME_Evolution_Addressbook_BookListener_ProtocolNotSupported, - CORBA_OBJECT_NIL, - ev); - - return; - } - - pas_book_factory_queue_request (factory, uri, listener); -} - -static gboolean -pas_book_factory_construct (PASBookFactory *factory) -{ - POA_GNOME_Evolution_Addressbook_BookFactory *servant; - CORBA_Environment ev; - CORBA_Object obj; - - g_assert (factory != NULL); - g_assert (PAS_IS_BOOK_FACTORY (factory)); - - servant = (POA_GNOME_Evolution_Addressbook_BookFactory *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &pas_book_factory_vepv; - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_Addressbook_BookFactory__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - - return FALSE; - } - - CORBA_exception_free (&ev); - - obj = bonobo_object_activate_servant (BONOBO_OBJECT (factory), servant); - if (obj == CORBA_OBJECT_NIL) { - g_free (servant); - - return FALSE; - } - - bonobo_object_construct (BONOBO_OBJECT (factory), obj); - - return TRUE; -} - -/** - * pas_book_factory_new: - */ -PASBookFactory * -pas_book_factory_new (void) -{ - PASBookFactory *factory; - - factory = gtk_type_new (pas_book_factory_get_type ()); - - if (! pas_book_factory_construct (factory)) { - g_warning ("pas_book_factory_new: Could not construct PASBookFactory!\n"); - gtk_object_unref (GTK_OBJECT (factory)); - - return NULL; - } - - return factory; -} - -/** - * pas_book_factory_activate: - */ -gboolean -pas_book_factory_activate (PASBookFactory *factory) -{ - PASBookFactoryPrivate *priv; - CORBA_Object obj; - OAF_RegistrationResult result; - - g_return_val_if_fail (factory != NULL, FALSE); - g_return_val_if_fail (PAS_IS_BOOK_FACTORY (factory), FALSE); - - priv = factory->priv; - - g_return_val_if_fail (!priv->registered, FALSE); - - puts ("about to register addressbook"); - - obj = bonobo_object_corba_objref (BONOBO_OBJECT (factory)); - - result = oaf_active_server_register (PAS_BOOK_FACTORY_OAF_ID, obj); - - switch (result) { - case OAF_REG_SUCCESS: - priv->registered = TRUE; - return TRUE; - case OAF_REG_NOT_LISTED: - g_message ("Error registering the PAS factory: not listed"); - return FALSE; - case OAF_REG_ALREADY_ACTIVE: - g_message ("Error registering the PAS factory: already active"); - return FALSE; - case OAF_REG_ERROR: - default: - g_message ("Error registering the PAS factory: generic error"); - return FALSE; - } -} - -static void -pas_book_factory_init (PASBookFactory *factory) -{ - factory->priv = g_new0 (PASBookFactoryPrivate, 1); - - factory->priv->active_server_map = g_hash_table_new (g_str_hash, g_str_equal); - factory->priv->backends = g_hash_table_new (g_str_hash, g_str_equal); - factory->priv->queued_requests = NULL; - factory->priv->registered = FALSE; -} - -static void -free_active_server_map_entry (gpointer key, gpointer value, gpointer data) -{ - char *uri; - PASBackend *backend; - - uri = key; - g_free (uri); - - backend = PAS_BACKEND (value); - gtk_object_unref (GTK_OBJECT (backend)); -} - -static void -remove_backends_entry (gpointer key, gpointer value, gpointer data) -{ - char *uri; - - uri = key; - g_free (uri); -} - -static void -pas_book_factory_destroy (GtkObject *object) -{ - PASBookFactory *factory = PAS_BOOK_FACTORY (object); - GList *l; - - for (l = factory->priv->queued_requests; l != NULL; l = l->next) { - PASBookFactoryQueuedRequest *request = l->data; - CORBA_Environment ev; - - g_free (request->uri); - - CORBA_exception_init (&ev); - CORBA_Object_release (request->listener, &ev); - CORBA_exception_free (&ev); - - g_free (request); - } - g_list_free (factory->priv->queued_requests); - factory->priv->queued_requests = NULL; - - g_hash_table_foreach (factory->priv->active_server_map, - free_active_server_map_entry, - NULL); - g_hash_table_destroy (factory->priv->active_server_map); - factory->priv->active_server_map = NULL; - - g_hash_table_foreach (factory->priv->backends, - remove_backends_entry, - NULL); - g_hash_table_destroy (factory->priv->backends); - factory->priv->backends = NULL; - - if (factory->priv->registered) { - CORBA_Object obj; - - obj = bonobo_object_corba_objref (BONOBO_OBJECT (factory)); - oaf_active_server_unregister (PAS_BOOK_FACTORY_OAF_ID, obj); - factory->priv->registered = FALSE; - } - - g_free (factory->priv); - - GTK_OBJECT_CLASS (pas_book_factory_parent_class)->destroy (object); -} - -static POA_GNOME_Evolution_Addressbook_BookFactory__epv * -pas_book_factory_get_epv (void) -{ - POA_GNOME_Evolution_Addressbook_BookFactory__epv *epv; - - epv = g_new0 (POA_GNOME_Evolution_Addressbook_BookFactory__epv, 1); - - epv->openBook = impl_GNOME_Evolution_Addressbook_BookFactory_openBook; - - return epv; - -} - -static void -pas_book_factory_corba_class_init (void) -{ - pas_book_factory_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv (); - pas_book_factory_vepv.GNOME_Evolution_Addressbook_BookFactory_epv = pas_book_factory_get_epv (); -} - -static void -pas_book_factory_class_init (PASBookFactoryClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - pas_book_factory_parent_class = gtk_type_class (bonobo_object_get_type ()); - - factory_signals[LAST_BOOK_GONE] = - gtk_signal_new ("last_book_gone", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (PASBookFactoryClass, last_book_gone), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, factory_signals, LAST_SIGNAL); - - object_class->destroy = pas_book_factory_destroy; - - pas_book_factory_corba_class_init (); -} - -/** - * pas_book_factory_get_type: - */ -GtkType -pas_book_factory_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "PASBookFactory", - sizeof (PASBookFactory), - sizeof (PASBookFactoryClass), - (GtkClassInitFunc) pas_book_factory_class_init, - (GtkObjectInitFunc) pas_book_factory_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (bonobo_object_get_type (), &info); - } - - return type; -} diff --git a/addressbook/backend/pas/pas-book-factory.h b/addressbook/backend/pas/pas-book-factory.h deleted file mode 100644 index 7f8754ce2f..0000000000 --- a/addressbook/backend/pas/pas-book-factory.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2000, Helix Code, Inc. - */ - -#include <bonobo/bonobo-object.h> -#include <libgnome/gnome-defs.h> - -#include <pas/pas-backend.h> - -#ifndef __PAS_BOOK_FACTORY_H__ -#define __PAS_BOOK_FACTORY_H__ - -BEGIN_GNOME_DECLS - -typedef struct _PASBookFactoryPrivate PASBookFactoryPrivate; - -typedef struct { - BonoboObject parent_object; - PASBookFactoryPrivate *priv; -} PASBookFactory; - -typedef struct { - BonoboObjectClass parent_class; - - /* Notification signals */ - - void (* last_book_gone) (PASBookFactory *factory); -} PASBookFactoryClass; - -PASBookFactory *pas_book_factory_new (void); - -void pas_book_factory_register_backend (PASBookFactory *factory, - const char *proto, - PASBackendFactoryFn backend_factory); - -int pas_book_factory_get_n_backends (PASBookFactory *factory); - -gboolean pas_book_factory_activate (PASBookFactory *factory); - -GtkType pas_book_factory_get_type (void); - -#define PAS_BOOK_FACTORY_TYPE (pas_book_factory_get_type ()) -#define PAS_BOOK_FACTORY(o) (GTK_CHECK_CAST ((o), PAS_BOOK_FACTORY_TYPE, PASBookFactory)) -#define PAS_BOOK_FACTORY_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BOOK_FACTORY_TYPE, PASBookFactoryClass)) -#define PAS_IS_BOOK_FACTORY(o) (GTK_CHECK_TYPE ((o), PAS_BOOK_FACTORY_TYPE)) -#define PAS_IS_BOOK_FACTORY_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BOOK_FACTORY_TYPE)) - -END_GNOME_DECLS - -#endif /* ! __PAS_BOOK_FACTORY_H__ */ diff --git a/addressbook/backend/pas/pas-book-view.c b/addressbook/backend/pas/pas-book-view.c deleted file mode 100644 index 58f2e79cda..0000000000 --- a/addressbook/backend/pas/pas-book-view.c +++ /dev/null @@ -1,315 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * pas-book-view.c - * - * Copyright 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <glib.h> -#include "pas-book-view.h" - -static BonoboObjectClass *pas_book_view_parent_class; -POA_GNOME_Evolution_Addressbook_BookView__vepv pas_book_view_vepv; - -struct _PASBookViewPrivate { - GNOME_Evolution_Addressbook_BookViewListener listener; -}; - -/** - * pas_book_view_notify_change: - */ -void -pas_book_view_notify_change (PASBookView *book_view, - const GList *cards) -{ - CORBA_Environment ev; - gint i, length; - CORBA_sequence_GNOME_Evolution_Addressbook_VCard card_sequence; - - length = g_list_length((GList *) cards); - - card_sequence._buffer = CORBA_sequence_GNOME_Evolution_Addressbook_VCard_allocbuf(length); - card_sequence._maximum = length; - card_sequence._length = length; - - for ( i = 0; cards; cards = g_list_next(cards), i++ ) { - card_sequence._buffer[i] = CORBA_string_dup((char *) cards->data); - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookViewListener_notifyCardChanged ( - book_view->priv->listener, &card_sequence, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_view_notify_change: Exception signaling BookViewListener!\n"); - } - - CORBA_exception_free (&ev); - - CORBA_free(card_sequence._buffer); -} - -void -pas_book_view_notify_change_1 (PASBookView *book_view, - const char *card) -{ - GList *list = g_list_append(NULL, (char *) card); - pas_book_view_notify_change(book_view, list); - g_list_free(list); -} - -/** - * pas_book_view_notify_remove: - */ -void -pas_book_view_notify_remove (PASBookView *book_view, - const char *id) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookViewListener_notifyCardRemoved ( - book_view->priv->listener, (GNOME_Evolution_Addressbook_CardId) id, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_view_notify_remove: Exception signaling BookViewListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_view_notify_add: - */ -void -pas_book_view_notify_add (PASBookView *book_view, - const GList *cards) -{ - CORBA_Environment ev; - gint i, length; - CORBA_sequence_GNOME_Evolution_Addressbook_VCard card_sequence; - - length = g_list_length((GList *)cards); - - card_sequence._buffer = CORBA_sequence_GNOME_Evolution_Addressbook_VCard_allocbuf(length); - card_sequence._maximum = length; - card_sequence._length = length; - - for ( i = 0; cards; cards = g_list_next(cards), i++ ) { - card_sequence._buffer[i] = CORBA_string_dup((char *) cards->data); - } - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookViewListener_notifyCardAdded ( - book_view->priv->listener, &card_sequence, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_view_notify_add: Exception signaling BookViewListener!\n"); - } - - CORBA_exception_free (&ev); - - CORBA_free(card_sequence._buffer); -} - -void -pas_book_view_notify_add_1 (PASBookView *book_view, - const char *card) -{ - GList *list = g_list_append(NULL, (char *) card); - pas_book_view_notify_add(book_view, list); - g_list_free(list); -} - -void -pas_book_view_notify_complete (PASBookView *book_view) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookViewListener_notifySequenceComplete ( - book_view->priv->listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_view_notify_complete: Exception signaling BookViewListener!\n"); - } - - CORBA_exception_free (&ev); -} - -void -pas_book_view_notify_status_message (PASBookView *book_view, - const char *message) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookViewListener_notifyStatusMessage ( - book_view->priv->listener, message, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_view_notify_status_message: Exception signaling BookViewListener!\n"); - } - - CORBA_exception_free (&ev); -} - -static gboolean -pas_book_view_construct (PASBookView *book_view, - GNOME_Evolution_Addressbook_BookViewListener listener) -{ - POA_GNOME_Evolution_Addressbook_BookView *servant; - CORBA_Environment ev; - CORBA_Object obj; - - g_assert (book_view != NULL); - g_assert (PAS_IS_BOOK_VIEW (book_view)); - g_assert (listener != CORBA_OBJECT_NIL); - - servant = (POA_GNOME_Evolution_Addressbook_BookView *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &pas_book_view_vepv; - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_Addressbook_BookView__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - - return FALSE; - } - - bonobo_object_dup_ref (listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning("Unable to duplicate & ref listener object in pas-book-view.c\n"); - CORBA_exception_free (&ev); - - return FALSE; - } - - CORBA_exception_free (&ev); - - obj = bonobo_object_activate_servant (BONOBO_OBJECT (book_view), servant); - if (obj == CORBA_OBJECT_NIL) { - g_free (servant); - - return FALSE; - } - - bonobo_object_construct (BONOBO_OBJECT (book_view), obj); - - book_view->priv->listener = listener; - - return TRUE; -} - -/** - * pas_book_view_new: - */ -PASBookView * -pas_book_view_new (GNOME_Evolution_Addressbook_BookViewListener listener) -{ - PASBookView *book_view; - - g_return_val_if_fail (listener != CORBA_OBJECT_NIL, NULL); - - book_view = gtk_type_new (pas_book_view_get_type ()); - - if (! pas_book_view_construct (book_view, listener)) { - gtk_object_unref (GTK_OBJECT (book_view)); - - return NULL; - } - - return book_view; -} - -static void -pas_book_view_destroy (GtkObject *object) -{ - PASBookView *book_view = PAS_BOOK_VIEW (object); - CORBA_Environment ev; - - CORBA_exception_init (&ev); - bonobo_object_release_unref (book_view->priv->listener, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - - return; - } - CORBA_exception_free (&ev); - - g_free (book_view->priv); - - GTK_OBJECT_CLASS (pas_book_view_parent_class)->destroy (object); -} - -static POA_GNOME_Evolution_Addressbook_BookView__epv * -pas_book_view_get_epv (void) -{ - POA_GNOME_Evolution_Addressbook_BookView__epv *epv; - - epv = g_new0 (POA_GNOME_Evolution_Addressbook_BookView__epv, 1); - - return epv; - -} - -static void -pas_book_view_corba_class_init (void) -{ - pas_book_view_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv (); - pas_book_view_vepv.GNOME_Evolution_Addressbook_BookView_epv = pas_book_view_get_epv (); -} - -static void -pas_book_view_class_init (PASBookViewClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - pas_book_view_parent_class = gtk_type_class (bonobo_object_get_type ()); - - object_class->destroy = pas_book_view_destroy; - - pas_book_view_corba_class_init (); -} - -static void -pas_book_view_init (PASBookView *book_view) -{ - book_view->priv = g_new0 (PASBookViewPrivate, 1); - book_view->priv->listener = CORBA_OBJECT_NIL; -} - -/** - * pas_book_view_get_type: - */ -GtkType -pas_book_view_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "PASBookView", - sizeof (PASBookView), - sizeof (PASBookViewClass), - (GtkClassInitFunc) pas_book_view_class_init, - (GtkObjectInitFunc) pas_book_view_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (bonobo_object_get_type (), &info); - } - - return type; -} - diff --git a/addressbook/backend/pas/pas-book-view.h b/addressbook/backend/pas/pas-book-view.h deleted file mode 100644 index fb9e892dfd..0000000000 --- a/addressbook/backend/pas/pas-book-view.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * A wrapper object which exports the GNOME_Evolution_Addressbook_Book CORBA interface - * and which maintains a request queue. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __PAS_BOOK_VIEW_H__ -#define __PAS_BOOK_VIEW_H__ - -#include <bonobo/bonobo-object.h> -#include <libgnome/gnome-defs.h> -#include <pas/addressbook.h> - -typedef struct _PASBookView PASBookView; -typedef struct _PASBookViewClass PASBookViewClass; -typedef struct _PASBookViewPrivate PASBookViewPrivate; - -struct _PASBookView { - BonoboObject parent_object; - PASBookViewPrivate *priv; -}; - -struct _PASBookViewClass { - BonoboObjectClass parent_class; -}; -PASBookView *pas_book_view_new (GNOME_Evolution_Addressbook_BookViewListener listener); - -void pas_book_view_notify_change (PASBookView *book_view, - const GList *cards); -void pas_book_view_notify_change_1 (PASBookView *book_view, - const char *card); -void pas_book_view_notify_remove (PASBookView *book_view, - const char *id); -void pas_book_view_notify_add (PASBookView *book_view, - const GList *cards); -void pas_book_view_notify_add_1 (PASBookView *book_view, - const char *card); -void pas_book_view_notify_complete (PASBookView *book_view); -void pas_book_view_notify_status_message (PASBookView *book_view, - const char *message); - -GtkType pas_book_view_get_type (void); - -#define PAS_BOOK_VIEW_TYPE (pas_book_view_get_type ()) -#define PAS_BOOK_VIEW(o) (GTK_CHECK_CAST ((o), PAS_BOOK_VIEW_TYPE, PASBookView)) -#define PAS_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BOOK_VIEW_FACTORY_TYPE, PASBookViewClass)) -#define PAS_IS_BOOK_VIEW(o) (GTK_CHECK_TYPE ((o), PAS_BOOK_VIEW_TYPE)) -#define PAS_IS_BOOK_VIEW_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BOOK_VIEW_TYPE)) - -#endif /* ! __PAS_BOOK_VIEW_H__ */ diff --git a/addressbook/backend/pas/pas-book.c b/addressbook/backend/pas/pas-book.c deleted file mode 100644 index 74e95a8ab3..0000000000 --- a/addressbook/backend/pas/pas-book.c +++ /dev/null @@ -1,884 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * pas-book.c - * - * Copyright 2000, Helix Code, Inc. - */ - -#include <config.h> -#include <gtk/gtksignal.h> -#include "e-util/e-list.h" -#include "pas-book.h" - -static BonoboObjectClass *pas_book_parent_class; -POA_GNOME_Evolution_Addressbook_Book__vepv pas_book_vepv; - -enum { - REQUESTS_QUEUED, - LAST_SIGNAL -}; - -static guint pas_book_signals [LAST_SIGNAL]; - -struct _PASBookPrivate { - PASBackend *backend; - GNOME_Evolution_Addressbook_BookListener listener; - PASBookGetVCardFn get_vcard; - PASBookCanWriteFn can_write; - PASBookCanWriteCardFn can_write_card; - - GList *request_queue; - gint idle_id; -}; - -static gboolean -pas_book_check_queue (PASBook *book) -{ - if (book->priv->request_queue != NULL) { - gtk_signal_emit (GTK_OBJECT (book), - pas_book_signals [REQUESTS_QUEUED]); - } - - if (book->priv->request_queue == NULL) { - book->priv->idle_id = 0; - return FALSE; - } - - return TRUE; -} - -static void -pas_book_queue_request (PASBook *book, PASRequest *req) -{ - book->priv->request_queue = - g_list_append (book->priv->request_queue, req); - - if (book->priv->idle_id == 0) { - book->priv->idle_id = g_idle_add ((GSourceFunc) pas_book_check_queue, book); - } -} - -static void -pas_book_queue_create_card (PASBook *book, const char *vcard) -{ - PASRequest *req; - - req = g_new0 (PASRequest, 1); - req->op = CreateCard; - req->vcard = g_strdup (vcard); - - pas_book_queue_request (book, req); -} - -static void -pas_book_queue_remove_card (PASBook *book, const char *id) -{ - PASRequest *req; - - req = g_new0 (PASRequest, 1); - req->op = RemoveCard; - req->id = g_strdup (id); - - pas_book_queue_request (book, req); -} - -static void -pas_book_queue_modify_card (PASBook *book, const char *vcard) -{ - PASRequest *req; - - req = g_new0 (PASRequest, 1); - req->op = ModifyCard; - req->vcard = g_strdup (vcard); - - pas_book_queue_request (book, req); -} - -static void -pas_book_queue_get_cursor (PASBook *book, const char *search) -{ - PASRequest *req; - - req = g_new0 (PASRequest, 1); - req->op = GetCursor; - req->search = g_strdup(search); - - pas_book_queue_request (book, req); -} - -static void -pas_book_queue_authenticate_user (PASBook *book, - const char *user, const char *passwd) -{ - PASRequest *req; - - req = g_new0 (PASRequest, 1); - req->op = AuthenticateUser; - req->user = g_strdup(user); - req->passwd = g_strdup(passwd); - - pas_book_queue_request (book, req); -} - -static void -pas_book_queue_get_supported_fields (PASBook *book) -{ - PASRequest *req; - - req = g_new0 (PASRequest, 1); - req->op = GetSupportedFields; - - pas_book_queue_request (book, req); -} - - -static void -pas_book_queue_get_book_view (PASBook *book, const GNOME_Evolution_Addressbook_BookViewListener listener, const char *search) -{ - PASRequest *req; - CORBA_Environment ev; - - req = g_new0 (PASRequest, 1); - req->op = GetBookView; - req->search = g_strdup(search); - - CORBA_exception_init (&ev); - - req->listener = bonobo_object_dup_ref(listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_queue_get_book_view: Exception " - "duplicating BookViewListener!\n"); - } - - CORBA_exception_free (&ev); - - pas_book_queue_request (book, req); -} - -static void -pas_book_queue_get_changes (PASBook *book, const GNOME_Evolution_Addressbook_BookViewListener listener, const char *change_id) -{ - PASRequest *req; - CORBA_Environment ev; - - req = g_new0 (PASRequest, 1); - req->op = GetChanges; - req->change_id= g_strdup(change_id); - - CORBA_exception_init (&ev); - - req->listener = bonobo_object_dup_ref(listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_queue_get_changes: Exception " - "duplicating BookViewListener!\n"); - } - - CORBA_exception_free (&ev); - - pas_book_queue_request (book, req); -} - -static void -pas_book_queue_check_connection (PASBook *book) -{ - PASRequest *req; - - req = g_new0 (PASRequest, 1); - req->op = CheckConnection; - - pas_book_queue_request (book, req); -} - -static CORBA_char * -impl_GNOME_Evolution_Addressbook_Book_getVCard (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_CardId id, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - char *vcard; - CORBA_char *retval; - - vcard = (book->priv->get_vcard) (book, (const char *) id); - retval = CORBA_string_dup (vcard); - g_free (vcard); - - return retval; -} - -static CORBA_boolean -impl_GNOME_Evolution_Addressbook_Book_isWriteable (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - CORBA_boolean retval; - - retval = (book->priv->can_write) (book); - - return retval; -} - -static CORBA_boolean -impl_GNOME_Evolution_Addressbook_Book_isCardWriteable (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_CardId id, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - CORBA_boolean retval; - - retval = (book->priv->can_write_card) (book, (const char *) id); - - return retval; -} - -static void -impl_GNOME_Evolution_Addressbook_Book_authenticateUser (PortableServer_Servant servant, - const char* user, - const char* passwd, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_authenticate_user (book, user, passwd); -} - -static void -impl_GNOME_Evolution_Addressbook_Book_addCard (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_VCard vcard, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_create_card (book, (const char *) vcard); -} - -static void -impl_GNOME_Evolution_Addressbook_Book_removeCard (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_CardId id, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_remove_card (book, (const char *) id); -} - -static void -impl_GNOME_Evolution_Addressbook_Book_modifyCard (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_VCard vcard, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_modify_card (book, (const char *) vcard); -} - -static void -impl_GNOME_Evolution_Addressbook_Book_getCursor (PortableServer_Servant servant, - const CORBA_char *search, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_get_cursor (book, search); -} - -static void -impl_GNOME_Evolution_Addressbook_Book_getBookView (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookViewListener listener, - const CORBA_char *search, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_get_book_view (book, listener, search); -} - -static void -impl_GNOME_Evolution_Addressbook_Book_getChanges (PortableServer_Servant servant, - const GNOME_Evolution_Addressbook_BookViewListener listener, - const CORBA_char *change_id, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_get_changes (book, listener, change_id); -} - -static void -impl_GNOME_Evolution_Addressbook_Book_checkConnection (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_check_connection (book); -} - -static char * -impl_GNOME_Evolution_Addressbook_Book_getStaticCapabilities (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - char *temp; - char *ret_val; - - temp = pas_backend_get_static_capabilities (book->priv->backend); - ret_val = CORBA_string_dup(temp); - g_free(temp); - return ret_val; -} - -static void -impl_GNOME_Evolution_Addressbook_Book_getSupportedFields (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - PASBook *book = PAS_BOOK (bonobo_object_from_servant (servant)); - - pas_book_queue_get_supported_fields (book); -} - -/** - * pas_book_get_backend: - */ -PASBackend * -pas_book_get_backend (PASBook *book) -{ - g_return_val_if_fail (book != NULL, NULL); - g_return_val_if_fail (PAS_IS_BOOK (book), NULL); - - return book->priv->backend; -} - -/** - * pas_book_get_listener: - */ -GNOME_Evolution_Addressbook_BookListener -pas_book_get_listener (PASBook *book) -{ - g_return_val_if_fail (book != NULL, CORBA_OBJECT_NIL); - g_return_val_if_fail (PAS_IS_BOOK (book), CORBA_OBJECT_NIL); - - return book->priv->listener; -} - -/** - * pas_book_check_pending - */ -gint -pas_book_check_pending (PASBook *book) -{ - g_return_val_if_fail (book != NULL, -1); - g_return_val_if_fail (PAS_IS_BOOK (book), -1); - - return g_list_length (book->priv->request_queue); -} - -/** - * pas_book_pop_request: - */ -PASRequest * -pas_book_pop_request (PASBook *book) -{ - GList *popped; - PASRequest *req; - - g_return_val_if_fail (book != NULL, NULL); - g_return_val_if_fail (PAS_IS_BOOK (book), NULL); - - if (book->priv->request_queue == NULL) - return NULL; - - req = book->priv->request_queue->data; - - popped = book->priv->request_queue; - book->priv->request_queue = - g_list_remove_link (book->priv->request_queue, popped); - - g_list_free_1 (popped); - - return req; -} - -/** - * pas_book_respond_open: - */ -void -pas_book_respond_open (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - if (status == GNOME_Evolution_Addressbook_BookListener_Success) { - GNOME_Evolution_Addressbook_BookListener_notifyBookOpened ( - book->priv->listener, status, - bonobo_object_corba_objref (BONOBO_OBJECT (book)), - &ev); - } else { - GNOME_Evolution_Addressbook_BookListener_notifyBookOpened ( - book->priv->listener, status, - CORBA_OBJECT_NIL, &ev); - } - - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_open: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_respond_create: - */ -void -pas_book_respond_create (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const char *id) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookListener_notifyCardCreated ( - book->priv->listener, status, (char *)id, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_create: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_respond_remove: - */ -void -pas_book_respond_remove (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookListener_notifyCardRemoved ( - book->priv->listener, status, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_remove: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_respond_modify: - */ -void -pas_book_respond_modify (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookListener_notifyCardModified ( - book->priv->listener, status, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_modify: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_respond_authenticate_user: - */ -void -pas_book_respond_authenticate_user (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookListener_notifyAuthenticationResult ( - book->priv->listener, status, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_authenticate_user: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -void -pas_book_respond_get_supported_fields (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - EList *fields) -{ - CORBA_Environment ev; - GNOME_Evolution_Addressbook_stringlist stringlist; - int num_fields; - EIterator *iter; - int i; - - CORBA_exception_init (&ev); - - num_fields = e_list_length (fields); - - stringlist._buffer = CORBA_sequence_CORBA_string_allocbuf (num_fields); - stringlist._maximum = num_fields; - stringlist._length = num_fields; - - iter = e_list_get_iterator (fields); - - for (i = 0; e_iterator_is_valid (iter); e_iterator_next (iter), i ++) { - stringlist._buffer[i] = CORBA_string_dup (e_iterator_get(iter)); - } - - gtk_object_unref (GTK_OBJECT (fields)); - - GNOME_Evolution_Addressbook_BookListener_notifySupportedFields ( - book->priv->listener, status, - &stringlist, - &ev); - - CORBA_exception_free (&ev); - - CORBA_free(stringlist._buffer); -} - -/** - * pas_book_respond_get_cursor: - */ -void -pas_book_respond_get_cursor (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - PASCardCursor *cursor) -{ - CORBA_Environment ev; - CORBA_Object object; - - CORBA_exception_init (&ev); - - object = bonobo_object_corba_objref(BONOBO_OBJECT(cursor)); - - GNOME_Evolution_Addressbook_BookListener_notifyCursorRequested ( - book->priv->listener, status, object, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_get_cursor: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_respond_get_book_view: - */ -void -pas_book_respond_get_book_view (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - PASBookView *book_view) -{ - CORBA_Environment ev; - CORBA_Object object; - - CORBA_exception_init (&ev); - - object = bonobo_object_corba_objref(BONOBO_OBJECT(book_view)); - - GNOME_Evolution_Addressbook_BookListener_notifyViewRequested ( - book->priv->listener, status, object, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_get_book_view: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_respond_get_changes: - */ -void -pas_book_respond_get_changes (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - PASBookView *book_view) -{ - CORBA_Environment ev; - CORBA_Object object; - - CORBA_exception_init (&ev); - - object = bonobo_object_corba_objref(BONOBO_OBJECT(book_view)); - - GNOME_Evolution_Addressbook_BookListener_notifyChangesRequested ( - book->priv->listener, status, object, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_respond_get_changes: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_report_connection: - */ -void -pas_book_report_connection (PASBook *book, - gboolean connected) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookListener_notifyConnectionStatus ( - book->priv->listener, (CORBA_boolean) connected, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_report_connection: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -/** - * pas_book_report_writable: - */ -void -pas_book_report_writable (PASBook *book, - gboolean writable) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_BookListener_notifyWritable ( - book->priv->listener, (CORBA_boolean) writable, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("pas_book_report_writable: Exception " - "responding to BookListener!\n"); - } - - CORBA_exception_free (&ev); -} - -static gboolean -pas_book_construct (PASBook *book, - PASBackend *backend, - GNOME_Evolution_Addressbook_BookListener listener, - PASBookGetVCardFn get_vcard, - PASBookCanWriteFn can_write, - PASBookCanWriteCardFn can_write_card) -{ - POA_GNOME_Evolution_Addressbook_Book *servant; - CORBA_Environment ev; - CORBA_Object obj; - - g_assert (book != NULL); - g_assert (PAS_IS_BOOK (book)); - g_assert (listener != CORBA_OBJECT_NIL); - g_assert (get_vcard != NULL); - g_assert (can_write != NULL); - g_assert (can_write_card != NULL); - - servant = (POA_GNOME_Evolution_Addressbook_Book *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &pas_book_vepv; - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_Addressbook_Book__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - - return FALSE; - } - - CORBA_exception_free (&ev); - - obj = bonobo_object_activate_servant (BONOBO_OBJECT (book), servant); - if (obj == CORBA_OBJECT_NIL) { - g_free (servant); - - return FALSE; - } - - bonobo_object_construct (BONOBO_OBJECT (book), obj); - - CORBA_exception_init (&ev); - book->priv->listener = CORBA_Object_duplicate (listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - g_message ("pas_book_construct(): could not duplicate the listener"); - - CORBA_exception_free (&ev); - - book->priv->listener = listener; - book->priv->get_vcard = get_vcard; - book->priv->can_write = can_write; - book->priv->can_write_card = can_write_card; - book->priv->backend = backend; - - return TRUE; -} - -/** - * pas_book_new: - */ -PASBook * -pas_book_new (PASBackend *backend, - GNOME_Evolution_Addressbook_BookListener listener, - PASBookGetVCardFn get_vcard, - PASBookCanWriteFn can_write, - PASBookCanWriteCardFn can_write_card) -{ - PASBook *book; - - g_return_val_if_fail (listener != CORBA_OBJECT_NIL, NULL); - g_return_val_if_fail (get_vcard != NULL, NULL); - - book = gtk_type_new (pas_book_get_type ()); - - if (! pas_book_construct (book, backend, listener, - get_vcard, can_write, can_write_card)) { - gtk_object_unref (GTK_OBJECT (book)); - - return NULL; - } - - return book; -} - -static void -pas_book_destroy (GtkObject *object) -{ - PASBook *book = PAS_BOOK (object); - GList *l; - CORBA_Environment ev; - - for (l = book->priv->request_queue; l != NULL; l = l->next) { - PASRequest *req = l->data; - - g_free (req->id); - g_free (req->vcard); - g_free (req); - } - g_list_free (book->priv->request_queue); - - CORBA_exception_init (&ev); - CORBA_Object_release (book->priv->listener, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - g_message ("pas_book_construct(): could not release the listener"); - - CORBA_exception_free (&ev); - - g_free (book->priv); - - GTK_OBJECT_CLASS (pas_book_parent_class)->destroy (object); -} - -static POA_GNOME_Evolution_Addressbook_Book__epv * -pas_book_get_epv (void) -{ - POA_GNOME_Evolution_Addressbook_Book__epv *epv; - - epv = g_new0 (POA_GNOME_Evolution_Addressbook_Book__epv, 1); - - epv->getVCard = impl_GNOME_Evolution_Addressbook_Book_getVCard; - epv->isWriteable = impl_GNOME_Evolution_Addressbook_Book_isWriteable; - epv->isCardWriteable = impl_GNOME_Evolution_Addressbook_Book_isCardWriteable; - epv->authenticateUser = impl_GNOME_Evolution_Addressbook_Book_authenticateUser; - epv->addCard = impl_GNOME_Evolution_Addressbook_Book_addCard; - epv->removeCard = impl_GNOME_Evolution_Addressbook_Book_removeCard; - epv->modifyCard = impl_GNOME_Evolution_Addressbook_Book_modifyCard; - epv->checkConnection = impl_GNOME_Evolution_Addressbook_Book_checkConnection; - epv->getStaticCapabilities = impl_GNOME_Evolution_Addressbook_Book_getStaticCapabilities; - epv->getSupportedFields = impl_GNOME_Evolution_Addressbook_Book_getSupportedFields; - epv->getCursor = impl_GNOME_Evolution_Addressbook_Book_getCursor; - epv->getBookView = impl_GNOME_Evolution_Addressbook_Book_getBookView; - epv->getChanges = impl_GNOME_Evolution_Addressbook_Book_getChanges; - - return epv; - -} - -static void -pas_book_corba_class_init (void) -{ - pas_book_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv (); - pas_book_vepv.GNOME_Evolution_Addressbook_Book_epv = pas_book_get_epv (); -} - -static void -pas_book_class_init (PASBookClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - pas_book_parent_class = gtk_type_class (bonobo_object_get_type ()); - - pas_book_signals [REQUESTS_QUEUED] = - gtk_signal_new ("requests_queued", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (PASBookClass, requests_queued), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, pas_book_signals, LAST_SIGNAL); - - object_class->destroy = pas_book_destroy; - - pas_book_corba_class_init (); -} - -static void -pas_book_init (PASBook *book) -{ - book->priv = g_new0 (PASBookPrivate, 1); - book->priv->idle_id = 0; - book->priv->request_queue = NULL; -} - -/** - * pas_book_get_type: - */ -GtkType -pas_book_get_type (void) -{ - static GtkType type = 0; - - if (! type) { - GtkTypeInfo info = { - "PASBook", - sizeof (PASBook), - sizeof (PASBookClass), - (GtkClassInitFunc) pas_book_class_init, - (GtkObjectInitFunc) pas_book_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (bonobo_object_get_type (), &info); - } - - return type; -} - diff --git a/addressbook/backend/pas/pas-book.h b/addressbook/backend/pas/pas-book.h deleted file mode 100644 index 12c780e282..0000000000 --- a/addressbook/backend/pas/pas-book.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * A wrapper object which exports the GNOME_Evolution_Addressbook_Book CORBA interface - * and which maintains a request queue. - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __PAS_BOOK_H__ -#define __PAS_BOOK_H__ - -#include <bonobo/bonobo-object.h> -#include <libgnome/gnome-defs.h> -#include <pas/addressbook.h> -#include <pas/pas-book-view.h> -#include "e-util/e-list.h" - -typedef struct _PASBook PASBook; -typedef struct _PASBookPrivate PASBookPrivate; - -#include <pas/pas-backend.h> -#include <pas/pas-card-cursor.h> - -typedef enum { - CreateCard, - RemoveCard, - ModifyCard, - GetCursor, - GetBookView, - GetChanges, - CheckConnection, - AuthenticateUser, - GetSupportedFields -} PASOperation; - -typedef struct { - PASOperation op; - char *id; - char *vcard; - char *search; - char *change_id; - char *user; - char *passwd; - GNOME_Evolution_Addressbook_BookViewListener listener; - GNOME_Evolution_Addressbook_stringlist fields; -} PASRequest; - -struct _PASBook { - BonoboObject parent_object; - PASBookPrivate *priv; -}; - -typedef struct { - BonoboObjectClass parent_class; - - /* Signals */ - void (*requests_queued) (void); -} PASBookClass; - -typedef char * (*PASBookGetVCardFn) (PASBook *book, const char *id); -typedef gboolean (*PASBookCanWriteFn) (PASBook *book); -typedef gboolean (*PASBookCanWriteCardFn) (PASBook *book, const char *id); - -PASBook *pas_book_new (PASBackend *backend, - GNOME_Evolution_Addressbook_BookListener listener, - PASBookGetVCardFn get_vcard, - PASBookCanWriteFn can_write, - PASBookCanWriteCardFn can_write_card); -PASBackend *pas_book_get_backend (PASBook *book); -GNOME_Evolution_Addressbook_BookListener pas_book_get_listener (PASBook *book); -int pas_book_check_pending (PASBook *book); -PASRequest *pas_book_pop_request (PASBook *book); -void pas_book_respond_open (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status); -void pas_book_respond_create (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - const char *id); -void pas_book_respond_remove (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status); -void pas_book_respond_modify (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status); -void pas_book_respond_authenticate_user (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status); -void pas_book_respond_get_supported_fields (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - EList *fields); - -void pas_book_respond_get_cursor (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - PASCardCursor *cursor); -void pas_book_respond_get_book_view (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - PASBookView *book_view); -void pas_book_respond_get_changes (PASBook *book, - GNOME_Evolution_Addressbook_BookListener_CallStatus status, - PASBookView *book_view); -void pas_book_report_connection (PASBook *book, - gboolean connected); - -void pas_book_report_writable (PASBook *book, - gboolean writable); - -gboolean pas_book_can_write (PASBook *book); -gboolean pas_book_can_write_card (PASBook *book, - const char *id); -GtkType pas_book_get_type (void); - -#define PAS_BOOK_TYPE (pas_book_get_type ()) -#define PAS_BOOK(o) (GTK_CHECK_CAST ((o), PAS_BOOK_TYPE, PASBook)) -#define PAS_BOOK_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_BOOK_FACTORY_TYPE, PASBookClass)) -#define PAS_IS_BOOK(o) (GTK_CHECK_TYPE ((o), PAS_BOOK_TYPE)) -#define PAS_IS_BOOK_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_BOOK_TYPE)) - -#endif /* ! __PAS_BOOK_H__ */ diff --git a/addressbook/backend/pas/pas-card-cursor.c b/addressbook/backend/pas/pas-card-cursor.c deleted file mode 100644 index aeb1eddd48..0000000000 --- a/addressbook/backend/pas/pas-card-cursor.c +++ /dev/null @@ -1,226 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * pas-card-cursor.c: Implements card cursors. - * - * Author: - * Christopher James Lahey <clahey@helixcode.com. - */ - -#include <config.h> -#include "addressbook.h" -#include "pas-card-cursor.h" - -struct _PASCardCursorPrivate { - long (*get_length) (PASCardCursor *cursor, gpointer data); - char * (*get_nth) (PASCardCursor *cursor, long n, gpointer data); - gpointer data; -}; - -/* - * A pointer to our parent object class - */ -static BonoboObjectClass *parent_class; - -/* - * The VEPV for the CardCursor object - */ -static POA_GNOME_Evolution_Addressbook_CardCursor__vepv cursor_vepv; - -/* - * Implemented GtkObject::destroy - */ -static void -pas_card_cursor_destroy (GtkObject *object) -{ - PASCardCursor *cursor = PAS_CARD_CURSOR (object); - - if ( cursor->priv ) - g_free ( cursor->priv ); - - GTK_OBJECT_CLASS (parent_class)->destroy (object); -} - -/* - * CORBA Demo::Echo::echo method implementation - */ -static CORBA_long -impl_pas_card_cursor_get_length (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - PASCardCursor *cursor = PAS_CARD_CURSOR (bonobo_object_from_servant (servant)); - if ( cursor->priv->get_length ) - return cursor->priv->get_length( cursor, cursor->priv->data ); - else - return 0; -} - -/* - * CORBA Demo::Echo::echo method implementation - */ -static char * -impl_pas_card_cursor_get_nth (PortableServer_Servant servant, - const CORBA_long n, - CORBA_Environment *ev) -{ - PASCardCursor *cursor = PAS_CARD_CURSOR (bonobo_object_from_servant (servant)); - if ( cursor->priv->get_nth ) { - char *vcard = cursor->priv->get_nth( cursor, n, cursor->priv->data ); - char *retval = CORBA_string_dup (vcard); - g_free (vcard); - return retval; - } else - return CORBA_string_dup (""); -} - -/* - * If you want users to derive classes from your implementation - * you need to support this method. - */ -POA_GNOME_Evolution_Addressbook_CardCursor__epv * -pas_card_cursor_get_epv (void) -{ - POA_GNOME_Evolution_Addressbook_CardCursor__epv *epv; - - epv = g_new0 (POA_GNOME_Evolution_Addressbook_CardCursor__epv, 1); - - /* - * This is the method invoked by CORBA - */ - epv->count = impl_pas_card_cursor_get_length; - epv->getNth = impl_pas_card_cursor_get_nth; - - return epv; -} - -static void -init_pas_card_cursor_corba_class (void) -{ - cursor_vepv.Bonobo_Unknown_epv = bonobo_object_get_epv (); - cursor_vepv.GNOME_Evolution_Addressbook_CardCursor_epv = pas_card_cursor_get_epv (); -} - -static void -pas_card_cursor_class_init (PASCardCursorClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - - parent_class = gtk_type_class (bonobo_object_get_type ()); - - object_class->destroy = pas_card_cursor_destroy; - - init_pas_card_cursor_corba_class (); -} - -static void -pas_card_cursor_init (PASCardCursor *cursor) -{ - cursor->priv = g_new(PASCardCursorPrivate, 1); - cursor->priv->get_length = NULL; - cursor->priv->get_nth = NULL; - cursor->priv->data = NULL; -} - -GtkType -pas_card_cursor_get_type (void) -{ - static GtkType type = 0; - - if (!type){ - GtkTypeInfo info = { - "PASCardCursor", - sizeof (PASCardCursor), - sizeof (PASCardCursorClass), - (GtkClassInitFunc) pas_card_cursor_class_init, - (GtkObjectInitFunc) pas_card_cursor_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (bonobo_object_get_type (), &info); - } - - return type; -} - -PASCardCursor * -pas_card_cursor_construct (PASCardCursor *cursor, - GNOME_Evolution_Addressbook_CardCursor corba_cursor, - PASCardCursorLengthFunc get_length, - PASCardCursorNthFunc get_nth, - gpointer data) -{ - g_return_val_if_fail (cursor != NULL, NULL); - g_return_val_if_fail (PAS_IS_CARD_CURSOR (cursor), NULL); - g_return_val_if_fail (corba_cursor != CORBA_OBJECT_NIL, NULL); - - /* - * Call parent constructor - */ - if (!bonobo_object_construct (BONOBO_OBJECT (cursor), (CORBA_Object) corba_cursor)) - return NULL; - - /* - * Initialize cursor - */ - cursor->priv->get_length = get_length; - cursor->priv->get_nth = get_nth; - cursor->priv->data = data; - - /* - * Success: return the GtkType we were given - */ - return cursor; -} - -/* - * This routine creates the ORBit CORBA server and initializes the - * CORBA side of things - */ -static GNOME_Evolution_Addressbook_CardCursor -create_cursor (BonoboObject *cursor) -{ - POA_GNOME_Evolution_Addressbook_CardCursor *servant; - CORBA_Environment ev; - - servant = (POA_GNOME_Evolution_Addressbook_CardCursor *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &cursor_vepv; - - CORBA_exception_init (&ev); - POA_GNOME_Evolution_Addressbook_CardCursor__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION){ - g_free (servant); - CORBA_exception_free (&ev); - return CORBA_OBJECT_NIL; - } - - CORBA_exception_free (&ev); - - /* - * Activates the CORBA object. - */ - return (GNOME_Evolution_Addressbook_CardCursor) bonobo_object_activate_servant (cursor, servant); -} - -PASCardCursor * -pas_card_cursor_new (PASCardCursorLengthFunc get_length, - PASCardCursorNthFunc get_nth, - gpointer data) -{ - PASCardCursor *cursor; - GNOME_Evolution_Addressbook_CardCursor corba_cursor; - - cursor = gtk_type_new (pas_card_cursor_get_type ()); - corba_cursor = create_cursor (BONOBO_OBJECT (cursor)); - - if (corba_cursor == CORBA_OBJECT_NIL){ - gtk_object_unref (GTK_OBJECT (cursor)); - return NULL; - } - - return pas_card_cursor_construct (cursor, - corba_cursor, - get_length, - get_nth, - data); -} diff --git a/addressbook/backend/pas/pas-card-cursor.h b/addressbook/backend/pas/pas-card-cursor.h deleted file mode 100644 index d7d19ecebd..0000000000 --- a/addressbook/backend/pas/pas-card-cursor.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * - * Author: - * Nat Friedman (nat@helixcode.com) - * - * Copyright 2000, Helix Code, Inc. - */ - -#ifndef __PAS_CARD_CURSOR_H__ -#define __PAS_CARD_CURSOR_H__ - -#include <libgnome/gnome-defs.h> -#include <bonobo/bonobo-object.h> -#include <pas/addressbook.h> - -BEGIN_GNOME_DECLS - -typedef struct _PASCardCursor PASCardCursor; -typedef struct _PASCardCursorPrivate PASCardCursorPrivate; -typedef struct _PASCardCursorClass PASCardCursorClass; - -typedef long (*PASCardCursorLengthFunc) (PASCardCursor *cursor, gpointer data); -typedef char * (*PASCardCursorNthFunc) (PASCardCursor *cursor, long n, gpointer data); - -struct _PASCardCursor { - BonoboObject parent; - PASCardCursorPrivate *priv; -}; - -struct _PASCardCursorClass { - BonoboObjectClass parent; -}; - -/* Creating a new addressbook. */ -PASCardCursor *pas_card_cursor_new (PASCardCursorLengthFunc get_length, - PASCardCursorNthFunc get_nth, - gpointer data); -PASCardCursor *pas_card_cursor_construct (PASCardCursor *cursor, - GNOME_Evolution_Addressbook_CardCursor corba_cursor, - PASCardCursorLengthFunc get_length, - PASCardCursorNthFunc get_nth, - gpointer data); - -GtkType pas_card_cursor_get_type (void); -POA_GNOME_Evolution_Addressbook_CardCursor__epv * - pas_card_cursor_get_epv (void); - -/* Fetching cards. */ -#define PAS_CARD_CURSOR_TYPE (pas_card_cursor_get_type ()) -#define PAS_CARD_CURSOR(o) (GTK_CHECK_CAST ((o), PAS_CARD_CURSOR_TYPE, PASCardCursor)) -#define PAS_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_CAST((k), PAS_CARD_CURSOR_TYPE, PASCardCursorClass)) -#define PAS_IS_CARD_CURSOR(o) (GTK_CHECK_TYPE ((o), PAS_CARD_CURSOR_TYPE)) -#define PAS_IS_CARD_CURSOR_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), PAS_CARD_CURSOR_TYPE)) - -END_GNOME_DECLS - -#endif /* ! __PAS_CARD_CURSOR_H__ */ diff --git a/addressbook/conduit/.cvsignore b/addressbook/conduit/.cvsignore deleted file mode 100644 index 87b35d3be5..0000000000 --- a/addressbook/conduit/.cvsignore +++ /dev/null @@ -1,9 +0,0 @@ -.deps -.libs -*.lo -Makefile.in -Makefile -libeaddress_conduit.la -e-address-conduit-control-applet -e-address-conduit-control-applet.desktop -e-address.conduit diff --git a/addressbook/conduit/Makefile.am b/addressbook/conduit/Makefile.am deleted file mode 100644 index ab5ea0ec50..0000000000 --- a/addressbook/conduit/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/e-util \ - $(BONOBO_GNOME_CFLAGS) \ - $(PISOCK_CFLAGS) \ - $(GNOME_PILOT_CFLAGS) - -# Address Conduit -e_address_conduitsdir=$(libdir)/gnome-pilot/conduits -e_address_conduits_LTLIBRARIES = libeaddress_conduit.la - -libeaddress_conduit_la_SOURCES = \ - address-conduit.c \ - address-conduit.h \ - address-conduit-config.h - -libeaddress_conduit_la_LDFLAGS = -module -avoid-version -libeaddress_conduit_la_LIBADD = \ - $(top_builddir)/addressbook/backend/ebook/libebook-static.la \ - $(top_builddir)/e-util/libeutil-static.la \ - $(top_builddir)/e-util/ename/libename-static.la \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/e-util/libeconduit-static.la \ - $(GNOME_PILOT_LIBS) \ - $(PISOCK_LIBS) \ - $(BONOBO_GNOME_LIBS) \ - $(EXTRA_GNOME_LIBS) \ - $(GNOME_LIBDIR) \ - $(GNOME_LIBS) - -e-address.conduit: e-address.conduit.in Makefile - sed -e 's^\@prefix\@^$(prefix)^g' \ - -e 's^\@datadir\@^$(datadir)^g' \ - < $(srcdir)/e-address.conduit.in > e-address.conduit.tmp \ - && mv e-address.conduit.tmp e-address.conduit - - -Conduitdir = $(datadir)/gnome-pilot/conduits/ -Conduit_DATA = e-address.conduit - -EXTRA_DIST = \ - e-address.conduit.in - -install-data-local: - $(mkinstalldirs) $(Conduitdir) diff --git a/addressbook/conduit/address-conduit-config.h b/addressbook/conduit/address-conduit-config.h deleted file mode 100644 index d0981af6bf..0000000000 --- a/addressbook/conduit/address-conduit-config.h +++ /dev/null @@ -1,121 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* Evolution calendar - ToDo Conduit Configuration - * - * Copyright (C) 1998 Free Software Foundation - * Copyright (C) 2000 Helix Code, Inc. - * - * Authors: Eskil Heyn Olsen <deity@eskil.dk> - * JP Rosevear <jpr@helixcode.com> - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __ADDR_CONDUIT_CONFIG_H__ -#define __ADDR_CONDUIT_CONFIG_H__ - -#include <gnome.h> -#include <libgpilotdCM/gnome-pilot-conduit-management.h> -#include <gpilotd/gnome-pilot-conduit.h> -#include <libgpilotdCM/gnome-pilot-conduit-config.h> - -/* Configuration info */ -typedef struct _EAddrConduitCfg EAddrConduitCfg; -struct _EAddrConduitCfg { - gboolean open_secret; - guint32 pilot_id; - GnomePilotConduitSyncType sync_type; /* only used by capplet */ -}; - -#ifdef ADDR_CONFIG_LOAD -/* Loads the configuration data */ -static void -addrconduit_load_configuration (EAddrConduitCfg **c, guint32 pilot_id) -{ - gchar prefix[256]; - g_snprintf (prefix, 255, "/gnome-pilot.d/e-todo-conduit/Pilot_%u/", - pilot_id); - - *c = g_new0 (EAddrConduitCfg,1); - g_assert (*c != NULL); - - gnome_config_push_prefix (prefix); - (*c)->open_secret = gnome_config_get_bool ("open_secret=FALSE"); - - /* set in capplets main */ - (*c)->sync_type = GnomePilotConduitSyncTypeCustom; - gnome_config_pop_prefix (); - - (*c)->pilot_id = pilot_id; -} -#endif - -#ifdef ADDR_CONFIG_SAVE -/* Saves the configuration data. */ -static void -addrconduit_save_configuration (EAddrConduitCfg *c) -{ - gchar prefix[256]; - - g_snprintf (prefix, 255, "/gnome-pilot.d/e-todo-conduit/Pilot_%u/", - c->pilot_id); - - gnome_config_push_prefix (prefix); - gnome_config_set_bool ("open_secret", c->open_secret); - gnome_config_pop_prefix (); - - gnome_config_sync (); - gnome_config_drop_all (); -} -#endif - -#ifdef ADDR_CONFIG_DUPE -/* Creates a duplicate of the configuration data */ -static EAddrConduitCfg* -addrconduit_dupe_configuration (EAddrConduitCfg *c) -{ - EAddrConduitCfg *retval; - - g_return_val_if_fail (c != NULL, NULL); - - retval = g_new0 (EAddrConduitCfg, 1); - retval->sync_type = c->sync_type; - retval->open_secret = c->open_secret; - retval->pilot_id = c->pilot_id; - - return retval; -} -#endif - -#ifdef ADDR_CONFIG_DESTROY -/* Destroy a configuration */ -static void -addrconduit_destroy_configuration (EAddrConduitCfg **c) -{ - g_return_if_fail (c != NULL); - g_return_if_fail (*c != NULL); - - g_free (*c); - *c = NULL; -} -#endif - -#endif __ADDR_CONDUIT_CONFIG_H__ - - - - - - - diff --git a/addressbook/conduit/address-conduit.c b/addressbook/conduit/address-conduit.c deleted file mode 100644 index 428584b9c4..0000000000 --- a/addressbook/conduit/address-conduit.c +++ /dev/null @@ -1,1140 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* Evolution addressbook - Address Conduit - * - * Copyright (C) 1998 Free Software Foundation - * Copyright (C) 2000 Helix Code, Inc. - * - * Authors: Eskil Heyn Olsen <deity@eskil.dk> - * JP Rosevear <jpr@helixcode.com> - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <liboaf/liboaf.h> -#include <bonobo.h> -#include <gnome-xml/parser.h> -#include <pi-source.h> -#include <pi-socket.h> -#include <pi-file.h> -#include <pi-dlp.h> -#include <ebook/e-book.h> -#include <ebook/e-card-types.h> -#include <ebook/e-card-cursor.h> -#include <ebook/e-card.h> -#include <ebook/e-card-simple.h> -#include <e-pilot-util.h> - -#define ADDR_CONFIG_LOAD 1 -#define ADDR_CONFIG_DESTROY 1 -#include "address-conduit-config.h" -#undef ADDR_CONFIG_LOAD -#undef ADDR_CONFIG_DESTROY - -#include "address-conduit.h" - -GnomePilotConduit * conduit_get_gpilot_conduit (guint32); -void conduit_destroy_gpilot_conduit (GnomePilotConduit*); - -#define CONDUIT_VERSION "0.1.1" -#ifdef G_LOG_DOMAIN -#undef G_LOG_DOMAIN -#endif -#define G_LOG_DOMAIN "eaddrconduit" - -#define DEBUG_CONDUIT 1 -/* #undef DEBUG_CONDUIT */ - -#ifdef DEBUG_CONDUIT -#define LOG(e...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, e) -#else -#define LOG(e...) -#endif - -#define WARN(e...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, e) -#define INFO(e...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, e) - -typedef struct { - EBookStatus status; - char *id; -} CardObjectChangeStatus; - -typedef enum { - CARD_ADDED, - CARD_MODIFIED, - CARD_DELETED -} CardObjectChangeType; - -typedef struct -{ - ECard *card; - CardObjectChangeType type; -} CardObjectChange; - -/* Debug routines */ -static char * -print_local (EAddrLocalRecord *local) -{ - static char buff[ 4096 ]; - - if (local == NULL) { - sprintf (buff, "[NULL]"); - return buff; - } - - if (local->addr) { - g_snprintf (buff, 4096, "['%s' '%s' '%s']", - local->addr->entry[entryLastname] ? - local->addr->entry[entryLastname] : "", - local->addr->entry[entryFirstname] ? - local->addr->entry[entryFirstname] : "", - local->addr->entry[entryCompany] ? - local->addr->entry[entryCompany] : ""); - return buff; - } - - return ""; -} - -static char *print_remote (GnomePilotRecord *remote) -{ - static char buff[ 4096 ]; - struct Address addr; - - if (remote == NULL) { - sprintf (buff, "[NULL]"); - return buff; - } - - memset (&addr, 0, sizeof (struct Address)); - unpack_Address (&addr, remote->record, remote->length); - - g_snprintf (buff, 4096, "['%s' '%s' '%s']", - addr.entry[entryLastname] ? - addr.entry[entryLastname] : "", - addr.entry[entryFirstname] ? - addr.entry[entryFirstname] : "", - addr.entry[entryCompany] ? - addr.entry[entryCompany] : ""); - - return buff; -} - -/* Context Routines */ -static void -e_addr_context_new (EAddrConduitContext **ctxt, guint32 pilot_id) -{ - *ctxt = g_new0 (EAddrConduitContext,1); - g_assert (ctxt!=NULL); - - addrconduit_load_configuration (&(*ctxt)->cfg, pilot_id); -} - -static void -e_addr_context_destroy (EAddrConduitContext **ctxt) -{ - g_return_if_fail (ctxt!=NULL); - g_return_if_fail (*ctxt!=NULL); - - if ((*ctxt)->cfg != NULL) - addrconduit_destroy_configuration (&(*ctxt)->cfg); - - g_free (*ctxt); - *ctxt = NULL; -} - -/* Addressbok Server routines */ -static void -add_card_cb (EBook *ebook, EBookStatus status, const char *id, gpointer closure) -{ - CardObjectChangeStatus *cons = closure; - - cons->status = status; - cons->id = g_strdup (id); - - gtk_main_quit(); -} - -static void -status_cb (EBook *ebook, EBookStatus status, gpointer closure) -{ - (*(EBookStatus*)closure) = status; - gtk_main_quit(); -} - -static void -cursor_cb (EBook *book, EBookStatus status, ECardCursor *cursor, gpointer closure) -{ - EAddrConduitContext *ctxt = (EAddrConduitContext*)closure; - - if (status == E_BOOK_STATUS_SUCCESS) { - long length; - int i; - - ctxt->address_load_success = TRUE; - - length = e_card_cursor_get_length (cursor); - ctxt->cards = NULL; - for (i = 0; i < length; i ++) { - ECard *card = e_card_cursor_get_nth (cursor, i); - - gtk_object_ref (GTK_OBJECT (card)); - ctxt->cards = g_list_append (ctxt->cards, card); - } - - gtk_main_quit(); /* end the sub event loop */ - } - else { - WARN (_("Cursor could not be loaded\n")); - gtk_main_quit(); /* end the sub event loop */ - } -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - EAddrConduitContext *ctxt = (EAddrConduitContext*)closure; - - if (status == E_BOOK_STATUS_SUCCESS) { - e_book_get_cursor (book, "(contains \"full_name\" \"\")", cursor_cb, ctxt); - } else { - WARN (_("EBook not loaded\n")); - gtk_main_quit(); /* end the sub event loop */ - } -} - -static int -start_addressbook_server (EAddrConduitContext *ctxt) -{ - gchar *uri, *path; - - g_return_val_if_fail(ctxt!=NULL,-2); - - ctxt->ebook = e_book_new (); - - path = g_concat_dir_and_file (g_get_home_dir (), - "evolution/local/Contacts/addressbook.db"); - uri = g_strdup_printf ("file://%s", path); - g_free (path); - - e_book_load_uri (ctxt->ebook, uri, book_open_cb, ctxt); - - /* run a sub event loop to turn ebook's async loading into a - synchronous call */ - gtk_main (); - - g_free (uri); - - if (ctxt->address_load_success) - return 0; - - return -1; -} - -/* Utility routines */ -static char * -map_name (EAddrConduitContext *ctxt) -{ - char *filename = NULL; - - filename = g_strdup_printf ("%s/evolution/local/Contacts/pilot-map-%d.xml", g_get_home_dir (), ctxt->cfg->pilot_id); - - return filename; -} - -static GList * -next_changed_item (EAddrConduitContext *ctxt, GList *changes) -{ - CardObjectChange *coc; - GList *l; - - for (l = changes; l != NULL; l = l->next) { - coc = l->data; - - if (g_hash_table_lookup (ctxt->changed_hash, e_card_get_id (coc->card))) - return l; - } - - return NULL; -} - -static char * -get_entry_text (struct Address address, int field) -{ - if (address.entry[field]) - return e_pilot_utf8_from_pchar (address.entry[field]); - - return g_strdup (""); -} - -static void -compute_status (EAddrConduitContext *ctxt, EAddrLocalRecord *local, const char *uid) -{ - CardObjectChange *coc; - - local->local.archived = FALSE; - local->local.secret = FALSE; - - coc = g_hash_table_lookup (ctxt->changed_hash, uid); - - if (coc == NULL) { - local->local.attr = GnomePilotRecordNothing; - return; - } - - switch (coc->type) { - case CARD_ADDED: - local->local.attr = GnomePilotRecordNew; - break; - case CARD_MODIFIED: - local->local.attr = GnomePilotRecordModified; - break; - case CARD_DELETED: - local->local.attr = GnomePilotRecordDeleted; - break; - } -} - -static GnomePilotRecord -local_record_to_pilot_record (EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - GnomePilotRecord p; - - g_assert (local->addr != NULL ); - - LOG ("local_record_to_pilot_record\n"); - - p.ID = local->local.ID; - p.category = 0; - p.attr = local->local.attr; - p.archived = local->local.archived; - p.secret = local->local.secret; - - /* Generate pilot record structure */ - p.record = g_new0 (char,0xffff); - p.length = pack_Address (local->addr, p.record, 0xffff); - - return p; -} - -static void -local_record_from_ecard (EAddrLocalRecord *local, ECard *ecard, EAddrConduitContext *ctxt) -{ - ECardSimple *simple; - const ECardDeliveryAddress *delivery; - int phone = entryPhone1; - int i; - - g_return_if_fail (local != NULL); - g_return_if_fail (ecard != NULL); - - local->ecard = ecard; - gtk_object_ref (GTK_OBJECT (ecard)); - simple = e_card_simple_new (ecard); - - local->local.ID = e_pilot_map_lookup_pid (ctxt->map, ecard->id); - - compute_status (ctxt, local, ecard->id); - - local->addr = g_new0 (struct Address, 1); - - if (ecard->name) { - if (ecard->name->given) - local->addr->entry[entryFirstname] = e_pilot_utf8_to_pchar (ecard->name->given); - if (ecard->name->family) - local->addr->entry[entryLastname] = e_pilot_utf8_to_pchar (ecard->name->family); - if (ecard->org) - local->addr->entry[entryCompany] = e_pilot_utf8_to_pchar (ecard->org); - if (ecard->title) - local->addr->entry[entryTitle] = e_pilot_utf8_to_pchar (ecard->title); - } - - delivery = e_card_simple_get_delivery_address (simple, E_CARD_SIMPLE_ADDRESS_ID_BUSINESS); - if (delivery) { - local->addr->entry[entryAddress] = e_pilot_utf8_to_pchar (delivery->street); - local->addr->entry[entryCity] = e_pilot_utf8_to_pchar (delivery->city); - local->addr->entry[entryState] = e_pilot_utf8_to_pchar (delivery->region); - local->addr->entry[entryZip] = e_pilot_utf8_to_pchar (delivery->code); - local->addr->entry[entryCountry] = e_pilot_utf8_to_pchar (delivery->country); - } - - for (i = 0; i <= 7 && phone <= entryPhone5; i++) { - const char *phone_str = NULL; - char *phonelabel = ctxt->ai.phoneLabels[i]; - - if (!strcmp (phonelabel, "E-mail")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_EMAIL); - else if (!strcmp (phonelabel, "Home")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_HOME); - else if (!strcmp (phonelabel, "Work")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS); - else if (!strcmp (phonelabel, "Fax")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX); - else if (!strcmp (phonelabel, "Other")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_OTHER); - else if (!strcmp (phonelabel, "Main")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_PRIMARY); - else if (!strcmp (phonelabel, "Pager")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_PAGER); - else if (!strcmp (phonelabel, "Mobile")) - phone_str = e_card_simple_get_const (simple, E_CARD_SIMPLE_FIELD_PHONE_MOBILE); - - if (phone_str) { - local->addr->entry[phone] = e_pilot_utf8_to_pchar (phone_str); - local->addr->phoneLabel[phone - entryPhone1] = i; - phone++; - } - } - for (; phone <= entryPhone5; phone++) - local->addr->phoneLabel[phone - entryPhone1] = phone - entryPhone1; - - gtk_object_unref (GTK_OBJECT (simple)); -} - -static void -local_record_from_uid (EAddrLocalRecord *local, - char *uid, - EAddrConduitContext *ctxt) -{ - ECard *ecard = NULL; - - g_assert (local != NULL); - - ecard = e_book_get_card (ctxt->ebook, uid); - - if (ecard != NULL) { - local_record_from_ecard (local, ecard, ctxt); - } else { - ecard = e_card_new (""); - e_card_set_id (ecard, uid); - local_record_from_ecard (local, ecard, ctxt); - } -} - -static ECard * -ecard_from_remote_record(EAddrConduitContext *ctxt, - GnomePilotRecord *remote, - ECard *in_card) -{ - struct Address address; - ECard *ecard; - ECardSimple *simple; - ECardDeliveryAddress delivery; - ECardAddrLabel label; - char *string; - char *stringparts[3]; - int i; - - g_return_val_if_fail(remote!=NULL,NULL); - memset (&address, 0, sizeof (struct Address)); - unpack_Address (&address, remote->record, remote->length); - - if (in_card == NULL) - ecard = e_card_new(""); - else - ecard = e_card_duplicate (in_card); - simple = e_card_simple_new (ecard); - - /* Name and company */ - i = 0; - if (address.entry[entryFirstname] && *address.entry[entryFirstname]) - stringparts[i++] = address.entry[entryFirstname]; - if (address.entry[entryLastname] && *address.entry[entryLastname]) - stringparts[i++] = address.entry[entryLastname]; - stringparts[i] = NULL; - - string = g_strjoinv(" ", stringparts); - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_FULL_NAME, e_pilot_utf8_from_pchar (string)); - g_free(string); - - if (address.entry[entryTitle]) { - char *txt = get_entry_text (address, entryTitle); - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_TITLE, txt); - g_free (txt); - } - - if (address.entry[entryCompany]) { - char *txt = get_entry_text (address, entryCompany); - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_ORG, txt); - g_free (txt); - } - - /* Address */ - memset (&delivery, 0, sizeof (ECardDeliveryAddress)); - delivery.flags = E_CARD_ADDR_WORK; - if (address.entry[entryAddress]) - delivery.street = get_entry_text (address, entryAddress); - if (address.entry[entryCity]) - delivery.city = get_entry_text (address, entryCity); - if (address.entry[entryState]) - delivery.region = get_entry_text (address, entryState); - if (address.entry[entryCountry]) - delivery.country = get_entry_text (address, entryCountry); - if (address.entry[entryZip]) - delivery.code = get_entry_text (address, entryZip); - - label.flags = E_CARD_ADDR_WORK; - label.data = e_card_delivery_address_to_string (&delivery); - - e_card_simple_set_address (simple, E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, &label); - e_card_simple_set_delivery_address (simple, E_CARD_SIMPLE_ADDRESS_ID_BUSINESS, &delivery); - - free (delivery.street); - free (delivery.city); - free (delivery.region); - free (delivery.country); - free (delivery.code); - g_free (label.data); - - /* Phone numbers */ - for (i = entryPhone1; i <= entryPhone5; i++) { - char *phonelabel = ctxt->ai.phoneLabels[address.phoneLabel[i - entryPhone1]]; - char *phonenum = get_entry_text (address, i); - - if (!strcmp (phonelabel, "E-mail")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_EMAIL, phonenum); - else if (!strcmp (phonelabel, "Home")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_HOME, phonenum); - else if (!strcmp (phonelabel, "Work")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS, phonenum); - else if (!strcmp (phonelabel, "Fax")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_BUSINESS_FAX, phonenum); - else if (!strcmp (phonelabel, "Other")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_OTHER, phonenum); - else if (!strcmp (phonelabel, "Main")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_PRIMARY, phonenum); - else if (!strcmp (phonelabel, "Pager")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_PAGER, phonenum); - else if (!strcmp (phonelabel, "Mobile")) - e_card_simple_set(simple, E_CARD_SIMPLE_FIELD_PHONE_MOBILE, phonenum); - - g_free (phonenum); - } - - e_card_simple_sync_card (simple); - gtk_object_unref(GTK_OBJECT(simple)); - - free_Address(&address); - - return ecard; -} - -static void -check_for_slow_setting (GnomePilotConduit *c, EAddrConduitContext *ctxt) -{ - int count, map_count; - - count = g_list_length (ctxt->cards); - map_count = g_hash_table_size (ctxt->map->pid_map); - - if (map_count == 0) { - GnomePilotConduitStandard *conduit; - LOG (" doing slow sync\n"); - conduit = GNOME_PILOT_CONDUIT_STANDARD (c); - gnome_pilot_conduit_standard_set_slow (conduit); - } else { - LOG (" doing fast sync\n"); - } -} - -static void -card_added (EBookView *book_view, const GList *cards, EAddrConduitContext *ctxt) -{ - const GList *l; - - for (l = cards; l != NULL; l = l->next) { - CardObjectChange *coc = g_new0 (CardObjectChange, 1); - - coc->card = E_CARD (l->data); - coc->type = CARD_ADDED; - - gtk_object_ref (GTK_OBJECT (coc->card)); - ctxt->changed = g_list_prepend (ctxt->changed, coc); - if (!e_pilot_map_uid_is_archived (ctxt->map, e_card_get_id (coc->card))) - g_hash_table_insert (ctxt->changed_hash, e_card_get_id (coc->card), coc); - } -} - -static void -card_changed (EBookView *book_view, const GList *cards, EAddrConduitContext *ctxt) -{ - const GList *l; - - for (l = cards; l != NULL; l = l->next) { - CardObjectChange *coc = g_new0 (CardObjectChange, 1); - - coc->card = E_CARD (l->data); - coc->type = CARD_MODIFIED; - - gtk_object_ref (GTK_OBJECT (coc->card)); - ctxt->changed = g_list_prepend (ctxt->changed, coc); - if (!e_pilot_map_uid_is_archived (ctxt->map, e_card_get_id (coc->card))) - g_hash_table_insert (ctxt->changed_hash, e_card_get_id (coc->card), coc); - } -} - - -static void -card_removed (EBookView *book_view, const char *id, EAddrConduitContext *ctxt) -{ - CardObjectChange *coc = g_new0 (CardObjectChange, 1); - - coc->card = e_card_new (""); - e_card_set_id (coc->card, id); - coc->type = CARD_DELETED; - - ctxt->changed = g_list_prepend (ctxt->changed, coc); - if (!e_pilot_map_uid_is_archived (ctxt->map, id)) - g_hash_table_insert (ctxt->changed_hash, e_card_get_id (coc->card), coc); -} - -static void -sequence_complete (EBookView *book_view, EAddrConduitContext *ctxt) -{ - gtk_signal_disconnect_by_data (GTK_OBJECT (book_view), ctxt); - gtk_object_unref (GTK_OBJECT (book_view)); - gtk_main_quit (); -} - -static void -view_cb (EBook *book, EBookStatus status, EBookView *book_view, gpointer data) -{ - EAddrConduitContext *ctxt = data; - - gtk_object_ref (GTK_OBJECT (book_view)); - - gtk_signal_connect (GTK_OBJECT (book_view), "card_added", - (GtkSignalFunc) card_added, ctxt); - gtk_signal_connect (GTK_OBJECT (book_view), "card_changed", - (GtkSignalFunc) card_changed, ctxt); - gtk_signal_connect (GTK_OBJECT (book_view), "card_removed", - (GtkSignalFunc) card_removed, ctxt); - gtk_signal_connect (GTK_OBJECT (book_view), "sequence_complete", - (GtkSignalFunc) sequence_complete, ctxt); - -} - -/* Pilot syncing callbacks */ -static gint -pre_sync (GnomePilotConduit *conduit, - GnomePilotDBInfo *dbi, - EAddrConduitContext *ctxt) -{ - GnomePilotConduitSyncAbs *abs_conduit; -/* GList *l; */ - int len; - unsigned char *buf; - char *filename; - char *change_id; -/* gint num_records; */ - - abs_conduit = GNOME_PILOT_CONDUIT_SYNC_ABS (conduit); - - LOG ("---------------------------------------------------------\n"); - LOG ("pre_sync: Addressbook Conduit v.%s", CONDUIT_VERSION); - g_message ("Addressbook Conduit v.%s", CONDUIT_VERSION); - - ctxt->ebook = NULL; - - if (start_addressbook_server (ctxt) != 0) { - WARN(_("Could not start wombat server")); - gnome_pilot_conduit_error (conduit, _("Could not start wombat")); - return -1; - } - - /* Load the uid <--> pilot id mappings */ - filename = map_name (ctxt); - e_pilot_map_read (filename, &ctxt->map); - g_free (filename); - - /* Count and hash the changes */ - change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id); - ctxt->changed_hash = g_hash_table_new (g_str_hash, g_str_equal); - e_book_get_changes (ctxt->ebook, change_id, view_cb, ctxt); - - /* Force the view loading to be synchronous */ - gtk_main (); - g_free (change_id); - - /* Set the count information */ -/* num_records = cal_client_get_n_objects (ctxt->client, CALOBJ_TYPE_TODO); */ -/* gnome_pilot_conduit_sync_abs_set_num_local_records(abs_conduit, num_records); */ -/* gnome_pilot_conduit_sync_abs_set_num_new_local_records (abs_conduit, add_records); */ -/* gnome_pilot_conduit_sync_abs_set_num_updated_local_records (abs_conduit, mod_records); */ -/* gnome_pilot_conduit_sync_abs_set_num_deleted_local_records(abs_conduit, del_records); */ - - gtk_object_set_data (GTK_OBJECT (conduit), "dbinfo", dbi); - - buf = (unsigned char*)g_malloc (0xffff); - len = dlp_ReadAppBlock (dbi->pilot_socket, dbi->db_handle, 0, - (unsigned char *)buf, 0xffff); - - if (len < 0) { - WARN (_("Could not read pilot's Address application block")); - WARN ("dlp_ReadAppBlock(...) = %d", len); - gnome_pilot_conduit_error (conduit, - _("Could not read pilot's Address application block")); - return -1; - } - unpack_AddressAppInfo (&(ctxt->ai), buf, len); - g_free (buf); - - check_for_slow_setting (conduit, ctxt); - - return 0; -} - -static gint -post_sync (GnomePilotConduit *conduit, - GnomePilotDBInfo *dbi, - EAddrConduitContext *ctxt) -{ - gchar *filename, *change_id; - - LOG ("post_sync: Address Conduit v.%s", CONDUIT_VERSION); - LOG ("---------------------------------------------------------\n"); - - filename = map_name (ctxt); - e_pilot_map_write (filename, ctxt->map); - g_free (filename); - - /* FIX ME ugly hack - our changes musn't count, this does introduce - * a race condition if anyone changes a record elsewhere during sycnc - */ - change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id); - e_book_get_changes (ctxt->ebook, change_id, view_cb, ctxt); - g_free (change_id); - gtk_main (); - - return 0; -} - -static gint -set_pilot_id (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - guint32 ID, - EAddrConduitContext *ctxt) -{ - LOG ("set_pilot_id: setting to %d\n", ID); - - e_pilot_map_insert (ctxt->map, ID, local->ecard->id, FALSE); - - return 0; -} - -static gint -set_status_cleared (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - LOG ("set_status_cleared: clearing status\n"); - - g_hash_table_remove (ctxt->changed_hash, e_card_get_id (local->ecard)); - - return 0; -} - -static gint -for_each (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord **local, - EAddrConduitContext *ctxt) -{ - static GList *cards, *iterator; - static int count; - - g_return_val_if_fail (local != NULL, -1); - - if (*local == NULL) { - LOG ("beginning for_each"); - - cards = ctxt->cards; - count = 0; - - if (cards != NULL) { - LOG ("iterating over %d records", g_list_length (cards)); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, cards->data, ctxt); - - iterator = cards; - } else { - LOG ("no events"); - (*local) = NULL; - return 0; - } - } else { - count++; - if (g_list_next (iterator)) { - iterator = g_list_next (iterator); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, iterator->data, ctxt); - } else { - LOG ("for_each ending"); - - /* Tell the pilot the iteration is over */ - *local = NULL; - - return 0; - } - } - - return 0; -} - -static gint -for_each_modified (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord **local, - EAddrConduitContext *ctxt) -{ - static GList *iterator; - static int count; - - g_return_val_if_fail (local != NULL, 0); - - if (*local == NULL) { - LOG ("beginning for_each_modified: beginning\n"); - - iterator = ctxt->changed; - - count = 0; - - iterator = next_changed_item (ctxt, iterator); - if (iterator != NULL) { - CardObjectChange *coc = iterator->data; - - LOG ("iterating over %d records", g_hash_table_size (ctxt->changed_hash)); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, coc->card, ctxt); - } else { - LOG ("no events"); - - *local = NULL; - } - } else { - count++; - iterator = g_list_next (iterator); - if (iterator && (iterator = next_changed_item (ctxt, iterator))) { - CardObjectChange *coc = iterator->data; - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, coc->card, ctxt); - } else { - LOG ("for_each_modified ending"); - - /* Signal the iteration is over */ - *local = NULL; - - return 0; - } - } - - return 0; -} - -static gint -compare (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - /* used by the quick compare */ - GnomePilotRecord local_pilot; - int retval = 0; - - LOG ("compare: local=%s remote=%s...\n", - print_local (local), print_remote (remote)); - - g_return_val_if_fail (local!=NULL,-1); - g_return_val_if_fail (remote!=NULL,-1); - - local_pilot = local_record_to_pilot_record (local, ctxt); - - if (remote->length != local_pilot.length - || memcmp (local_pilot.record, remote->record, remote->length)) - retval = 1; - - if (retval == 0) - LOG (" equal"); - else - LOG (" not equal"); - - return retval; -} - -static gint -add_record (GnomePilotConduitSyncAbs *conduit, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - ECard *ecard; - CardObjectChangeStatus cons; - int retval = 0; - - g_return_val_if_fail (remote != NULL, -1); - - LOG ("add_record: adding %s to desktop\n", print_remote (remote)); - - ecard = ecard_from_remote_record (ctxt, remote, NULL); - - /* add the ecard to the server */ - e_book_add_card (ctxt->ebook, ecard, add_card_cb, &cons); - - gtk_main(); /* enter sub mainloop */ - - if (cons.status != E_BOOK_STATUS_SUCCESS) { - WARN ("add_record: failed to add card to ebook\n"); - return -1; - } - - e_card_set_id (ecard, cons.id); - e_pilot_map_insert (ctxt->map, remote->ID, ecard->id, FALSE); - - return retval; -} - -static gint -replace_record (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - ECard *new_ecard; - EBookStatus commit_status; - CardObjectChange *coc; - CardObjectChangeStatus cons; - char *old_id; - int retval = 0; - - g_return_val_if_fail (remote != NULL, -1); - - LOG ("replace_record: replace %s with %s\n", - print_local (local), print_remote (remote)); - - old_id = g_strdup (e_card_get_id (local->ecard)); - coc = g_hash_table_lookup (ctxt->changed_hash, old_id); - - new_ecard = ecard_from_remote_record (ctxt, remote, local->ecard); - gtk_object_unref (GTK_OBJECT (local->ecard)); - local->ecard = new_ecard; - - if (coc && coc->type == CARD_DELETED) - e_book_add_card (ctxt->ebook, local->ecard, add_card_cb, &cons); - else - e_book_commit_card (ctxt->ebook, local->ecard, status_cb, &commit_status); - - gtk_main (); /* enter sub mainloop */ - - /* Adding a record causes wombat to assign a new uid so we must tidy */ - if (coc && coc->type == CARD_DELETED) { - gboolean arch = e_pilot_map_uid_is_archived (ctxt->map, e_card_get_id (local->ecard)); - - e_card_set_id (local->ecard, cons.id); - e_pilot_map_insert (ctxt->map, remote->ID, cons.id, arch); - - coc = g_hash_table_lookup (ctxt->changed_hash, old_id); - if (coc) { - g_hash_table_remove (ctxt->changed_hash, e_card_get_id (coc->card)); - coc->card = local->ecard; - g_hash_table_insert (ctxt->changed_hash, e_card_get_id (coc->card), coc); - - } - - commit_status = cons.status; - } - - if (commit_status != E_BOOK_STATUS_SUCCESS) - WARN ("replace_record: failed to update card in ebook\n"); - - return retval; -} - -static gint -delete_record (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - EBookStatus commit_status; - int retval = 0; - - g_return_val_if_fail (local != NULL, -1); - g_return_val_if_fail (local->ecard != NULL, -1); - - LOG ("delete_record: delete %s\n", print_local (local)); - - e_pilot_map_remove_by_uid (ctxt->map, local->ecard->id); - e_book_remove_card_by_id (ctxt->ebook, local->ecard->id, status_cb, &commit_status); - - gtk_main (); /* enter sub mainloop */ - - if (commit_status != E_BOOK_STATUS_SUCCESS && commit_status != E_BOOK_STATUS_CARD_NOT_FOUND) - WARN ("delete_record: failed to delete card in ebook\n"); - - return retval; -} - -static gint -archive_record (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - gboolean archive, - EAddrConduitContext *ctxt) -{ - int retval = 0; - - g_return_val_if_fail (local != NULL, -1); - - LOG ("archive_record: %s\n", archive ? "yes" : "no"); - - e_pilot_map_insert (ctxt->map, local->local.ID, local->ecard->id, archive); - - return retval; -} - -static gint -match (GnomePilotConduitSyncAbs *conduit, - GnomePilotRecord *remote, - EAddrLocalRecord **local, - EAddrConduitContext *ctxt) -{ - char *uid; - - LOG ("match: looking for local copy of %s\n", - print_remote (remote)); - - g_return_val_if_fail (local != NULL, -1); - g_return_val_if_fail (remote != NULL, -1); - - *local = NULL; - uid = e_pilot_map_lookup_uid (ctxt->map, remote->ID); - - if (!uid) - return 0; - - LOG (" matched\n"); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_uid (*local, uid, ctxt); - - return 0; -} - -static gint -free_match (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - LOG ("free_match: freeing\n"); - - g_return_val_if_fail (local != NULL, -1); - - gtk_object_unref (GTK_OBJECT (local->ecard)); - g_free (local); - - return 0; -} - -static gint -prepare (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - LOG ("prepare: encoding local %s\n", print_local (local)); - - *remote = local_record_to_pilot_record (local, ctxt); - - return 0; -} - -static ORBit_MessageValidationResult -accept_all_cookies (CORBA_unsigned_long request_id, - CORBA_Principal *principal, - CORBA_char *operation) -{ - /* allow ALL cookies */ - return ORBIT_MESSAGE_ALLOW_ALL; -} - - -GnomePilotConduit * -conduit_get_gpilot_conduit (guint32 pilot_id) -{ - GtkObject *retval; - EAddrConduitContext *ctxt; - - LOG ("in address's conduit_get_gpilot_conduit\n"); - - /* we need to find wombat with oaf, so make sure oaf - is initialized here. once the desktop is converted - to oaf and gpilotd is built with oaf, this can go away */ - if (!oaf_is_initialized ()) { - char *argv[ 1 ] = {"hi"}; - oaf_init (1, argv); - - if (bonobo_init (CORBA_OBJECT_NIL, - CORBA_OBJECT_NIL, - CORBA_OBJECT_NIL) == FALSE) - g_error (_("Could not initialize Bonobo")); - - ORBit_set_request_validation_handler (accept_all_cookies); - } - - retval = gnome_pilot_conduit_sync_abs_new ("AddressDB", 0x61646472); - g_assert (retval != NULL); - - gnome_pilot_conduit_construct (GNOME_PILOT_CONDUIT (retval), - "e_addr_conduit"); - - e_addr_context_new (&ctxt, pilot_id); - gtk_object_set_data (GTK_OBJECT (retval), "addrconduit_context", ctxt); - - gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt); - gtk_signal_connect (retval, "post_sync", (GtkSignalFunc) post_sync, ctxt); - - gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt); - gtk_signal_connect (retval, "set_status_cleared", (GtkSignalFunc) set_status_cleared, ctxt); - - gtk_signal_connect (retval, "for_each", (GtkSignalFunc) for_each, ctxt); - gtk_signal_connect (retval, "for_each_modified", (GtkSignalFunc) for_each_modified, ctxt); - gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt); - - gtk_signal_connect (retval, "add_record", (GtkSignalFunc) add_record, ctxt); - gtk_signal_connect (retval, "replace_record", (GtkSignalFunc) replace_record, ctxt); - gtk_signal_connect (retval, "delete_record", (GtkSignalFunc) delete_record, ctxt); - gtk_signal_connect (retval, "archive_record", (GtkSignalFunc) archive_record, ctxt); - - gtk_signal_connect (retval, "match", (GtkSignalFunc) match, ctxt); - gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt); - - gtk_signal_connect (retval, "prepare", (GtkSignalFunc) prepare, ctxt); - - return GNOME_PILOT_CONDUIT (retval); -} - -void -conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit) -{ - EAddrConduitContext *ctxt; - - ctxt = gtk_object_get_data (GTK_OBJECT (conduit), - "addrconduit_context"); - - e_addr_context_destroy (&ctxt); - - gtk_object_destroy (GTK_OBJECT (conduit)); -} diff --git a/addressbook/conduit/address-conduit.h b/addressbook/conduit/address-conduit.h deleted file mode 100644 index 8b901a5da7..0000000000 --- a/addressbook/conduit/address-conduit.h +++ /dev/null @@ -1,77 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* Evolution calendar - ToDo Conduit Capplet - * - * Copyright (C) 1998 Free Software Foundation - * Copyright (C) 2000 Helix Code, Inc. - * - * Authors: Eskil Heyn Olsen <deity@eskil.dk> - * JP Rosevear <jpr@helixcode.com> - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __ADDR_CONDUIT_H__ -#define __ADDR_CONDUIT_H__ - -#include <sys/types.h> -#include <fcntl.h> -#include <unistd.h> -#include <gnome.h> -#include <pi-address.h> -#include <gpilotd/gnome-pilot-conduit.h> -#include <gpilotd/gnome-pilot-conduit-sync-abs.h> -#include <e-pilot-map.h> - -/* This is the local record structure for the Evolution ToDo conduit. */ -typedef struct _EAddrLocalRecord EAddrLocalRecord; -struct _EAddrLocalRecord { - /* The stuff from gnome-pilot-conduit-standard-abs.h - Must be first in the structure, or instances of this - structure cannot be used by gnome-pilot-conduit-standard-abs. - */ - GnomePilotDesktopRecord local; - - /* The corresponding ECard object */ - ECard *ecard; - - /* pilot-link todo structure, used for implementing Transmit. */ - struct Address *addr; -}; - -/* This is the context for all the GnomeCal conduit methods. */ -typedef struct _EAddrConduitContext EAddrConduitContext; -struct _EAddrConduitContext { - EAddrConduitCfg *cfg; - - struct AddressAppInfo ai; - - EBook *ebook; - GList *cards; - GList *changed; - GHashTable *changed_hash; - - gboolean address_load_tried; - gboolean address_load_success; - - EPilotMap *map; -}; - -#endif __ADDR_CONDUIT_H__ - - - - - - diff --git a/addressbook/conduit/e-address.conduit.in b/addressbook/conduit/e-address.conduit.in deleted file mode 100644 index 99b5a15221..0000000000 --- a/addressbook/conduit/e-address.conduit.in +++ /dev/null @@ -1,9 +0,0 @@ -<gnome-pilot-conduit version="1.0"> - <conduit id="e_address_conduit" type="shlib" location="@prefix@/lib/gnome-pilot/conduits/libeaddress_conduit.so"/> - <name value="EAddress"/> - <conduit-attribute name="description" value="Synchronizes Addressbook with Evolution"/> - <conduit-attribute name="default-synctype" value="synchronize"/> - <conduit-attribute name="valid-synctypes" value="synchronize copy_from_pilot copy_to_pilot merge_from_pilot merge_to_pilot"/> - <conduit-attribute name="settings" value="FALSE"/> - <conduit-attribute name="icon" value="@datadir@/images/evolution/conduits/48_evo-address-conduit.png"/> -</gnome-pilot-conduit> diff --git a/addressbook/contact-editor/.cvsignore b/addressbook/contact-editor/.cvsignore deleted file mode 100644 index 6fd0b5075c..0000000000 --- a/addressbook/contact-editor/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -contact-editor-test diff --git a/addressbook/contact-editor/Makefile.am b/addressbook/contact-editor/Makefile.am deleted file mode 100644 index 700be0ff35..0000000000 --- a/addressbook/contact-editor/Makefile.am +++ /dev/null @@ -1,62 +0,0 @@ -INCLUDES = \ - $(BONOBO_GNOME_CFLAGS) \ - $(EXTRA_GNOME_CFLAGS) \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook/ \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_srcdir)/widgets/e-table \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DDATADIR=\""$(datadir)"\" \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTIONDIR=\""$(evolutiondir)"\" \ - -DG_LOG_DOMAIN=\"contact-editor\" - -noinst_LIBRARIES = \ - libecontacteditor.a - -libecontacteditor_a_SOURCES = \ - e-contact-editor-address.c \ - e-contact-editor-address.h \ - e-contact-editor-fullname.c \ - e-contact-editor-fullname.h \ - e-contact-editor.c \ - e-contact-editor.h \ - e-contact-save-as.c \ - e-contact-save-as.h \ - e-contact-quick-add.c \ - e-contact-quick-add.h - -noinst_PROGRAMS = \ - contact-editor-test - -contact_editor_test_SOURCES = \ - test-editor.c - -contact_editor_test_LDADD = \ - libecontacteditor.a \ - $(top_builddir)/e-util/libeutil.la \ - $(top_builddir)/addressbook/printing/libecontactprint.a \ - $(top_builddir)/addressbook/backend/ebook/libebook.la \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/libversit/libversit.la \ - $(GNOMEGNORBA_LIBS) \ - $(BONOBO_GNOME_LIBS) \ - $(top_builddir)/widgets/misc/libemiscwidgets.a \ - $(top_builddir)/e-util/libeutil.la \ - $(GNOME_PRINT_LIBS) \ - $(EXTRA_GNOME_LIBS) - -evolutiondir = $(datadir)/evolution - -evolution_DATA = arrow.png - -gladedir = $(datadir)/evolution/glade - -glade_DATA = \ - contact-editor.glade \ - fulladdr.glade \ - fullname.glade \ - e-contact-editor-confirm-delete.glade - -EXTRA_DIST = $(evolution_DATA) \ - $(glade_DATA) diff --git a/addressbook/contact-editor/arrow.png b/addressbook/contact-editor/arrow.png Binary files differdeleted file mode 100644 index b102356c78..0000000000 --- a/addressbook/contact-editor/arrow.png +++ /dev/null diff --git a/addressbook/contact-editor/contact-editor.glade b/addressbook/contact-editor/contact-editor.glade deleted file mode 100644 index c6afe583f5..0000000000 --- a/addressbook/contact-editor/contact-editor.glade +++ /dev/null @@ -1,2453 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <name>Contact-editor</name> - <program_name>contact-editor</program_name> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> - <use_widget_names>True</use_widget_names> - <output_main_file>False</output_main_file> - <output_support_files>False</output_support_files> - <output_build_files>False</output_build_files> - <backup_source_files>False</backup_source_files> - <main_source_file>interface.c</main_source_file> - <main_header_file>interface.h</main_header_file> - <handler_source_file>callbacks.c</handler_source_file> - <handler_header_file>callbacks.h</handler_header_file> - <support_source_file>support.c</support_source_file> - <support_header_file>support.h</support_header_file> -</project> - -<widget> - <class>GnomeDialog</class> - <name>dialog2</name> - <border_width>2</border_width> - <cxx_use_heap>True</cxx_use_heap> - <visible>False</visible> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>False</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>dialog-vbox2</name> - <cxx_use_heap>True</cxx_use_heap> - <homogeneous>False</homogeneous> - <spacing>4</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkTable</class> - <name>table2</name> - <cxx_use_heap>True</cxx_use_heap> - <rows>2</rows> - <columns>2</columns> - <homogeneous>False</homogeneous> - <row_spacing>0</row_spacing> - <column_spacing>2</column_spacing> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkEntry</class> - <name>entry2</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>0</left_attach> - <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkVBox</class> - <name>vbox1</name> - <cxx_use_heap>True</cxx_use_heap> - <homogeneous>False</homogeneous> - <spacing>2</spacing> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button31</name> - <border_width>2</border_width> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <label>_Add</label> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - - <widget> - <class>GtkButton</class> - <name>button32</name> - <border_width>2</border_width> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <label>_Delete</label> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - </widget> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow1</name> - <height>200</height> - <cxx_use_heap>True</cxx_use_heap> - <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkCList</class> - <name>clist1</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <columns>1</columns> - <column_widths>80</column_widths> - <selection_mode>GTK_SELECTION_SINGLE</selection_mode> - <show_titles>True</show_titles> - <shadow_type>GTK_SHADOW_NONE</shadow_type> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label20</name> - <cxx_use_heap>True</cxx_use_heap> - <label>Phone Types</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - </widget> - </widget> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>dialog-action_area2</name> - <cxx_use_heap>True</cxx_use_heap> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>button28</name> - <cxx_use_heap>True</cxx_use_heap> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button29</name> - <cxx_use_heap>True</cxx_use_heap> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button30</name> - <cxx_use_heap>True</cxx_use_heap> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - </widget> -</widget> - -<widget> - <class>GnomeDialog</class> - <name>dialog-add-phone</name> - <cxx_use_heap>True</cxx_use_heap> - <visible>False</visible> - <title>New phone type</title> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>False</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>vbox2</name> - <cxx_use_heap>True</cxx_use_heap> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkFrame</class> - <name>frame-add-phone</name> - <border_width>4</border_width> - <cxx_use_heap>True</cxx_use_heap> - <label>New phone type</label> - <label_xalign>0</label_xalign> - <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkAlignment</class> - <name>alignment9</name> - <border_width>9</border_width> - <cxx_use_heap>True</cxx_use_heap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xscale>1</xscale> - <yscale>1</yscale> - - <widget> - <class>GtkEntry</class> - <name>entry-add-phone</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <has_focus>True</has_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - </widget> - </widget> - </widget> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>hbuttonbox1</name> - <cxx_use_heap>True</cxx_use_heap> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>button43</name> - <cxx_use_heap>True</cxx_use_heap> - <can_default>True</can_default> - <has_default>True</has_default> - <can_focus>True</can_focus> - <label>Add</label> - <stock_pixmap>GNOME_STOCK_PIXMAP_ADD</stock_pixmap> - </widget> - - <widget> - <class>GtkButton</class> - <name>button44</name> - <cxx_use_heap>True</cxx_use_heap> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - </widget> -</widget> - -<widget> - <class>GnomeApp</class> - <name>contact editor</name> - <cxx_use_heap>True</cxx_use_heap> - <visible>False</visible> - <title>Contact Editor</title> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>True</allow_grow> - <auto_shrink>False</auto_shrink> - <enable_layout_config>True</enable_layout_config> - - <widget> - <class>GnomeDock</class> - <child_name>GnomeApp:dock</child_name> - <name>dock1</name> - <cxx_use_heap>True</cxx_use_heap> - <allow_floating>True</allow_floating> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkNotebook</class> - <child_name>GnomeDock:contents</child_name> - <name>notebook-contact-editor</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <show_tabs>True</show_tabs> - <show_border>True</show_border> - <tab_pos>GTK_POS_TOP</tab_pos> - <scrollable>False</scrollable> - <tab_hborder>2</tab_hborder> - <tab_vborder>2</tab_vborder> - <popup_enable>False</popup_enable> - - <widget> - <class>GtkTable</class> - <name>table-contact-editor-general</name> - <border_width>7</border_width> - <cxx_use_heap>True</cxx_use_heap> - <rows>14</rows> - <columns>8</columns> - <homogeneous>False</homogeneous> - <row_spacing>4</row_spacing> - <column_spacing>4</column_spacing> - - <widget> - <class>GtkEntry</class> - <name>entry-phone1</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>7</left_attach> - <right_attach>8</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-phone2</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>7</left_attach> - <right_attach>8</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-phone3</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>7</left_attach> - <right_attach>8</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-phone4</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>7</left_attach> - <right_attach>8</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkText</class> - <name>text-address</name> - <width>1</width> - <height>1</height> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text></text> - <child> - <left_attach>7</left_attach> - <right_attach>8</right_attach> - <top_attach>5</top_attach> - <bottom_attach>9</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkButton</class> - <name>button-fullname</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <label>_Full Name...</label> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkAccelLabel</class> - <name>accellabel-fileas</name> - <cxx_use_heap>True</cxx_use_heap> - <label>File As:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkAccelLabel</class> - <name>accellabel-web</name> - <cxx_use_heap>True</cxx_use_heap> - <label>Web page address:</label> - <justify>GTK_JUSTIFY_LEFT</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>8</top_attach> - <bottom_attach>9</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment3</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xscale>0</xscale> - <yscale>1</yscale> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-email1</name> - <cxx_use_heap>True</cxx_use_heap> - - <widget> - <class>Placeholder</class> - </widget> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment5</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xscale>0</xscale> - <yscale>0</yscale> - <child> - <left_attach>6</left_attach> - <right_attach>7</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-phone4</name> - <cxx_use_heap>True</cxx_use_heap> - - <widget> - <class>Placeholder</class> - </widget> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment7</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xscale>0</xscale> - <yscale>0</yscale> - <child> - <left_attach>6</left_attach> - <right_attach>7</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-phone2</name> - <cxx_use_heap>True</cxx_use_heap> - - <widget> - <class>Placeholder</class> - </widget> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment8</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xscale>0</xscale> - <yscale>0</yscale> - <child> - <left_attach>6</left_attach> - <right_attach>7</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-phone1</name> - <cxx_use_heap>True</cxx_use_heap> - - <widget> - <class>Placeholder</class> - </widget> - </widget> - </widget> - - <widget> - <class>GtkHSeparator</class> - <name>hseparator4</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>4</left_attach> - <right_attach>8</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>2</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment6</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xscale>0</xscale> - <yscale>0</yscale> - <child> - <left_attach>6</left_attach> - <right_attach>7</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-phone3</name> - <cxx_use_heap>True</cxx_use_heap> - - <widget> - <class>Placeholder</class> - </widget> - </widget> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-fullname</name> - <cxx_use_heap>True</cxx_use_heap> - <has_default>True</has_default> - <can_focus>True</can_focus> - <has_focus>True</has_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-jobtitle</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-company</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-email1</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-web</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>8</top_attach> - <bottom_attach>9</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkHSeparator</class> - <name>hseparator5</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>0</left_attach> - <right_attach>4</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>2</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkCombo</class> - <name>combo-file-as</name> - <cxx_use_heap>True</cxx_use_heap> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>True</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> - <items></items> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>entry-file-as</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - </widget> - </widget> - - <widget> - <class>GtkHSeparator</class> - <name>hseparator6</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>0</left_attach> - <right_attach>4</right_attach> - <top_attach>7</top_attach> - <bottom_attach>8</bottom_attach> - <xpad>0</xpad> - <ypad>2</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment10</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>0.5</xalign> - <yalign>0</yalign> - <xscale>1</xscale> - <yscale>1</yscale> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>6</top_attach> - <bottom_attach>7</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>True</xshrink> - <yshrink>True</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkCheckButton</class> - <name>checkbutton-htmlmail</name> - <cxx_use_heap>True</cxx_use_heap> - <label>Wants to receive _HTML mail</label> - <active>False</active> - <draw_indicator>True</draw_indicator> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment4</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xscale>0</xscale> - <yscale>0</yscale> - <child> - <left_attach>6</left_attach> - <right_attach>7</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-address</name> - <cxx_use_heap>True</cxx_use_heap> - - <widget> - <class>Placeholder</class> - </widget> - </widget> - </widget> - - <widget> - <class>GtkEventBox</class> - <name>eventbox1</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>5</left_attach> - <right_attach>6</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label-phone1</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Business</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - - <widget> - <class>GtkEventBox</class> - <name>eventbox2</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>5</left_attach> - <right_attach>6</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label-phone2</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Home</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-phone2</focus_target> - </widget> - </widget> - - <widget> - <class>GtkEventBox</class> - <name>eventbox3</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>5</left_attach> - <right_attach>6</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label-phone3</name> - <cxx_use_heap>True</cxx_use_heap> - <label>Business _Fax</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-phone3</focus_target> - </widget> - </widget> - - <widget> - <class>GtkEventBox</class> - <name>eventbox4</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>5</left_attach> - <right_attach>6</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label-phone4</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Mobile</label> - <justify>GTK_JUSTIFY_LEFT</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-phone4</focus_target> - </widget> - </widget> - - <widget> - <class>GtkEventBox</class> - <name>eventbox5</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label-email1</name> - <cxx_use_heap>True</cxx_use_heap> - <label>Primary Email</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-email1</focus_target> - </widget> - </widget> - - <widget> - <class>GtkEventBox</class> - <name>eventbox-business</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>5</left_attach> - <right_attach>6</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label-address</name> - <cxx_use_heap>True</cxx_use_heap> - <label>B_usiness</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>text-address</focus_target> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment2</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>0</xalign> - <yalign>0</yalign> - <xscale>0</xscale> - <yscale>0</yscale> - <child> - <left_attach>7</left_attach> - <right_attach>8</right_attach> - <top_attach>9</top_attach> - <bottom_attach>10</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkCheckButton</class> - <name>checkbutton-mailingaddress</name> - <cxx_use_heap>True</cxx_use_heap> - <visible>False</visible> - <label>_This is the mailing address</label> - <active>False</active> - <draw_indicator>True</draw_indicator> - </widget> - </widget> - - <widget> - <class>GtkHSeparator</class> - <name>hseparator9</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>0</left_attach> - <right_attach>4</right_attach> - <top_attach>11</top_attach> - <bottom_attach>12</bottom_attach> - <xpad>0</xpad> - <ypad>2</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkHSeparator</class> - <name>hseparator10</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>4</left_attach> - <right_attach>8</right_attach> - <top_attach>11</top_attach> - <bottom_attach>12</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment-contacts</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xscale>1</xscale> - <yscale>0</yscale> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>12</top_attach> - <bottom_attach>13</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-contacts</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <label>C_ontacts...</label> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment15</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xscale>1</xscale> - <yscale>0</yscale> - <child> - <left_attach>7</left_attach> - <right_attach>8</right_attach> - <top_attach>12</top_attach> - <bottom_attach>13</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkEntry</class> - <name>entry-categories</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment14</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xscale>1</xscale> - <yscale>0</yscale> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>12</top_attach> - <bottom_attach>13</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkEntry</class> - <name>entry-contacts</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - </widget> - </widget> - - <widget> - <class>GtkAlignment</class> - <name>alignment16</name> - <cxx_use_heap>True</cxx_use_heap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xscale>1</xscale> - <yscale>0</yscale> - <child> - <left_attach>5</left_attach> - <right_attach>7</right_attach> - <top_attach>12</top_attach> - <bottom_attach>13</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button-categories</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <label>Ca_tegories...</label> - </widget> - </widget> - - <widget> - <class>GtkEventBox</class> - <name>eventbox7</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label-jobtitle</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Job title:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-jobtitle</focus_target> - </widget> - </widget> - - <widget> - <class>Custom</class> - <name>custom1</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>malehead.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:19:47 GMT</last_modification_time> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom2</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>cellphone.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:20:02 GMT</last_modification_time> - <child> - <left_attach>4</left_attach> - <right_attach>5</right_attach> - <top_attach>0</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom3</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>envelope.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:19:51 GMT</last_modification_time> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>5</top_attach> - <bottom_attach>7</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom4</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>house.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:20:06 GMT</last_modification_time> - <child> - <left_attach>4</left_attach> - <right_attach>5</right_attach> - <top_attach>5</top_attach> - <bottom_attach>10</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom5</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>evolution-contacts-plain.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:19:59 GMT</last_modification_time> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>12</top_attach> - <bottom_attach>14</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom6</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>briefcase.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:20:09 GMT</last_modification_time> - <child> - <left_attach>4</left_attach> - <right_attach>5</right_attach> - <top_attach>12</top_attach> - <bottom_attach>14</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom10</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>globe.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:19:56 GMT</last_modification_time> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>8</top_attach> - <bottom_attach>10</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-company</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Company:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-company</focus_target> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkButton</class> - <name>button-fulladdr</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <label>_Address...</label> - <child> - <left_attach>5</left_attach> - <right_attach>7</right_attach> - <top_attach>6</top_attach> - <bottom_attach>7</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - </widget> - - <widget> - <class>GtkLabel</class> - <child_name>Notebook:tab</child_name> - <name>label15</name> - <cxx_use_heap>True</cxx_use_heap> - <label>General</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - - <widget> - <class>GtkTable</class> - <name>table-contact-editor-details</name> - <border_width>7</border_width> - <cxx_use_heap>True</cxx_use_heap> - <rows>9</rows> - <columns>6</columns> - <homogeneous>False</homogeneous> - <row_spacing>4</row_spacing> - <column_spacing>4</column_spacing> - - <widget> - <class>GtkLabel</class> - <name>label-department</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Department:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-department</focus_target> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-office</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Office:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-office</focus_target> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-profession</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Profession:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-profession</focus_target> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-nickname</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Nickname:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-nickname</focus_target> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-spouse</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Spouse:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-spouse</focus_target> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-birthday</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Birthday:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-assistant</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Assistant's name:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-assistant</focus_target> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-manager</name> - <cxx_use_heap>True</cxx_use_heap> - <label>_Manager's Name:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-manager</focus_target> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-anniversary</name> - <cxx_use_heap>True</cxx_use_heap> - <label>Anni_versary:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-spouse</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-department</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-office</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-profession</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-nickname</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GnomeDateEdit</class> - <name>dateedit-anniversary</name> - <cxx_use_heap>True</cxx_use_heap> - <show_time>False</show_time> - <use_24_format>False</use_24_format> - <week_start_monday>False</week_start_monday> - <lower_hour>7</lower_hour> - <upper_hour>19</upper_hour> - <child> - <left_attach>4</left_attach> - <right_attach>6</right_attach> - <top_attach>5</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GnomeDateEdit</class> - <name>dateedit-birthday</name> - <cxx_use_heap>True</cxx_use_heap> - <show_time>False</show_time> - <use_24_format>False</use_24_format> - <week_start_monday>False</week_start_monday> - <lower_hour>7</lower_hour> - <upper_hour>19</upper_hour> - <child> - <left_attach>4</left_attach> - <right_attach>6</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-assistant</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>4</left_attach> - <right_attach>6</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-manager</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>4</left_attach> - <right_attach>6</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkHSeparator</class> - <name>hseparator7</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>0</left_attach> - <right_attach>6</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>2</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label-comments</name> - <cxx_use_heap>True</cxx_use_heap> - <label>No_tes:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>7</top_attach> - <bottom_attach>8</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkHSeparator</class> - <name>hseparator8</name> - <cxx_use_heap>True</cxx_use_heap> - <child> - <left_attach>0</left_attach> - <right_attach>6</right_attach> - <top_attach>6</top_attach> - <bottom_attach>7</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom7</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>briefcase.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:20:13 GMT</last_modification_time> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>Custom</class> - <name>custom8</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>malehead.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:20:16 GMT</last_modification_time> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>4</top_attach> - <bottom_attach>6</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow2</name> - <cxx_use_heap>True</cxx_use_heap> - <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <left_attach>1</left_attach> - <right_attach>6</right_attach> - <top_attach>8</top_attach> - <bottom_attach>9</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkText</class> - <name>text-comments</name> - <cxx_use_heap>True</cxx_use_heap> - <can_focus>True</can_focus> - <editable>True</editable> - <text></text> - </widget> - </widget> - - <widget> - <class>Custom</class> - <name>custom9</name> - <cxx_use_heap>True</cxx_use_heap> - <creation_function>e_create_image_widget</creation_function> - <string1>globe.png</string1> - <string2></string2> - <int1>0</int1> - <int2>0</int2> - <last_modification_time>Thu, 18 May 2000 12:20:19 GMT</last_modification_time> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>7</top_attach> - <bottom_attach>9</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - </widget> - - <widget> - <class>GtkLabel</class> - <child_name>Notebook:tab</child_name> - <name>label16</name> - <cxx_use_heap>True</cxx_use_heap> - <label>Details</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - </widget> - - <widget> - <class>GnomeAppBar</class> - <child_name>GnomeApp:appbar</child_name> - <name>appbar1</name> - <cxx_use_heap>True</cxx_use_heap> - <has_progress>True</has_progress> - <has_status>True</has_status> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - </widget> -</widget> - -</GTK-Interface> diff --git a/addressbook/contact-editor/e-contact-editor-address.c b/addressbook/contact-editor/e-contact-editor-address.c deleted file mode 100644 index 777a3cb617..0000000000 --- a/addressbook/contact-editor/e-contact-editor-address.c +++ /dev/null @@ -1,243 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-editor-address.c - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include <libgnomeui/gnome-stock.h> -#include <gal/widgets/e-unicode.h> -#include <e-contact-editor-address.h> - -static void e_contact_editor_address_init (EContactEditorAddress *card); -static void e_contact_editor_address_class_init (EContactEditorAddressClass *klass); -static void e_contact_editor_address_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); -static void e_contact_editor_address_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_contact_editor_address_destroy (GtkObject *object); - -static void fill_in_info(EContactEditorAddress *editor); -static void extract_info(EContactEditorAddress *editor); - -static GnomeDialogClass *parent_class = NULL; - -/* The arguments we take */ -enum { - ARG_0, - ARG_ADDRESS, - ARG_IS_READ_ONLY -}; - -GtkType -e_contact_editor_address_get_type (void) -{ - static GtkType contact_editor_address_type = 0; - - if (!contact_editor_address_type) - { - static const GtkTypeInfo contact_editor_address_info = - { - "EContactEditorAddress", - sizeof (EContactEditorAddress), - sizeof (EContactEditorAddressClass), - (GtkClassInitFunc) e_contact_editor_address_class_init, - (GtkObjectInitFunc) e_contact_editor_address_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - contact_editor_address_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_address_info); - } - - return contact_editor_address_type; -} - -static void -e_contact_editor_address_class_init (EContactEditorAddressClass *klass) -{ - GtkObjectClass *object_class; - GnomeDialogClass *dialog_class; - - object_class = (GtkObjectClass*) klass; - dialog_class = (GnomeDialogClass *) klass; - - parent_class = gtk_type_class (gnome_dialog_get_type ()); - - gtk_object_add_arg_type ("EContactEditorAddress::address", GTK_TYPE_POINTER, - GTK_ARG_READWRITE, ARG_ADDRESS); - gtk_object_add_arg_type ("EContactEditorAddress::is_read_only", GTK_TYPE_BOOL, - GTK_ARG_READWRITE, ARG_IS_READ_ONLY); - - object_class->set_arg = e_contact_editor_address_set_arg; - object_class->get_arg = e_contact_editor_address_get_arg; - object_class->destroy = e_contact_editor_address_destroy; -} - -static void -e_contact_editor_address_init (EContactEditorAddress *e_contact_editor_address) -{ - GladeXML *gui; - GtkWidget *widget; - - gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_address), - GNOME_STOCK_BUTTON_OK); - - gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_address), - GNOME_STOCK_BUTTON_CANCEL); - - gtk_window_set_policy(GTK_WINDOW(e_contact_editor_address), FALSE, TRUE, FALSE); - - e_contact_editor_address->address = NULL; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/fulladdr.glade", NULL); - e_contact_editor_address->gui = gui; - - widget = glade_xml_get_widget(gui, "table-checkaddress"); - gtk_widget_ref(widget); - gtk_container_remove(GTK_CONTAINER(widget->parent), widget); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (e_contact_editor_address)->vbox), widget, TRUE, TRUE, 0); - gtk_widget_unref(widget); -} - -void -e_contact_editor_address_destroy (GtkObject *object) -{ - EContactEditorAddress *e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS(object); - - if (e_contact_editor_address->gui) - gtk_object_unref(GTK_OBJECT(e_contact_editor_address->gui)); - e_card_delivery_address_free(e_contact_editor_address->address); -} - -GtkWidget* -e_contact_editor_address_new (const ECardDeliveryAddress *address) -{ - GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_address_get_type ())); - gtk_object_set (GTK_OBJECT(widget), - "address", address, - NULL); - return widget; -} - -static void -e_contact_editor_address_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) -{ - EContactEditorAddress *e_contact_editor_address; - - e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS (o); - - switch (arg_id){ - case ARG_ADDRESS: - if (e_contact_editor_address->address) - e_card_delivery_address_free(e_contact_editor_address->address); - e_contact_editor_address->address = e_card_delivery_address_copy(GTK_VALUE_POINTER (*arg)); - fill_in_info(e_contact_editor_address); - break; - case ARG_IS_READ_ONLY: { - int i; - char *entry_names[] = { - "entry-street", - "entry-city", - "entry-ext", - "entry-po", - "entry-region", - "combo-country", - "entry-code", - NULL - }; - e_contact_editor_address->is_read_only = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; - for (i = 0; entry_names[i] != NULL; i ++) { - gtk_widget_set_sensitive (glade_xml_get_widget(e_contact_editor_address->gui, entry_names[i]), !e_contact_editor_address->is_read_only); - } - break; - } - } -} - -static void -e_contact_editor_address_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - EContactEditorAddress *e_contact_editor_address; - - e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS (object); - - switch (arg_id) { - case ARG_ADDRESS: - extract_info(e_contact_editor_address); - GTK_VALUE_POINTER (*arg) = e_card_delivery_address_copy(e_contact_editor_address->address); - break; - case ARG_IS_READ_ONLY: - GTK_VALUE_BOOL (*arg) = e_contact_editor_address->is_read_only ? TRUE : FALSE; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -fill_in_field(EContactEditorAddress *editor, char *field, char *string) -{ - GtkEditable *editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, field)); - if (editable) { - e_utf8_gtk_editable_set_text(editable, string); - } -} - -static void -fill_in_info(EContactEditorAddress *editor) -{ - ECardDeliveryAddress *address = editor->address; - if (address) { - fill_in_field(editor, "entry-street" , address->street ); - fill_in_field(editor, "entry-po" , address->po ); - fill_in_field(editor, "entry-ext" , address->ext ); - fill_in_field(editor, "entry-city" , address->city ); - fill_in_field(editor, "entry-region" , address->region ); - fill_in_field(editor, "entry-code" , address->code ); - fill_in_field(editor, "entry-country", address->country); - } -} - -static char * -extract_field(EContactEditorAddress *editor, char *field) -{ - GtkEditable *editable = GTK_EDITABLE(glade_xml_get_widget(editor->gui, field)); - if (editable) - return e_utf8_gtk_editable_get_text(editable); - else - return NULL; -} - -static void -extract_info(EContactEditorAddress *editor) -{ - ECardDeliveryAddress *address = editor->address; - if (!address) { - address = e_card_delivery_address_new(); - editor->address = address; - } - address->street = extract_field(editor, "entry-street" ); - address->po = extract_field(editor, "entry-po" ); - address->ext = extract_field(editor, "entry-ext" ); - address->city = extract_field(editor, "entry-city" ); - address->region = extract_field(editor, "entry-region" ); - address->code = extract_field(editor, "entry-code" ); - address->country = extract_field(editor, "entry-country"); -} diff --git a/addressbook/contact-editor/e-contact-editor-address.h b/addressbook/contact-editor/e-contact-editor-address.h deleted file mode 100644 index 48d88aab85..0000000000 --- a/addressbook/contact-editor/e-contact-editor-address.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor-address.h - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_EDITOR_ADDRESS_H__ -#define __E_CONTACT_EDITOR_ADDRESS_H__ - -#include <libgnomeui/gnome-dialog.h> -#include <glade/glade.h> -#include <ebook/e-card.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EContactEditorAddress - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * name ECardName * RW The card currently being edited. Returns a copy. - */ - -#define E_CONTACT_EDITOR_ADDRESS_TYPE (e_contact_editor_address_get_type ()) -#define E_CONTACT_EDITOR_ADDRESS(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_ADDRESS_TYPE, EContactEditorAddress)) -#define E_CONTACT_EDITOR_ADDRESS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_ADDRESS_TYPE, EContactEditorAddressClass)) -#define E_IS_CONTACT_EDITOR_ADDRESS(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_ADDRESS_TYPE)) -#define E_IS_CONTACT_EDITOR_ADDRESS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_ADDRESS_TYPE)) - - -typedef struct _EContactEditorAddress EContactEditorAddress; -typedef struct _EContactEditorAddressClass EContactEditorAddressClass; - -struct _EContactEditorAddress -{ - GnomeDialog parent; - - /* item specific fields */ - ECardDeliveryAddress *address; - - guint is_read_only : 1; - - GladeXML *gui; -}; - -struct _EContactEditorAddressClass -{ - GnomeDialogClass parent_class; -}; - - -GtkWidget *e_contact_editor_address_new(const ECardDeliveryAddress *name); -GtkType e_contact_editor_address_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_CONTACT_EDITOR_ADDRESS_H__ */ diff --git a/addressbook/contact-editor/e-contact-editor-confirm-delete.glade b/addressbook/contact-editor/e-contact-editor-confirm-delete.glade deleted file mode 100644 index b91a040d46..0000000000 --- a/addressbook/contact-editor/e-contact-editor-confirm-delete.glade +++ /dev/null @@ -1,83 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <name>e-contact-editor-confirm-delete</name> - <program_name>e-contact-editor-confirm-delete</program_name> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> - <use_widget_names>True</use_widget_names> - <output_main_file>False</output_main_file> - <output_support_files>False</output_support_files> - <output_build_files>False</output_build_files> - <gnome_help_support>True</gnome_help_support> -</project> - -<widget> - <class>GnomeMessageBox</class> - <name>confirm-dialog</name> - <message_box_type>GNOME_MESSAGE_BOX_QUESTION</message_box_type> - <message>Are you sure you want -to delete this contact?</message> - <title>Delete Contact?</title> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>False</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>True</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>dialog-vbox1</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>dialog-action_area1</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>button1</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button2</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - </widget> -</widget> - -</GTK-Interface> diff --git a/addressbook/contact-editor/e-contact-editor-fullname.c b/addressbook/contact-editor/e-contact-editor-fullname.c deleted file mode 100644 index 69477d3325..0000000000 --- a/addressbook/contact-editor/e-contact-editor-fullname.c +++ /dev/null @@ -1,243 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-editor-fullname.c - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include <libgnomeui/gnome-stock.h> -#include <gal/widgets/e-unicode.h> -#include "e-contact-editor-fullname.h" - -static void e_contact_editor_fullname_init (EContactEditorFullname *card); -static void e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass); -static void e_contact_editor_fullname_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); -static void e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_contact_editor_fullname_destroy (GtkObject *object); - -static void fill_in_info(EContactEditorFullname *editor); -static void extract_info(EContactEditorFullname *editor); - -static GnomeDialogClass *parent_class = NULL; - -/* The arguments we take */ -enum { - ARG_0, - ARG_NAME, - ARG_IS_READ_ONLY -}; - -GtkType -e_contact_editor_fullname_get_type (void) -{ - static GtkType contact_editor_fullname_type = 0; - - if (!contact_editor_fullname_type) - { - static const GtkTypeInfo contact_editor_fullname_info = - { - "EContactEditorFullname", - sizeof (EContactEditorFullname), - sizeof (EContactEditorFullnameClass), - (GtkClassInitFunc) e_contact_editor_fullname_class_init, - (GtkObjectInitFunc) e_contact_editor_fullname_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - contact_editor_fullname_type = gtk_type_unique (gnome_dialog_get_type (), &contact_editor_fullname_info); - } - - return contact_editor_fullname_type; -} - -static void -e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass) -{ - GtkObjectClass *object_class; - GnomeDialogClass *dialog_class; - - object_class = (GtkObjectClass*) klass; - dialog_class = (GnomeDialogClass *) klass; - - parent_class = gtk_type_class (gnome_dialog_get_type ()); - - gtk_object_add_arg_type ("EContactEditorFullname::name", GTK_TYPE_POINTER, - GTK_ARG_READWRITE, ARG_NAME); - - gtk_object_add_arg_type ("EContactEditorFullname::is_read_only", GTK_TYPE_BOOL, - GTK_ARG_READWRITE, ARG_IS_READ_ONLY); - - object_class->set_arg = e_contact_editor_fullname_set_arg; - object_class->get_arg = e_contact_editor_fullname_get_arg; - object_class->destroy = e_contact_editor_fullname_destroy; -} - -static void -e_contact_editor_fullname_init (EContactEditorFullname *e_contact_editor_fullname) -{ - GladeXML *gui; - GtkWidget *widget; - - gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname), - GNOME_STOCK_BUTTON_OK); - - gnome_dialog_append_button ( GNOME_DIALOG(e_contact_editor_fullname), - GNOME_STOCK_BUTTON_CANCEL); - - gtk_window_set_policy(GTK_WINDOW(e_contact_editor_fullname), TRUE, TRUE, FALSE); - - e_contact_editor_fullname->name = NULL; - gui = glade_xml_new (EVOLUTION_GLADEDIR "/fullname.glade", NULL); - e_contact_editor_fullname->gui = gui; - - widget = glade_xml_get_widget(gui, "table-checkfullname"); - gtk_widget_ref(widget); - gtk_container_remove(GTK_CONTAINER(widget->parent), widget); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (e_contact_editor_fullname)->vbox), widget, TRUE, TRUE, 0); - gtk_widget_unref(widget); -} - -void -e_contact_editor_fullname_destroy (GtkObject *object) -{ - EContactEditorFullname *e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME(object); - - if (e_contact_editor_fullname->gui) - gtk_object_unref(GTK_OBJECT(e_contact_editor_fullname->gui)); - e_card_name_free(e_contact_editor_fullname->name); -} - -GtkWidget* -e_contact_editor_fullname_new (const ECardName *name) -{ - GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_editor_fullname_get_type ())); - gtk_object_set (GTK_OBJECT(widget), - "name", name, - NULL); - return widget; -} - -static void -e_contact_editor_fullname_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) -{ - EContactEditorFullname *e_contact_editor_fullname; - - e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (o); - - switch (arg_id){ - case ARG_NAME: - if (e_contact_editor_fullname->name) - e_card_name_free(e_contact_editor_fullname->name); - e_contact_editor_fullname->name = e_card_name_copy(GTK_VALUE_POINTER (*arg)); - fill_in_info(e_contact_editor_fullname); - break; - case ARG_IS_READ_ONLY: { - int i; - char *entry_names[] = { - "combo-title", - "combo-suffix", - "entry-first", - "entry-middle", - "entry-last", - NULL - }; - e_contact_editor_fullname->is_read_only = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; - for (i = 0; entry_names[i] != NULL; i ++) { - gtk_widget_set_sensitive (glade_xml_get_widget(e_contact_editor_fullname->gui, - entry_names[i]), - !e_contact_editor_fullname->is_read_only); - } - break; - } - } -} - -static void -e_contact_editor_fullname_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - EContactEditorFullname *e_contact_editor_fullname; - - e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); - - switch (arg_id) { - case ARG_NAME: - extract_info(e_contact_editor_fullname); - GTK_VALUE_POINTER (*arg) = e_card_name_copy(e_contact_editor_fullname->name); - break; - case ARG_IS_READ_ONLY: - GTK_VALUE_BOOL (*arg) = e_contact_editor_fullname->is_read_only ? TRUE : FALSE; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -fill_in_field(EContactEditorFullname *editor, char *field, char *string) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) { - if (string) - e_utf8_gtk_entry_set_text(entry, string); - else - gtk_entry_set_text(entry, ""); - } -} - -static void -fill_in_info(EContactEditorFullname *editor) -{ - ECardName *name = editor->name; - if (name) { - fill_in_field(editor, "entry-title", name->prefix); - fill_in_field(editor, "entry-first", name->given); - fill_in_field(editor, "entry-middle", name->additional); - fill_in_field(editor, "entry-last", name->family); - fill_in_field(editor, "entry-suffix", name->suffix); - } -} - -static char * -extract_field(EContactEditorFullname *editor, char *field) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) - return e_utf8_gtk_entry_get_text(entry); - else - return NULL; -} - -static void -extract_info(EContactEditorFullname *editor) -{ - ECardName *name = editor->name; - if (!name) { - name = e_card_name_new(); - editor->name = name; - } - - name->prefix = extract_field(editor, "entry-title" ); - name->given = extract_field(editor, "entry-first" ); - name->additional = extract_field(editor, "entry-middle"); - name->family = extract_field(editor, "entry-last" ); - name->suffix = extract_field(editor, "entry-suffix"); -} diff --git a/addressbook/contact-editor/e-contact-editor-fullname.h b/addressbook/contact-editor/e-contact-editor-fullname.h deleted file mode 100644 index 70bb793d0a..0000000000 --- a/addressbook/contact-editor/e-contact-editor-fullname.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor-fullname.h - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_EDITOR_FULLNAME_H__ -#define __E_CONTACT_EDITOR_FULLNAME_H__ - -#include <libgnomeui/gnome-dialog.h> -#include <glade/glade.h> -#include <ebook/e-card.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EContactEditorFullname - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * name ECardName * RW The card currently being edited. Returns a copy. - */ - -#define E_CONTACT_EDITOR_FULLNAME_TYPE (e_contact_editor_fullname_get_type ()) -#define E_CONTACT_EDITOR_FULLNAME(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE, EContactEditorFullname)) -#define E_CONTACT_EDITOR_FULLNAME_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_FULLNAME_TYPE, EContactEditorFullnameClass)) -#define E_IS_CONTACT_EDITOR_FULLNAME(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE)) -#define E_IS_CONTACT_EDITOR_FULLNAME_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_FULLNAME_TYPE)) - - -typedef struct _EContactEditorFullname EContactEditorFullname; -typedef struct _EContactEditorFullnameClass EContactEditorFullnameClass; - -struct _EContactEditorFullname -{ - GnomeDialog parent; - - /* item specific fields */ - ECardName *name; - GladeXML *gui; - - /* Whether the dialog will accept modifications */ - guint is_read_only : 1; -}; - -struct _EContactEditorFullnameClass -{ - GnomeDialogClass parent_class; -}; - - -GtkWidget *e_contact_editor_fullname_new(const ECardName *name); -GtkType e_contact_editor_fullname_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_CONTACT_EDITOR_FULLNAME_H__ */ diff --git a/addressbook/contact-editor/e-contact-editor.c b/addressbook/contact-editor/e-contact-editor.c deleted file mode 100644 index 8c9b7519a3..0000000000 --- a/addressbook/contact-editor/e-contact-editor.c +++ /dev/null @@ -1,2125 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-editor.c - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <time.h> -#include <gtk/gtkcheckbutton.h> -#include <gtk/gtkcheckmenuitem.h> -#include <gtk/gtkcombo.h> -#include <gtk/gtktext.h> -#include <libgnomeui/gnome-popup-menu.h> -#include <libgnomeui/gnome-dateedit.h> -#include <libgnome/gnome-i18n.h> - -#include <bonobo/bonobo-ui-container.h> -#include <bonobo/bonobo-ui-util.h> -#include <gdk-pixbuf/gdk-pixbuf.h> -#include <gdk-pixbuf/gnome-canvas-pixbuf.h> -#include <gal/widgets/e-categories.h> -#include <gal/widgets/e-gui-utils.h> -#include <gal/widgets/e-unicode.h> - -#include "addressbook/printing/e-contact-print.h" -#include "addressbook/printing/e-contact-print-envelope.h" -#include "e-util/e-gui-utils.h" - -#include "e-contact-editor.h" -#include "e-contact-editor-address.h" -#include "e-contact-editor-fullname.h" -#include "e-contact-save-as.h" - -/* Signal IDs */ -enum { - ADD_CARD, - COMMIT_CARD, - DELETE_CARD, - EDITOR_CLOSED, - LAST_SIGNAL -}; - -static void e_contact_editor_init (EContactEditor *card); -static void e_contact_editor_class_init (EContactEditorClass *klass); -static void e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); -static void e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_contact_editor_destroy (GtkObject *object); - -#if 0 -static GtkWidget *e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info); -#endif -static void _email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); -static void _phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); -static void _address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor); -static void enable_writable_fields(EContactEditor *editor); -static void set_read_only(EContactEditor *editor); -static void fill_in_info(EContactEditor *editor); -static void extract_info(EContactEditor *editor); -static void set_fields(EContactEditor *editor); -static void set_address_field(EContactEditor *editor, int result); -static void add_field_callback(GtkWidget *widget, EContactEditor *editor); - -static GtkObjectClass *parent_class = NULL; - -static guint contact_editor_signals[LAST_SIGNAL]; - -/* The arguments we take */ -enum { - ARG_0, - ARG_CARD, - ARG_IS_NEW_CARD, - ARG_IS_READ_ONLY, - ARG_WRITABLE_FIELDS -}; - -enum { - DYNAMIC_LIST_EMAIL, - DYNAMIC_LIST_PHONE, - DYNAMIC_LIST_ADDRESS -}; - -GtkType -e_contact_editor_get_type (void) -{ - static GtkType contact_editor_type = 0; - - if (!contact_editor_type) - { - static const GtkTypeInfo contact_editor_info = - { - "EContactEditor", - sizeof (EContactEditor), - sizeof (EContactEditorClass), - (GtkClassInitFunc) e_contact_editor_class_init, - (GtkObjectInitFunc) e_contact_editor_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - contact_editor_type = gtk_type_unique (GTK_TYPE_OBJECT, &contact_editor_info); - } - - return contact_editor_type; -} - -static void -e_contact_editor_class_init (EContactEditorClass *klass) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass*) klass; - - parent_class = gtk_type_class (GTK_TYPE_OBJECT); - - gtk_object_add_arg_type ("EContactEditor::card", GTK_TYPE_OBJECT, - GTK_ARG_READWRITE, ARG_CARD); - gtk_object_add_arg_type ("EContactEditor::is_new_card", GTK_TYPE_BOOL, - GTK_ARG_READWRITE, ARG_IS_NEW_CARD); - gtk_object_add_arg_type ("EContactEditor::writable_fields", GTK_TYPE_POINTER, - GTK_ARG_READWRITE, ARG_WRITABLE_FIELDS); - gtk_object_add_arg_type ("EContactEditor::is_read_only", GTK_TYPE_BOOL, - GTK_ARG_READWRITE, ARG_IS_READ_ONLY); - - contact_editor_signals[ADD_CARD] = - gtk_signal_new ("add_card", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EContactEditorClass, add_card), - gtk_marshal_NONE__OBJECT, - GTK_TYPE_NONE, 1, - GTK_TYPE_OBJECT); - - contact_editor_signals[COMMIT_CARD] = - gtk_signal_new ("commit_card", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EContactEditorClass, commit_card), - gtk_marshal_NONE__OBJECT, - GTK_TYPE_NONE, 1, - GTK_TYPE_OBJECT); - - contact_editor_signals[DELETE_CARD] = - gtk_signal_new ("delete_card", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EContactEditorClass, delete_card), - gtk_marshal_NONE__OBJECT, - GTK_TYPE_NONE, 1, - GTK_TYPE_OBJECT); - - contact_editor_signals[EDITOR_CLOSED] = - gtk_signal_new ("editor_closed", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EContactEditorClass, editor_closed), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, contact_editor_signals, LAST_SIGNAL); - - object_class->set_arg = e_contact_editor_set_arg; - object_class->get_arg = e_contact_editor_get_arg; - object_class->destroy = e_contact_editor_destroy; -} - -static void -_replace_button(EContactEditor *editor, gchar *button_xml, gchar *image, GtkSignalFunc func) -{ - GladeXML *gui = editor->gui; - GtkWidget *button = glade_xml_get_widget(gui, button_xml); - GtkWidget *pixmap; - gchar *image_temp; - if (button && GTK_IS_BUTTON(button)) { - image_temp = g_strdup_printf("%s/%s", EVOLUTIONDIR, image); - pixmap = e_create_image_widget(NULL, image_temp, NULL, 0, 0); - gtk_container_add(GTK_CONTAINER(button), - pixmap); - g_free(image_temp); - gtk_widget_show(pixmap); - gtk_signal_connect(GTK_OBJECT(button), "button_press_event", func, editor); - } -} - -static void -_replace_buttons(EContactEditor *editor) -{ - _replace_button(editor, "button-phone1", "arrow.png", _phone_arrow_pressed); - _replace_button(editor, "button-phone2", "arrow.png", _phone_arrow_pressed); - _replace_button(editor, "button-phone3", "arrow.png", _phone_arrow_pressed); - _replace_button(editor, "button-phone4", "arrow.png", _phone_arrow_pressed); - _replace_button(editor, "button-address", "arrow.png", _address_arrow_pressed); - _replace_button(editor, "button-email1", "arrow.png", _email_arrow_pressed); -} - -static void -wants_html_changed (GtkWidget *widget, EContactEditor *editor) -{ - gboolean wants_html; - gtk_object_get(GTK_OBJECT(widget), - "active", &wants_html, - NULL); - gtk_object_set(GTK_OBJECT(editor->card), - "wants_html", wants_html, - NULL); -} - -static void -phone_entry_changed (GtkWidget *widget, EContactEditor *editor) -{ - int which; - gchar *string; - GtkEntry *entry = GTK_ENTRY(widget); - ECardPhone *phone; - - if ( widget == glade_xml_get_widget(editor->gui, "entry-phone1") ) { - which = 1; - } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone2") ) { - which = 2; - } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone3") ) { - which = 3; - } else if ( widget == glade_xml_get_widget(editor->gui, "entry-phone4") ) { - which = 4; - } else - return; - string = e_utf8_gtk_entry_get_text(entry); - phone = e_card_phone_new(); - phone->number = string; - e_card_simple_set_phone(editor->simple, editor->phone_choice[which - 1], phone); -#if 0 - phone->number = NULL; -#endif - e_card_phone_free(phone); - set_fields(editor); -} - -static void -email_entry_changed (GtkWidget *widget, EContactEditor *editor) -{ - gchar *string; - GtkEntry *entry = GTK_ENTRY(widget); - - string = e_utf8_gtk_entry_get_text(entry); - - e_card_simple_set_email(editor->simple, editor->email_choice, string); - - g_free (string); -} - -static void -address_text_changed (GtkWidget *widget, EContactEditor *editor) -{ - GtkEditable *editable = GTK_EDITABLE(widget); - ECardAddrLabel *address; - - if (editor->address_choice == -1) - return; - - address = e_card_address_label_new(); - - address->data = e_utf8_gtk_editable_get_chars(editable, 0, -1); - - e_card_simple_set_address(editor->simple, editor->address_choice, address); - e_card_address_label_free(address); -} - -/* This function tells you whether name_to_style will make sense. */ -static gboolean -style_makes_sense(const ECardName *name, char *company, int style) -{ - switch (style) { - case 0: /* Fall Through */ - case 1: - return TRUE; - case 2: - if (company && *company) - return TRUE; - else - return FALSE; - case 3: /* Fall Through */ - case 4: - if (company && *company && name && ((name->given && *name->given) || (name->family && *name->family))) - return TRUE; - else - return FALSE; - default: - return FALSE; - } -} - -static char * -name_to_style(const ECardName *name, char *company, int style) -{ - char *string; - char *strings[4], **stringptr; - char *substring; - switch (style) { - case 0: - stringptr = strings; - if (name) { - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->given && *name->given) - *(stringptr++) = name->given; - } - *stringptr = NULL; - string = g_strjoinv(", ", strings); - break; - case 1: - stringptr = strings; - if (name) { - if (name->given && *name->given) - *(stringptr++) = name->given; - if (name->family && *name->family) - *(stringptr++) = name->family; - } - *stringptr = NULL; - string = g_strjoinv(" ", strings); - break; - case 2: - string = g_strdup(company); - break; - case 3: /* Fall Through */ - case 4: - stringptr = strings; - if (name) { - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->given && *name->given) - *(stringptr++) = name->given; - } - *stringptr = NULL; - substring = g_strjoinv(", ", strings); - if (!(company && *company)) - company = ""; - if (style == 3) - string = g_strdup_printf("%s (%s)", substring, company); - else - string = g_strdup_printf("%s (%s)", company, substring); - g_free(substring); - break; - default: - string = g_strdup(""); - } - return string; -} - -static int -file_as_get_style (EContactEditor *editor) -{ - GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); - char *filestring; - char *trystring; - ECardName *name = editor->name; - int i; - int style; - - if (!(file_as && GTK_IS_ENTRY(file_as))) - return -1; - - filestring = e_utf8_gtk_entry_get_text(file_as); - - style = -1; - for (i = 0; i < 5; i++) { - trystring = name_to_style(name, editor->company, i); - if (!strcmp(trystring, filestring)) { - g_free(trystring); - g_free(filestring); - return i; - } - g_free(trystring); - } - g_free (filestring); - return -1; -} - -static void -file_as_set_style(EContactEditor *editor, int style) -{ - char *string; - int i; - GList *strings = NULL; - GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); - GtkWidget *widget; - - - if (!(file_as && GTK_IS_ENTRY(file_as))) - return; - - if (style == -1) { - string = e_utf8_gtk_entry_get_text(file_as); - strings = g_list_append(strings, string); - } - - widget = glade_xml_get_widget(editor->gui, "combo-file-as"); - - for (i = 0; i < 5; i++) { - if (style_makes_sense(editor->name, editor->company, i)) { - char *u; - u = name_to_style(editor->name, editor->company, i); - string = e_utf8_to_gtk_string (widget, u); - g_free (u); - if (string) strings = g_list_append(strings, string); - } - } - - if (widget && GTK_IS_COMBO(widget)) { - GtkCombo *combo = GTK_COMBO(widget); - gtk_combo_set_popdown_strings(combo, strings); - g_list_foreach(strings, (GFunc) g_free, NULL); - g_list_free(strings); - } - - if (style != -1) { - string = name_to_style(editor->name, editor->company, style); - e_utf8_gtk_entry_set_text(file_as, string); - g_free(string); - } -} - -static void -name_entry_changed (GtkWidget *widget, EContactEditor *editor) -{ - int style = 0; - char *string; - - style = file_as_get_style(editor); - - e_card_name_free(editor->name); - - string = e_utf8_gtk_entry_get_text (GTK_ENTRY(widget)); - editor->name = e_card_name_from_string(string); - g_free (string); - - file_as_set_style(editor, style); -} - -static void -company_entry_changed (GtkWidget *widget, EContactEditor *editor) -{ - int style = 0; - - style = file_as_get_style(editor); - - g_free(editor->company); - - editor->company = e_utf8_gtk_entry_get_text(GTK_ENTRY(widget)); - - file_as_set_style(editor, style); -} - -static void -set_entry_changed_signal_phone(EContactEditor *editor, char *id) -{ - GtkWidget *widget = glade_xml_get_widget(editor->gui, id); - if (widget && GTK_IS_ENTRY(widget)) - gtk_signal_connect(GTK_OBJECT(widget), "changed", - phone_entry_changed, editor); -} - -static void -set_entry_changed_signals(EContactEditor *editor) -{ - GtkWidget *widget; - set_entry_changed_signal_phone(editor, "entry-phone1"); - set_entry_changed_signal_phone(editor, "entry-phone2"); - set_entry_changed_signal_phone(editor, "entry-phone3"); - set_entry_changed_signal_phone(editor, "entry-phone4"); - widget = glade_xml_get_widget(editor->gui, "entry-email1"); - if (widget && GTK_IS_ENTRY(widget)) { - gtk_signal_connect(GTK_OBJECT(widget), "changed", - email_entry_changed, editor); - } - widget = glade_xml_get_widget(editor->gui, "text-address"); - if (widget && GTK_IS_TEXT(widget)) { - gtk_signal_connect(GTK_OBJECT(widget), "changed", - address_text_changed, editor); - } - widget = glade_xml_get_widget(editor->gui, "entry-fullname"); - if (widget && GTK_IS_ENTRY(widget)) { - gtk_signal_connect(GTK_OBJECT(widget), "changed", - name_entry_changed, editor); - } - widget = glade_xml_get_widget(editor->gui, "entry-company"); - if (widget && GTK_IS_ENTRY(widget)) { - gtk_signal_connect(GTK_OBJECT(widget), "changed", - company_entry_changed, editor); - } -} - -static void -full_name_clicked(GtkWidget *button, EContactEditor *editor) -{ - GnomeDialog *dialog = GNOME_DIALOG(e_contact_editor_fullname_new(editor->name)); - int result; - - gtk_object_set (GTK_OBJECT (dialog), - "is_read_only", editor->is_read_only, - NULL); - gtk_widget_show(GTK_WIDGET(dialog)); - result = gnome_dialog_run (dialog); - - if (result == 0) { - ECardName *name; - GtkWidget *fname_widget; - int style = 0; - - gtk_object_get(GTK_OBJECT(dialog), - "name", &name, - NULL); - - style = file_as_get_style(editor); - - fname_widget = glade_xml_get_widget(editor->gui, "entry-fullname"); - if (fname_widget && GTK_IS_ENTRY(fname_widget)) { - char *full_name = e_card_name_to_string(name); - e_utf8_gtk_entry_set_text(GTK_ENTRY(fname_widget), full_name); - g_free(full_name); - } - - e_card_name_free(editor->name); - editor->name = e_card_name_copy(name); - - file_as_set_style(editor, style); - } - gtk_object_unref(GTK_OBJECT(dialog)); -} - -static void -full_addr_clicked(GtkWidget *button, EContactEditor *editor) -{ - GnomeDialog *dialog; - int result; - const ECardDeliveryAddress *address; - - address = e_card_simple_get_delivery_address(editor->simple, editor->address_choice); - - dialog = GNOME_DIALOG(e_contact_editor_address_new(address)); - gtk_object_set (GTK_OBJECT (dialog), - "is_read_only", editor->is_read_only, - NULL); - gtk_widget_show(GTK_WIDGET(dialog)); - - result = gnome_dialog_run (dialog); - if (result == 0) { - ECardDeliveryAddress *new_address; - GtkWidget *address_widget; - - gtk_object_get(GTK_OBJECT(dialog), - "address", &new_address, - NULL); - - address_widget = glade_xml_get_widget(editor->gui, "text-address"); - if (address_widget && GTK_IS_EDITABLE(address_widget)) { - char *string = e_card_delivery_address_to_string(new_address); - e_utf8_gtk_editable_set_text(GTK_EDITABLE(address_widget), string); - g_free(string); - } else { - ECardAddrLabel *address = e_card_delivery_address_to_label(new_address); - e_card_simple_set_address(editor->simple, editor->address_choice, address); - e_card_address_label_free(address); - } - - e_card_simple_set_delivery_address(editor->simple, editor->address_choice, new_address); - - e_card_delivery_address_free(new_address); - } - gtk_object_unref(GTK_OBJECT(dialog)); -} - -static void -categories_clicked(GtkWidget *button, EContactEditor *editor) -{ - char *categories; - GnomeDialog *dialog; - int result; - GtkWidget *entry = glade_xml_get_widget(editor->gui, "entry-categories"); - if (entry && GTK_IS_ENTRY(entry)) - categories = e_utf8_gtk_entry_get_text(GTK_ENTRY(entry)); - else if (editor->card) - gtk_object_get(GTK_OBJECT(editor->card), - "categories", &categories, - NULL); - dialog = GNOME_DIALOG(e_categories_new(categories)); - gtk_object_set(GTK_OBJECT(dialog), - "header", _("This contact belongs to these categories:"), - NULL); - gtk_widget_show(GTK_WIDGET(dialog)); - result = gnome_dialog_run (dialog); - g_free (categories); - if (result == 0) { - gtk_object_get(GTK_OBJECT(dialog), - "categories", &categories, - NULL); - if (entry && GTK_IS_ENTRY(entry)) - e_utf8_gtk_entry_set_text(GTK_ENTRY(entry), categories); - else - gtk_object_set(GTK_OBJECT(editor->card), - "categories", categories, - NULL); - g_free(categories); - } - gtk_object_destroy(GTK_OBJECT(dialog)); -#if 0 - if (!entry) - g_free(categories); -#endif -} - -/* Emits the signal to request saving a card */ -static void -save_card (EContactEditor *ce) -{ - extract_info (ce); - e_card_simple_sync_card (ce->simple); - - if (ce->is_new_card) - gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[ADD_CARD], - ce->card); - else - gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[COMMIT_CARD], - ce->card); - - /* FIXME: should we set the ce->is_new_card here or have the client code - * set the "is_new_card" argument on the contact editor object? - */ - - ce->is_new_card = FALSE; -} - -/* Closes the dialog box and emits the appropriate signals */ -static void -close_dialog (EContactEditor *ce) -{ - g_assert (ce->app != NULL); - - gtk_widget_destroy (ce->app); - ce->app = NULL; - - gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[EDITOR_CLOSED]); -} - -/* Menu callbacks */ - -/* File/Save callback */ -static void -file_save_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - save_card (ce); -} - -/* File/Close callback */ -static void -file_close_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - close_dialog (ce); -} - -static void -file_save_as_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce; - ECard *card; - - ce = E_CONTACT_EDITOR (data); - - extract_info (ce); - e_card_simple_sync_card (ce->simple); - - card = ce->card; - e_contact_save_as("Save as VCard", card); -} - -static void -file_send_as_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce; - ECard *card; - - ce = E_CONTACT_EDITOR (data); - - extract_info (ce); - e_card_simple_sync_card (ce->simple); - - card = ce->card; - e_card_send(card, E_CARD_DISPOSITION_AS_ATTACHMENT); -} - -static void -file_send_to_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce; - ECard *card; - - ce = E_CONTACT_EDITOR (data); - - extract_info (ce); - e_card_simple_sync_card (ce->simple); - - card = ce->card; - e_card_send(card, E_CARD_DISPOSITION_AS_TO); -} - -gboolean -e_contact_editor_confirm_delete(GtkWindow *parent) -{ - GnomeDialog *dialog; - GladeXML *gui; - int result; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-contact-editor-confirm-delete.glade", NULL); - - dialog = GNOME_DIALOG(glade_xml_get_widget(gui, "confirm-dialog")); - - gnome_dialog_set_parent(dialog, parent); - - result = gnome_dialog_run_and_close(dialog); - - gtk_object_unref(GTK_OBJECT(gui)); - - return !result; -} - -static void -delete_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce = E_CONTACT_EDITOR (data); - ECard *card = ce->card; - ECardSimple *simple = ce->simple; - - gtk_object_ref(GTK_OBJECT(card)); - gtk_object_ref(GTK_OBJECT(simple)); - - if (e_contact_editor_confirm_delete(GTK_WINDOW(ce->app))) { - - extract_info (ce); - e_card_simple_sync_card (simple); - - if (!ce->is_new_card) - gtk_signal_emit (GTK_OBJECT (ce), contact_editor_signals[DELETE_CARD], - card); - - file_close_cb(widget, data); - } - - gtk_object_unref(GTK_OBJECT(card)); - gtk_object_unref(GTK_OBJECT(simple)); -} - -/* Emits the signal to request printing a card */ -static void -print_cb (BonoboUIComponent *uih, void *data, const char *path) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - - extract_info (ce); - e_card_simple_sync_card (ce->simple); - - gtk_widget_show(e_contact_print_card_dialog_new(ce->card)); -} - -/* Emits the signal to request printing a card */ -static void -print_envelope_cb (BonoboUIComponent *uih, void *data, const char *path) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - - extract_info (ce); - e_card_simple_sync_card (ce->simple); - - gtk_widget_show(e_contact_print_envelope_dialog_new(ce->card)); -} - -/* Toolbar/Save and Close callback */ -static void -tb_save_and_close_cb (BonoboUIComponent *uih, void *data, const char *path) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - save_card (ce); - close_dialog (ce); -} - -static -BonoboUIVerb verbs [] = { - BONOBO_UI_UNSAFE_VERB ("ContactEditorSave", file_save_cb), - BONOBO_UI_UNSAFE_VERB ("ContactEditorSaveAs", file_save_as_cb), - BONOBO_UI_UNSAFE_VERB ("ContactEditorSaveClose", tb_save_and_close_cb), - BONOBO_UI_UNSAFE_VERB ("ContactEditorSendAs", file_send_as_cb), - BONOBO_UI_UNSAFE_VERB ("ContactEditorSendTo", file_send_to_cb), - BONOBO_UI_UNSAFE_VERB ("ContactEditorDelete", delete_cb), - BONOBO_UI_UNSAFE_VERB ("ContactEditorPrint", print_cb), - BONOBO_UI_UNSAFE_VERB ("ContactEditorPrintEnvelope", print_envelope_cb), - /* BONOBO_UI_UNSAFE_VERB ("ContactEditorPageSetup", file_page_setup_menu), */ - BONOBO_UI_UNSAFE_VERB ("ContactEditorClose", file_close_cb), - - BONOBO_UI_VERB_END -}; - -static void -create_ui (EContactEditor *ce) -{ - bonobo_ui_component_add_verb_list_with_data ( - ce->uic, verbs, ce); - - bonobo_ui_util_set_ui (ce->uic, EVOLUTION_DATADIR, - "evolution-contact-editor.xml", - "evolution-contact-editor"); -} - -/* Callback used when the dialog box is destroyed */ -static gint -app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - - close_dialog (ce); - return TRUE; -} - -static GList * -add_to_tab_order(GList *list, GladeXML *gui, char *name) -{ - GtkWidget *widget = glade_xml_get_widget(gui, name); - return g_list_prepend(list, widget); -} - -static void -setup_tab_order(GladeXML *gui) -{ - GtkWidget *container; - GList *list = NULL; - - container = glade_xml_get_widget(gui, "table-contact-editor-general"); - - if (container) { - list = add_to_tab_order(list, gui, "entry-fullname"); - list = add_to_tab_order(list, gui, "entry-jobtitle"); - list = add_to_tab_order(list, gui, "entry-company"); - list = add_to_tab_order(list, gui, "combo-file-as"); - list = add_to_tab_order(list, gui, "entry-phone1"); - list = add_to_tab_order(list, gui, "entry-phone2"); - list = add_to_tab_order(list, gui, "entry-phone3"); - list = add_to_tab_order(list, gui, "entry-phone4"); - list = g_list_reverse(list); - e_container_change_tab_order(GTK_CONTAINER(container), list); - g_list_free(list); - - list = NULL; - list = add_to_tab_order(list, gui, "entry-email1"); - list = add_to_tab_order(list, gui, "entry-web"); - list = add_to_tab_order(list, gui, "text-address"); - list = add_to_tab_order(list, gui, "alignment-contacts"); - list = g_list_reverse(list); - e_container_change_tab_order(GTK_CONTAINER(container), list); - g_list_free(list); - } -} - -static void -e_contact_editor_init (EContactEditor *e_contact_editor) -{ - GladeXML *gui; - GtkWidget *widget; - GtkWidget *bonobo_win; - GtkWidget *wants_html; - BonoboUIContainer *container; - - e_contact_editor->email_info = NULL; - e_contact_editor->phone_info = NULL; - e_contact_editor->address_info = NULL; - e_contact_editor->email_popup = NULL; - e_contact_editor->phone_popup = NULL; - e_contact_editor->address_popup = NULL; - e_contact_editor->email_list = NULL; - e_contact_editor->phone_list = NULL; - e_contact_editor->address_list = NULL; - e_contact_editor->name = e_card_name_new(); - e_contact_editor->company = g_strdup(""); - - e_contact_editor->email_choice = 0; - e_contact_editor->phone_choice[0] = E_CARD_SIMPLE_PHONE_ID_BUSINESS; - e_contact_editor->phone_choice[1] = E_CARD_SIMPLE_PHONE_ID_HOME; - e_contact_editor->phone_choice[2] = E_CARD_SIMPLE_PHONE_ID_BUSINESS_FAX; - e_contact_editor->phone_choice[3] = E_CARD_SIMPLE_PHONE_ID_MOBILE; - e_contact_editor->address_choice = 0; - - e_contact_editor->arbitrary_fields = NULL; - - e_contact_editor->simple = e_card_simple_new(NULL); - - e_contact_editor->card = NULL; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL); - e_contact_editor->gui = gui; - - setup_tab_order(gui); - - e_contact_editor->app = glade_xml_get_widget (gui, "contact editor"); - - e_container_foreach_leaf (GTK_CONTAINER (e_contact_editor->app), - (GtkCallback) add_field_callback, - e_contact_editor); - - _replace_buttons(e_contact_editor); - set_entry_changed_signals(e_contact_editor); - - wants_html = glade_xml_get_widget(e_contact_editor->gui, "checkbutton-htmlmail"); - if (wants_html && GTK_IS_TOGGLE_BUTTON(wants_html)) - gtk_signal_connect(GTK_OBJECT(wants_html), "toggled", - wants_html_changed, e_contact_editor); - - widget = glade_xml_get_widget(e_contact_editor->gui, "button-fullname"); - if (widget && GTK_IS_BUTTON(widget)) - gtk_signal_connect(GTK_OBJECT(widget), "clicked", - full_name_clicked, e_contact_editor); - - widget = glade_xml_get_widget(e_contact_editor->gui, "button-fulladdr"); - if (widget && GTK_IS_BUTTON(widget)) - gtk_signal_connect(GTK_OBJECT(widget), "clicked", - full_addr_clicked, e_contact_editor); - - widget = glade_xml_get_widget(e_contact_editor->gui, "button-categories"); - if (widget && GTK_IS_BUTTON(widget)) - gtk_signal_connect(GTK_OBJECT(widget), "clicked", - categories_clicked, e_contact_editor); - - - /* Construct the app */ - bonobo_win = bonobo_window_new ("contact-editor-dialog", "Contact Editor"); - - /* FIXME: The sucking bit */ - { - GtkWidget *contents; - - contents = gnome_dock_get_client_area ( - GNOME_DOCK (GNOME_APP (e_contact_editor->app)->dock)); - if (!contents) { - g_message ("contact_editor_construct(): Could not get contents"); - return; - } - gtk_widget_ref (contents); - gtk_container_remove (GTK_CONTAINER (contents->parent), contents); - bonobo_window_set_contents (BONOBO_WINDOW (bonobo_win), contents); - gtk_widget_destroy (e_contact_editor->app); - e_contact_editor->app = bonobo_win; - } - - /* Build the menu and toolbar */ - - container = bonobo_ui_container_new (); - bonobo_ui_container_set_win (container, BONOBO_WINDOW (e_contact_editor->app)); - - e_contact_editor->uic = bonobo_ui_component_new_default (); - if (!e_contact_editor->uic) { - g_message ("e_contact_editor_init(): eeeeek, could not create the UI handler!"); - return; - } - bonobo_ui_component_set_container (e_contact_editor->uic, - bonobo_object_corba_objref ( - BONOBO_OBJECT (container))); - - create_ui (e_contact_editor); - - /* Connect to the deletion of the dialog */ - - gtk_signal_connect (GTK_OBJECT (e_contact_editor->app), "delete_event", - GTK_SIGNAL_FUNC (app_delete_event_cb), e_contact_editor); -} - -void -e_contact_editor_destroy (GtkObject *object) { - EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object); - - if (e_contact_editor->writable_fields) { - gtk_object_unref(GTK_OBJECT(e_contact_editor->writable_fields)); - } - if (e_contact_editor->email_list) { - g_list_foreach(e_contact_editor->email_list, (GFunc) g_free, NULL); - g_list_free(e_contact_editor->email_list); - } - if (e_contact_editor->email_info) { - g_free(e_contact_editor->email_info); - } - if (e_contact_editor->email_popup) { - gtk_widget_unref(e_contact_editor->email_popup); - } - - if (e_contact_editor->phone_list) { - g_list_foreach(e_contact_editor->phone_list, (GFunc) g_free, NULL); - g_list_free(e_contact_editor->phone_list); - } - if (e_contact_editor->phone_info) { - g_free(e_contact_editor->phone_info); - } - if (e_contact_editor->phone_popup) { - gtk_widget_unref(e_contact_editor->phone_popup); - } - - if (e_contact_editor->address_list) { - g_list_foreach(e_contact_editor->address_list, (GFunc) g_free, NULL); - g_list_free(e_contact_editor->address_list); - } - if (e_contact_editor->address_info) { - g_free(e_contact_editor->address_info); - } - if (e_contact_editor->address_popup) { - gtk_widget_unref(e_contact_editor->address_popup); - } - - if (e_contact_editor->simple) - gtk_object_unref(GTK_OBJECT(e_contact_editor->simple)); - - if (e_contact_editor->name) - e_card_name_free(e_contact_editor->name); - - g_free (e_contact_editor->company); - - gtk_object_unref(GTK_OBJECT(e_contact_editor->gui)); -} - -EContactEditor * -e_contact_editor_new (ECard *card, - gboolean is_new_card, - EList *fields, - gboolean is_read_only) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (gtk_type_new (E_CONTACT_EDITOR_TYPE)); - - gtk_object_set (GTK_OBJECT (ce), - "card", card, - "is_new_card", is_new_card, - "writable_fields", fields, - "is_read_only", is_read_only, - NULL); - - gtk_widget_show (ce->app); - return ce; -} - -static void -e_contact_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) -{ - EContactEditor *editor; - - editor = E_CONTACT_EDITOR (o); - - switch (arg_id){ - case ARG_CARD: - if (editor->card) - gtk_object_unref(GTK_OBJECT(editor->card)); - editor->card = e_card_duplicate(E_CARD(GTK_VALUE_OBJECT (*arg))); - gtk_object_set(GTK_OBJECT(editor->simple), - "card", editor->card, - NULL); - fill_in_info(editor); - break; - - case ARG_IS_NEW_CARD: - editor->is_new_card = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; - break; - - case ARG_IS_READ_ONLY: { - gboolean new_value = GTK_VALUE_BOOL (*arg) ? TRUE : FALSE; - gboolean changed = (editor->is_read_only != new_value); - - editor->is_read_only = new_value; - - if (changed) - set_read_only (editor); - break; - } - case ARG_WRITABLE_FIELDS: - if (editor->writable_fields) - gtk_object_unref(GTK_OBJECT(editor->writable_fields)); - editor->writable_fields = GTK_VALUE_POINTER (*arg); - if (editor->writable_fields) - gtk_object_ref (GTK_OBJECT (editor->writable_fields)); - else - editor->writable_fields = e_list_new(NULL, NULL, NULL); - enable_writable_fields (editor); - break; - } -} - -static void -e_contact_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - EContactEditor *e_contact_editor; - - e_contact_editor = E_CONTACT_EDITOR (object); - - switch (arg_id) { - case ARG_CARD: - e_card_simple_sync_card(e_contact_editor->simple); - extract_info(e_contact_editor); - GTK_VALUE_OBJECT (*arg) = GTK_OBJECT(e_contact_editor->card); - break; - - case ARG_IS_NEW_CARD: - GTK_VALUE_BOOL (*arg) = e_contact_editor->is_new_card ? TRUE : FALSE; - break; - - case ARG_IS_READ_ONLY: - GTK_VALUE_BOOL (*arg) = e_contact_editor->is_read_only ? TRUE : FALSE; - break; - - case ARG_WRITABLE_FIELDS: - if (e_contact_editor->writable_fields) - GTK_VALUE_POINTER (*arg) = e_list_duplicate (e_contact_editor->writable_fields); - else - GTK_VALUE_POINTER (*arg) = NULL; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -_popup_position(GtkMenu *menu, - gint *x, - gint *y, - gpointer data) -{ - GtkWidget *button = GTK_WIDGET(data); - GtkRequisition request; - int mh, mw; - gdk_window_get_origin (button->window, x, y); - *x += button->allocation.width; - *y += button->allocation.height; - - gtk_widget_size_request(GTK_WIDGET(menu), &request); - - mh = request.height; - mw = request.width; - - *x -= mw; - if (*x < 0) - *x = 0; - - if (*y < 0) - *y = 0; - - if ((*x + mw) > gdk_screen_width ()) - *x = gdk_screen_width () - mw; - - if ((*y + mh) > gdk_screen_height ()) - *y = gdk_screen_height () - mh; -} - -static gint -_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor, GtkWidget *popup, GList **list, GnomeUIInfo **info, gchar *label, gchar *entry, gchar *dialog_title) -{ - gint menu_item; - gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "button_press_event"); - gtk_widget_realize(popup); - menu_item = gnome_popup_menu_do_popup_modal(popup, _popup_position, widget, button, editor); - if ( menu_item != -1 ) { -#if 0 - if (menu_item == g_list_length (*list)) { - e_contact_editor_build_dialog(editor, entry, label, dialog_title, list, info); - } else { -#endif - GtkWidget *label_widget = glade_xml_get_widget(editor->gui, label); - if (label_widget && GTK_IS_LABEL(label_widget)) { - gtk_object_set(GTK_OBJECT(label_widget), - "label", _(g_list_nth_data(*list, menu_item)), - NULL); - } -#if 0 - } -#endif - } - return menu_item; -} - -static void -e_contact_editor_build_ui_info(GList *list, GnomeUIInfo **infop) -{ - GnomeUIInfo *info; - GnomeUIInfo singleton = { GNOME_APP_UI_TOGGLEITEM, NULL, NULL, NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, 0, 0, 0, NULL }; - GnomeUIInfo end = GNOMEUIINFO_END; - int length; - int i; - - info = *infop; - - if ( info ) - g_free(info); - length = g_list_length( list ); - info = g_new(GnomeUIInfo, length + 2); - for (i = 0; i < length; i++) { - info[i] = singleton; - info[i].label = _(list->data); - list = list->next; - } - info[i] = end; - - *infop = info; -} - -static void -e_contact_editor_build_phone_ui (EContactEditor *editor) -{ - int i; - - if (editor->phone_list == NULL) { - static char *info[] = { - N_("Assistant"), - N_("Business"), - N_("Business 2"), - N_("Business Fax"), - N_("Callback"), - N_("Car"), - N_("Company"), - N_("Home"), - N_("Home 2"), - N_("Home Fax"), - N_("ISDN"), - N_("Mobile"), - N_("Other"), - N_("Other Fax"), - N_("Pager"), - N_("Primary"), - N_("Radio"), - N_("Telex"), - N_("TTY/TDD") - }; - - for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { - editor->phone_list = g_list_append(editor->phone_list, g_strdup(info[i])); - } - } - if (editor->phone_info == NULL) { - e_contact_editor_build_ui_info(editor->phone_list, &editor->phone_info); - - if ( editor->phone_popup ) - gtk_widget_unref(editor->phone_popup); - - editor->phone_popup = gnome_popup_menu_new(editor->phone_info); - } -} - -static void -e_contact_editor_build_email_ui (EContactEditor *editor) -{ - int i; - - if (editor->email_list == NULL) { - static char *info[] = { - N_("Primary Email"), - N_("Email 2"), - N_("Email 3") - }; - - for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { - editor->email_list = g_list_append(editor->email_list, g_strdup(info[i])); - } - } - if (editor->email_info == NULL) { - e_contact_editor_build_ui_info(editor->email_list, &editor->email_info); - - if ( editor->email_popup ) - gtk_widget_unref(editor->email_popup); - - editor->email_popup = gnome_popup_menu_new(editor->email_info); - } -} - -static void -e_contact_editor_build_address_ui (EContactEditor *editor) -{ - int i; - - if (editor->address_list == NULL) { - static char *info[] = { - N_("Business"), - N_("Home"), - N_("Other") - }; - - for (i = 0; i < sizeof(info) / sizeof(info[0]); i++) { - editor->address_list = g_list_append(editor->address_list, g_strdup(info[i])); - } - } - if (editor->address_info == NULL) { - e_contact_editor_build_ui_info(editor->address_list, &editor->address_info); - - if ( editor->address_popup ) - gtk_widget_unref(editor->address_popup); - - editor->address_popup = gnome_popup_menu_new(editor->address_info); - } -} -#if 0 -static void -_dialog_clicked(GtkWidget *dialog, gint button, EContactEditor *editor) -{ - GtkWidget *label = gtk_object_get_data(GTK_OBJECT(dialog), - "e_contact_editor_label"); - - GtkWidget *dialog_entry = gtk_object_get_data(GTK_OBJECT(dialog), - "e_contact_editor_dialog_entry"); - - GList **list = gtk_object_get_data(GTK_OBJECT(dialog), - "e_contact_editor_list"); - GList **info = gtk_object_get_data(GTK_OBJECT(dialog), - "e_contact_editor_info"); - switch (button) { - case 0: - if (label && GTK_IS_LABEL(label)) { - gtk_object_set(GTK_OBJECT(label), - "label", gtk_entry_get_text(GTK_ENTRY(dialog_entry)), - NULL); - *list = g_list_append(*list, e_utf8_gtk_entry_get_text(GTK_ENTRY(dialog_entry))); - g_free(*info); - *info = NULL; - } - break; - } - gnome_dialog_close(GNOME_DIALOG(dialog)); -} - -static void -_dialog_destroy(EContactEditor *editor, GtkWidget *dialog) -{ - gnome_dialog_close(GNOME_DIALOG(dialog)); -} - -static GtkWidget * -e_contact_editor_build_dialog(EContactEditor *editor, gchar *entry_id, gchar *label_id, gchar *title, GList **list, GnomeUIInfo **info) -{ - GtkWidget *dialog_entry = gtk_entry_new(); - GtkWidget *entry = glade_xml_get_widget(editor->gui, entry_id); - GtkWidget *label = glade_xml_get_widget(editor->gui, label_id); - - GtkWidget *dialog = gnome_dialog_new(title, - NULL); - - gtk_container_add(GTK_CONTAINER(GNOME_DIALOG(dialog)->vbox), - gtk_widget_new (gtk_frame_get_type(), - "border_width", 4, - "label", title, - "child", gtk_widget_new(gtk_alignment_get_type(), - "child", dialog_entry, - "xalign", .5, - "yalign", .5, - "xscale", 1.0, - "yscale", 1.0, - "border_width", 9, - NULL), - NULL)); - - gnome_dialog_append_button_with_pixmap(GNOME_DIALOG(dialog), - "Add", - GNOME_STOCK_PIXMAP_ADD); - gnome_dialog_append_button(GNOME_DIALOG(dialog), GNOME_STOCK_BUTTON_CANCEL); - gnome_dialog_set_default(GNOME_DIALOG(dialog), 0); - - gtk_signal_connect(GTK_OBJECT(dialog), "clicked", - _dialog_clicked, editor); - gtk_signal_connect_while_alive(GTK_OBJECT(editor), "destroy", - _dialog_destroy, GTK_OBJECT(dialog), GTK_OBJECT(dialog)); - - gtk_object_set_data(GTK_OBJECT(dialog), - "e_contact_editor_entry", entry); - gtk_object_set_data(GTK_OBJECT(dialog), - "e_contact_editor_label", label); - gtk_object_set_data(GTK_OBJECT(dialog), - "e_contact_editor_dialog_entry", dialog_entry); - gtk_object_set_data(GTK_OBJECT(dialog), - "e_contact_editor_list", list); - gtk_object_set_data(GTK_OBJECT(dialog), - "e_contact_editor_info", info); - - gtk_widget_show_all(dialog); - return dialog; -} -#endif - -static void -_phone_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) -{ - int which; - int i; - gchar *label; - gchar *entry; - int result; - if ( widget == glade_xml_get_widget(editor->gui, "button-phone1") ) { - which = 1; - } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone2") ) { - which = 2; - } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone3") ) { - which = 3; - } else if ( widget == glade_xml_get_widget(editor->gui, "button-phone4") ) { - which = 4; - } else - return; - - label = g_strdup_printf("label-phone%d", which); - entry = g_strdup_printf("entry-phone%d", which); - - e_contact_editor_build_phone_ui (editor); - - for(i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i++) { - const ECardPhone *phone = e_card_simple_get_phone(editor->simple, i); - gboolean checked; - checked = phone && phone->number && *phone->number; - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->phone_info[i].widget), - checked); - gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->phone_info[i].widget), - TRUE); - } - - result = _arrow_pressed (widget, button, editor, editor->phone_popup, &editor->phone_list, &editor->phone_info, label, entry, "Add new phone number type"); - - if (result != -1) { - editor->phone_choice[which - 1] = result; - set_fields(editor); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, label), TRUE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, entry), !editor->is_read_only); - } - - g_free(label); - g_free(entry); -} - -static void -_email_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) -{ - int i; - int result; - - e_contact_editor_build_email_ui (editor); - - for(i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i++) { - const char *string = e_card_simple_get_email(editor->simple, i); - gboolean checked; - checked = string && *string; - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->email_info[i].widget), - checked); - gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->email_info[i].widget), - TRUE); - } - - result = _arrow_pressed (widget, button, editor, editor->email_popup, &editor->email_list, &editor->email_info, "label-email1", "entry-email1", "Add new Email type"); - - if (result != -1) { - editor->email_choice = result; - set_fields(editor); - - /* make sure the buttons/entry is/are sensitive */ - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), !editor->is_read_only); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), !editor->is_read_only); - } -} - -static void -_address_arrow_pressed (GtkWidget *widget, GdkEventButton *button, EContactEditor *editor) -{ - int i; - int result; - - e_contact_editor_build_address_ui (editor); - - for(i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i++) { - const ECardAddrLabel *address = e_card_simple_get_address(editor->simple, i); - gboolean checked; - checked = address && address->data && *address->data; - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(editor->address_info[i].widget), - checked); - gtk_check_menu_item_set_show_toggle(GTK_CHECK_MENU_ITEM(editor->address_info[i].widget), - TRUE); - } - - result = _arrow_pressed (widget, button, editor, editor->address_popup, &editor->address_list, &editor->address_info, "label-address", "text-address", "Add new Address type"); - - if (result != -1) { - set_address_field(editor, result); - - /* make sure the buttons/entry is/are sensitive */ - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), TRUE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), !editor->is_read_only); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), !editor->is_read_only); - } -} - -static void -set_field(GtkEntry *entry, const char *string) -{ - char *oldstring = e_utf8_gtk_entry_get_text(entry); - if (!string) - string = ""; - if (strcmp(string, oldstring)) - e_utf8_gtk_entry_set_text(entry, string); - g_free (oldstring); -} - -static void -set_phone_field(GtkWidget *entry, const ECardPhone *phone) -{ - set_field(GTK_ENTRY(entry), phone ? phone->number : ""); -} - -static void -set_fields(EContactEditor *editor) -{ - GtkWidget *entry; - - entry = glade_xml_get_widget(editor->gui, "entry-phone1"); - if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[0])); - - entry = glade_xml_get_widget(editor->gui, "entry-phone2"); - if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[1])); - - entry = glade_xml_get_widget(editor->gui, "entry-phone3"); - if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[2])); - - entry = glade_xml_get_widget(editor->gui, "entry-phone4"); - if (entry && GTK_IS_ENTRY(entry)) - set_phone_field(entry, e_card_simple_get_phone(editor->simple, editor->phone_choice[3])); - - entry = glade_xml_get_widget(editor->gui, "entry-email1"); - if (entry && GTK_IS_ENTRY(entry)) - set_field(GTK_ENTRY(entry), e_card_simple_get_email(editor->simple, editor->email_choice)); - - set_address_field(editor, -1); -} - -static void -set_address_field(EContactEditor *editor, int result) -{ - GtkWidget *widget; - - widget = glade_xml_get_widget(editor->gui, "text-address"); - - if (widget && GTK_IS_TEXT(widget)) { - int position; - GtkEditable *editable; - const ECardAddrLabel *address; - - if (result == -1) - result = editor->address_choice; - editor->address_choice = -1; - - position = 0; - editable = GTK_EDITABLE(widget); - gtk_editable_delete_text(editable, 0, -1); - address = e_card_simple_get_address(editor->simple, result); - if (address && address->data) { - gchar *u = e_utf8_to_gtk_string ((GtkWidget *) editable, address->data); - gtk_editable_insert_text(editable, u, strlen(u), &position); - g_free (u); - } - - editor->address_choice = result; - } -} - -static void -add_field_callback(GtkWidget *widget, EContactEditor *editor) -{ - const char *name; - int i; - static const char *builtins[] = { - "entry-fullname", - "entry-web", - "entry-company", - "entry-department", - "entry-office", - "entry-jobtitle", - "entry-profession", - "entry-manager", - "entry-assistant", - "entry-nickname", - "entry-spouse", - "text-comments", - "entry-categories", - "entry-contacts", - "entry-file-as", - "dateedit-anniversary", - "dateedit-birthday", - "entry-phone1", - "entry-phone2", - "entry-phone3", - "entry-phone4", - "entry-email1", - "text-address", - "checkbutton-mailingaddress", - "checkbutton-htmlmail", - NULL - }; - name = glade_get_widget_name(widget); - if (name) { - for (i = 0; builtins[i]; i++) { - if (!strcmp(name, builtins[i])) - return; - } - if (GTK_IS_ENTRY(widget) || GTK_IS_TEXT(widget)) { - editor->arbitrary_fields = g_list_prepend(editor->arbitrary_fields, g_strdup(name)); - } - } -} - -struct { - char *id; - char *key; -} field_mapping [] = { - { "entry-fullname", "full_name" }, - { "entry-web", "url" }, - { "entry-company", "org" }, - { "entry-department", "org_unit" }, - { "entry-office", "office" }, - { "entry-jobtitle", "title" }, - { "entry-profession", "role" }, - { "entry-manager", "manager" }, - { "entry-assistant", "assistant" }, - { "entry-nickname", "nickname" }, - { "entry-spouse", "spouse" }, - { "text-comments", "note" }, - { "entry-categories", "categories" }, -}; - -static void -fill_in_field(EContactEditor *editor, char *id, char *value) -{ - GtkWidget *widget = glade_xml_get_widget(editor->gui, id); - if (widget && GTK_IS_EDITABLE(widget)) { - int position = 0; - GtkEditable *editable = GTK_EDITABLE(widget); - gtk_editable_delete_text(editable, 0, -1); - if (value) { - gchar *u = e_utf8_to_gtk_string ((GtkWidget *) editable, value); - gtk_editable_insert_text(editable, u, strlen(u), &position); - g_free (u); - } - } -} - -static void -fill_in_card_field(EContactEditor *editor, ECard *card, char *id, char *key) -{ - char *string; - gtk_object_get(GTK_OBJECT(card), - key, &string, - NULL); - fill_in_field(editor, id, string); -} - -static void -fill_in_single_field(EContactEditor *editor, char *name) -{ - ECardSimple *simple = editor->simple; - GtkWidget *widget = glade_xml_get_widget(editor->gui, name); - if (widget && GTK_IS_EDITABLE(widget)) { - int position = 0; - GtkEditable *editable = GTK_EDITABLE(widget); - const ECardArbitrary *arbitrary; - - gtk_editable_delete_text(editable, 0, -1); - arbitrary = e_card_simple_get_arbitrary(simple, - name); - if (arbitrary && arbitrary->value) { - gchar *u = e_utf8_to_gtk_string ((GtkWidget *) editable, arbitrary->value); - gtk_editable_insert_text(editable, u, strlen(u), &position); - g_free (u); - } - } -} - -static void -disable_widget_foreach (char *key, GtkWidget *widget, gpointer closure) -{ - gtk_widget_set_sensitive (widget, FALSE); -} - -static struct { - char *widget_name; - ECardSimpleField field_id; - gboolean desensitize_for_read_only; -} widget_field_mappings[] = { - { "entry-web", E_CARD_SIMPLE_FIELD_URL, TRUE }, - { "accellabel-web", E_CARD_SIMPLE_FIELD_URL }, - - { "entry-jobtitle", E_CARD_SIMPLE_FIELD_TITLE, TRUE }, - { "label-jobtitle", E_CARD_SIMPLE_FIELD_TITLE }, - - { "entry-company", E_CARD_SIMPLE_FIELD_ORG, TRUE }, - { "label-company", E_CARD_SIMPLE_FIELD_ORG }, - - { "combo-file-as", E_CARD_SIMPLE_FIELD_FILE_AS, TRUE }, - { "entry-file-as", E_CARD_SIMPLE_FIELD_FILE_AS, TRUE }, - { "accellabel-fileas", E_CARD_SIMPLE_FIELD_FILE_AS }, - - { "label-department", E_CARD_SIMPLE_FIELD_ORG_UNIT }, - { "entry-department", E_CARD_SIMPLE_FIELD_ORG_UNIT, TRUE }, - - { "label-office", E_CARD_SIMPLE_FIELD_OFFICE }, - { "entry-office", E_CARD_SIMPLE_FIELD_OFFICE, TRUE }, - - { "label-profession", E_CARD_SIMPLE_FIELD_ROLE }, - { "entry-profession", E_CARD_SIMPLE_FIELD_ROLE, TRUE }, - - { "label-manager", E_CARD_SIMPLE_FIELD_MANAGER }, - { "entry-manager", E_CARD_SIMPLE_FIELD_MANAGER, TRUE }, - - { "label-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT }, - { "entry-assistant", E_CARD_SIMPLE_FIELD_ASSISTANT, TRUE }, - - { "label-nickname", E_CARD_SIMPLE_FIELD_NICKNAME }, - { "entry-nickname", E_CARD_SIMPLE_FIELD_NICKNAME, TRUE }, - - { "label-spouse", E_CARD_SIMPLE_FIELD_SPOUSE }, - { "entry-spouse", E_CARD_SIMPLE_FIELD_SPOUSE, TRUE }, - - { "label-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE }, - { "dateedit-birthday", E_CARD_SIMPLE_FIELD_BIRTH_DATE, TRUE }, - - { "label-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY }, - { "dateedit-anniversary", E_CARD_SIMPLE_FIELD_ANNIVERSARY, TRUE }, - - { "label-comments", E_CARD_SIMPLE_FIELD_NOTE }, - { "text-comments", E_CARD_SIMPLE_FIELD_NOTE, TRUE }, - - { "button-fullname", E_CARD_SIMPLE_FIELD_FULL_NAME }, - { "entry-fullname", E_CARD_SIMPLE_FIELD_FULL_NAME, TRUE }, - - { "button-categories", E_CARD_SIMPLE_FIELD_CATEGORIES, TRUE }, - { "entry-categories", E_CARD_SIMPLE_FIELD_CATEGORIES, TRUE } -}; -static int num_widget_field_mappings = sizeof(widget_field_mappings) / sizeof (widget_field_mappings[0]); - -static void -enable_writable_fields(EContactEditor *editor) -{ - EList *fields = editor->writable_fields; - EIterator *iter; - GHashTable *dropdown_hash, *supported_hash; - int i; - ECardSimple *card; - char *widget_name; - - if (!fields) - return; - - card = e_card_simple_new (e_card_new ("")); - - dropdown_hash = g_hash_table_new (g_str_hash, g_str_equal); - supported_hash = g_hash_table_new (g_str_hash, g_str_equal); - - /* build our hashtable of the drop down menu items */ - e_contact_editor_build_phone_ui (editor); - for (i = 0; i < E_CARD_SIMPLE_PHONE_ID_LAST; i ++) - g_hash_table_insert (dropdown_hash, - (char*)e_card_simple_get_ecard_field(card, e_card_simple_map_phone_to_field (i)), - editor->phone_info[i].widget); - e_contact_editor_build_email_ui (editor); - for (i = 0; i < E_CARD_SIMPLE_EMAIL_ID_LAST; i ++) - g_hash_table_insert (dropdown_hash, - (char*)e_card_simple_get_ecard_field(card, e_card_simple_map_email_to_field (i)), - editor->email_info[i].widget); - e_contact_editor_build_address_ui (editor); - for (i = 0; i < E_CARD_SIMPLE_ADDRESS_ID_LAST; i ++) - g_hash_table_insert (dropdown_hash, - (char*)e_card_simple_get_ecard_field(card, e_card_simple_map_address_to_field (i)), - editor->address_info[i].widget); - - /* then disable them all */ - g_hash_table_foreach (dropdown_hash, (GHFunc)disable_widget_foreach, NULL); - - /* disable the label widgets for the dropdowns (4 phone, 1 - email and the toggle button, and 1 address and one for - the full adress button */ - for (i = 0; i < 4; i ++) { - widget_name = g_strdup_printf ("label-phone%d", i+1); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), FALSE); - g_free (widget_name); - widget_name = g_strdup_printf ("entry-phone%d", i+1); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), FALSE); - g_free (widget_name); - } - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), FALSE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), FALSE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), FALSE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), FALSE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), FALSE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), FALSE); - - /* enable widgets that map directly from a field to a widget (the drop down items) */ - iter = e_list_get_iterator (fields); - for (; e_iterator_is_valid (iter); e_iterator_next (iter)) { - char *field = (char*)e_iterator_get (iter); - GtkWidget *widget = g_hash_table_lookup (dropdown_hash, field); - - if (widget) { - gtk_widget_set_sensitive (widget, TRUE); - } - else { - /* if it's not a field that's handled by the - dropdown items, add it to the has to be - used in the second step */ - g_hash_table_insert (supported_hash, field, field); - } - - /* ugh - this is needed to make sure we don't have a - disabled label next to a drop down when the item in - the menu (the one reflected in the label) is - enabled. */ - if (!strcmp (field, e_card_simple_get_ecard_field (card, e_card_simple_map_email_to_field(editor->email_choice)))) { - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-email1"), TRUE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "entry-email1"), !editor->is_read_only); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "checkbutton-htmlmail"), TRUE); - } - else if (!strcmp (field, e_card_simple_get_ecard_field (card, e_card_simple_map_address_to_field(editor->address_choice)))) { - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "label-address"), TRUE); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "button-fulladdr"), !editor->is_read_only); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "text-address"), !editor->is_read_only); - } - else for (i = 0; i < 4; i ++) { - if (!strcmp (field, e_card_simple_get_ecard_field (card, e_card_simple_map_phone_to_field(editor->phone_choice[i])))) { - widget_name = g_strdup_printf ("label-phone%d", i+1); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), TRUE); - g_free (widget_name); - widget_name = g_strdup_printf ("entry-phone%d", i+1); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, widget_name), !editor->is_read_only); - g_free (widget_name); - } - } - } - - /* handle the label next to the dropdown widgets */ - - for (i = 0; i < num_widget_field_mappings; i ++) { - gboolean enabled = g_hash_table_lookup (supported_hash, - e_card_simple_get_ecard_field (card, - widget_field_mappings[i].field_id)) != NULL; - gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, - widget_field_mappings[i].widget_name), enabled); - } - - g_hash_table_destroy (dropdown_hash); - g_hash_table_destroy (supported_hash); -} - -static void -set_read_only (EContactEditor *editor) -{ - int i; - char *label, *entry; - /* set the sensitivity of all the non-dropdown entry/texts/dateedits */ - for (i = 0; i < num_widget_field_mappings; i ++) { - if (widget_field_mappings[i].desensitize_for_read_only) - gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, - widget_field_mappings[i].widget_name), !editor->is_read_only); - } - - /* handle the phone dropdown entries */ - for (i = 0; i < 4; i ++) { - label = g_strdup_printf ("label-phone%d", i+1); - entry = g_strdup_printf ("entry-phone%d", i+1); - - if (GTK_WIDGET_IS_SENSITIVE (glade_xml_get_widget (editor->gui, label))) - gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, - entry), !editor->is_read_only); - - g_free (label); - g_free (entry); - } - - /* handle the email dropdown entry */ - label = "label-email1"; - entry = "entry-email1"; - if (GTK_WIDGET_IS_SENSITIVE (glade_xml_get_widget (editor->gui, label))) { - gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, - entry), !editor->is_read_only); - gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, - "checkbutton-htmlmail"), !editor->is_read_only); - } - - /* handle the address dropdown entry */ - label = "label-address"; - entry = "text-address"; - if (GTK_WIDGET_IS_SENSITIVE (glade_xml_get_widget (editor->gui, label))) - gtk_widget_set_sensitive (glade_xml_get_widget(editor->gui, - entry), !editor->is_read_only); -} - -static void -fill_in_info(EContactEditor *editor) -{ - ECard *card = editor->card; - if (card) { - char *file_as; - ECardName *name; - const ECardDate *anniversary; - const ECardDate *bday; - int i; - GtkWidget *widget; - GList *list; - gboolean wants_html, wants_html_set; - - gtk_object_get(GTK_OBJECT(card), - "file_as", &file_as, - "name", &name, - "anniversary", &anniversary, - "birth_date", &bday, - "wants_html_set",&wants_html_set, - "wants_html", &wants_html, - NULL); - - for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) { - fill_in_card_field(editor, card, field_mapping[i].id, field_mapping[i].key); - } - - for (list = editor->arbitrary_fields; list; list = list->next) { - fill_in_single_field(editor, list->data); - } - - if (wants_html_set) { - GtkWidget *widget = glade_xml_get_widget(editor->gui, "checkbutton-htmlmail"); - if (widget && GTK_IS_CHECK_BUTTON(widget)) { - gtk_object_set(GTK_OBJECT(widget), - "active", wants_html, - NULL); - } - } - - /* File as has to come after company and name or else it'll get messed up when setting them. */ - fill_in_field(editor, "entry-file-as", file_as); - - e_card_name_free(editor->name); - editor->name = e_card_name_copy(name); - - widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary"); - if (anniversary && widget && GNOME_IS_DATE_EDIT(widget)) { - struct tm time_struct = {0,0,0,0,0,0,0,0,0}; - time_t time_val; - GnomeDateEdit *dateedit; - - time_struct.tm_mday = anniversary->day; - time_struct.tm_mon = anniversary->month - 1; - time_struct.tm_year = anniversary->year - 1900; - time_val = mktime(&time_struct); - dateedit = GNOME_DATE_EDIT(widget); - gnome_date_edit_set_time(dateedit, time_val); - } - - widget = glade_xml_get_widget(editor->gui, "dateedit-birthday"); - if (bday && widget && GNOME_IS_DATE_EDIT(widget)) { - struct tm time_struct = {0,0,0,0,0,0,0,0,0}; - time_t time_val; - GnomeDateEdit *dateedit; - time_struct.tm_mday = bday->day; - time_struct.tm_mon = bday->month - 1; - time_struct.tm_year = bday->year - 1900; - time_val = mktime(&time_struct); - dateedit = GNOME_DATE_EDIT(widget); - gnome_date_edit_set_time(dateedit, time_val); - } - - set_fields(editor); - } -} - -static void -extract_field(EContactEditor *editor, ECard *card, char *editable_id, char *key) -{ - GtkWidget *widget = glade_xml_get_widget(editor->gui, editable_id); - if (widget && GTK_IS_EDITABLE(widget)) { - GtkEditable *editable = GTK_EDITABLE(widget); - char *string = e_utf8_gtk_editable_get_chars(editable, 0, -1); - - if (string && *string) - gtk_object_set(GTK_OBJECT(card), - key, string, - NULL); - else - gtk_object_set(GTK_OBJECT(card), - key, NULL, - NULL); - - if (string) g_free(string); - } -} - -static void -extract_single_field(EContactEditor *editor, char *name) -{ - GtkWidget *widget = glade_xml_get_widget(editor->gui, name); - ECardSimple *simple = editor->simple; - if (widget && GTK_IS_EDITABLE(widget)) { - GtkEditable *editable = GTK_EDITABLE(widget); - char *string = e_utf8_gtk_editable_get_chars(editable, 0, -1); - - if (string && *string) - e_card_simple_set_arbitrary(simple, - name, - NULL, - string); - else - e_card_simple_set_arbitrary(simple, - name, - NULL, - NULL); - if (string) g_free(string); - } -} - -static void -extract_info(EContactEditor *editor) -{ - ECard *card = editor->card; - if (card) { - ECardDate *anniversary; - ECardDate *bday; - struct tm time_struct; - time_t time_val; - int i; - GtkWidget *widget; - GList *list; - - widget = glade_xml_get_widget(editor->gui, "entry-file-as"); - if (widget && GTK_IS_EDITABLE(widget)) { - GtkEditable *editable = GTK_EDITABLE(widget); - char *string = e_utf8_gtk_editable_get_chars(editable, 0, -1); - - if (string && *string) - gtk_object_set(GTK_OBJECT(card), - "file_as", string, - NULL); - - if (string) g_free(string); - } - - for (i = 0; i < sizeof(field_mapping) / sizeof(field_mapping[0]); i++) { - extract_field(editor, card, field_mapping[i].id, field_mapping[i].key); - } - - for (list = editor->arbitrary_fields; list; list = list->next) { - extract_single_field(editor, list->data); - } - - if (editor->name) - gtk_object_set(GTK_OBJECT(card), - "name", editor->name, - NULL); - - widget = glade_xml_get_widget(editor->gui, "dateedit-anniversary"); - if (widget && GNOME_IS_DATE_EDIT(widget)) { - time_val = gnome_date_edit_get_date(GNOME_DATE_EDIT(widget)); - gmtime_r(&time_val, - &time_struct); - anniversary = g_new(ECardDate, 1); - anniversary->day = time_struct.tm_mday; - anniversary->month = time_struct.tm_mon + 1; - anniversary->year = time_struct.tm_year + 1900; - gtk_object_set(GTK_OBJECT(card), - "anniversary", anniversary, - NULL); - } - - widget = glade_xml_get_widget(editor->gui, "dateedit-birthday"); - if (widget && GNOME_IS_DATE_EDIT(widget)) { - time_val = gnome_date_edit_get_date(GNOME_DATE_EDIT(widget)); - gmtime_r(&time_val, - &time_struct); - bday = g_new(ECardDate, 1); - bday->day = time_struct.tm_mday; - bday->month = time_struct.tm_mon + 1; - bday->year = time_struct.tm_year + 1900; - gtk_object_set(GTK_OBJECT(card), - "birth_date", bday, - NULL); - } - } -} - -/** - * e_contact_editor_raise: - * @config: The %EContactEditor object. - * - * Raises the dialog associated with this %EContactEditor object. - */ -void -e_contact_editor_raise (EContactEditor *editor) -{ - gdk_window_raise (GTK_WIDGET (editor->app)->window); -} diff --git a/addressbook/contact-editor/e-contact-editor.h b/addressbook/contact-editor/e-contact-editor.h deleted file mode 100644 index bc54dd02b0..0000000000 --- a/addressbook/contact-editor/e-contact-editor.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor.h - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_EDITOR_H__ -#define __E_CONTACT_EDITOR_H__ - -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-app-helper.h> -#include <bonobo/bonobo-ui-component.h> -#include <glade/glade.h> - -#include "addressbook/backend/ebook/e-card.h" -#include "addressbook/backend/ebook/e-card-simple.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EContactEditor - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * card ECard * RW The card currently being edited - */ - -#define E_CONTACT_EDITOR_TYPE (e_contact_editor_get_type ()) -#define E_CONTACT_EDITOR(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_EDITOR_TYPE, EContactEditor)) -#define E_CONTACT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_EDITOR_TYPE, EContactEditorClass)) -#define E_IS_CONTACT_EDITOR(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_EDITOR_TYPE)) -#define E_IS_CONTACT_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_EDITOR_TYPE)) - - -typedef struct _EContactEditor EContactEditor; -typedef struct _EContactEditorClass EContactEditorClass; - -struct _EContactEditor -{ - GtkObject object; - - /* item specific fields */ - ECard *card; - ECardSimple *simple; - - /* UI handler */ - BonoboUIComponent *uic; - - GladeXML *gui; - GtkWidget *app; - GnomeUIInfo *email_info; - GnomeUIInfo *phone_info; - GnomeUIInfo *address_info; - GtkWidget *email_popup; - GtkWidget *phone_popup; - GtkWidget *address_popup; - GList *email_list; - GList *phone_list; - GList *address_list; - - ECardName *name; - char *company; - - ECardSimpleEmailId email_choice; - ECardSimplePhoneId phone_choice[4]; - ECardSimpleAddressId address_choice; - - GList *arbitrary_fields; - - /* Whether we are editing a new card or an existing one */ - guint is_new_card : 1; - - /* Whether the contact editor will accept modifications */ - guint is_read_only : 1; - - EList *writable_fields; -}; - -struct _EContactEditorClass -{ - GtkObjectClass parent_class; - - /* Notification signals */ - - void (* add_card) (EContactEditor *ce, ECard *card); - void (* commit_card) (EContactEditor *ce, ECard *card); - void (* delete_card) (EContactEditor *ce, ECard *card); - void (* editor_closed) (EContactEditor *ce); -}; - -EContactEditor *e_contact_editor_new (ECard *card, - gboolean is_new_card, - EList *writable_fields, - gboolean is_read_only); -GtkType e_contact_editor_get_type (void); -void e_contact_editor_raise (EContactEditor *editor); - - -gboolean e_contact_editor_confirm_delete (GtkWindow *parent); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_CONTACT_EDITOR_H__ */ diff --git a/addressbook/contact-editor/e-contact-quick-add.c b/addressbook/contact-editor/e-contact-quick-add.c deleted file mode 100644 index 0ab39701d3..0000000000 --- a/addressbook/contact-editor/e-contact-quick-add.c +++ /dev/null @@ -1,393 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-contact-quick-add.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include <ctype.h> -#include <glib.h> -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> -#include <gtk/gtktable.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-dialog.h> -#include <libgnomeui/gnome-stock.h> -#include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-card.h> -#include "e-contact-editor.h" -#include "e-contact-quick-add.h" - -static void -e_card_quick_set_name (ECard *card, const gchar *str) -{ - ECardSimple *simple; - - g_return_if_fail (card && E_IS_CARD (card)); - - if (str == NULL) - return; - - simple = e_card_simple_new (card); - e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_FULL_NAME, str); - e_card_simple_sync_card (simple); - gtk_object_unref (GTK_OBJECT (simple)); -} - -static void -e_card_quick_set_email (ECard *card, const gchar *str) -{ - ECardSimple *simple; - - g_return_if_fail (card && E_IS_CARD (card)); - - if (str == NULL) - return; - - simple = e_card_simple_new (card); - e_card_simple_set (simple, E_CARD_SIMPLE_FIELD_EMAIL, str); - e_card_simple_sync_card (simple); - gtk_object_unref (GTK_OBJECT (simple)); -} - - -static void -book_ready_cb (EBook *book, EBookStatus status, gpointer user_data) -{ - ECard *card = E_CARD (user_data); - - EContactQuickAddCallback cb = gtk_object_get_data (GTK_OBJECT (card), "e-contact-quick-add-cb"); - gpointer cb_user_data = gtk_object_get_data (GTK_OBJECT (card), "e-contact-quick-add-user-data"); - - if (status == E_BOOK_STATUS_SUCCESS) { - e_book_add_card (book, card, NULL, NULL); - if (cb) - cb (card, cb_user_data); - } else { - /* Something went wrong... */ - if (cb) - cb (NULL, cb_user_data); - - gtk_object_unref (GTK_OBJECT (book)); - } -} - -static void -add_card (ECard *card) -{ - EBook *book = e_book_new (); - e_book_load_local_address_book (book, book_ready_cb, card); -} - -/* - * Raise a contact editor with all fields editable, and hook up all signals accordingly. - */ - -static void -add_card_cb (EContactEditor *ce, ECard *card, gpointer user_data) -{ - add_card (card); -} - -static void -editor_closed_cb (GtkWidget *w, gpointer user_data) -{ - /* w is the contact editor, user_data is an ECard. */ - if (user_data) - gtk_object_unref (user_data); - gtk_object_unref (GTK_OBJECT (w)); -} - -static void -ce_book_found_fields (EBook *book, EBookStatus status, EList *fields, gpointer user_data) -{ - ECard *card = E_CARD (user_data); - EContactEditor *contact_editor; - - if (status != E_BOOK_STATUS_SUCCESS) { - g_warning ("Couldn't find supported fields for local address book."); - return; - } - - contact_editor = e_contact_editor_new (card, TRUE, fields, FALSE /* XXX */); - - gtk_signal_connect (GTK_OBJECT (contact_editor), - "add_card", - GTK_SIGNAL_FUNC (add_card_cb), - NULL); - gtk_signal_connect (GTK_OBJECT (contact_editor), - "editor_closed", - GTK_SIGNAL_FUNC (editor_closed_cb), - user_data); - - e_contact_editor_raise (contact_editor); -} - -static void -ce_book_ready (EBook *book, EBookStatus status, gpointer user_data) -{ - if (status != E_BOOK_STATUS_SUCCESS) { - g_warning ("Couldn't open local address book."); - return; - } - - e_book_get_supported_fields (book, ce_book_found_fields, user_data); -} - -static void -edit_card (ECard *card) -{ - e_book_load_local_address_book (e_book_new (), ce_book_ready, card); -} - -static void -clicked_cb (GtkWidget *w, gint button, gpointer user_data) -{ - ECard *card = E_CARD (user_data); - - /* Get data out of entries. */ - if (button == 0 || button == 1) { - gpointer name_entry; - gpointer email_entry; - gchar *name = NULL; - gchar *email = NULL; - - name_entry = gtk_object_get_data (GTK_OBJECT (card), "e-contact-quick-add-name-entry"); - email_entry = gtk_object_get_data (GTK_OBJECT (card), "e-contact-quick-add-email-entry"); - - if (name_entry) - name = gtk_editable_get_chars (GTK_EDITABLE (name_entry), 0, -1); - if (email_entry) - email = gtk_editable_get_chars (GTK_EDITABLE (email_entry), 0, -1); - - e_card_quick_set_name (card, name); - e_card_quick_set_email (card, email); - - g_free (name); - g_free (email); - } - - gtk_widget_destroy (w); - - if (button == 0) { /* OK */ - - add_card (card); - - } else if (button == 1) { - - /* EDIT FULL */ - edit_card (card); - - } else { - /* CANCEL */ - gtk_object_unref (user_data); - } - -} - -static GtkWidget * -build_quick_add_dialog (ECard *new_card, EContactQuickAddCallback cb, gpointer user_data) -{ - GtkWidget *dialog; - GtkTable *table; - GtkWidget *name_entry; - GtkWidget *email_entry; - const gint xpad=1, ypad=1; - - g_return_val_if_fail (new_card && E_IS_CARD (new_card), NULL); - - dialog = gnome_dialog_new (_("Contact Quick-Add"), - GNOME_STOCK_BUTTON_OK, - _("Edit Full"), - GNOME_STOCK_BUTTON_CANCEL, - NULL); - - gtk_signal_connect (GTK_OBJECT (dialog), - "clicked", - clicked_cb, - new_card); - - name_entry = gtk_entry_new (); - - if (new_card->name) { - gchar *str = e_card_name_to_string (new_card->name); - gtk_entry_set_text (GTK_ENTRY (name_entry), str); - g_free (str); - } - - - email_entry = gtk_entry_new (); - - if (new_card->email && e_list_length (new_card->email)) { - EIterator *iterator = e_list_get_iterator (new_card->email); - if (iterator) { - e_iterator_reset (iterator); - if (e_iterator_is_valid (iterator)) { - const gchar *str = e_iterator_get (iterator); - gtk_entry_set_text (GTK_ENTRY (email_entry), str); - } - } - } - - gtk_object_set_data (GTK_OBJECT (new_card), "e-contact-quick-add-name-entry", name_entry); - gtk_object_set_data (GTK_OBJECT (new_card), "e-contact-quick-add-email-entry", email_entry); - - - table = GTK_TABLE (gtk_table_new (2, 2, FALSE)); - - gtk_table_attach (table, gtk_label_new (_("Full Name")), - 0, 1, 0, 1, - 0, 0, xpad, ypad); - gtk_table_attach (table, name_entry, - 1, 2, 0, 1, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, xpad, ypad); - gtk_table_attach (table, gtk_label_new (_("E-mail")), - 0, 1, 1, 2, - 0, 0, xpad, ypad); - gtk_table_attach (table, email_entry, - 1, 2, 1, 2, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, xpad, ypad); - - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), - GTK_WIDGET (table), - TRUE, TRUE, 0); - gtk_widget_show_all (GTK_WIDGET (table)); - - - return dialog; -} - -void -e_contact_quick_add (const gchar *name, const gchar *email, - EContactQuickAddCallback cb, gpointer user_data) -{ - ECard *new_card; - GtkWidget *dialog; - - /* We need to have *something* to work with. */ - if (name == NULL && email == NULL) { - if (cb) - cb (NULL, user_data); - return; - } - - new_card = e_card_new (""); - if (cb) - gtk_object_set_data (GTK_OBJECT (new_card), "e-contact-quick-add-cb", cb); - if (user_data) - gtk_object_set_data (GTK_OBJECT (new_card), "e-contact-quick-add-user-data", user_data); - - - e_card_quick_set_name (new_card, name); - e_card_quick_set_email (new_card, email); - - dialog = build_quick_add_dialog (new_card, cb, user_data); - - gtk_widget_show_all (dialog); -} - -void -e_contact_quick_add_free_form (const gchar *text, EContactQuickAddCallback cb, gpointer user_data) -{ - gchar *name=NULL, *email=NULL; - const gchar *last_at, *s; - gboolean in_quote; - - if (text == NULL) { - e_contact_quick_add (NULL, NULL, cb, user_data); - return; - } - - /* Look for things that look like e-mail addresses embedded in text */ - in_quote = FALSE; - last_at = NULL; - for (s = text; *s; ++s) { - if (*s == '@' && !in_quote) - last_at = s; - else if (*s == '"') - in_quote = !in_quote; - } - - - if (last_at == NULL) { - /* No at sign, so we treat it all as the name */ - name = g_strdup (text); - } else { - gboolean bad_char = FALSE; - - /* walk backwards to whitespace or a < or a quote... */ - while (last_at >= text && !bad_char - && !(isspace ((gint) *last_at) || *last_at == '<' || *last_at == '"')) { - /* Check for some stuff that can't appear in a legal e-mail address. */ - if (*last_at == '[' - || *last_at == ']' - || *last_at == '(' - || *last_at == ')') - bad_char = TRUE; - --last_at; - } - if (last_at < text) - last_at = text; - - /* ...and then split the text there */ - if (!bad_char) { - if (text < last_at) - name = g_strndup (text, last_at-text); - email = g_strdup (last_at); - } - } - - /* If all else has failed, make it the name. */ - if (name == NULL && email == NULL) - name = g_strdup (text); - - - /* Clean up name */ - if (name && *name) - g_strstrip (name); - - /* Clean up email, remove bracketing <>s */ - if (email && *email) { - gboolean changed = FALSE; - g_strstrip (email); - if (*email == '<') { - *email = ' '; - changed = TRUE; - } - if (email[strlen (email)-1] == '>') { - email[strlen (email)-1] = ' '; - changed = TRUE; - } - if (changed) - g_strstrip (email); - } - - - e_contact_quick_add (name, email, cb, user_data); - g_free (name); - g_free (email); -} diff --git a/addressbook/contact-editor/e-contact-quick-add.h b/addressbook/contact-editor/e-contact-quick-add.h deleted file mode 100644 index 81e3fdaab5..0000000000 --- a/addressbook/contact-editor/e-contact-quick-add.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-contact-quick-add.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_CONTACT_QUICK_ADD_H__ -#define __E_CONTACT_QUICK_ADD_H__ - -#include <addressbook/backend/ebook/e-card.h> - -typedef void (*EContactQuickAddCallback) (ECard *new_card, gpointer user_data); - -void e_contact_quick_add (const gchar *name, const gchar *email, - EContactQuickAddCallback cb, gpointer user_data); - -void e_contact_quick_add_free_form (const gchar *text, EContactQuickAddCallback cb, gpointer user_data); - -#endif /* __E_CONTACT_QUICK_ADD_H__ */ - diff --git a/addressbook/contact-editor/e-contact-save-as.c b/addressbook/contact-editor/e-contact-save-as.c deleted file mode 100644 index 5381fb8b2d..0000000000 --- a/addressbook/contact-editor/e-contact-save-as.c +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor.h - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include <unistd.h> -#include <fcntl.h> -#include <gtk/gtkfilesel.h> -#include <gtk/gtksignal.h> -#include <gal/util/e-util.h> -#include "e-contact-save-as.h" - -typedef struct { - GtkFileSelection *filesel; - ECard *card; -} SaveAsInfo; - -static void -save_it(GtkWidget *widget, SaveAsInfo *info) -{ - char *vcard = e_card_get_vcard(info->card); - const char *filename = gtk_file_selection_get_filename(info->filesel); - e_write_file(filename, vcard, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC); - g_free(vcard); - gtk_object_unref(GTK_OBJECT(info->card)); - gtk_widget_destroy(GTK_WIDGET(info->filesel)); - g_free(info); -} - -static void -close_it(GtkWidget *widget, SaveAsInfo *info) -{ - gtk_object_unref(GTK_OBJECT(info->card)); - gtk_widget_destroy(GTK_WIDGET(info->filesel)); - g_free(info); -} - -static void -delete_it(GtkWidget *widget, SaveAsInfo *info) -{ - gtk_object_unref(GTK_OBJECT(info->card)); - g_free(info); -} - -void -e_contact_save_as(char *title, ECard *card) -{ - GtkFileSelection *filesel; - SaveAsInfo *info = g_new(SaveAsInfo, 1); - - filesel = GTK_FILE_SELECTION(gtk_file_selection_new(title)); - - info->filesel = filesel; - info->card = e_card_duplicate(card); - - gtk_signal_connect(GTK_OBJECT(filesel->ok_button), "clicked", - save_it, info); - gtk_signal_connect(GTK_OBJECT(filesel->cancel_button), "clicked", - close_it, info); - gtk_signal_connect(GTK_OBJECT(filesel), "delete_event", - delete_it, info); - gtk_widget_show(GTK_WIDGET(filesel)); -} diff --git a/addressbook/contact-editor/e-contact-save-as.h b/addressbook/contact-editor/e-contact-save-as.h deleted file mode 100644 index d304d4d558..0000000000 --- a/addressbook/contact-editor/e-contact-save-as.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-save-as.h - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_SAVE_AS_H__ -#define __E_CONTACT_SAVE_AS_H__ - -#include <glade/glade.h> -#include "addressbook/backend/ebook/e-card.h" -#include "addressbook/backend/ebook/e-card-simple.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -void -e_contact_save_as(gchar *title, ECard *card); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_CONTACT_EDITOR_H__ */ diff --git a/addressbook/contact-editor/fulladdr.glade b/addressbook/contact-editor/fulladdr.glade deleted file mode 100644 index 46d1a180b6..0000000000 --- a/addressbook/contact-editor/fulladdr.glade +++ /dev/null @@ -1,475 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <name>fulladdr</name> - <program_name>fulladdr</program_name> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> - <use_widget_names>True</use_widget_names> - <output_main_file>False</output_main_file> - <output_support_files>False</output_support_files> - <output_build_files>False</output_build_files> -</project> - -<widget> - <class>GnomeDialog</class> - <name>dialog-checkaddress</name> - <visible>False</visible> - <title>Check Address</title> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>True</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>True</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>vbox-container</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>hbuttonbox1</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>button1</name> - <can_default>True</can_default> - <has_default>True</has_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button2</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - - <widget> - <class>GtkTable</class> - <name>table-checkaddress</name> - <border_width>8</border_width> - <rows>4</rows> - <columns>4</columns> - <homogeneous>False</homogeneous> - <row_spacing>6</row_spacing> - <column_spacing>6</column_spacing> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label2</name> - <label>_Address:</label> - <justify>GTK_JUSTIFY_LEFT</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-street</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label4</name> - <label>_City:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-city</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-city</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-ext</name> - <width>100</width> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label8</name> - <label>_PO Box:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-po</focus_target> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label3</name> - <label>Address _2:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-ext</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-po</name> - <width>100</width> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-street</name> - <can_focus>True</can_focus> - <has_focus>True</has_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>4</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label5</name> - <label>_State/Province:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-region</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-region</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkCombo</class> - <name>combo-country</name> - <width>100</width> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>False</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> - <items>USA -Canada -Finland -</items> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>entry-country</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - </widget> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-code</name> - <width>100</width> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>3</left_attach> - <right_attach>4</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label6</name> - <label>_ZIP Code:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-code</focus_target> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label7</name> - <label>Countr_y:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-country</focus_target> - <child> - <left_attach>2</left_attach> - <right_attach>3</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - </widget> - </widget> -</widget> - -</GTK-Interface> diff --git a/addressbook/contact-editor/fullname.glade b/addressbook/contact-editor/fullname.glade deleted file mode 100644 index 17be70647c..0000000000 --- a/addressbook/contact-editor/fullname.glade +++ /dev/null @@ -1,389 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <name>fullname</name> - <program_name>fullname</program_name> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> - <use_widget_names>True</use_widget_names> - <output_main_file>False</output_main_file> - <output_support_files>False</output_support_files> - <output_build_files>False</output_build_files> -</project> - -<widget> - <class>GnomeDialog</class> - <name>dialog-checkfullname</name> - <visible>False</visible> - <title>Check Full Name</title> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>True</modal> - <allow_shrink>True</allow_shrink> - <allow_grow>True</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>vbox-container</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>hbuttonbox1</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>button1</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button2</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - - <widget> - <class>GtkTable</class> - <name>table-checkfullname</name> - <border_width>8</border_width> - <rows>5</rows> - <columns>3</columns> - <homogeneous>False</homogeneous> - <row_spacing>6</row_spacing> - <column_spacing>21</column_spacing> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkCombo</class> - <name>combo-title</name> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>False</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> - <items> -Mr. -Mrs. -Ms. -Miss -Dr. -</items> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>entry-title</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - </widget> - </widget> - - <widget> - <class>GtkCombo</class> - <name>combo-suffix</name> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>False</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> - <items> -Sr. -Jr. -I -II -III -Esq. -</items> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>entry-suffix</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - </widget> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-first</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-middle</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry-last</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>3</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label2</name> - <label>_First:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-first</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label1</name> - <label>_Title:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-title</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label3</name> - <label>_Middle:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-middle</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label5</name> - <label>_Last:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-last</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label4</name> - <label>_Suffix:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <focus_target>entry-suffix</focus_target> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>4</top_attach> - <bottom_attach>5</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - </widget> - </widget> -</widget> - -</GTK-Interface> diff --git a/addressbook/contact-editor/test-editor.c b/addressbook/contact-editor/test-editor.c deleted file mode 100644 index 22c871c693..0000000000 --- a/addressbook/contact-editor/test-editor.c +++ /dev/null @@ -1,145 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * test-editor.c - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include <stdlib.h> -#include <gtk/gtkmain.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-init.h> -#include <glade/glade.h> -#include "e-contact-editor.h" - -#define TEST_VCARD \ -"BEGIN:VCARD -" \ -"FN:Nat -" \ -"N:Friedman;Nat;D;Mr. -" \ -"BDAY:1977-08-06 -" \ -"TEL;WORK:617 679 1984 -" \ -"TEL;CELL:123 456 7890 -" \ -"EMAIL;INTERNET:nat@nat.org -" \ -"EMAIL;INTERNET:nat@helixcode.com -" \ -"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234; -" \ -"ADR;HOME;POSTAL;INTL:P.O. Box 202;;;Any Town 2;MI;12344-4321;USA -" \ -"END:VCARD -" \ -" -" - -static char * -read_file (char *name) -{ - int len; - char buff[65536]; - char line[1024]; - FILE *f; - - f = fopen (name, "r"); - if (f == NULL) - g_error ("Unable to open %s!\n", name); - - len = 0; - while (fgets (line, sizeof (line), f) != NULL) { - strcpy (buff + len, line); - len += strlen (line); - } - - fclose (f); - - return g_strdup (buff); -} - -/* Callback used when a contact editor is closed */ -static void -editor_closed_cb (EContactEditor *ce, gpointer data) -{ - static int count = 2; - - count--; - gtk_object_unref (GTK_OBJECT (ce)); - - if (count == 0) - exit (0); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey <clahey@umich.edu>", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Contact Editor Test" ), VERSION, - _( "Copyright (C) 2000, Helix Code, Inc." ), - authors, - _( "This should test the contact editor canvas item" ), - NULL); - gtk_widget_show (about); -} -#endif - -int main( int argc, char *argv[] ) -{ - char *cardstr; - EContactEditor *ce; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - gnome_init( "Contact Editor Test", VERSION, argc, argv); - - glade_gnome_init (); - - cardstr = NULL; - if (argc == 2) - cardstr = read_file (argv [1]); - - if (cardstr == NULL) - cardstr = TEST_VCARD; - - ce = e_contact_editor_new (e_card_new (cardstr), TRUE, NULL, FALSE); - gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", - GTK_SIGNAL_FUNC (editor_closed_cb), NULL); - - ce = e_contact_editor_new (e_card_new (cardstr), TRUE, NULL, FALSE); - gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", - GTK_SIGNAL_FUNC (editor_closed_cb), NULL); - - gtk_main(); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/gui/.cvsignore b/addressbook/gui/.cvsignore deleted file mode 100644 index 09980ae6ba..0000000000 --- a/addressbook/gui/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la diff --git a/addressbook/gui/Makefile.am b/addressbook/gui/Makefile.am deleted file mode 100644 index cd8fe38705..0000000000 --- a/addressbook/gui/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = widgets search component diff --git a/addressbook/gui/component/.cvsignore b/addressbook/gui/component/.cvsignore deleted file mode 100644 index 8bcb766191..0000000000 --- a/addressbook/gui/component/.cvsignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -evolution-addressbook -evolution-addressbook.pure -test-addressbook -GNOME_Evolution_Addressbook.oaf
\ No newline at end of file diff --git a/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in b/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in deleted file mode 100644 index 7350b4925e..0000000000 --- a/addressbook/gui/component/GNOME_Evolution_Addressbook.oaf.in +++ /dev/null @@ -1,147 +0,0 @@ -<oaf_info> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_MiniCard_ControlFactory" - type="exe" - location="evolution-addressbook"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Factory for the Addressbook Minicard control"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_MiniCard_Control" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_MiniCard_ControlFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:Bonobo/Control:1.0"/> - <item value="IDL:Bonobo/PersistStream:1.0"/> - </oaf_attribute> - - <oaf_attribute name="bonobo:supported_mime_types" type="stringv"> - <item value="text/vcard"/> - <item value="text/x-vcard"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook minicard viewer"/> - <oaf_attribute name="description" type="string" - _value="Control that displays an Evolution addressbook minicard."/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_ControlFactory" - type="exe" - location="evolution-addressbook"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Factory for the sample Addressbook control"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Control" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_ControlFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:BonoboControl/addressbook-control:1.0"/> - <item value="IDL:GNOME/Control:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="A sample Bonobo control which displays an addressbook."/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_ShellComponentFactory" - type="exe" - location="evolution-addressbook"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Factory for the Evolution addressbook component."/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_ShellComponent" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_ShellComponentFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/ShellComponent:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Evolution component for handling contacts."/> - - <oaf_attribute name="evolution:shell-component-icon" type="string" - value="evolution-contacts.png"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressWidgetFactory" - type="exe" - location="evolution-addressbook"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Factory for the Addressbook's address displayer"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressWidget" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_AddressWidgetFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:BonoboControl/address-widget:1.0"/> - <item value="IDL:GNOME/Control:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="A Bonobo control for displaying an address."/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressPopupFactory" - type="exe" - location="evolution-addressbook"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Factory for the Addressbook's address popup"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressPopup" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_AddressPopupFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:BonoboControl/address-widget:1.0"/> - <item value="IDL:GNOME/Control:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="A Bonobo control for an address popup."/> - -</oaf_server> - -</oaf_info> diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am deleted file mode 100644 index 3089f53901..0000000000 --- a/addressbook/gui/component/Makefile.am +++ /dev/null @@ -1,88 +0,0 @@ -SUBDIRS = select-names - -INCLUDES = \ - -DG_LOG_DOMAIN=\"evolution-addressbook\" \ - $(EXTRA_GNOME_CFLAGS) \ - $(GNOME_INCLUDEDIR) \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -I$(top_srcdir)/shell \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_srcdir)/addressbook/gui/minicard \ - -I$(top_srcdir)/addressbook/gui/widgets \ - -I$(top_srcdir)/addressbook/contact-editor \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - $(BONOBO_HTML_GNOME_CFLAGS) \ - -DEVOLUTION_VERSION=\""$(VERSION)"\" \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ - -DCAMEL_PROVIDERDIR=\""$(providerdir)"\" - -bin_PROGRAMS = \ - evolution-addressbook - -evolution_addressbook_SOURCES = \ - addressbook-component.c \ - addressbook-component.h \ - addressbook-config.c \ - addressbook-config.h \ - addressbook-factory.c \ - addressbook-storage.c \ - addressbook-storage.h \ - addressbook.c \ - addressbook.h \ - e-cardlist-model.c \ - e-cardlist-model.h \ - e-address-widget.h \ - e-address-widget.c \ - e-address-popup.h \ - e-address-popup.c - -evolution_addressbook_LDADD = \ - select-names/libeselectnames.la \ - $(top_builddir)/shell/libeshell.a \ - $(EXTRA_GNOME_LIBS) \ - $(BONOBO_HTML_GNOME_LIBS) \ - $(top_builddir)/addressbook/gui/widgets/libeminicard.a \ - $(top_builddir)/addressbook/backend/ebook/libebook.la \ - $(top_builddir)/e-util/ename/libename.la \ - $(top_builddir)/addressbook/contact-editor/libecontacteditor.a \ - $(top_builddir)/libversit/libversit.la \ - $(top_builddir)/widgets/misc/libemiscwidgets.a \ - $(top_builddir)/addressbook/printing/libecontactprint.a \ - $(top_builddir)/addressbook/gui/search/libeaddressbooksearch.a \ - $(top_builddir)/filter/libfilter.la \ - $(top_builddir)/e-util/libeutil.la \ - $(top_builddir)/widgets/menus/libmenus.la - -evolution_addressbook_LDFLAGS = `gnome-config --libs gdk_pixbuf` -export-dynamic - -@XML_I18N_MERGE_OAF_RULE@ - -oafdir = $(datadir)/oaf -oaf_in_files = GNOME_Evolution_Addressbook.oaf.in -oaf_DATA = $(oaf_in_files:.oaf.in=.oaf) - -gladedir = $(datadir)/evolution/glade -glade_DATA = addressbook-config.glade - -EXTRA_DIST = \ - $(glade_DATA) \ - $(oaf_DATA) \ - addressbook-config.glade\ - $(oaf_in_files) - -if ENABLE_PURIFY -PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ - -all-local: evolution-addressbook.pure - -evolution-addressbook.pure: evolution-addressbook - @rm -f evolution-addressbook.pure - $(PLINK) $(evolution_addressbook_LDFLAGS) $(evolution_addressbook_OBJECTS) $(evolution_addressbook_LDADD) $(LIBS) - -endif diff --git a/addressbook/gui/component/addressbook-component.c b/addressbook/gui/component/addressbook-component.c deleted file mode 100644 index 250d13dc36..0000000000 --- a/addressbook/gui/component/addressbook-component.c +++ /dev/null @@ -1,214 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* addressbook-component.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-generic-factory.h> - -#include "evolution-shell-component.h" -#include "evolution-storage.h" - -#include "addressbook-storage.h" -#include "addressbook-component.h" -#include "addressbook.h" - - - -#define GNOME_EVOLUTION_ADDRESSBOOK_COMPONENT_FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_ShellComponentFactory" - -EvolutionShellClient *global_shell_client; - -EvolutionShellClient * -addressbook_component_get_shell_client (void) -{ - return global_shell_client; -} - -static BonoboGenericFactory *factory = NULL; - -static char *accepted_dnd_types[] = { - "text/x-vcard", - NULL -}; - -static const EvolutionShellComponentFolderType folder_types[] = { - { "contacts", "evolution-contacts.png", accepted_dnd_types }, - { NULL, NULL, NULL, NULL } -}; - - -/* EvolutionShellComponent methods and signals. */ - -static EvolutionShellComponentResult -create_view (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - BonoboControl **control_return, - void *closure) -{ - BonoboControl *control; - - if (g_strcasecmp (type, "contacts") != 0) - return EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE; - - control = addressbook_factory_new_control (); - bonobo_control_set_property (control, "folder_uri", physical_uri, NULL); - - *control_return = control; - - return EVOLUTION_SHELL_COMPONENT_OK; -} - -static void -create_folder (EvolutionShellComponent *shell_component, - const char *physical_uri, - const char *type, - const GNOME_Evolution_ShellComponentListener listener, - void *closure) -{ - CORBA_Environment ev; - GNOME_Evolution_ShellComponentListener_Result result; - - if (g_strcasecmp (type, "contacts") != 0) - result = GNOME_Evolution_ShellComponentListener_UNSUPPORTED_TYPE; - else - result = GNOME_Evolution_ShellComponentListener_OK; - - CORBA_exception_init(&ev); - GNOME_Evolution_ShellComponentListener_notifyResult(listener, result, &ev); - CORBA_exception_free(&ev); -} - -#if 0 -static void -remove_folder (EvolutionShellComponent *shell_component, - const char *physical_uri, - const GNOME_Evolution_ShellComponentListener listener, - void *closure) -{ - printf ("should remove %s\n", physical_uri); -} - -static void -xfer_folder (EvolutionShellComponent *shell_component, - const char *source_physical_uri, - const char *destination_physical_uri, - gboolean remove_source, - const GNOME_Evolution_ShellComponentListener listener, - void *closure) -{ - printf ("should transfer %s to %s, %s source\n", source_physical_uri, - destination_physical_uri, remove_source ? "removing" : "not removing"); -} - -static void -populate_context_menu (EvolutionShellComponent *shell_component, - BonoboUIComponent *uic, - const char *physical_uri, - const char *type, - void *closure) -{ - printf ("should populate context menu for %s (%s)\n", physical_uri, type); -} - -static char* -get_dnd_selection (EvolutionShellComponent *shell_component, - const char *physical_uri, - int type, - int *format_return, - const char **selection_return, - int *selection_length_return, - void *closure) -{ - printf ("should get dnd selection for %s\n", physical_uri); - return NULL; -} -#endif - -static int owner_count = 0; - -static void -owner_set_cb (EvolutionShellComponent *shell_component, - EvolutionShellClient *shell_client, - const char *evolution_homedir, - gpointer user_data) -{ - owner_count ++; - - if (global_shell_client == NULL) - global_shell_client = shell_client; - - addressbook_storage_setup (shell_component, evolution_homedir); -} - -static void -owner_unset_cb (EvolutionShellComponent *shell_component, - GNOME_Evolution_Shell shell_interface, - gpointer user_data) -{ - owner_count --; - if (owner_count == 0) - gtk_main_quit(); -} - - -/* The factory function. */ - -static BonoboObject * -factory_fn (BonoboGenericFactory *factory, - void *closure) -{ - EvolutionShellComponent *shell_component; - - shell_component = evolution_shell_component_new (folder_types, create_view, create_folder, - NULL, NULL, NULL, NULL, -#if 0 - remove_folder, xfer_folder, - populate_context_menu, get_dnd_selection, -#endif - NULL); - - gtk_signal_connect (GTK_OBJECT (shell_component), "owner_set", - GTK_SIGNAL_FUNC (owner_set_cb), NULL); - - gtk_signal_connect (GTK_OBJECT (shell_component), "owner_unset", - GTK_SIGNAL_FUNC (owner_unset_cb), NULL); - - return BONOBO_OBJECT (shell_component); -} - - -void -addressbook_component_factory_init (void) -{ - if (factory != NULL) - return; - - factory = bonobo_generic_factory_new (GNOME_EVOLUTION_ADDRESSBOOK_COMPONENT_FACTORY_ID, factory_fn, NULL); - - if (factory == NULL) - g_error ("Cannot initialize the Evolution addressbook factory."); -} - diff --git a/addressbook/gui/component/addressbook-component.h b/addressbook/gui/component/addressbook-component.h deleted file mode 100644 index ea0d8b9a46..0000000000 --- a/addressbook/gui/component/addressbook-component.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* addressbook-component.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _ADDRESSBOOK_COMPONENT_H -#define _ADDRESSBOOK_COMPONENT_H - -#include "evolution-shell-component.h" -#include "evolution-storage.h" - -void addressbook_component_factory_init (void); -EvolutionShellClient *addressbook_component_get_shell_client (void); - -#endif /* _ADDRESSBOOK_COMPONENT_H */ diff --git a/addressbook/gui/component/addressbook-config.c b/addressbook/gui/component/addressbook-config.c deleted file mode 100644 index e56c1fa799..0000000000 --- a/addressbook/gui/component/addressbook-config.c +++ /dev/null @@ -1,965 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -#include <config.h> - -#include <glib.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-dialog.h> -#include <libgnomeui/gnome-propertybox.h> -#include <libgnomeui/gnome-stock.h> -#include <glade/glade.h> -#include <gal/widgets/e-unicode.h> -#include <gtkhtml/gtkhtml.h> -#include <e-util/e-html-utils.h> -#include "addressbook-config.h" -#include "addressbook-storage.h" - -/* #define INCLUDE_FILE_SOURCE */ - -typedef struct _AddressbookSourceDialog AddressbookSourceDialog; -typedef struct _AddressbookSourcePageItem AddressbookSourcePageItem; -typedef struct _LDAPAuthPageItem LDAPAuthPageItem; - -struct _AddressbookSourceDialog { - GtkWidget *html; - GtkWidget *dialog; - GtkWidget *vbox; - GtkWidget *name; - GtkWidget *description; - GtkWidget *source_option; - GtkWidget *notebook; - - GList *source_pages; - AddressbookSourcePageItem *source_page; - - gint id; /* button we closed the dialog with */ - - AddressbookSource *source; /* our result if the Ok button was clicked */ -}; - -struct _AddressbookSourcePageItem { - gint pnum; - - AddressbookSourceType source_type; - - AddressbookSourceDialog *dialog; - - GtkWidget *item; - GtkWidget *vbox; - - /* file: addressbook's */ - GtkWidget *path; - GtkWidget *creat; - - /* ldap: addressbook's */ - GtkWidget *host; - GtkWidget *port; - GtkWidget *rootdn; - GtkWidget *scope_optionmenu; - GtkWidget *auth_optionmenu; - GtkWidget *auth_notebook; - - GList *auths; - LDAPAuthPageItem *auth; -}; - -struct _LDAPAuthPageItem { - gint pnum; - - AddressbookLDAPAuthType auth_type; - - AddressbookSourceDialog *dialog; - AddressbookSourcePageItem *page; - - GtkWidget *item; - GtkWidget *vbox; - - /* simple (password) auth */ - GtkWidget *binddn; - GtkWidget *remember_passwd; -}; - -static void -html_size_req (GtkWidget *widget, GtkRequisition *requisition) -{ - requisition->height = GTK_LAYOUT (widget)->height; -} - -/* Returns a GtkHTML which is already inside a GtkScrolledWindow. If - * @white is TRUE, the GtkScrolledWindow will be inside a GtkFrame. - */ -static GtkWidget * -html_new (gboolean white) -{ - GtkWidget *html, *scrolled, *frame; - GtkStyle *style; - - html = gtk_html_new (); - GTK_LAYOUT (html)->height = 0; - gtk_signal_connect (GTK_OBJECT (html), "size_request", - GTK_SIGNAL_FUNC (html_size_req), NULL); - gtk_html_set_editable (GTK_HTML (html), FALSE); - style = gtk_rc_get_style (html); - if (style) { - gtk_html_set_default_background_color (GTK_HTML (html), - white ? &style->white : - &style->bg[0]); - } - gtk_widget_set_sensitive (html, FALSE); - scrolled = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), - GTK_POLICY_NEVER, - GTK_POLICY_NEVER); - gtk_container_add (GTK_CONTAINER (scrolled), html); - - if (white) { - frame = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (frame), - GTK_SHADOW_ETCHED_IN); - gtk_container_add (GTK_CONTAINER (frame), scrolled); - gtk_widget_show_all (frame); - } else - gtk_widget_show_all (scrolled); - - return html; -} - -static void -put_html (GtkHTML *html, char *text) -{ - GtkHTMLStream *handle; - - text = e_text_to_html (text, E_TEXT_TO_HTML_CONVERT_NL); - handle = gtk_html_begin (html); - gtk_html_write (html, handle, "<HTML><BODY>", 12); - gtk_html_write (html, handle, text, strlen (text)); - gtk_html_write (html, handle, "</BODY></HTML>", 14); - g_free (text); - gtk_html_end (html, handle, GTK_HTML_STREAM_OK); -} - -#ifdef INCLUDE_FILE_SOURCE -static const char * -addressbook_config_source_label (AddressbookSourceType type) -{ - switch (type) { - case ADDRESSBOOK_SOURCE_LDAP: - return _("LDAP Server"); - case ADDRESSBOOK_SOURCE_FILE: - return _("File"); - default: - g_assert(0); - return _("Unknown addressbook type"); - } -} -#endif - -static const char * -addressbook_config_auth_label (AddressbookLDAPAuthType type) -{ - switch (type) { - case ADDRESSBOOK_LDAP_AUTH_NONE: - return _("None (anonymous mode)"); - case ADDRESSBOOK_LDAP_AUTH_SIMPLE: - return _("Password"); - case ADDRESSBOOK_LDAP_AUTH_SASL: - return _("SASL"); - default: - g_assert(0); - return _("Unknown auth type"); - } -} - -static const char * -addressbook_config_scope_label (AddressbookLDAPScopeType scope) -{ - switch (scope) { - case ADDRESSBOOK_LDAP_SCOPE_BASE: - return _("Base"); - case ADDRESSBOOK_LDAP_SCOPE_ONELEVEL: - return _("One"); - case ADDRESSBOOK_LDAP_SCOPE_SUBTREE: - return _("Subtree"); - default: - g_assert (0); - return _("Unknown scope type"); - } -} - -static void -addressbook_source_edit_changed (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - char *data; - gboolean complete = TRUE; - AddressbookSourcePageItem *source_page = dialog->source_page; - - if (source_page == NULL) - complete = FALSE; - - if (complete) { - data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (dialog->name), 0, -1); - if (!data || !*data) - complete = FALSE; - g_free (data); - } - - if (complete) { - if (source_page->source_type == ADDRESSBOOK_SOURCE_FILE) { - if (complete) { - data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source_page->path), 0, -1); - if (!data || !*data) - complete = FALSE; - g_free (data); - } - } - else { - if (complete) { - data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source_page->host), 0, -1); - if (!data || !*data) - complete = FALSE; - g_free (data); - } - - if (complete) { - data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source_page->port), 0, -1); - if (!data || !*data) - complete = FALSE; - /* XXX more validation on port here */ - g_free (data); - } - - if (complete) { - LDAPAuthPageItem *auth_page = source_page->auth; - - if (auth_page->auth_type == ADDRESSBOOK_LDAP_AUTH_SIMPLE) { - data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (auth_page->binddn), 0, -1); - if (!data || !*data) - complete = FALSE; - g_free (data); - } - else if (auth_page->auth_type == ADDRESSBOOK_LDAP_AUTH_SASL) { - } - data = e_utf8_gtk_editable_get_chars (GTK_EDITABLE (source_page->port), 0, -1); - if (!data || !*data) - complete = FALSE; - /* XXX more validation on port here */ - g_free (data); - } - } - } - - gnome_dialog_set_sensitive (GNOME_DIALOG (dialog->dialog), 0, complete); -} - -static void -source_type_menuitem_activate (GtkWidget *item, gpointer data) -{ - AddressbookSourcePageItem *sitem = data; - - gtk_notebook_set_page (GTK_NOTEBOOK(sitem->dialog->notebook), sitem->pnum); - sitem->dialog->source_page = sitem; - - addressbook_source_edit_changed (item, sitem->dialog); -} - -typedef struct { - AddressbookSourceDialog *dialog; - char *help_text; -} FocusHelpClosure; - -static void -free_focus_help_closure (gpointer data) -{ - FocusHelpClosure *closure = data; - g_free(closure->help_text); - g_free(closure); -} - -static gint -focus_help (GtkWidget *widget, GdkEventFocus *event, FocusHelpClosure *closure) -{ - put_html (GTK_HTML(closure->dialog->html), closure->help_text); - return FALSE; -} - -static GtkWidget * -table_add_elem (AddressbookSourceDialog *dialog, GtkWidget *table, - int row, - const char *label_text, - const char *help_text) -{ - GtkWidget *label, *entry; - FocusHelpClosure *focus_closure; - - label = gtk_label_new (label_text); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, - row, row + 1, GTK_FILL, 0, 0, 0); - gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); - - entry = gtk_entry_new (); - gtk_table_attach (GTK_TABLE (table), entry, 1, 3, row, row + 1, - GTK_EXPAND | GTK_FILL, 0, 0, 0); - - gtk_signal_connect (GTK_OBJECT (entry), "changed", - GTK_SIGNAL_FUNC (addressbook_source_edit_changed), dialog); - - focus_closure = g_new0 (FocusHelpClosure, 1); - focus_closure->dialog = dialog; - focus_closure->help_text = g_strdup(help_text); - - gtk_signal_connect_full (GTK_OBJECT (entry), - "focus_in_event" /* XXX */, - (GtkSignalFunc) focus_help, NULL, - focus_closure, - (GtkDestroyNotify) free_focus_help_closure, - FALSE, FALSE); - return entry; -} - -static void -ldap_auth_type_menuitem_activate (GtkWidget *item, gpointer data) -{ - LDAPAuthPageItem *auth_item = data; - - gtk_notebook_set_page (GTK_NOTEBOOK(auth_item->page->auth_notebook), auth_item->pnum); - - auth_item->page->auth = auth_item; - - addressbook_source_edit_changed (item, auth_item->dialog); -} - -static LDAPAuthPageItem * -addressbook_ldap_auth_item_new (AddressbookSourceDialog *dialog, - AddressbookSourcePageItem *page, - AddressbookLDAPAuthType type) -{ - LDAPAuthPageItem *item = g_new0 (LDAPAuthPageItem, 1); - GtkWidget *table = NULL; - int row = 0; - - item->pnum = type; - item->auth_type = type; - item->dialog = dialog; - item->page = page; - item->vbox = gtk_vbox_new (FALSE, 0); - - switch (type) { - case ADDRESSBOOK_LDAP_AUTH_NONE: - break; - case ADDRESSBOOK_LDAP_AUTH_SIMPLE: - table = gtk_table_new (2, 2, FALSE); - item->binddn = table_add_elem (dialog, table, row++, - _("Bind DN:"), - _("FIXME Bind DN Help text here")); - - item->remember_passwd = gtk_check_button_new_with_label (_("Remember this password")); - - gtk_table_attach (GTK_TABLE (table), item->remember_passwd, 1, 2, - row, row + 1, GTK_FILL, 0, 0, 0); - - gtk_box_pack_start (GTK_BOX (item->vbox), table, - TRUE, TRUE, 0); - break; - case ADDRESSBOOK_LDAP_AUTH_SASL: - break; - default: - g_assert (0); - return item; - } - - if (table) { - gtk_table_set_row_spacings (GTK_TABLE (table), 2); - gtk_table_set_col_spacings (GTK_TABLE (table), 10); - gtk_container_set_border_width (GTK_CONTAINER (table), 8); - } - - gtk_widget_show_all (item->vbox); - - return item; -} - -static AddressbookSourcePageItem * -addressbook_source_item_new (AddressbookSourceDialog *dialog, AddressbookSourceType type) -{ - AddressbookSourcePageItem *item = g_new0 (AddressbookSourcePageItem, 1); - GtkWidget *table = NULL; - int row = 0; - - item->pnum = type; - item->source_type = type; - item->dialog = dialog; - - item->vbox = gtk_vbox_new (FALSE, 0); - - switch (type) { - case ADDRESSBOOK_SOURCE_LDAP: { - GtkWidget *label; - GtkWidget *menu; - int i; - LDAPAuthPageItem *first_item = NULL; - int position; - - table = gtk_table_new (5, 2, FALSE); - - item->host = table_add_elem (dialog, table, row++, - _("Host:"), - _("FIXME Host help text here.")); - item->port = table_add_elem (dialog, table, row++, - _("Port:"), - _("FIXME Port help text here.")); - gtk_editable_insert_text (GTK_EDITABLE (item->port), "389", 3, &position); - - item->rootdn = table_add_elem (dialog, table, row++, - _("Root DN:"), - _("FIXME Root DN help text here.")); - - item->scope_optionmenu = gtk_option_menu_new (); - menu = gtk_menu_new (); - - for (i = 0; i < ADDRESSBOOK_LDAP_SCOPE_LAST; i ++) { - GtkWidget *scope_item = gtk_menu_item_new_with_label (addressbook_config_scope_label (i)); - - gtk_signal_connect (GTK_OBJECT (scope_item), "activate", - GTK_SIGNAL_FUNC (addressbook_source_edit_changed), - dialog); - - gtk_menu_append (GTK_MENU (menu), scope_item); - gtk_widget_show (scope_item); - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (item->scope_optionmenu), menu); - // ldap_auth_type_menuitem_activate (first_item->item, first_item); - gtk_option_menu_set_history (GTK_OPTION_MENU(item->scope_optionmenu), 0); - - label = gtk_label_new (_("Search Scope:")); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, - row, row + 1, GTK_FILL, 0, 0, 0); - gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); - - gtk_table_attach (GTK_TABLE (table), - item->scope_optionmenu, - 1, 2, row, row + 1, - GTK_EXPAND | GTK_FILL, 0, - 0, 0); - - row++; - - gtk_box_pack_start (GTK_BOX (item->vbox), table, - TRUE, FALSE, 0); - - item->auth_optionmenu = gtk_option_menu_new (); - menu = gtk_menu_new (); - - item->auth_notebook = gtk_notebook_new(); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (item->auth_notebook), FALSE); - - for (i = 0; i < ADDRESSBOOK_LDAP_AUTH_LAST; i++) { - LDAPAuthPageItem *auth_item; - -#ifndef LDAP_SASL - /* skip the sasl stuff if we're not configured for it. */ - if (i == ADDRESSBOOK_LDAP_AUTH_SASL) - continue; -#endif - auth_item = addressbook_ldap_auth_item_new (dialog, item, i); - - item->auths = g_list_append (item->auths, auth_item); - - if (!first_item) - first_item = auth_item; - - auth_item->item = gtk_menu_item_new_with_label (addressbook_config_auth_label (i)); - - gtk_notebook_append_page (GTK_NOTEBOOK (item->auth_notebook), - auth_item->vbox, NULL); - - gtk_signal_connect (GTK_OBJECT (auth_item->item), "activate", - GTK_SIGNAL_FUNC (ldap_auth_type_menuitem_activate), - auth_item); - - gtk_menu_append (GTK_MENU (menu), auth_item->item); - gtk_widget_show (auth_item->item); - } - - gtk_option_menu_set_menu (GTK_OPTION_MENU (item->auth_optionmenu), menu); - ldap_auth_type_menuitem_activate (first_item->item, first_item); - gtk_option_menu_set_history (GTK_OPTION_MENU(item->auth_optionmenu), 0); - - label = gtk_label_new (_("Authentication:")); - gtk_table_attach (GTK_TABLE (table), label, 0, 1, - row, row + 1, GTK_FILL, 0, 0, 0); - gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); - - gtk_table_attach (GTK_TABLE (table), - item->auth_optionmenu, - 1, 2, row, row + 1, - GTK_EXPAND | GTK_FILL, 0, - 0, 0); - - gtk_box_pack_start (GTK_BOX (item->vbox), item->auth_notebook, - TRUE, TRUE, 0); - break; - } - case ADDRESSBOOK_SOURCE_FILE: { - table = gtk_table_new (2, 2, FALSE); - item->path = table_add_elem (dialog, table, row++, - _("Path:"), - _("FIXME Path Help text here")); - - gtk_box_pack_start (GTK_BOX (item->vbox), table, - TRUE, TRUE, 0); - - item->creat = gtk_check_button_new_with_label (_("Create path if it doesn't exist.")); - gtk_table_attach (GTK_TABLE (table), item->creat, 1, 2, - row, row + 1, GTK_FILL, 0, 0, 0); - break; - } - default: - g_assert(0); - return item; - } - - gtk_table_set_row_spacings (GTK_TABLE (table), 2); - gtk_table_set_col_spacings (GTK_TABLE (table), 10); - gtk_container_set_border_width (GTK_CONTAINER (table), 8); - - gtk_widget_show_all (item->vbox); - - return item; -} - -static void -addressbook_source_dialog_set_source (AddressbookSourceDialog *dialog, AddressbookSource *source) -{ - AddressbookSourcePageItem *source_page; - - e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->name), source->name); - e_utf8_gtk_entry_set_text (GTK_ENTRY (dialog->description), source->description); - - /* choose the correct server page */ - source_page = g_list_nth_data (dialog->source_pages, source->type); - source_type_menuitem_activate (source_page->item, source_page); - gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->source_option), source->type); - - if (source->type == ADDRESSBOOK_SOURCE_LDAP) { - LDAPAuthPageItem *auth_page; - - e_utf8_gtk_entry_set_text (GTK_ENTRY (source_page->host), source->ldap.host); - e_utf8_gtk_entry_set_text (GTK_ENTRY (source_page->port), source->ldap.port); - e_utf8_gtk_entry_set_text (GTK_ENTRY (source_page->rootdn), source->ldap.rootdn); - - gtk_option_menu_set_history (GTK_OPTION_MENU(source_page->scope_optionmenu), source->ldap.scope); - - auth_page = g_list_nth_data (source_page->auths, source->ldap.auth); - ldap_auth_type_menuitem_activate (auth_page->item, auth_page); - gtk_option_menu_set_history (GTK_OPTION_MENU(source_page->auth_optionmenu), auth_page->auth_type); - - if (auth_page->auth_type == ADDRESSBOOK_LDAP_AUTH_SIMPLE) { - e_utf8_gtk_entry_set_text (GTK_ENTRY (auth_page->binddn), source->ldap.binddn); - } - } - else { - e_utf8_gtk_entry_set_text (GTK_ENTRY (source_page->path), source->file.path); - } -} - -static AddressbookSource * -addressbook_source_dialog_get_source (AddressbookSourceDialog *dialog) -{ - AddressbookSource *source = g_new0 (AddressbookSource, 1); - AddressbookSourcePageItem *source_page; - - source_page = dialog->source_page; - - source->name = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->name)); - source->description = e_utf8_gtk_entry_get_text (GTK_ENTRY (dialog->description)); - source->type = source_page->source_type; - - if (source->type == ADDRESSBOOK_SOURCE_FILE) { - source->file.path = e_utf8_gtk_entry_get_text (GTK_ENTRY (source_page->path)); - } - else { - LDAPAuthPageItem *auth_page; - - source->ldap.host = e_utf8_gtk_entry_get_text (GTK_ENTRY (source_page->host)); - source->ldap.port = e_utf8_gtk_entry_get_text (GTK_ENTRY (source_page->port)); - source->ldap.rootdn = e_utf8_gtk_entry_get_text (GTK_ENTRY (source_page->rootdn)); - - auth_page = source_page->auth; - - source->ldap.auth = auth_page->auth_type; - if (source->ldap.auth == ADDRESSBOOK_LDAP_AUTH_SIMPLE) { - source->ldap.binddn = e_utf8_gtk_entry_get_text (GTK_ENTRY (auth_page->binddn)); - source->ldap.remember_passwd = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (auth_page->remember_passwd)); - } - - ldap_auth_type_menuitem_activate (auth_page->item, auth_page); - gtk_option_menu_set_history (GTK_OPTION_MENU(source_page->auth_optionmenu), auth_page->auth_type); - } - - addressbook_storage_init_source_uri (source); - - return source; -} - -static void -addressbook_source_dialog_ok_clicked (GtkWidget *widget, AddressbookSourceDialog *dialog) -{ - dialog->source = addressbook_source_dialog_get_source (dialog); -} - -static void -addressbook_source_dialog_destroy (AddressbookSourceDialog *dialog) -{ - GList *s; - - for (s = dialog->source_pages; s; s = s->next) { - AddressbookSourcePageItem *source_item = s->data; - - g_list_foreach (source_item->auths, (GFunc)g_free, NULL); - g_list_free (source_item->auths); - g_free (source_item); - } - - g_list_free (dialog->source_pages); - - if (dialog->source) - addressbook_source_free (dialog->source); - g_free (dialog); -} - -static AddressbookSourceDialog* -addressbook_source_dialog (AddressbookSource *source, GtkWidget *parent) -{ - GtkWidget *table; - AddressbookSourceDialog *dialog = g_new0 (AddressbookSourceDialog, 1); - GtkWidget *vbox, *dialog_vbox; -#ifdef INCLUDE_FILE_SOURCE - GtkWidget *menu; - AddressbookSourcePageItem *first_item = NULL; -#endif - GtkWidget *area; - int i; - int row = 0; - - if (source) - dialog->dialog = gnome_dialog_new (_("Edit Addressbook"), NULL); - else - dialog->dialog = gnome_dialog_new (_("Add Addressbook"), NULL); - - gtk_window_set_modal (GTK_WINDOW (dialog->dialog), TRUE); - gtk_window_set_policy (GTK_WINDOW (dialog->dialog), - FALSE, TRUE, FALSE); - gtk_window_set_default_size (GTK_WINDOW (dialog->dialog), 300, 350); - gnome_dialog_set_parent (GNOME_DIALOG (dialog->dialog), - GTK_WINDOW (parent)); - - dialog->vbox = gtk_vbox_new (FALSE, 5); - dialog_vbox = GNOME_DIALOG (dialog->dialog)->vbox; - - vbox = gtk_vbox_new (FALSE, 0); - - dialog->html = html_new (FALSE); - put_html (GTK_HTML (dialog->html), - _("Select the kind of addressbook you have, and enter " - "the relevant information about it.")); - - table = gtk_table_new (2, 2, FALSE); - - dialog->name = table_add_elem (dialog, table, row++, - _("Name:"), - _("FIXME Name help text here")); - dialog->description = table_add_elem (dialog, table, row++, - _("Description:"), - _("FIXME Description help text here")); - - gtk_table_set_row_spacings (GTK_TABLE (table), 2); - gtk_table_set_col_spacings (GTK_TABLE (table), 10); - gtk_container_set_border_width (GTK_CONTAINER (table), 8); - - dialog->notebook = gtk_notebook_new(); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (dialog->notebook), FALSE); - -#ifdef INCLUDE_FILE_SOURCE - dialog->source_option = gtk_option_menu_new (); - menu = gtk_menu_new (); -#endif - - for (i = -#ifndef INCLUDE_FILE_SOURCE - ADDRESSBOOK_SOURCE_LDAP; -#else - ADDRESSBOOK_SOURCE_FILE; -#endif - i < ADDRESSBOOK_SOURCE_LAST; - i ++) { - AddressbookSourcePageItem *item; - - item = addressbook_source_item_new (dialog, i); - - dialog->source_pages = g_list_append (dialog->source_pages, item); - -#ifdef INCLUDE_FILE_SOURCE - item->item = gtk_menu_item_new_with_label (addressbook_config_source_label (i)); - - if (!first_item) - first_item = item; -#endif - - gtk_notebook_append_page (GTK_NOTEBOOK (dialog->notebook), - item->vbox, NULL); - - gtk_signal_connect (GTK_OBJECT (item->item), "activate", - GTK_SIGNAL_FUNC (source_type_menuitem_activate), - item); - -#ifdef INCLUDE_FILE_SOURCE - gtk_menu_append (GTK_MENU (menu), item->item); -#endif - gtk_widget_show (item->item); - } - -#ifdef INCLUDE_FILE_SOURCE - gtk_option_menu_set_menu (GTK_OPTION_MENU (dialog->source_option), menu); - source_type_menuitem_activate (first_item->item, first_item); - gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->source_option), 0); -#endif - - gtk_box_pack_start (GTK_BOX (vbox), dialog->html->parent, - FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox), table, - FALSE, FALSE, 0); - -#ifdef INCLUDE_FILE_SOURCE - gtk_box_pack_start (GTK_BOX (vbox), dialog->source_option, - FALSE, FALSE, 0); -#endif - - gtk_box_pack_start (GTK_BOX (dialog->vbox), vbox, FALSE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (dialog->vbox), dialog->notebook, - TRUE, TRUE, 0); - - /* hook our ui into the gnome-dialog */ - gtk_box_pack_start (GTK_BOX (dialog_vbox), dialog->vbox, TRUE, TRUE, 0); - - gtk_widget_show_all (dialog->vbox); - - /* Buttons */ - area = GNOME_DIALOG (dialog->dialog)->action_area; - gtk_widget_show (area); - gtk_button_box_set_layout (GTK_BUTTON_BOX (area), GTK_BUTTONBOX_END); - gtk_button_box_set_spacing (GTK_BUTTON_BOX (area), 8); - - gnome_dialog_append_button (GNOME_DIALOG (dialog->dialog), - GNOME_STOCK_BUTTON_OK); - gnome_dialog_append_button (GNOME_DIALOG (dialog->dialog), - GNOME_STOCK_BUTTON_CANCEL); - - gnome_dialog_set_default (GNOME_DIALOG (dialog->dialog), 0); - - /* fill in source info if there is some */ - if (source) - addressbook_source_dialog_set_source (dialog, source); - - gnome_dialog_set_sensitive (GNOME_DIALOG (dialog->dialog), 0, FALSE); - - gnome_dialog_button_connect( GNOME_DIALOG (dialog->dialog), 0, - GTK_SIGNAL_FUNC (addressbook_source_dialog_ok_clicked), - dialog); - - return dialog; -} - -static AddressbookSourceDialog * -addressbook_config_source (AddressbookSource *source, GtkWidget *parent) -{ - AddressbookSourceDialog* dialog = addressbook_source_dialog (source, parent); - - dialog->id = gnome_dialog_run_and_close (GNOME_DIALOG (dialog->dialog)); - - return dialog; -} - - - -typedef struct { - GladeXML *gui; - GNOME_Evolution_Shell shell; - GtkWidget *dialog; - GtkWidget *clistSources; - GtkWidget *addSource; - GtkWidget *editSource; - GtkWidget *deleteSource; - gint source_row; -} AddressbookDialog; - -static void -update_sensitivity (AddressbookDialog *dialog) -{ - gboolean sensitive = dialog->source_row != -1; - - gtk_widget_set_sensitive (dialog->editSource, sensitive); - gtk_widget_set_sensitive (dialog->deleteSource, sensitive); -} - -static void -add_source_clicked (GtkWidget *widget, AddressbookDialog *dialog) -{ - AddressbookSourceDialog *sdialog; - - sdialog = addressbook_config_source (NULL, dialog->dialog); - if (sdialog->id == 0) { - /* Ok was clicked */ - AddressbookSource *source = addressbook_source_copy(sdialog->source); - gint row; - gchar *text[2]; - - text[0] = source->name; - text[1] = source->uri; - - row = e_utf8_gtk_clist_append (GTK_CLIST(dialog->clistSources), text); - gtk_clist_set_row_data_full (GTK_CLIST(dialog->clistSources), row, source, (GtkDestroyNotify) addressbook_source_free); - gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog)); - update_sensitivity (dialog); - } - - addressbook_source_dialog_destroy (sdialog); -} - -static void -edit_source_clicked (GtkWidget *widget, AddressbookDialog *dialog) -{ - AddressbookSource *source; - AddressbookSourceDialog *sdialog; - - source = gtk_clist_get_row_data (GTK_CLIST (dialog->clistSources), dialog->source_row); - - sdialog = addressbook_config_source (source, dialog->dialog); - if (sdialog->id == 0) { - /* Ok was clicked */ - source = addressbook_source_copy(sdialog->source); - - e_utf8_gtk_clist_set_text (GTK_CLIST (dialog->clistSources), dialog->source_row, 0, source->name); - e_utf8_gtk_clist_set_text (GTK_CLIST (dialog->clistSources), dialog->source_row, 1, source->uri); - gtk_clist_set_row_data (GTK_CLIST (dialog->clistSources), dialog->source_row, source); - gnome_property_box_changed (GNOME_PROPERTY_BOX (dialog->dialog)); - update_sensitivity (dialog); - } - - addressbook_source_dialog_destroy (sdialog); -} - -static void -delete_source_clicked (GtkWidget *widget, AddressbookDialog *dialog) -{ - gtk_clist_remove (GTK_CLIST (dialog->clistSources), dialog->source_row); - dialog->source_row = -1; - gnome_property_box_changed (GNOME_PROPERTY_BOX(dialog->dialog)); - update_sensitivity (dialog); -} - -static void -sources_select_row (GtkWidget *widget, gint row, gint column, - GdkEventButton *event, AddressbookDialog *dialog) -{ - dialog->source_row = row; - - update_sensitivity (dialog); -} - -static void -addressbook_dialog_apply (GnomePropertyBox *property_box, gint page_num, AddressbookDialog *dialog) -{ - int i; - - if (page_num != -1) - return; - - addressbook_storage_clear_sources(); - - for (i = 0; i < GTK_CLIST(dialog->clistSources)->rows; i ++) { - AddressbookSource *source = (AddressbookSource*)gtk_clist_get_row_data (GTK_CLIST (dialog->clistSources), i); - addressbook_storage_add_source (addressbook_source_copy (source)); - } -} - -static void -addressbook_dialog_close (GnomePropertyBox *property_box, AddressbookDialog *dialog) -{ - gtk_object_unref (GTK_OBJECT (dialog->gui)); - g_free (dialog); -} - -void -addressbook_config (GNOME_Evolution_Shell shell) -{ - AddressbookDialog *dialog; - GladeXML *gui; - GtkWidget *clist; - GList *l; - - dialog = g_new0 (AddressbookDialog, 1); - - dialog->source_row = -1; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/addressbook-config.glade", NULL); - dialog->gui = gui; - dialog->shell = shell; - - dialog->dialog = glade_xml_get_widget (gui, "dialog"); - - clist = glade_xml_get_widget (gui, "clistSources"); - dialog->clistSources = clist; - - gtk_clist_column_titles_passive (GTK_CLIST (clist)); - gtk_clist_set_column_width (GTK_CLIST (clist), 0, 80); - - dialog->addSource = glade_xml_get_widget (gui, "addSource"); - gtk_signal_connect (GTK_OBJECT(dialog->addSource), "clicked", - GTK_SIGNAL_FUNC (add_source_clicked), - dialog); - - dialog->editSource = glade_xml_get_widget (gui, "editSource"); - gtk_signal_connect (GTK_OBJECT(dialog->editSource), "clicked", - GTK_SIGNAL_FUNC (edit_source_clicked), - dialog); - - dialog->deleteSource = glade_xml_get_widget (gui, "deleteSource"); - gtk_signal_connect (GTK_OBJECT(dialog->deleteSource), "clicked", - GTK_SIGNAL_FUNC (delete_source_clicked), - dialog); - - update_sensitivity (dialog); - - l = addressbook_storage_get_sources (); - for (; l != NULL; l = l->next) { - AddressbookSource *source; - gint row; - gchar *text[2]; - - source = addressbook_source_copy ((AddressbookSource*)l->data); - - text[0] = source->name; - text[1] = source->uri; - - row = e_utf8_gtk_clist_append (GTK_CLIST(clist), text); - gtk_clist_set_row_data_full (GTK_CLIST(clist), row, source, (GtkDestroyNotify) addressbook_source_free); - } - - gtk_signal_connect (GTK_OBJECT (clist), "select_row", - GTK_SIGNAL_FUNC (sources_select_row), - dialog); - - gtk_signal_connect (GTK_OBJECT (dialog->dialog), "apply", - addressbook_dialog_apply, dialog); - - gtk_signal_connect (GTK_OBJECT (dialog->dialog), "destroy", - addressbook_dialog_close, dialog); - - gtk_window_set_default_size (GTK_WINDOW (dialog->dialog), 300, 350); - - gtk_widget_show (dialog->dialog); -} diff --git a/addressbook/gui/component/addressbook-config.glade b/addressbook/gui/component/addressbook-config.glade deleted file mode 100644 index 9194a27c5d..0000000000 --- a/addressbook/gui/component/addressbook-config.glade +++ /dev/null @@ -1,158 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> -</project> - -<widget> - <class>GnomePropertyBox</class> - <name>dialog</name> - <width>460</width> - <height>360</height> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>False</allow_grow> - <auto_shrink>False</auto_shrink> - - <widget> - <class>GtkNotebook</class> - <child_name>GnomePropertyBox:notebook</child_name> - <name>notebook1</name> - <can_focus>True</can_focus> - <show_tabs>True</show_tabs> - <show_border>True</show_border> - <tab_pos>GTK_POS_TOP</tab_pos> - <scrollable>False</scrollable> - <tab_hborder>2</tab_hborder> - <tab_vborder>2</tab_vborder> - <popup_enable>False</popup_enable> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHBox</class> - <name>hbox2</name> - <homogeneous>False</homogeneous> - <spacing>0</spacing> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow1</name> - <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkCList</class> - <name>clistSources</name> - <can_focus>True</can_focus> - <columns>2</columns> - <column_widths>80,80</column_widths> - <selection_mode>GTK_SELECTION_SINGLE</selection_mode> - <show_titles>True</show_titles> - <shadow_type>GTK_SHADOW_IN</shadow_type> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label10</name> - <label>Name</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label11</name> - <label>URI</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - </widget> - - <widget> - <class>GtkVButtonBox</class> - <name>vbuttonbox2</name> - <layout_style>GTK_BUTTONBOX_START</layout_style> - <spacing>10</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - - <widget> - <class>GtkButton</class> - <name>addSource</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label>Add</label> - <relief>GTK_RELIEF_NORMAL</relief> - </widget> - - <widget> - <class>GtkButton</class> - <name>editSource</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label>Edit</label> - <relief>GTK_RELIEF_NORMAL</relief> - </widget> - - <widget> - <class>GtkButton</class> - <name>deleteSource</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <label>Delete</label> - <relief>GTK_RELIEF_NORMAL</relief> - </widget> - </widget> - </widget> - - <widget> - <class>GtkLabel</class> - <child_name>Notebook:tab</child_name> - <name>label8</name> - <label>Addressbook Sources</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> -</widget> - -</GTK-Interface> diff --git a/addressbook/gui/component/addressbook-config.h b/addressbook/gui/component/addressbook-config.h deleted file mode 100644 index 51fe555f00..0000000000 --- a/addressbook/gui/component/addressbook-config.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* addressbook-storage.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Toshok - */ - -#ifndef __ADDRESSBOOK_CONFIG_H__ -#define __ADDRESSBOOK_CONFIG_H__ - -#include "addressbook-storage.h" - -void addressbook_config (GNOME_Evolution_Shell shell); - -#endif /* __ADDRESSBOOK_CONFIG_H__ */ diff --git a/addressbook/gui/component/addressbook-factory.c b/addressbook/gui/component/addressbook-factory.c deleted file mode 100644 index 89514d6527..0000000000 --- a/addressbook/gui/component/addressbook-factory.c +++ /dev/null @@ -1,85 +0,0 @@ -/** - * sample-control-factory.c - * - * Copyright 1999, Helix Code, Inc. - * - * Author: - * Nat Friedman (nat@nat.org) - * - */ - -#include <config.h> -#include <glib.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-init.h> -#include <liboaf/liboaf.h> -#include <bonobo/bonobo-main.h> -#include <glade/glade.h> -#include <gal/widgets/e-cursors.h> -#include <unicode.h> - -#include "addressbook.h" -#include "addressbook-component.h" -#include "e-address-widget.h" -#include "e-address-popup.h" -#include "addressbook/gui/widgets/e-minicard-control.h" -#include "select-names/e-select-names-factory.h" - - -static void -init_corba (int *argc, char **argv) -{ - gnome_init_with_popt_table ("evolution-addressbook", "0.0", - *argc, argv, oaf_popt_options, 0, NULL); - - oaf_init (*argc, argv); -} - -static void -init_bonobo (int argc, char **argv) -{ - if (bonobo_init (CORBA_OBJECT_NIL, CORBA_OBJECT_NIL, CORBA_OBJECT_NIL) == FALSE) - g_error (_("Could not initialize Bonobo")); - - glade_gnome_init (); -} - -int -main (int argc, char **argv) -{ - bindtextdomain (PACKAGE, EVOLUTION_LOCALEDIR); - textdomain (PACKAGE); - - init_corba (&argc, argv); - - - init_bonobo (argc, argv); - - /* FIXME: Messy names here. This file should be `main.c'. `addressbook.c' should - be `addressbook-control-factory.c' and the functions should be called - `addressbook_control_factory_something()'. And `addressbook-component.c' - should be `addressbook-component-factory.c'. */ - - addressbook_factory_init (); - addressbook_component_factory_init (); - - e_select_names_factory_init (); - - e_minicard_control_factory_init (); - - e_address_widget_factory_init (); - e_address_popup_factory_init (); - - e_cursors_init(); - - unicode_init(); - -#if 0 - g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING); -#endif - - bonobo_main (); - - return 0; -} diff --git a/addressbook/gui/component/addressbook-storage.c b/addressbook/gui/component/addressbook-storage.c deleted file mode 100644 index 5fcebee68d..0000000000 --- a/addressbook/gui/component/addressbook-storage.c +++ /dev/null @@ -1,539 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-ldap-storage.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Toshok - */ - -/* The ldap server file goes like this: - - <?xml version="1.0"?> - <addressbooks> - <contactserver> - <name>LDAP Server</name> - <description>This is my company address book.</description> - <host>ldap.server.com</host> - <port>389</port> - <rootdn></rootdn> - <authmethod>simple</authmethod> - <binddn>cn=Chris Toshok,dc=helixcode,dc=com</binddn> - <rememberpass/> - </contactserver> - <contactfile> - <name>On Disk Contacts</name> - <description>This is one of my private contact dbs.</description> - <path>/home/toshok/contacts/work-contacts.db</path> - </contactfile> - </addressbooks> - - FIXME: Do we want to use a namespace for this? - FIXME: Do we want to have an internationalized description? - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <sys/types.h> -#include <sys/fcntl.h> -#include <sys/stat.h> -#include <errno.h> - -#include <glib.h> -#include <gnome-xml/parser.h> -#include <gnome-xml/xmlmemory.h> - -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <bonobo/bonobo-object.h> - -#include <gal/util/e-util.h> -#include <gal/util/e-xml-utils.h> -#include <libgnome/gnome-i18n.h> - -#include "evolution-shell-component.h" -#include "evolution-storage.h" - -#include "addressbook-storage.h" - -#define ADDRESSBOOK_SOURCES_XML "addressbook-sources.xml" - -static gboolean load_source_data (EvolutionStorage *storage, const char *file_path); -static gboolean save_source_data (const char *file_path); - -GList *sources; -EvolutionStorage *storage; -static char *storage_path; - -void -addressbook_storage_setup (EvolutionShellComponent *shell_component, - const char *evolution_homedir) -{ - EvolutionShellClient *shell_client; - GNOME_Evolution_Shell corba_shell; - - shell_client = evolution_shell_component_get_owner (shell_component); - if (shell_client == CORBA_OBJECT_NIL) { - g_warning ("We have no shell!?"); - return; - } - - corba_shell = bonobo_object_corba_objref (BONOBO_OBJECT (shell_client)); - - storage = evolution_storage_new (_("Other Contacts"), NULL, NULL); - if (evolution_storage_register_on_shell (storage, corba_shell) != EVOLUTION_STORAGE_OK) { - g_warning ("Cannot register storage"); - return; - } - - sources = NULL; - - gtk_object_set_data (GTK_OBJECT (shell_component), "e-storage", storage); - - if (storage_path) - g_free (storage_path); - storage_path = g_strdup_printf ("%s/" ADDRESSBOOK_SOURCES_XML, evolution_homedir); - load_source_data (storage, storage_path); -} - -static char * -get_string_value (xmlNode *node, - const char *name) -{ - xmlNode *p; - xmlChar *xml_string; - char *retval; - - p = e_xml_get_child_by_name (node, (xmlChar *) name); - if (p == NULL) - return NULL; - - p = e_xml_get_child_by_name (p, (xmlChar *) "text"); - if (p == NULL) /* there's no text between the tags, return the empty string */ - return g_strdup(""); - - xml_string = xmlNodeListGetString (node->doc, p, 1); - retval = g_strdup ((char *) xml_string); - xmlFree (xml_string); - - return retval; -} - -static char * -ldap_unparse_auth (AddressbookLDAPAuthType auth_type) -{ - switch (auth_type) { - case ADDRESSBOOK_LDAP_AUTH_NONE: - return "none"; - case ADDRESSBOOK_LDAP_AUTH_SIMPLE: - return "simple"; - case ADDRESSBOOK_LDAP_AUTH_SASL: - return "sasl"; - default: - g_assert(0); - return "none"; - } -} - -static AddressbookLDAPAuthType -ldap_parse_auth (const char *auth) -{ - if (!auth) - return ADDRESSBOOK_LDAP_AUTH_NONE; - - if (!strcmp (auth, "simple")) - return ADDRESSBOOK_LDAP_AUTH_SIMPLE; - else if (!strcmp (auth, "sasl")) - return ADDRESSBOOK_LDAP_AUTH_SASL; - else - return ADDRESSBOOK_LDAP_AUTH_NONE; -} - -static char * -ldap_unparse_scope (AddressbookLDAPScopeType scope_type) -{ - switch (scope_type) { - case ADDRESSBOOK_LDAP_SCOPE_BASE: - return "base"; - case ADDRESSBOOK_LDAP_SCOPE_ONELEVEL: - return "one"; - case ADDRESSBOOK_LDAP_SCOPE_SUBTREE: - return "sub"; - default: - g_assert(0); - return ""; - } -} - -static AddressbookLDAPScopeType -ldap_parse_scope (const char *scope) -{ - if (!scope) - return ADDRESSBOOK_LDAP_SCOPE_SUBTREE; /* XXX good default? */ - - if (!strcmp (scope, "base")) - return ADDRESSBOOK_LDAP_SCOPE_BASE; - else if (!strcmp (scope, "one")) - return ADDRESSBOOK_LDAP_SCOPE_ONELEVEL; - else - return ADDRESSBOOK_LDAP_SCOPE_SUBTREE; -} - -void -addressbook_storage_init_source_uri (AddressbookSource *source) -{ - if (source->uri) - g_free (source->uri); - - if (source->type == ADDRESSBOOK_SOURCE_LDAP) - source->uri = g_strdup_printf ("ldap://%s:%s/%s??%s", - source->ldap.host, source->ldap.port, - source->ldap.rootdn, ldap_unparse_scope(source->ldap.scope)); - else - source->uri = g_strdup_printf ("file://%s", - source->file.path); -} - -static gboolean -load_source_data (EvolutionStorage *storage, - const char *file_path) -{ - xmlDoc *doc; - xmlNode *root; - xmlNode *child; - - tryagain: - doc = xmlParseFile (file_path); - if (doc == NULL) { - /* check to see if a ldapserver.xml.new file is - there. if it is, rename it and run with it */ - char *new_path = g_strdup_printf ("%s.new", file_path); - struct stat sb; - - if (stat (new_path, &sb) == 0) { - int rv; - - rv = rename (new_path, file_path); - g_free (new_path); - - if (0 > rv) { - g_error ("Failed to rename %s: %s\n", - ADDRESSBOOK_SOURCES_XML, - strerror(errno)); - return FALSE; - } - else { - goto tryagain; - } - } - - g_free (new_path); - return TRUE; - } - - root = xmlDocGetRootElement (doc); - if (root == NULL || strcmp (root->name, "addressbooks") != 0) { - xmlFreeDoc (doc); - return FALSE; - } - - for (child = root->childs; child; child = child->next) { - char *path; - AddressbookSource *source; - - source = g_new0 (AddressbookSource, 1); - - if (!strcmp (child->name, "contactserver")) { - source->type = ADDRESSBOOK_SOURCE_LDAP; - source->ldap.port = get_string_value (child, "port"); - source->ldap.host = get_string_value (child, "host"); - source->ldap.rootdn = get_string_value (child, "rootdn"); - source->ldap.scope = ldap_parse_scope (get_string_value (child, "scope")); - source->ldap.auth = ldap_parse_auth (get_string_value (child, "authmethod")); - source->ldap.binddn = get_string_value (child, "binddn"); - } - else if (!strcmp (child->name, "contactfile")) { - source->type = ADDRESSBOOK_SOURCE_FILE; - source->file.path = get_string_value (child, "path"); - } - else { - g_warning ("unknown node '%s' in %s", child->name, file_path); - g_free (source); - continue; - } - - addressbook_storage_init_source_uri (source); - - source->name = get_string_value (child, "name"); - source->description = get_string_value (child, "description"); - - path = g_strdup_printf ("/%s", source->name); - evolution_storage_new_folder (storage, path, source->name, - "contacts", source->uri, - source->description, FALSE); - - sources = g_list_append (sources, source); - - g_free (path); - } - - xmlFreeDoc (doc); - - return TRUE; -} - -static void -ldap_source_foreach(AddressbookSource *source, xmlNode *root) -{ - xmlNode *source_root = xmlNewNode (NULL, - (xmlChar *) "contactserver"); - - xmlAddChild (root, source_root); - - xmlNewChild (source_root, NULL, (xmlChar *) "name", - (xmlChar *) source->name); - xmlNewChild (source_root, NULL, (xmlChar *) "description", - (xmlChar *) source->description); - - xmlNewChild (source_root, NULL, (xmlChar *) "port", - (xmlChar *) source->ldap.port); - xmlNewChild (source_root, NULL, (xmlChar *) "host", - (xmlChar *) source->ldap.host); - xmlNewChild (source_root, NULL, (xmlChar *) "rootdn", - (xmlChar *) source->ldap.rootdn); - xmlNewChild (source_root, NULL, (xmlChar *) "scope", - (xmlChar *) ldap_unparse_scope(source->ldap.scope)); - xmlNewChild (source_root, NULL, (xmlChar *) "authmethod", - (xmlChar *) ldap_unparse_auth(source->ldap.auth)); - if (source->ldap.auth == ADDRESSBOOK_LDAP_AUTH_SIMPLE) { - xmlNewChild (source_root, NULL, (xmlChar *) "binddn", - (xmlChar *) source->ldap.binddn); - if (source->ldap.remember_passwd) - xmlNewChild (source_root, NULL, (xmlChar *) "rememberpass", - NULL); - } -} - -static void -file_source_foreach (AddressbookSource *source, xmlNode *root) -{ - xmlNode *source_root = xmlNewNode (NULL, - (xmlChar *) "contactfile"); - - xmlAddChild (root, source_root); - - xmlNewChild (source_root, NULL, (xmlChar *) "name", - (xmlChar *) source->name); - xmlNewChild (source_root, NULL, (xmlChar *) "description", - (xmlChar *) source->description); - - xmlNewChild (source_root, NULL, (xmlChar *) "path", - (xmlChar *) source->file.path); -} - -static void -source_foreach(gpointer value, gpointer user_data) -{ - AddressbookSource *source = value; - xmlNode *root = user_data; - - if (source->type == ADDRESSBOOK_SOURCE_LDAP) - ldap_source_foreach(source, root); - else - file_source_foreach(source, root); -} - -static gboolean -save_source_data (const char *file_path) -{ - xmlDoc *doc; - xmlNode *root; - int fd, rv; - xmlChar *buf; - int buf_size; - char *new_path = g_strdup_printf ("%s.new", file_path); - - doc = xmlNewDoc ((xmlChar *) "1.0"); - root = xmlNewDocNode (doc, NULL, (xmlChar *) "addressbooks", NULL); - xmlDocSetRootElement (doc, root); - - g_list_foreach (sources, source_foreach, root); - - fd = open (new_path, O_CREAT | O_TRUNC | O_WRONLY, 0600); - fchmod (fd, 0600); - - xmlDocDumpMemory (doc, &buf, &buf_size); - - if (buf == NULL) { - g_error ("Failed to write %s: xmlBufferCreate() == NULL", ADDRESSBOOK_SOURCES_XML); - return FALSE; - } - - rv = write (fd, buf, buf_size); - xmlFree (buf); - close (fd); - - if (0 > rv) { - g_error ("Failed to write new %s: %s\n", ADDRESSBOOK_SOURCES_XML, strerror(errno)); - unlink (new_path); - return FALSE; - } - else { - if (0 > rename (new_path, file_path)) { - g_error ("Failed to rename %s: %s\n", ADDRESSBOOK_SOURCES_XML, strerror(errno)); - unlink (new_path); - return FALSE; - } - return TRUE; - } -} - -void -addressbook_storage_add_source (AddressbookSource *source) -{ - char *path; - - sources = g_list_append (sources, source); - - /* and then to the ui */ - path = g_strdup_printf ("/%s", source->name); - evolution_storage_new_folder (storage, path, source->name, "contacts", - source->uri, source->description, FALSE); - - g_free (path); - - save_source_data (storage_path); -} - -void -addressbook_storage_remove_source (const char *name) -{ - char *path; - AddressbookSource *source = NULL; - GList *l; - - /* remove it from our hashtable */ - for (l = sources; l; l = l->next) { - AddressbookSource *s = l->data; - if (!strcmp (s->name, name)) { - source = s; - break; - } - } - - if (!source) - return; - - sources = g_list_remove_link (sources, l); - g_list_free_1 (l); - - addressbook_source_free (source); - - /* and then from the ui */ - path = g_strdup_printf ("/%s", name); - evolution_storage_removed_folder (storage, path); - - g_free (path); - - save_source_data (storage_path); -} - -GList * -addressbook_storage_get_sources () -{ - return sources; -} - -AddressbookSource * -addressbook_storage_get_source_by_uri (const char *uri) -{ - GList *l; - - for (l = sources; l ; l = l->next) { - AddressbookSource *source = l->data; - if (!strcmp (uri, source->uri)) - return source; - } - - return NULL; -} - -void -addressbook_source_free (AddressbookSource *source) -{ - g_free (source->name); - g_free (source->description); - g_free (source->uri); - if (source->type == ADDRESSBOOK_SOURCE_LDAP) { - g_free (source->ldap.host); - g_free (source->ldap.port); - g_free (source->ldap.rootdn); - g_free (source->ldap.binddn); - } else { - g_free (source->file.path); - } - - g_free (source); -} - -static void -addressbook_source_foreach (AddressbookSource *source, gpointer data) -{ - char *path = g_strdup_printf ("/%s", source->name); - - evolution_storage_removed_folder (storage, path); - - g_free (path); - - addressbook_source_free (source); -} - -void -addressbook_storage_clear_sources () -{ - g_list_foreach (sources, (GFunc)addressbook_source_foreach, NULL); - g_list_free (sources); - sources = NULL; -} - -AddressbookSource * -addressbook_source_copy (const AddressbookSource *source) -{ - AddressbookSource *copy; - - copy = g_new0 (AddressbookSource, 1); - copy->name = g_strdup (source->name); - copy->description = g_strdup (source->description); - copy->type = source->type; - copy->uri = g_strdup (source->uri); - - if (copy->type == ADDRESSBOOK_SOURCE_LDAP) { - copy->ldap.host = g_strdup (source->ldap.host); - copy->ldap.port = g_strdup (source->ldap.port); - copy->ldap.rootdn = g_strdup (source->ldap.rootdn); - copy->ldap.scope = source->ldap.scope; - copy->ldap.auth = source->ldap.auth; - copy->ldap.binddn = source->ldap.binddn; - copy->ldap.remember_passwd = source->ldap.remember_passwd; - } - else { - copy->file.path = g_strdup (source->file.path); - } - return copy; -} diff --git a/addressbook/gui/component/addressbook-storage.h b/addressbook/gui/component/addressbook-storage.h deleted file mode 100644 index 518977598e..0000000000 --- a/addressbook/gui/component/addressbook-storage.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* addressbook-storage.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Toshok - */ - -#ifndef __ADDRESSBOOK_STORAGE_H__ -#define __ADDRESSBOOK_STORAGE_H__ - -#include "evolution-shell-component.h" - -typedef enum { - ADDRESSBOOK_SOURCE_FILE, - ADDRESSBOOK_SOURCE_LDAP, - ADDRESSBOOK_SOURCE_LAST -} AddressbookSourceType; - -typedef enum { - ADDRESSBOOK_LDAP_AUTH_NONE, - ADDRESSBOOK_LDAP_AUTH_SIMPLE, - ADDRESSBOOK_LDAP_AUTH_SASL, /* XXX currently unsupported */ - ADDRESSBOOK_LDAP_AUTH_LAST -} AddressbookLDAPAuthType; - -typedef enum { - ADDRESSBOOK_LDAP_SCOPE_SUBTREE, - ADDRESSBOOK_LDAP_SCOPE_BASE, - ADDRESSBOOK_LDAP_SCOPE_ONELEVEL, - ADDRESSBOOK_LDAP_SCOPE_LAST -} AddressbookLDAPScopeType; - -typedef struct { - AddressbookSourceType type; - char *name; - char *description; - struct { - char *path; - } file; - struct { - char *host; - char *port; - char *rootdn; - AddressbookLDAPScopeType scope; - AddressbookLDAPAuthType auth; - char *binddn; /* used in AUTH_SIMPLE */ - gboolean remember_passwd; - } ldap; - char *uri; /* filled in from the above */ -} AddressbookSource; - -void addressbook_storage_setup (EvolutionShellComponent *shell_component, - const char *evolution_homedir); - -GList *addressbook_storage_get_sources (void); -AddressbookSource *addressbook_storage_get_source_by_uri (const char *uri); -void addressbook_storage_clear_sources (void); -AddressbookSource *addressbook_source_copy (const AddressbookSource *source); -void addressbook_source_free (AddressbookSource *source); -void addressbook_storage_init_source_uri (AddressbookSource *source); - -void addressbook_storage_add_source (AddressbookSource *source); -void addressbook_storage_remove_source (const char *name); - -#endif /* __ADDRESSBOOK_STORAGE_H__ */ diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c deleted file mode 100644 index f165217f14..0000000000 --- a/addressbook/gui/component/addressbook.c +++ /dev/null @@ -1,771 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * addressbook.c: - * - * Author: - * Chris Lahey (clahey@helixcode.com) - * - * (C) 2000 Helix Code, Inc. - */ - -#include <config.h> - -#include <glib.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-stock.h> -#include <libgnomeui/gnome-uidefs.h> -#include <bonobo/bonobo-generic-factory.h> -#include <bonobo/bonobo-ui-util.h> -#include <gal/util/e-util.h> -#include <gal/widgets/e-unicode.h> - -#include "select-names/e-select-names.h" -#include "select-names/e-select-names-manager.h" - -#include "e-util/e-gui-utils.h" -#include "e-contact-editor.h" -#include "e-contact-save-as.h" -#include "addressbook-config.h" -#include "addressbook.h" -#include "addressbook/gui/search/e-addressbook-search-dialog.h" -#include "addressbook/gui/widgets/e-addressbook-view.h" -#include "addressbook/printing/e-contact-print.h" - -#include <ebook/e-book.h> -#include <widgets/misc/e-search-bar.h> - -#define PROPERTY_FOLDER_URI "folder_uri" - -#define PROPERTY_FOLDER_URI_IDX 1 - -typedef struct { - EAddressbookView *view; - ESearchBar *search; - GtkWidget *vbox; - BonoboControl *control; - BonoboPropertyBag *properties; - char *uri; - char *passwd; -} AddressbookView; - -static void -card_added_cb (EBook* book, EBookStatus status, const char *id, - gpointer user_data) -{ - g_print ("%s: %s(): a card was added\n", __FILE__, __FUNCTION__); -} - -static void -card_modified_cb (EBook* book, EBookStatus status, - gpointer user_data) -{ - g_print ("%s: %s(): a card was modified\n", __FILE__, __FUNCTION__); -} - -/* Callback for the add_card signal from the contact editor */ -static void -add_card_cb (EContactEditor *ce, ECard *card, gpointer data) -{ - EBook *book; - - book = E_BOOK (data); - e_book_add_card (book, card, card_added_cb, NULL); -} - -/* Callback for the commit_card signal from the contact editor */ -static void -commit_card_cb (EContactEditor *ce, ECard *card, gpointer data) -{ - EBook *book; - - book = E_BOOK (data); - e_book_commit_card (book, card, card_modified_cb, NULL); -} - -/* Callback for the delete_card signal from the contact editor */ -static void -delete_card_cb (EContactEditor *ce, ECard *card, gpointer data) -{ - EBook *book; - - book = E_BOOK (data); - e_book_remove_card (book, card, card_modified_cb, NULL); -} - -/* Callback used when the contact editor is closed */ -static void -editor_closed_cb (EContactEditor *ce, gpointer data) -{ - gtk_object_unref (GTK_OBJECT (ce)); -} - -static void -supported_fields_cb (EBook *book, EBookStatus status, EList *fields, gpointer closure) -{ - EContactEditor *ce; - ECard *card; - - card = e_card_new(""); - - ce = e_contact_editor_new (card, TRUE, fields, FALSE); - - gtk_signal_connect (GTK_OBJECT (ce), "add_card", - GTK_SIGNAL_FUNC (add_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "commit_card", - GTK_SIGNAL_FUNC (commit_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "delete_card", - GTK_SIGNAL_FUNC (delete_card_cb), book); - gtk_signal_connect (GTK_OBJECT (ce), "editor_closed", - GTK_SIGNAL_FUNC (editor_closed_cb), NULL); - - gtk_object_sink(GTK_OBJECT(card)); -} - -static void -new_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - EBook *book; - AddressbookView *view = (AddressbookView *) user_data; - - gtk_object_get(GTK_OBJECT(view->view), - "book", &book, - NULL); - - g_assert (E_IS_BOOK (book)); - - e_book_get_supported_fields (book, supported_fields_cb, view); -} - -static void -config_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - addressbook_config (NULL /* XXX */); -} - -static void -search_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - EBook *book; - AddressbookView *view = (AddressbookView *) user_data; - - gtk_object_get(GTK_OBJECT(view->view), - "book", &book, - NULL); - g_assert (E_IS_BOOK (book)); - - gtk_widget_show(e_addressbook_search_dialog_new(book)); -} - -#if 0 -static void -find_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - gint result; - GtkWidget* search_entry = gtk_entry_new(); - gchar* search_text; - AddressbookView *view = (AddressbookView *) user_data; - - GtkWidget* dlg = gnome_dialog_new ("Search Contacts", "Find", - GNOME_STOCK_BUTTON_CANCEL, NULL); - - gtk_object_get (view->view, - "query", &search_text, - NULL); - e_utf8_gtk_entry_set_text(GTK_ENTRY(search_entry), search_text); - g_free (search_text); - - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dlg)->vbox), - search_entry, TRUE, TRUE, 0); - - gtk_widget_show_all (dlg); - - gnome_dialog_close_hides (GNOME_DIALOG (dlg), TRUE); - result = gnome_dialog_run_and_close (GNOME_DIALOG (dlg)); - - /* If the user clicks "okay"...*/ - if (result == 0) { - search_text = e_utf8_gtk_entry_get_text(GTK_ENTRY(search_entry)); - gtk_object_set (view->view, - "query", query, - NULL); - g_free (search_text); - } -} -#endif - -static void -delete_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - e_addressbook_view_delete_selection(view->view); -} - -static void -print_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - e_addressbook_view_print(view->view); -} - -static void -show_all_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - e_addressbook_view_show_all(view->view); -} - -static void -stop_loading_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - e_addressbook_view_stop(view->view); -} - -static void -update_view_type (AddressbookView *view) -{ - BonoboUIComponent *uic = bonobo_control_get_ui_component (view->control); - EAddressbookViewType view_type; - - if (!uic || bonobo_ui_component_get_container (uic) == CORBA_OBJECT_NIL) - return; - - gtk_object_get (GTK_OBJECT (view->view), "type", &view_type, NULL); - - switch (view_type) { - case E_ADDRESSBOOK_VIEW_TABLE: - if (uic) - bonobo_ui_component_set_prop (uic, "/menu/View/AsTable", - "label", _("As _Minicards"), NULL); - - break; - case E_ADDRESSBOOK_VIEW_MINICARD: - if (uic) - bonobo_ui_component_set_prop (uic, "/menu/View/AsTable", - "label", _("As _Table"), NULL); - break; - default: - g_warning ("view_type must be either TABLE or MINICARD\n"); - return; - } -} - -static void -change_view_type (AddressbookView *view, EAddressbookViewType view_type) -{ - gtk_object_set (GTK_OBJECT (view->view), "type", view_type, NULL); - - update_view_type (view); -} - -static void -toggle_view_as_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = user_data; - EAddressbookViewType view_type; - - gtk_object_get (GTK_OBJECT (view->view), "type", &view_type, NULL); - - if (view_type == E_ADDRESSBOOK_VIEW_TABLE) - change_view_type (view, E_ADDRESSBOOK_VIEW_MINICARD); - else - change_view_type (view, E_ADDRESSBOOK_VIEW_TABLE); -} - -BonoboUIVerb verbs [] = { - BONOBO_UI_UNSAFE_VERB ("ContactsPrint", print_cb), - BONOBO_UI_UNSAFE_VERB ("ViewAsTable", toggle_view_as_cb), - BONOBO_UI_UNSAFE_VERB ("ViewNewContact", new_contact_cb), - BONOBO_UI_UNSAFE_VERB ("ToolSearch", search_cb), - - BONOBO_UI_UNSAFE_VERB ("AddressbookConfig", config_cb), - - BONOBO_UI_UNSAFE_VERB ("ContactNew", new_contact_cb), -/* BONOBO_UI_UNSAFE_VERB ("ContactFind", find_contact_cb),*/ - BONOBO_UI_UNSAFE_VERB ("ContactDelete", delete_contact_cb), - BONOBO_UI_UNSAFE_VERB ("ContactViewAll", show_all_contacts_cb), - BONOBO_UI_UNSAFE_VERB ("ContactStop", stop_loading_cb), - - BONOBO_UI_VERB_END -}; - -static EPixmap pixmaps [] = { - E_PIXMAP ("/menu/File/New/NewFirstItem/New", "evolution-contacts-mini.png"), - E_PIXMAP ("/menu/File/Print/Print", "print.xpm"), - E_PIXMAP ("/menu/File/Print/Print Preview", "print-preview.xpm"), - E_PIXMAP ("/menu/Tools/Component/AddressbookConfig", "configure_16_addressbook.xpm"), - - E_PIXMAP ("/Toolbar/View All", "all_contacts.xpm"), - E_PIXMAP ("/Toolbar/Find", "find_contact.xpm"), - E_PIXMAP ("/Toolbar/New", "new_contact.xpm"), - - E_PIXMAP_END -}; - -static void -control_activate (BonoboControl *control, - BonoboUIComponent *uic, - AddressbookView *view) -{ - Bonobo_UIContainer remote_ui_container; - - remote_ui_container = bonobo_control_get_remote_ui_container (control); - bonobo_ui_component_set_container (uic, remote_ui_container); - bonobo_object_release_unref (remote_ui_container, NULL); - - bonobo_ui_component_add_verb_list_with_data ( - uic, verbs, view); - - bonobo_ui_component_freeze (uic, NULL); - - bonobo_ui_util_set_ui (uic, EVOLUTION_DATADIR, - "evolution-addressbook.xml", - "evolution-addressbook"); - - e_addressbook_view_setup_menus (view->view, uic); - - update_view_type (view); - - e_pixmaps_update (uic, pixmaps); - - bonobo_ui_component_thaw (uic, NULL); -} - -static void -control_activate_cb (BonoboControl *control, - gboolean activate, - AddressbookView *view) -{ - BonoboUIComponent *uic; - - uic = bonobo_control_get_ui_component (control); - g_assert (uic != NULL); - - if (activate) - control_activate (control, uic, view); - else - bonobo_ui_component_unset_container (uic); -} - -static void -addressbook_view_free(AddressbookView *view) -{ - if (view->properties) - bonobo_object_unref(BONOBO_OBJECT(view->properties)); - g_free(view->passwd); - g_free(view->uri); - g_free(view); -} - -static void -book_auth_cb (EBook *book, EBookStatus status, gpointer closure) -{ - AddressbookView *view = closure; - if (status == E_BOOK_STATUS_SUCCESS) { - gtk_object_set(GTK_OBJECT(view->view), - "book", book, - NULL); - } - else { - /* pop up a nice dialog, or redo the authentication - bit some number of times. */ - } -} - -static void -passwd_cb (gchar *string, gpointer data) -{ - AddressbookView *view = (AddressbookView*)data; - - view->passwd = g_strdup (string); -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - if (status == E_BOOK_STATUS_SUCCESS) { - AddressbookView *view = closure; - AddressbookSource *source; - - /* check if the addressbook needs authentication */ - - source = addressbook_storage_get_source_by_uri (view->uri); - if (source && - source->type == ADDRESSBOOK_SOURCE_LDAP && - source->ldap.auth == ADDRESSBOOK_LDAP_AUTH_SIMPLE) { - int button; - char *msg = g_strdup_printf (_("Enter password for %s"), source->ldap.binddn); - /* give a password prompt for the binddn */ - GtkWidget *dialog = gnome_request_dialog (TRUE, msg, NULL, - 0, passwd_cb, view, NULL); - - button = gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); - - if (button == 0 && *(view->passwd)) { - e_book_authenticate_user (book, source->ldap.binddn, view->passwd, - book_auth_cb, closure); - memset (view->passwd, 0, strlen (view->passwd)); /* clear out the passwd */ - g_free (view->passwd); - view->passwd = NULL; - return; - } - } - - - /* if they either didn't configure the source to use - authentication, or they canceled the dialog, - proceed without authenticating */ - gtk_object_set(GTK_OBJECT(view->view), - "book", book, - NULL); - - } else { - GtkWidget *warning_dialog, *label, *href; - warning_dialog = gnome_dialog_new ( - _("Unable to open addressbook"), - GNOME_STOCK_BUTTON_CLOSE, - NULL); - - label = gtk_label_new ( - _("We were unable to open this addressbook. This either\n" - "means you have entered an incorrect URI, or have tried\n" - "to access an LDAP server and don't have LDAP support\n" - "compiled in. If you've entered a URI, check the URI for\n" - "correctness and reenter. If not, you probably have\n" - "attempted to access an LDAP server. If you wish to be\n" - "able to use LDAP, you'll need to download and install\n" - "OpenLDAP and recompile and install Evolution.\n")); - gtk_misc_set_alignment(GTK_MISC(label), - 0, .5); - gtk_label_set_justify(GTK_LABEL(label), - GTK_JUSTIFY_LEFT); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox), - label, TRUE, TRUE, 0); - gtk_widget_show (label); - - href = gnome_href_new ("http://www.openldap.org/", "OpenLDAP at http://www.openldap.org/"); - gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (warning_dialog)->vbox), - href, FALSE, FALSE, 0); - gtk_widget_show (href); - - gnome_dialog_run (GNOME_DIALOG (warning_dialog)); - - gtk_object_destroy (GTK_OBJECT (warning_dialog)); - } -} - -static void destroy_callback(GtkWidget *widget, gpointer data) -{ - AddressbookView *view = data; - addressbook_view_free(view); -} - -static void -get_prop (BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - AddressbookView *view = user_data; - - switch (arg_id) { - - case PROPERTY_FOLDER_URI_IDX: - if (view && view->uri) - BONOBO_ARG_SET_STRING (arg, view->uri); - else - BONOBO_ARG_SET_STRING (arg, ""); - break; - - default: - g_warning ("Unhandled arg %d\n", arg_id); - } -} - -static void -set_prop (BonoboPropertyBag *bag, - const BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - AddressbookView *view = user_data; - - char *uri_data; - EBook *book; - - switch (arg_id) { - - case PROPERTY_FOLDER_URI_IDX: - gtk_object_get(GTK_OBJECT(view->view), - "book", &book, - NULL); - if (view->uri) { - /* we've already had a uri set on this view, so unload it */ - e_book_unload_uri (book); - g_free (view->uri); - } else { - book = e_book_new (); - } - - view->uri = g_strdup(BONOBO_ARG_GET_STRING (arg)); - - if (!strncmp (view->uri, "file:", 5)) { - - if (strlen (view->uri + 7) > 3 - && !strcmp (view->uri + strlen(view->uri) - 3, ".db")) { - /* it's a .db file */ - uri_data = g_strdup (view->uri); - } - else { - char *file_name; - /* we assume it's a dir and glom addressbook.db onto the end. */ - file_name = g_concat_dir_and_file(view->uri + 7, "addressbook.db"); - uri_data = g_strdup_printf("file://%s", file_name); - g_free(file_name); - } - - } - else { - uri_data = g_strdup (view->uri); - } - - if (! e_book_load_uri (book, uri_data, book_open_cb, view)) - printf ("error calling load_uri!\n"); - - g_free(uri_data); - - break; - - default: - g_warning ("Unhandled arg %d\n", arg_id); - break; - } -} - -enum { - ESB_SHOW_ALL, - ESB_ADVANCED, -}; - -static ESearchBarItem addressbook_search_menu_items[] = { - { N_("Show All"), ESB_SHOW_ALL }, - { NULL, 0 }, - { N_("Advanced..."), ESB_ADVANCED}, - { NULL, -1 } -}; - -static void -addressbook_menu_activated (ESearchBar *esb, int id, AddressbookView *view) -{ - EBook *book; - switch (id) { - case ESB_SHOW_ALL: - e_addressbook_view_show_all(view->view); - break; - case ESB_ADVANCED: - gtk_object_get(GTK_OBJECT(view->view), - "book", &book, - NULL); - g_assert (E_IS_BOOK (book)); - - gtk_widget_show(e_addressbook_search_dialog_new(book)); - break; - } -} - -enum { - ESB_ANY, - ESB_FULL_NAME, - ESB_EMAIL, -}; - -static ESearchBarItem addressbook_search_option_items[] = { - { N_("Any field contains"), ESB_ANY }, - { N_("Name contains"), ESB_FULL_NAME }, - { N_("Email contains"), ESB_EMAIL }, - { NULL, -1 } -}; - -static void -addressbook_query_changed (ESearchBar *esb, AddressbookView *view) -{ - char *search_word, *search_query; - int search_type; - - gtk_object_get(GTK_OBJECT(esb), - "text", &search_word, - "option_choice", &search_type, - NULL); - - if (search_word && strlen (search_word)) { - switch (search_type) { - case ESB_ANY: - search_query = g_strdup_printf ("(contains \"x-evolution-any-field\" \"%s\")", - search_word); - break; - case ESB_FULL_NAME: - search_query = g_strdup_printf ("(contains \"full_name\" \"%s\")", - search_word); - break; - case ESB_EMAIL: - search_query = g_strdup_printf ("(contains \"email\" \"%s\")", - search_word); - break; - default: - search_query = g_strdup ("(contains \"full_name\" \"\")"); - break; - } - } else - search_query = g_strdup ("(contains \"full_name\" \"\")"); - - gtk_object_set (GTK_OBJECT(view->view), - "query", search_query, - NULL); - - g_free (search_query); - g_free (search_word); -} - -static GNOME_Evolution_ShellView -retrieve_shell_view_interface_from_control (BonoboControl *control) -{ - Bonobo_ControlFrame control_frame; - GNOME_Evolution_ShellView shell_view_interface; - CORBA_Environment ev; - - shell_view_interface = gtk_object_get_data (GTK_OBJECT (control), - "shell_view_interface"); - - if (shell_view_interface) - return shell_view_interface; - - control_frame = bonobo_control_get_control_frame (control); - - if (control_frame == NULL) - return CORBA_OBJECT_NIL; - - CORBA_exception_init (&ev); - shell_view_interface = Bonobo_Unknown_queryInterface (control_frame, - "IDL:GNOME/Evolution/ShellView:1.0", - &ev); - CORBA_exception_free (&ev); - - if (shell_view_interface != CORBA_OBJECT_NIL) - gtk_object_set_data (GTK_OBJECT (control), - "shell_view_interface", - shell_view_interface); - else - g_warning ("Control frame doesn't have Evolution/ShellView."); - - return shell_view_interface; -} - -static void -set_status_message (EAddressbookView *eav, const char *message, AddressbookView *view) -{ - CORBA_Environment ev; - GNOME_Evolution_ShellView shell_view_interface; - - CORBA_exception_init (&ev); - - shell_view_interface = retrieve_shell_view_interface_from_control (view->control); - - if (message == NULL || message[0] == 0) { - printf ("clearing message\n"); - GNOME_Evolution_ShellView_unsetMessage (shell_view_interface, &ev); - } - else { - printf ("setting message %s\n", message); - GNOME_Evolution_ShellView_setMessage (shell_view_interface, - message, 0 /* XXX */, &ev); - } - - CORBA_exception_free (&ev); -} - -BonoboControl * -addressbook_factory_new_control (void) -{ - AddressbookView *view; - - view = g_new0 (AddressbookView, 1); - - view->vbox = gtk_vbox_new(FALSE, GNOME_PAD); - - gtk_container_set_border_width(GTK_CONTAINER(view->vbox), GNOME_PAD_SMALL); - - gtk_signal_connect( GTK_OBJECT( view->vbox ), "destroy", - GTK_SIGNAL_FUNC( destroy_callback ), - ( gpointer ) view ); - - /* Create the control. */ - view->control = bonobo_control_new(view->vbox); - - view->search = E_SEARCH_BAR(e_search_bar_new(addressbook_search_menu_items, - addressbook_search_option_items)); - gtk_box_pack_start (GTK_BOX (view->vbox), GTK_WIDGET (view->search), - FALSE, FALSE, 0); - gtk_signal_connect (GTK_OBJECT (view->search), "query_changed", - GTK_SIGNAL_FUNC (addressbook_query_changed), view); - gtk_signal_connect (GTK_OBJECT (view->search), "menu_activated", - GTK_SIGNAL_FUNC (addressbook_menu_activated), view); - - view->view = E_ADDRESSBOOK_VIEW(e_addressbook_view_new()); - gtk_box_pack_start(GTK_BOX(view->vbox), GTK_WIDGET(view->view), - TRUE, TRUE, 0); - - /* create the initial view */ - change_view_type (view, E_ADDRESSBOOK_VIEW_MINICARD); - - gtk_widget_show( view->vbox ); - gtk_widget_show( GTK_WIDGET(view->view) ); - gtk_widget_show( GTK_WIDGET(view->search) ); - - view->properties = bonobo_property_bag_new (get_prop, set_prop, view); - - bonobo_property_bag_add ( - view->properties, PROPERTY_FOLDER_URI, PROPERTY_FOLDER_URI_IDX, - BONOBO_ARG_STRING, NULL, _("The URI that the Folder Browser will display"), 0); - - bonobo_control_set_properties (view->control, - view->properties); - - gtk_signal_connect (GTK_OBJECT (view->view), - "status_message", - GTK_SIGNAL_FUNC(set_status_message), - view); - - view->uri = NULL; - - gtk_signal_connect (GTK_OBJECT (view->control), "activate", - control_activate_cb, view); - - return view->control; -} - -static BonoboObject * -addressbook_factory (BonoboGenericFactory *Factory, void *closure) -{ - return BONOBO_OBJECT (addressbook_factory_new_control ()); -} - -void -addressbook_factory_init (void) -{ - static BonoboGenericFactory *addressbook_control_factory = NULL; - - if (addressbook_control_factory != NULL) - return; - - addressbook_control_factory = bonobo_generic_factory_new ( - "OAFIID:GNOME_Evolution_Addressbook_ControlFactory", - addressbook_factory, NULL); - - if (addressbook_control_factory == NULL) { - g_error ("I could not register a Addressbook factory."); - } -} diff --git a/addressbook/gui/component/addressbook.h b/addressbook/gui/component/addressbook.h deleted file mode 100644 index 66c5a7e4e6..0000000000 --- a/addressbook/gui/component/addressbook.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __ADDRESSBOOK_H__ -#define __ADDRESSBOOK_H__ - -#include <bonobo/bonobo-control.h> - -BonoboControl *addressbook_factory_new_control (void); -void addressbook_factory_init (void); - -#endif /* __ADDRESSBOOK_H__ */ diff --git a/addressbook/gui/component/e-address-popup.c b/addressbook/gui/component/e-address-popup.c deleted file mode 100644 index 19afd29baf..0000000000 --- a/addressbook/gui/component/e-address-popup.c +++ /dev/null @@ -1,521 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-address-popup.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include "e-address-popup.h" -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-property-bag.h> -#include <bonobo/bonobo-generic-factory.h> -#include <gal/widgets/e-popup-menu.h> -#include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/contact-editor/e-contact-editor.h> -#include <addressbook/contact-editor/e-contact-quick-add.h> -#include <addressbook/gui/widgets/e-minicard-widget.h> - -static GtkObjectClass *parent_class; -static EBook *common_book = NULL; /* still sort of lame */ - -static void e_address_popup_destroy (GtkObject *); -static void e_address_popup_realize (GtkWidget *); -static gint e_address_popup_button_press_event (GtkWidget *, GdkEventButton *ev); -static gint e_address_popup_enter_notify_event (GtkWidget *, GdkEventCrossing *ev); -static gint e_address_popup_leave_notify_event (GtkWidget *, GdkEventCrossing *ev); - -static void e_address_popup_query (EAddressPopup *); - - -static void -e_address_popup_class_init (EAddressPopupClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - - parent_class = GTK_OBJECT_CLASS (gtk_type_class (gtk_event_box_get_type ())); - - object_class->destroy = e_address_popup_destroy; - - widget_class->realize = e_address_popup_realize; - widget_class->button_press_event = e_address_popup_button_press_event; - widget_class->enter_notify_event = e_address_popup_enter_notify_event; - widget_class->leave_notify_event = e_address_popup_leave_notify_event; -} - -static void -e_address_popup_init (EAddressPopup *pop) -{ - -} - -static void -e_address_popup_destroy (GtkObject *obj) -{ - EAddressPopup *pop = E_ADDRESS_POPUP (obj); - - if (pop->card) - gtk_object_unref (GTK_OBJECT (pop->card)); - - if (pop->leave_timeout_tag) - gtk_timeout_remove (pop->leave_timeout_tag); - - g_free (pop->name); - g_free (pop->email); - - if (GTK_OBJECT_CLASS (parent_class)->destroy) - GTK_OBJECT_CLASS (parent_class)->destroy (obj); -} - -static void -e_address_popup_realize (GtkWidget *w) -{ - EAddressPopup *pop = E_ADDRESS_POPUP (w); - - if (GTK_WIDGET_CLASS (parent_class)->realize) - GTK_WIDGET_CLASS (parent_class)->realize (w); - - /* Start the death count. */ - pop->leave_timeout_tag = gtk_timeout_add (10000, (GtkFunction) gtk_widget_destroy, pop); -} - -static gint -e_address_popup_button_press_event (GtkWidget *w, GdkEventButton *ev) -{ - gtk_widget_destroy (w); - return FALSE; -} - -static gint -e_address_popup_enter_notify_event (GtkWidget *w, GdkEventCrossing *ev) -{ - EAddressPopup *pop = E_ADDRESS_POPUP (w); - - if (pop->leave_timeout_tag) { - gtk_timeout_remove (pop->leave_timeout_tag); - pop->leave_timeout_tag = 0; - } - - return FALSE; -} - -static gint -e_address_popup_leave_notify_event (GtkWidget *w, GdkEventCrossing *ev) -{ - EAddressPopup *pop = E_ADDRESS_POPUP (w); - const gint slack=5; - gint x, y; - - /* Manually check our "leave" events to avoid weird erroneous leaves - that seem related to bonobo... */ - gdk_window_get_pointer (w->window, &x, &y, NULL); - if (slack <= x && x < w->allocation.width-slack && slack <= y && y < w->allocation.height-slack) - return FALSE; - - if (pop->leave_timeout_tag == 0) - pop->leave_timeout_tag = gtk_timeout_add (1000, (GtkFunction) gtk_widget_destroy, pop); - - return FALSE; -} - -GtkType -e_address_popup_get_type (void) -{ - static GtkType pop_type = 0; - - if (!pop_type) { - GtkTypeInfo pop_info = { - "EAddressPopup", - sizeof (EAddressPopup), - sizeof (EAddressPopupClass), - (GtkClassInitFunc) e_address_popup_class_init, - (GtkObjectInitFunc) e_address_popup_init, - NULL, NULL, - (GtkClassInitFunc) NULL - }; - - pop_type = gtk_type_unique (gtk_event_box_get_type (), &pop_info); - } - - return pop_type; -} - -static void -e_address_popup_refresh_names (EAddressPopup *pop) -{ - if (pop->name_widget) { - if (pop->name && *pop->name) { - gtk_label_set_text (GTK_LABEL (pop->name_widget), pop->name); - gtk_widget_show (pop->name_widget); - } else { - gtk_widget_hide (pop->name_widget); - } - } - - if (pop->email_widget) { - if (pop->email && *pop->email) { - gtk_label_set_text (GTK_LABEL (pop->email_widget), pop->email); - gtk_widget_show (pop->email_widget); - } else { - gtk_widget_hide (pop->email_widget); - } - } - - e_address_popup_query (pop); -} - -void -e_address_popup_set_name (EAddressPopup *pop, const gchar *name) -{ - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - - g_free (pop->name); - pop->name = g_strdup (name); - g_strstrip (pop->name); - - ++pop->set_count; - - if (pop->set_count >= 2) - e_address_popup_refresh_names (pop); -} - -void -e_address_popup_set_email (EAddressPopup *pop, const gchar *email) -{ - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - - g_free (pop->email); - pop->email = g_strdup (email); - g_strstrip (pop->email); - - ++pop->set_count; - - if (pop->set_count >= 2) - e_address_popup_refresh_names (pop); -} - -void -e_address_popup_construct (EAddressPopup *pop) -{ - GtkWidget *vbox, *name_holder; - GdkColor color = { 0x0, 0xffff, 0xffff, 0xffff }; - - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - - pop->main_vbox = gtk_vbox_new (FALSE, 0); - - /* Build Generic View */ - - name_holder = gtk_event_box_new (); - vbox = gtk_vbox_new (FALSE, 2); - pop->name_widget = gtk_label_new (""); - pop->email_widget = gtk_label_new (""); - - gtk_box_pack_start (GTK_BOX (vbox), pop->name_widget, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (vbox), pop->email_widget, TRUE, TRUE, 2); - gtk_container_add (GTK_CONTAINER (name_holder), GTK_WIDGET (vbox)); - - if (gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (name_holder)), &color, FALSE, TRUE)) { - GtkStyle *style = gtk_style_copy (gtk_widget_get_style (GTK_WIDGET (name_holder))); - style->bg[0] = color; - gtk_widget_set_style (GTK_WIDGET (name_holder), style); - } - - pop->generic_view = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (pop->generic_view), name_holder); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->generic_view, TRUE, TRUE, 0); - gtk_widget_show_all (pop->generic_view); - - pop->query_msg = gtk_label_new ("Querying Addressbook..."); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->query_msg, TRUE, TRUE, 0); - gtk_widget_show (pop->query_msg); - - /* Build Minicard View */ - pop->minicard_view = e_minicard_widget_new (); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->minicard_view, TRUE, TRUE, 0); - - - /* Final assembly */ - - gtk_container_add (GTK_CONTAINER (pop), pop->main_vbox); - gtk_widget_show (pop->main_vbox); - - gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); - gtk_container_set_border_width (GTK_CONTAINER (pop), 2); -} - -GtkWidget * -e_address_popup_new (void) -{ - EAddressPopup *pop = gtk_type_new (E_ADDRESS_POPUP_TYPE); - e_address_popup_construct (pop); - return GTK_WIDGET (pop); -} - -static GtkWidget * -e_address_popup_popup (EAddressPopup *pop) -{ - GtkWidget *win, *fr; - gint x, y; - - win = gtk_window_new (GTK_WINDOW_POPUP); - fr = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (win), fr); - gtk_container_add (GTK_CONTAINER (fr), GTK_WIDGET (pop)); - - gtk_window_set_policy (GTK_WINDOW (win), FALSE, FALSE, FALSE); - - gdk_window_get_pointer (NULL, &x, &y, NULL); - x = MAX (x-10, 0); - y = MAX (y-10, 0); - gtk_widget_set_uposition (win, x, y); - - gtk_signal_connect_object (GTK_OBJECT (pop), - "destroy", - GTK_SIGNAL_FUNC(gtk_widget_destroy), - GTK_OBJECT (win)); - - gtk_widget_show (GTK_WIDGET (pop)); - gtk_widget_show (fr); - gtk_widget_show (win); - - return win; -} - -static void -found_fields_cb (EBook *book, EBookStatus status, EList *writable_fields, gpointer closure) -{ - EAddressPopup *pop = E_ADDRESS_POPUP (closure); - EContactEditor *ce = e_contact_editor_new (pop->card, FALSE, writable_fields, FALSE); - e_contact_editor_raise (ce); - gtk_widget_destroy (GTK_WIDGET (pop)); -} - -static void -edit_contact_info_cb (EAddressPopup *pop) -{ - e_book_get_supported_fields (common_book, found_fields_cb, pop); -} - -static void -e_address_popup_cardify (EAddressPopup *pop, ECard *card) -{ - GtkWidget *b; - - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - g_return_if_fail (card && E_IS_CARD (card)); - g_return_if_fail (pop->card == NULL); - - pop->card = card; - gtk_object_ref (GTK_OBJECT (pop->card)); - - e_minicard_widget_set_card (E_MINICARD_WIDGET (pop->minicard_view), card); - gtk_widget_show (pop->minicard_view); - gtk_widget_hide (pop->generic_view); - - b = gtk_button_new_with_label ("Edit Contact Info"); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), b, TRUE, TRUE, 0); - gtk_signal_connect_object (GTK_OBJECT (b), - "clicked", - GTK_SIGNAL_FUNC (edit_contact_info_cb), - GTK_OBJECT (pop)); - gtk_widget_show (b); -} - -static void -add_contacts_cb (EAddressPopup *pop) -{ - e_contact_quick_add (pop->name, pop->email, NULL, NULL); - gtk_widget_destroy (GTK_WIDGET (pop)); -} - -static void -e_address_popup_no_matches (EAddressPopup *pop) -{ - GtkWidget *b; - - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - - b = gtk_button_new_with_label ("Add to Contacts"); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), b, TRUE, TRUE, 0); - gtk_signal_connect_object (GTK_OBJECT (b), - "clicked", - GTK_SIGNAL_FUNC (add_contacts_cb), - GTK_OBJECT (pop)); - gtk_widget_show (b); -} - -static void -e_address_popup_multiple_matches (EAddressPopup *pop) -{ - -} - - -/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ - -/* - * Addressbook Query Fun - */ - -static void -query_cb (EBook *book, EBookSimpleQueryStatus status, const GList *cards, gpointer closure) -{ - EAddressPopup *pop; - - if (status != E_BOOK_SIMPLE_QUERY_STATUS_SUCCESS) - return; - - pop = E_ADDRESS_POPUP (closure); - - pop->have_queried = TRUE; - gtk_widget_hide (pop->query_msg); - - if (cards == NULL) { - - e_address_popup_no_matches (pop); - - } else { - if (g_list_length ((GList *) cards) == 1) - e_address_popup_cardify (pop, E_CARD (cards->data)); - else - e_address_popup_multiple_matches (pop); - } - - pop->query_tag = 0; -} - -static void -start_query (EAddressPopup *pop) -{ - g_assert (common_book != NULL); - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - - if (pop->query_tag) - e_book_simple_query_cancel (common_book, pop->query_tag); - - pop->query_tag = e_book_name_and_email_query (common_book, pop->name, pop->email, query_cb, pop); -} - -static void -loaded_book_cb (EBook *book, EBookStatus status, gpointer closure) -{ - g_return_if_fail (status == E_BOOK_STATUS_SUCCESS); - g_return_if_fail (book != NULL); - - if (common_book == NULL) { - common_book = book; - gtk_object_ref (GTK_OBJECT (common_book)); - } - - start_query (E_ADDRESS_POPUP (closure)); -} - -static void -e_address_popup_query (EAddressPopup *pop) -{ - g_return_if_fail (pop && E_IS_ADDRESS_POPUP (pop)); - - if (common_book == NULL) { - EBook *book = e_book_new (); - e_book_load_local_address_book (book, loaded_book_cb, pop); - } else { - start_query (pop); - } -} - -/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ - -enum { - PROPERTY_NAME, - PROPERTY_EMAIL -}; - -static void -set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) -{ - EAddressPopup *pop = E_ADDRESS_POPUP (user_data); - - switch (arg_id) { - - case PROPERTY_NAME: - e_address_popup_set_name (pop, BONOBO_ARG_GET_STRING (arg)); - break; - - case PROPERTY_EMAIL: - e_address_popup_set_email (pop, BONOBO_ARG_GET_STRING (arg)); - break; - - default: - g_assert_not_reached (); - } - -} - -static BonoboControl * -e_address_popup_factory_new_control (void) -{ - BonoboControl *control; - BonoboPropertyBag *bag; - GtkWidget *w; - - w = e_address_popup_new (); - control = bonobo_control_new (e_address_popup_popup (E_ADDRESS_POPUP (w))); - - bag = bonobo_property_bag_new (NULL, set_prop, w); - bonobo_property_bag_add (bag, "name", PROPERTY_NAME, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (bag, "email", PROPERTY_EMAIL, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE); - - bonobo_control_set_properties (control, bag); - bonobo_object_unref (BONOBO_OBJECT (bag)); - - return control; -} - -static BonoboObject * -e_address_popup_factory (BonoboGenericFactory *factory, gpointer user_data) -{ - return BONOBO_OBJECT (e_address_popup_factory_new_control ()); -} - -void -e_address_popup_factory_init (void) -{ - static BonoboGenericFactory *factory = NULL; - - if (factory != NULL) - return; - - factory = bonobo_generic_factory_new ("OAFIID:GNOME_Evolution_Addressbook_AddressPopupFactory", - e_address_popup_factory, NULL); - - if (factory == NULL) - g_error ("I could not register an AddressPopup factory."); -} diff --git a/addressbook/gui/component/e-address-popup.h b/addressbook/gui/component/e-address-popup.h deleted file mode 100644 index cac060fb4a..0000000000 --- a/addressbook/gui/component/e-address-popup.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-address-popup.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_ADDRESS_POPUP_H__ -#define __E_ADDRESS_POPUP_H__ - -#include <gtk/gtk.h> -#include <libgnome/gnome-defs.h> -#include <addressbook/backend/ebook/e-card.h> - -BEGIN_GNOME_DECLS - -#define E_ADDRESS_POPUP_TYPE (e_address_popup_get_type ()) -#define E_ADDRESS_POPUP(o) (GTK_CHECK_CAST ((o), E_ADDRESS_POPUP_TYPE, EAddressPopup)) -#define E_ADDRESS_POPUP_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), E_ADDRESS_POPUP_TYPE, EAddressPopupClass)) -#define E_IS_ADDRESS_POPUP(o) (GTK_CHECK_TYPE ((o), E_ADDRESS_POPUP_TYPE)) -#define E_IS_ADDRESS_POPUP_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ADDRESS_POPUP_TYPE)) - -typedef struct _EAddressPopup EAddressPopup; -typedef struct _EAddressPopupClass EAddressPopupClass; - -struct _EAddressPopup { - GtkEventBox parent; - - guint leave_timeout_tag; - gboolean grabbed; - - gint set_count; - gchar *name; - gchar *email; - - GtkWidget *name_widget; - GtkWidget *email_widget; - GtkWidget *query_msg; - - GtkWidget *main_vbox; - GtkWidget *generic_view; - GtkWidget *minicard_view; - - guint query_tag; - gboolean have_queried, multiple_matches; - ECard *card; -}; - -struct _EAddressPopupClass { - GtkEventBoxClass parent_class; -}; - -GtkType e_address_popup_get_type (void); - -void e_address_popup_set_name (EAddressPopup *, const gchar *name); -void e_address_popup_set_email (EAddressPopup *, const gchar *email); - -void e_address_popup_construct (EAddressPopup *); -GtkWidget *e_address_popup_new (void); - -void e_address_popup_factory_init (void); - -END_GNOME_DECLS - -#endif /* __E_ADDRESS_POPUP_H__ */ - diff --git a/addressbook/gui/component/e-address-widget.c b/addressbook/gui/component/e-address-widget.c deleted file mode 100644 index f69ce5c58d..0000000000 --- a/addressbook/gui/component/e-address-widget.c +++ /dev/null @@ -1,577 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-address-widget.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include <ctype.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-property-bag.h> -#include <bonobo/bonobo-generic-factory.h> -#include <addressbook/contact-editor/e-contact-quick-add.h> -#include "e-address-widget.h" - -static void e_address_widget_class_init (EAddressWidgetClass *klass); -static void e_address_widget_init (EAddressWidget *obj); -static void e_address_widget_destroy (GtkObject *obj); - -static gint e_address_widget_button_press_handler (GtkWidget *w, GdkEventButton *ev); -static void e_address_widget_popup (EAddressWidget *, GdkEventButton *ev); -static void e_address_widget_schedule_query (EAddressWidget *); - -static GtkObjectClass *parent_class; - -static EBook *common_book = NULL; /* sort of lame */ - -static gboolean doing_queries = FALSE; - -static void -e_address_widget_class_init (EAddressWidgetClass *klass) -{ - GtkObjectClass *object_class = (GtkObjectClass *) klass; - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - - parent_class = GTK_OBJECT_CLASS (gtk_type_class (gtk_event_box_get_type ())); - - object_class->destroy = e_address_widget_destroy; - - widget_class->button_press_event = e_address_widget_button_press_handler; -} - -static void -e_address_widget_init (EAddressWidget *addr) -{ - -} - -static void -e_address_widget_destroy (GtkObject *obj) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (obj); - - g_free (addr->name); - g_free (addr->email); - - if (addr->query_tag) - e_book_simple_query_cancel (common_book, addr->query_tag); - - if (addr->query_idle_tag) - gtk_idle_remove (addr->query_idle_tag); -} - -static gint -e_address_widget_button_press_handler (GtkWidget *w, GdkEventButton *ev) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (w); - if (ev->button == 3 && ev->state == 0) { - e_address_widget_popup (addr, ev); - return TRUE; - } - - return FALSE; -} - -GtkType -e_address_widget_get_type (void) -{ - static GtkType aw_type = 0; - - if (!aw_type) { - GtkTypeInfo aw_info = { - "EAddressWidget", - sizeof (EAddressWidget), - sizeof (EAddressWidgetClass), - (GtkClassInitFunc) e_address_widget_class_init, - (GtkObjectInitFunc) e_address_widget_init, - NULL, NULL, /* reserved... but for what sinister purpose? */ - (GtkClassInitFunc) NULL - }; - - aw_type = gtk_type_unique (gtk_event_box_get_type (), &aw_info); - } - - return aw_type; -} - -static void -gtk_widget_visible (GtkWidget *w, gboolean x) -{ - if (x) - gtk_widget_show (w); - else - gtk_widget_hide (w); -} - -static void -e_address_widget_refresh (EAddressWidget *addr) -{ - gchar *str; - gboolean have_name, have_email; - - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - have_name = addr->name && *addr->name; - have_email = addr->email && *addr->email && (addr->card == NULL || !addr->known_email); - - gtk_label_set_text (GTK_LABEL (addr->name_widget), have_name ? addr->name : ""); - gtk_widget_visible (addr->name_widget, have_name); - if (addr->card) { - gint i, N = strlen (addr->name); - gchar *pattern = g_malloc (N+1); - for (i=0; i<N; ++i) - pattern[i] = '_'; - pattern[i] = '\0'; - gtk_label_set_pattern (GTK_LABEL (addr->name_widget), pattern); - g_free (pattern); - } else { - gtk_label_set_pattern (GTK_LABEL (addr->name_widget), ""); - } - - if (have_email) { - str = g_strdup_printf (have_name ? "<%s>" : "%s", addr->email); - gtk_label_set_text (GTK_LABEL (addr->email_widget), str); - g_free (str); - } else { - gtk_label_set_text (GTK_LABEL (addr->email_widget), ""); - } - gtk_widget_visible (addr->email_widget, have_email); - - gtk_widget_visible (addr->spacer, have_name && have_email); - - /* Launch a query to find the appropriate card, if necessary. */ - if (addr->card == NULL) - e_address_widget_schedule_query (addr); -} - -void -e_address_widget_set_name (EAddressWidget *addr, const gchar *name) -{ - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - g_free (addr->name); - addr->name = g_strdup (name); - - e_address_widget_refresh (addr); -} - -void -e_address_widget_set_email (EAddressWidget *addr, const gchar *email) -{ - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - g_free (addr->email); - addr->email = g_strdup (email); - - e_address_widget_refresh (addr); -} - - -void -e_address_widget_set_text (EAddressWidget *addr, const gchar *text) -{ - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - e_address_widget_set_email (addr, text); /* CRAP */ -} - -void -e_address_widget_construct (EAddressWidget *addr) -{ - GtkWidget *box; - - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - box = gtk_hbox_new (FALSE, 2); - - addr->name_widget = gtk_label_new (""); - addr->spacer = gtk_label_new (" "); - addr->email_widget = gtk_label_new (""); - - gtk_box_pack_start (GTK_BOX (box), addr->name_widget, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (box), addr->spacer, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (box), addr->email_widget, FALSE, FALSE, 0); - - gtk_container_add (GTK_CONTAINER (addr), box); - - gtk_widget_show (box); - gtk_widget_show (addr->name_widget); - gtk_widget_show (addr->email_widget); -} - -GtkWidget * -e_address_widget_new (void) -{ - EAddressWidget *addr = gtk_type_new (e_address_widget_get_type ()); - e_address_widget_construct (addr); - return GTK_WIDGET (addr); -} - -/* - * - * Cardification - * - */ - -static void -e_address_widget_cardify (EAddressWidget *addr, ECard *card, gboolean known_email) -{ - if (addr->card != card || addr->known_email != known_email) { - - if (addr->card != card) { - if (addr->card) - gtk_object_unref (GTK_OBJECT (addr->card)); - addr->card = card; - gtk_object_ref (GTK_OBJECT (addr->card)); - } - - addr->known_email = known_email; - - if (!(addr->name && *addr->name)) { - gchar *s = e_card_name_to_string (card->name); - e_address_widget_set_name (addr, s); - g_free (s); - } - - e_address_widget_refresh (addr); - } -} - -static void -query_results_cb (EBook *book, EBookSimpleQueryStatus status, const GList *cards, gpointer user_data) -{ - EAddressWidget *addr = user_data; - - if (g_list_length ((GList *) cards) == 1) { - ECard *card = E_CARD (cards->data); - e_address_widget_cardify (addr, card, TRUE); - } - - addr->query_tag = 0; -} - -static void -e_address_widget_do_query (EAddressWidget *addr) -{ - e_book_name_and_email_query (common_book, addr->name, addr->email, query_results_cb, addr); -} - -static void -book_ready_cb (EBook *book, EBookStatus status, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - if (common_book == NULL) { - common_book = book; - gtk_object_ref (GTK_OBJECT (common_book)); - } else - gtk_object_unref (GTK_OBJECT (book)); - - e_address_widget_do_query (addr); -} - -static gint -query_idle_fn (gpointer ptr) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (ptr); - - if (common_book) { - e_address_widget_do_query (addr); - } else { - e_book_load_local_address_book (e_book_new (), book_ready_cb, addr); - } - - addr->query_idle_tag = 0; - return FALSE; -} - -static void -e_address_widget_schedule_query (EAddressWidget *addr) -{ - if (addr->query_idle_tag || !doing_queries) - return; - addr->query_idle_tag = gtk_idle_add (query_idle_fn, addr); -} - -/* - * - * Popup Menu - * - */ - -#define ARBITRARY_UIINFO_LIMIT 64 - -static gint -popup_add_name_and_address (EAddressWidget *addr, GnomeUIInfo *uiinfo, gint i) -{ - gboolean flag = FALSE; - - if (addr->name && *addr->name) { - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = addr->name; - ++i; - flag = TRUE; - } - - if (addr->email && *addr->email) { - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = addr->email; - ++i; - flag = TRUE; - } - - if (flag) { - uiinfo[i].type = GNOME_APP_UI_SEPARATOR; - ++i; - } - - return i; -} - -static void -flip_queries_flag_cb (GtkWidget *w, gpointer user_data) -{ - doing_queries = !doing_queries; -} - -static gint -popup_add_query_change (EAddressWidget *addr, GnomeUIInfo *uiinfo, gint i) -{ - uiinfo[i].type = GNOME_APP_UI_SEPARATOR; - ++i; - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = doing_queries ? _("Disable Queries") : _("Enable Queries (Dangerous!)"); - uiinfo[i].moreinfo = flip_queries_flag_cb; - ++i; - - return i; -} - - -static GtkWidget * -popup_menu_card (EAddressWidget *addr) -{ - GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT]; - GtkWidget *pop; - gint i=0; - ECard *card = E_CARD (addr->card); - - g_return_val_if_fail (card != NULL, NULL); - - memset (uiinfo, 0, sizeof (uiinfo)); - - i = popup_add_name_and_address (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = _("Edit Contact Info"); - ++i; - - i = popup_add_query_change (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ENDOFINFO; - pop = gnome_popup_menu_new (uiinfo); - return pop; -} - -static void -post_quick_add_cb (ECard *card, gpointer user_data) -{ - e_address_widget_cardify (E_ADDRESS_WIDGET (user_data), card, TRUE); -} - -static void -add_contacts_cb (GtkWidget *w, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - e_contact_quick_add (addr->name, addr->email, post_quick_add_cb, addr); -} - -static GtkWidget * -popup_menu_nocard (EAddressWidget *addr) -{ - GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT]; - GtkWidget *pop; - gint i=0; - - memset (uiinfo, 0, sizeof (uiinfo)); - - i = popup_add_name_and_address (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = _("Add to Contacts"); - uiinfo[i].moreinfo = add_contacts_cb; - ++i; - - i = popup_add_query_change (addr, uiinfo, i); - - uiinfo[i].type = GNOME_APP_UI_ENDOFINFO; - pop = gnome_popup_menu_new (uiinfo); - return pop; -} - -static void -e_address_widget_popup (EAddressWidget *addr, GdkEventButton *ev) -{ - GtkWidget *pop; - - g_return_if_fail (addr && E_IS_ADDRESS_WIDGET (addr)); - - pop = addr->card ? popup_menu_card (addr) : popup_menu_nocard (addr); - - if (pop) - gnome_popup_menu_do_popup (pop, NULL, NULL, ev, addr); -} - -/* - * - * Bonobo Control Magic - * - */ - -enum { - ADDRESS_PROPERTY_NAME, - ADDRESS_PROPERTY_EMAIL, - ADDRESS_PROPERTY_TEXT, - ADDRESS_PROPERTY_BACKGROUND_RGB -}; - - -static void -get_prop (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - switch (arg_id) { - - case ADDRESS_PROPERTY_NAME: - BONOBO_ARG_SET_STRING (arg, addr->name ? addr->name :""); - break; - - case ADDRESS_PROPERTY_EMAIL: - BONOBO_ARG_SET_STRING (arg, addr->email ? addr->email : ""); - break; - - case ADDRESS_PROPERTY_TEXT: - BONOBO_ARG_SET_STRING (arg, "?"); - break; - } -} - -static void -set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) -{ - EAddressWidget *addr = E_ADDRESS_WIDGET (user_data); - - switch (arg_id) { - case ADDRESS_PROPERTY_NAME: - e_address_widget_set_name (addr, BONOBO_ARG_GET_STRING (arg)); - break; - - case ADDRESS_PROPERTY_EMAIL: - e_address_widget_set_email (addr, BONOBO_ARG_GET_STRING (arg)); - break; - - case ADDRESS_PROPERTY_TEXT: - e_address_widget_set_text (addr, BONOBO_ARG_GET_STRING (arg)); - break; - - - case ADDRESS_PROPERTY_BACKGROUND_RGB: - { - gint bg = BONOBO_ARG_GET_INT (arg); - GdkColor color; - - color.red = (bg & 0xff0000) >> 8; - color.green = (bg & 0x00ff00); - color.blue = (bg & 0x0000ff) << 8; - - if (gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (addr)), &color, FALSE, TRUE)) { - GtkStyle *style = gtk_style_copy (gtk_widget_get_style (GTK_WIDGET (addr))); - style->bg[0] = color; - gtk_widget_set_style (GTK_WIDGET (addr), style); - } - } - - break; - } -} - -static BonoboControl * -e_address_widget_factory_new_control (void) -{ - BonoboControl *control; - BonoboPropertyBag *bag; - GtkWidget *w; - - w = e_address_widget_new (); - gtk_widget_show (w); - - control = bonobo_control_new (w); - - bag = bonobo_property_bag_new (get_prop, set_prop, w); - bonobo_property_bag_add (bag, "name", ADDRESS_PROPERTY_NAME, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (bag, "email", ADDRESS_PROPERTY_EMAIL, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (bag, "text", ADDRESS_PROPERTY_TEXT, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - - bonobo_property_bag_add (bag, "background_rgb", ADDRESS_PROPERTY_BACKGROUND_RGB, - BONOBO_ARG_INT, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE); - - bonobo_control_set_properties (control, bag); - bonobo_object_unref (BONOBO_OBJECT (bag)); - - return control; -} - -static BonoboObject * -e_address_widget_factory (BonoboGenericFactory *factory, gpointer user_data) -{ - return BONOBO_OBJECT (e_address_widget_factory_new_control ()); -} - -void -e_address_widget_factory_init (void) -{ - static BonoboGenericFactory *factory = NULL; - - if (factory != NULL) - return; - - factory = bonobo_generic_factory_new ("OAFIID:GNOME_Evolution_Addressbook_AddressWidgetFactory", - e_address_widget_factory, NULL); - - if (factory == NULL) - g_error ("I could not register an AddressWidget factory."); -} - diff --git a/addressbook/gui/component/e-address-widget.h b/addressbook/gui/component/e-address-widget.h deleted file mode 100644 index 8cf425d5c9..0000000000 --- a/addressbook/gui/component/e-address-widget.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-address-widget.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_ADDRESS_WIDGET_H__ -#define __E_ADDRESS_WIDGET_H__ - -#include <gtk/gtkeventbox.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkobject.h> -#include <gtk/gtkwidget.h> -#include <libgnome/gnome-defs.h> -#include <addressbook/backend/ebook/e-book.h> -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-card.h> - -BEGIN_GNOME_DECLS - -#define E_ADDRESS_WIDGET_TYPE (e_address_widget_get_type ()) -#define E_ADDRESS_WIDGET(o) (GTK_CHECK_CAST ((o), E_ADDRESS_WIDGET_TYPE, EAddressWidget)) -#define E_ADDRESS_WIDGET_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), E_ADDRESS_WIDGET_TYPE, EAddressWidgetClass)) -#define E_IS_ADDRESS_WIDGET(o) (GTK_CHECK_TYPE ((o), E_ADDRESS_WIDGET_TYPE)) -#define E_IS_ADDRESS_WIDGET_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_ADDRESS_WIDGET_TYPE)) - -typedef struct _EAddressWidget EAddressWidget; -typedef struct _EAddressWidgetClass EAddressWidgetClass; - -struct _EAddressWidget { - GtkEventBox parent; - - gchar *name; - gchar *email; - - GtkWidget *name_widget; - GtkWidget *email_widget; - GtkWidget *spacer; - - guint query_idle_tag; - guint query_tag; - - ECard *card; - gboolean known_email; -}; - -struct _EAddressWidgetClass { - GtkEventBoxClass parent_class; -}; - -GtkType e_address_widget_get_type (void); - -void e_address_widget_set_name (EAddressWidget *, const gchar *name); -void e_address_widget_set_email (EAddressWidget *, const gchar *email); -void e_address_widget_set_text (EAddressWidget *, const gchar *text); - -void e_address_widget_construct (EAddressWidget *); -GtkWidget *e_address_widget_new (void); - - -void e_address_widget_factory_init (void); - - - -END_GNOME_DECLS - -#endif /* __E_ADDRESS_WIDGET_H__ */ - - - - - - - - - - - - - - - diff --git a/addressbook/gui/component/e-cardlist-model.c b/addressbook/gui/component/e-cardlist-model.c deleted file mode 100644 index 007aa395d9..0000000000 --- a/addressbook/gui/component/e-cardlist-model.c +++ /dev/null @@ -1,225 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * - * Author: - * Christopher James Lahey <clahey@helixcode.com> - * - * (C) 1999 Helix Code, Inc. - */ - -#include <config.h> -#include <gnome-xml/tree.h> -#include <gnome-xml/parser.h> -#include <gnome-xml/xmlmemory.h> -#include "e-cardlist-model.h" - -#define PARENT_TYPE e_table_model_get_type() - -static void -e_cardlist_model_destroy(GtkObject *object) -{ - ECardlistModel *model = E_CARDLIST_MODEL(object); - int i; - - for ( i = 0; i < model->data_count; i++ ) { - gtk_object_unref(GTK_OBJECT(model->data[i])); - } - g_free(model->data); -} - -/* This function returns the number of columns in our ETableModel. */ -static int -e_cardlist_model_col_count (ETableModel *etc) -{ - return E_CARD_SIMPLE_FIELD_LAST; -} - -/* This function returns the number of rows in our ETableModel. */ -static int -e_cardlist_model_row_count (ETableModel *etc) -{ - ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc); - return e_cardlist_model->data_count; -} - -/* This function returns the value at a particular point in our ETableModel. */ -static void * -e_cardlist_model_value_at (ETableModel *etc, int col, int row) -{ - ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc); - const char *value; - if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= e_cardlist_model->data_count ) - return NULL; - value = e_card_simple_get_const(e_cardlist_model->data[row], - col + 1); - return (void *)(value ? value : ""); -} - -/* This function sets the value at a particular point in our ETableModel. */ -static void -e_cardlist_model_set_value_at (ETableModel *etc, int col, int row, const void *val) -{ - ECardlistModel *e_cardlist_model = E_CARDLIST_MODEL(etc); - ECard *card; - if ( col >= E_CARD_SIMPLE_FIELD_LAST - 1|| row >= e_cardlist_model->data_count ) - return; - e_card_simple_set(e_cardlist_model->data[row], - col + 1, - val); - gtk_object_get(GTK_OBJECT(e_cardlist_model->data[row]), - "card", &card, - NULL); - - e_table_model_cell_changed(etc, col, row); -} - -/* This function returns whether a particular cell is editable. */ -static gboolean -e_cardlist_model_is_cell_editable (ETableModel *etc, int col, int row) -{ - return TRUE; -} - -/* This function duplicates the value passed to it. */ -static void * -e_cardlist_model_duplicate_value (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -/* This function frees the value passed to it. */ -static void -e_cardlist_model_free_value (ETableModel *etc, int col, void *value) -{ - g_free(value); -} - -static void * -e_cardlist_model_initialize_value (ETableModel *etc, int col) -{ - return g_strdup(""); -} - -static gboolean -e_cardlist_model_value_is_empty (ETableModel *etc, int col, const void *value) -{ - return !(value && *(char *)value); -} - -static char * -e_cardlist_model_value_to_string (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -void -e_cardlist_model_add(ECardlistModel *model, - ECard **cards, - int count) -{ - int i; - model->data = g_realloc(model->data, model->data_count + count * sizeof(ECard *)); - for (i = 0; i < count; i++) { - gboolean found = FALSE; - gchar *id = e_card_get_id(cards[i]); - for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) { - found = TRUE; - } - } - if (!found) { - gtk_object_ref(GTK_OBJECT(cards[i])); - model->data[model->data_count++] = e_card_simple_new (cards[i]); - e_table_model_row_inserted(E_TABLE_MODEL(model), model->data_count - 1); - } - } -} - -void -e_cardlist_model_remove(ECardlistModel *model, - const char *id) -{ - int i; - for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_card_simple_get_id(model->data[i]), id) ) { - gtk_object_unref(GTK_OBJECT(model->data[i])); - memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (ECard *)); - e_table_model_row_deleted(E_TABLE_MODEL(model), i); - } - } -} - -static void -e_cardlist_model_class_init (GtkObjectClass *object_class) -{ - ETableModelClass *model_class = (ETableModelClass *) object_class; - - object_class->destroy = e_cardlist_model_destroy; - - model_class->column_count = e_cardlist_model_col_count; - model_class->row_count = e_cardlist_model_row_count; - model_class->value_at = e_cardlist_model_value_at; - model_class->set_value_at = e_cardlist_model_set_value_at; - model_class->is_cell_editable = e_cardlist_model_is_cell_editable; - model_class->duplicate_value = e_cardlist_model_duplicate_value; - model_class->free_value = e_cardlist_model_free_value; - model_class->initialize_value = e_cardlist_model_initialize_value; - model_class->value_is_empty = e_cardlist_model_value_is_empty; - model_class->value_to_string = e_cardlist_model_value_to_string; -} - -static void -e_cardlist_model_init (GtkObject *object) -{ - ECardlistModel *model = E_CARDLIST_MODEL(object); - model->data = NULL; - model->data_count = 0; -} - -ECard * -e_cardlist_model_get(ECardlistModel *model, - int row) -{ - if (model->data && row < model->data_count) { - ECard *card; - gtk_object_get(GTK_OBJECT(model->data[row]), - "card", &card, - NULL); - gtk_object_ref(GTK_OBJECT(card)); - return card; - } - return NULL; -} - -GtkType -e_cardlist_model_get_type (void) -{ - static GtkType type = 0; - - if (!type){ - GtkTypeInfo info = { - "ECardlistModel", - sizeof (ECardlistModel), - sizeof (ECardlistModelClass), - (GtkClassInitFunc) e_cardlist_model_class_init, - (GtkObjectInitFunc) e_cardlist_model_init, - NULL, /* reserved 1 */ - NULL, /* reserved 2 */ - (GtkClassInitFunc) NULL - }; - - type = gtk_type_unique (PARENT_TYPE, &info); - } - - return type; -} - -ETableModel * -e_cardlist_model_new (void) -{ - ECardlistModel *et; - - et = gtk_type_new (e_cardlist_model_get_type ()); - - return E_TABLE_MODEL(et); -} diff --git a/addressbook/gui/component/e-cardlist-model.h b/addressbook/gui/component/e-cardlist-model.h deleted file mode 100644 index 0b9a7a2265..0000000000 --- a/addressbook/gui/component/e-cardlist-model.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _E_CARDLIST_MODEL_H_ -#define _E_CARDLIST_MODEL_H_ - -#include <gal/e-table/e-table-model.h> -#include <ebook/e-book.h> -#include <ebook/e-book-view.h> -#include <ebook/e-card-simple.h> - -#define E_CARDLIST_MODEL_TYPE (e_cardlist_model_get_type ()) -#define E_CARDLIST_MODEL(o) (GTK_CHECK_CAST ((o), E_CARDLIST_MODEL_TYPE, ECardlistModel)) -#define E_CARDLIST_MODEL_CLASS(k) (GTK_CHECK_CLASS_CAST((k), E_CARDLIST_MODEL_TYPE, ECardlistModelClass)) -#define E_IS_CARDLIST_MODEL(o) (GTK_CHECK_TYPE ((o), E_CARDLIST_MODEL_TYPE)) -#define E_IS_CARDLIST_MODEL_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_CARDLIST_MODEL_TYPE)) - -typedef struct { - ETableModel parent; - - /* item specific fields */ - ECardSimple **data; - int data_count; -} ECardlistModel; - - -typedef struct { - ETableModelClass parent_class; -} ECardlistModelClass; - - -GtkType e_cardlist_model_get_type (void); -ETableModel *e_cardlist_model_new (void); - -/* Returns object with an extra ref count. */ -ECard *e_cardlist_model_get (ECardlistModel *model, - int row); -void e_cardlist_model_add (ECardlistModel *model, - ECard **card, - int count); -void e_cardlist_model_remove (ECardlistModel *model, - const char *id); - -#endif /* _E_CARDLIST_MODEL_H_ */ diff --git a/addressbook/gui/component/select-names/.cvsignore b/addressbook/gui/component/select-names/.cvsignore deleted file mode 100644 index cd669499fa..0000000000 --- a/addressbook/gui/component/select-names/.cvsignore +++ /dev/null @@ -1,12 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -Evolution-Addressbook-SelectNames-stubs.c -Evolution-Addressbook-SelectNames-skels.c -Evolution-Addressbook-SelectNames-common.c -Evolution-Addressbook-SelectNames.h -GNOME_Evolution_Addressbook_SelectNames.oaf diff --git a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl b/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl deleted file mode 100644 index c38d714cf4..0000000000 --- a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: IDL; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * CORBA interface for the SelectNames dialog. - * - * Authors: - * Ettore Perazzoli <ettore@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { -module Addressbook { - - interface SelectNames : Bonobo::Unknown { - struct Section { - string id; - string title; - }; - - typedef sequence<Section> SectionList; - - exception DuplicateID {}; - exception SectionNotFound {}; - - void addSection (in string id, in string title) - raises (DuplicateID); - - Bonobo::Control getEntryBySection (in string section_id) - raises (SectionNotFound); - - void activateDialog (in string section_id); - }; - -}; -}; -}; diff --git a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in b/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in deleted file mode 100644 index 7f26e2aaed..0000000000 --- a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in +++ /dev/null @@ -1,29 +0,0 @@ -<oaf_info> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_SelectNamesFactory" - type="exe" - location="evolution-addressbook"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Factory for the Addressbook's name selection interface"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_SelectNames" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_SelectNamesFactory"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/Addressbook/SelectNames"/> - </oaf_attribute> - - <oaf_attribute name="description" type="string" - _value="Evolution's addressbook name selection interface."/> - -</oaf_server> - -</oaf_info>
\ No newline at end of file diff --git a/addressbook/gui/component/select-names/Makefile.am b/addressbook/gui/component/select-names/Makefile.am deleted file mode 100644 index 2d877fdf6e..0000000000 --- a/addressbook/gui/component/select-names/Makefile.am +++ /dev/null @@ -1,86 +0,0 @@ -# CORBA stuff - -IDLS = \ - Evolution-Addressbook-SelectNames.idl - -IDL_GENERATED = \ - Evolution-Addressbook-SelectNames.h \ - Evolution-Addressbook-SelectNames-common.c \ - Evolution-Addressbook-SelectNames-skels.c \ - Evolution-Addressbook-SelectNames-stubs.c - -Evolution-Addressbook-SelectNames-impl.o: Evolution-Addressbook-SelectNames.h - -$(IDL_GENERATED): $(IDLS) - $(ORBIT_IDL) -I $(srcdir) -I $(datadir)/idl `$(GNOME_CONFIG) --cflags idl` \ - $(srcdir)/Evolution-Addressbook-SelectNames.idl - -oafdir = $(datadir)/oaf - -oaf_in_files = GNOME_Evolution_Addressbook_SelectNames.oaf.in -oaf_DATA = $(oaf_in_files:.oaf.in=.oaf) - -@XML_I18N_MERGE_OAF_RULE@ - - -INCLUDES = \ - -DG_LOG_DOMAIN=\"evolution-addressbook\" \ - $(EXTRA_GNOME_CFLAGS) \ - $(GNOME_INCLUDEDIR) \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -I$(top_srcdir)/shell \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/widgets/e-text \ - -I$(top_srcdir)/widgets/e-table \ - -I$(top_srcdir)/addressbook/gui/minicard \ - -I$(top_srcdir)/addressbook/gui/widgets \ - -I$(top_srcdir)/addressbook/contact-editor \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - $(BONOBO_HTML_GNOME_CFLAGS) \ - -DEVOLUTION_VERSION=\""$(VERSION)"\" \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ICONSDIR=\""$(iconsdir)"\" \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ - -DCAMEL_PROVIDERDIR=\""$(providerdir)"\" - -lib_LTLIBRARIES = libeselectnames.la - -libeselectnames_la_SOURCES = \ - $(IDL_GENERATED) \ - e-select-names-bonobo.c \ - e-select-names-bonobo.h \ - e-select-names-completion.c \ - e-select-names-completion.h \ - e-select-names-factory.c \ - e-select-names-factory.h \ - e-select-names-manager.c \ - e-select-names-manager.h \ - e-select-names-model.c \ - e-select-names-model.h \ - e-select-names-popup.c \ - e-select-names-popup.h \ - e-select-names-table-model.c \ - e-select-names-table-model.h \ - e-select-names-text-model.c \ - e-select-names-text-model.h \ - e-select-names.c \ - e-select-names.h - -gladedir = $(datadir)/evolution/glade -glade_DATA = select-names.glade - - - -EXTRA_DIST = \ - $(glade_DATA) \ - $(oaf_in_files) \ - $(oaf_DATA) \ - $(IDLS) - -BUILT_SOURCES = $(IDL_GENERATED) -CLEANFILES += $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.c b/addressbook/gui/component/select-names/e-select-names-bonobo.c deleted file mode 100644 index 98c235c067..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-bonobo.c +++ /dev/null @@ -1,330 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-bonobo.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-select-names-bonobo.h" - -#include <bonobo/bonobo-property-bag.h> -#include <bonobo/bonobo-control.h> - -#include <gal/util/e-util.h> -#include <gal/e-text/e-entry.h> - -#include "Evolution-Addressbook-SelectNames.h" - -#include "e-select-names-manager.h" - -#include "e-select-names-model.h" -#include "e-select-names-text-model.h" - - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _ESelectNamesBonoboPrivate { - ESelectNamesManager *manager; -}; - -enum _EntryPropertyID { - ENTRY_PROPERTY_ID_TEXT, - ENTRY_PROPERTY_ID_ENTRY_CHANGED -}; -typedef enum _EntryPropertyID EntryPropertyID; - - -/* PropertyBag implementation for the entry widgets. */ - -static void -entry_get_property_fn (BonoboPropertyBag *bag, - BonoboArg *arg, - unsigned int arg_id, - CORBA_Environment *ev, - void *user_data) -{ - GtkWidget *w; - const char *text; - - w = GTK_WIDGET (user_data); - - switch (arg_id) { - case ENTRY_PROPERTY_ID_TEXT: - { - ESelectNamesTextModel *text_model; - ESelectNamesModel *model; - - gtk_object_get(GTK_OBJECT(w), - "model", &text_model, - NULL); - gtk_object_get(GTK_OBJECT(text_model), - "source", &model, - NULL); - text = e_select_names_model_get_address_text (model); - BONOBO_ARG_SET_STRING (arg, text); - } - break; - default: - break; - } -} - -static void -entry_set_property_fn (BonoboPropertyBag *bag, - const BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - GtkWidget *widget; - - widget = GTK_WIDGET (user_data); - - switch (arg_id) { - - case ENTRY_PROPERTY_ID_TEXT: - e_entry_set_text (E_ENTRY (widget), BONOBO_ARG_GET_STRING (arg)); - break; - - case ENTRY_PROPERTY_ID_ENTRY_CHANGED: - gtk_object_set_data (GTK_OBJECT (widget), "entry_property_id_changed", GUINT_TO_POINTER (1)); - break; - default: - break; - } -} - - -/* CORBA interface implementation. */ - -static POA_GNOME_Evolution_Addressbook_SelectNames__vepv SelectNames_vepv; - -static POA_GNOME_Evolution_Addressbook_SelectNames * -create_servant (void) -{ - POA_GNOME_Evolution_Addressbook_SelectNames *servant; - CORBA_Environment ev; - - servant = (POA_GNOME_Evolution_Addressbook_SelectNames *) g_new0 (BonoboObjectServant, 1); - servant->vepv = &SelectNames_vepv; - - CORBA_exception_init (&ev); - - POA_GNOME_Evolution_Addressbook_SelectNames__init ((PortableServer_Servant) servant, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_free (servant); - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - return servant; -} - -static void -impl_SelectNames_add_section (PortableServer_Servant servant, - const CORBA_char *id, - const CORBA_char *title, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - select_names = E_SELECT_NAMES_BONOBO (bonobo_object); - priv = select_names->priv; - - e_select_names_manager_add_section (priv->manager, id, title); -} - -static void -entry_changed (GtkWidget *widget, BonoboControl *control) -{ - gboolean changed = GPOINTER_TO_UINT (gtk_object_get_data (GTK_OBJECT (widget), "entry_property_id_changed")); - - if (!changed) - bonobo_control_set_property (control, "entry_changed", TRUE, NULL); -} - -static Bonobo_Control -impl_SelectNames_get_entry_for_section (PortableServer_Servant servant, - const CORBA_char *section_id, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - GtkWidget *entry_widget; - BonoboControl *control; - BonoboPropertyBag *property_bag; - - bonobo_object = bonobo_object_from_servant (servant); - select_names = E_SELECT_NAMES_BONOBO (bonobo_object); - priv = select_names->priv; - - entry_widget = e_select_names_manager_create_entry (priv->manager, section_id); - gtk_widget_show (entry_widget); - - if (entry_widget == NULL) { - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Addressbook_SelectNames_SectionNotFound, - NULL); - return CORBA_OBJECT_NIL; - } - - control = bonobo_control_new (entry_widget); - - property_bag = bonobo_property_bag_new (entry_get_property_fn, entry_set_property_fn, entry_widget); - bonobo_property_bag_add (property_bag, "text", ENTRY_PROPERTY_ID_TEXT, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (property_bag, "entry_changed", ENTRY_PROPERTY_ID_ENTRY_CHANGED, - BONOBO_ARG_BOOLEAN, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE); - - bonobo_control_set_properties (control, property_bag); - - gtk_signal_connect (GTK_OBJECT (entry_widget), "changed", - GTK_SIGNAL_FUNC (entry_changed), control); - - return CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (control)), ev); -} - -static void -impl_SelectNames_activate_dialog (PortableServer_Servant servant, - const CORBA_char *section_id, - CORBA_Environment *ev) -{ - BonoboObject *bonobo_object; - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - - bonobo_object = bonobo_object_from_servant (servant); - select_names = E_SELECT_NAMES_BONOBO (bonobo_object); - priv = select_names->priv; - - e_select_names_manager_activate_dialog (priv->manager, section_id); -} - - -/* GtkObject methods. */ - -static void -impl_destroy (GtkObject *object) -{ - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - - select_names = E_SELECT_NAMES_BONOBO (object); - priv = select_names->priv; - - gtk_object_unref (GTK_OBJECT (priv->manager)); - - g_free (priv); -} - - -static void -corba_class_init () -{ - POA_GNOME_Evolution_Addressbook_SelectNames__vepv *vepv; - POA_GNOME_Evolution_Addressbook_SelectNames__epv *epv; - PortableServer_ServantBase__epv *base_epv; - - base_epv = g_new0 (PortableServer_ServantBase__epv, 1); - base_epv->_private = NULL; - base_epv->finalize = NULL; - base_epv->default_POA = NULL; - - epv = g_new0 (POA_GNOME_Evolution_Addressbook_SelectNames__epv, 1); - epv->addSection = impl_SelectNames_add_section; - epv->getEntryBySection = impl_SelectNames_get_entry_for_section; - epv->activateDialog = impl_SelectNames_activate_dialog; - - vepv = &SelectNames_vepv; - vepv->Bonobo_Unknown_epv = bonobo_object_get_epv (); - vepv->GNOME_Evolution_Addressbook_SelectNames_epv = epv; -} - -static void -class_init (ESelectNamesBonoboClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (klass); - parent_class = gtk_type_class (bonobo_object_get_type ()); - - object_class->destroy = impl_destroy; - - corba_class_init (); -} - -static void -init (ESelectNamesBonobo *select_names) -{ - ESelectNamesBonoboPrivate *priv; - - priv = g_new (ESelectNamesBonoboPrivate, 1); - - priv->manager = e_select_names_manager_new (); - - select_names->priv = priv; -} - - -void -e_select_names_bonobo_construct (ESelectNamesBonobo *select_names, - GNOME_Evolution_Addressbook_SelectNames corba_object) -{ - g_return_if_fail (select_names != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_BONOBO (select_names)); - - bonobo_object_construct (BONOBO_OBJECT (select_names), corba_object); -} - -ESelectNamesBonobo * -e_select_names_bonobo_new (void) -{ - POA_GNOME_Evolution_Addressbook_SelectNames *servant; - GNOME_Evolution_Addressbook_SelectNames corba_object; - ESelectNamesBonobo *select_names; - - servant = create_servant (); - if (servant == NULL) - return NULL; - - select_names = gtk_type_new (e_select_names_bonobo_get_type ()); - - corba_object = bonobo_object_activate_servant (BONOBO_OBJECT (select_names), servant); - e_select_names_bonobo_construct (select_names, corba_object); - - return select_names; -} - - -E_MAKE_TYPE (e_select_names_bonobo, "ESelectNamesBonobo", ESelectNamesBonobo, class_init, init, PARENT_TYPE) diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.h b/addressbook/gui/component/select-names/e-select-names-bonobo.h deleted file mode 100644 index 87fbfa0fab..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-bonobo.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-bonobo.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_SELECT_NAMES_BONOBO_H__ -#define __E_SELECT_NAMES_BONOBO_H__ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-object.h> - -#include "Evolution-Addressbook-SelectNames.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SELECT_NAMES_BONOBO (e_select_names_bonobo_get_type ()) -#define E_SELECT_NAMES_BONOBO(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_BONOBO, ESelectNamesBonobo)) -#define E_SELECT_NAMES_BONOBO_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_BONOBO, ESelectNamesBonoboClass)) -#define E_IS_SELECT_NAMES_BONOBO(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_BONOBO)) -#define E_IS_SELECT_NAMES_BONOBO_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_SELECT_NAMES_BONOBO)) - - -typedef struct _ESelectNamesBonobo ESelectNamesBonobo; -typedef struct _ESelectNamesBonoboPrivate ESelectNamesBonoboPrivate; -typedef struct _ESelectNamesBonoboClass ESelectNamesBonoboClass; - -struct _ESelectNamesBonobo { - BonoboObject parent; - - ESelectNamesBonoboPrivate *priv; -}; - -struct _ESelectNamesBonoboClass { - BonoboObjectClass parent_class; -}; - - -GtkType e_select_names_bonobo_get_type (void); -void e_select_names_bonobo_construct (ESelectNamesBonobo *select_names, - GNOME_Evolution_Addressbook_SelectNames corba_object); -ESelectNamesBonobo *e_select_names_bonobo_new (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_SELECT_NAMES_BONOBO_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names-completion.c b/addressbook/gui/component/select-names/e-select-names-completion.c deleted file mode 100644 index 88ab176bf6..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-completion.c +++ /dev/null @@ -1,1027 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-completion.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include <ctype.h> -#include <stdio.h> -#include <string.h> - -#include <gtk/gtksignal.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-util.h> - -#include <addressbook/backend/ebook/e-book-util.h> -#include <addressbook/backend/ebook/e-destination.h> -#include "e-select-names-completion.h" - -struct _ESelectNamesCompletionPrivate { - - ESelectNamesModel *model; - - EBook *book; - gboolean book_ready; - gboolean cancelled; - - guint book_view_tag; - EBookView *book_view; - - gchar *waiting_query; - gint waiting_pos, waiting_limit; - gchar *query_text; - - gchar *cached_query_text; - GList *cached_cards; - - gboolean primary_only; -}; - -static void e_select_names_completion_class_init (ESelectNamesCompletionClass *); -static void e_select_names_completion_init (ESelectNamesCompletion *); -static void e_select_names_completion_destroy (GtkObject *object); - -static void e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBookView *view, gpointer user_data); -static void e_select_names_completion_card_added_cb (EBookView *, const GList *cards, gpointer user_data); -static void e_select_names_completion_seq_complete_cb (EBookView *, gpointer user_data); - -static void e_select_names_completion_do_query (ESelectNamesCompletion *, const gchar *query_text, gint pos, gint limit); - -static void e_select_names_completion_begin (ECompletion *, const gchar *txt, gint pos, gint limit); -static void e_select_names_completion_end (ECompletion *); -static void e_select_names_completion_cancel (ECompletion *); - -static GtkObjectClass *parent_class; - -static FILE *out; - -/* - * - * Query builders - * - */ - -typedef gchar *(*BookQuerySExp) (ESelectNamesCompletion *); -typedef gchar *(*BookQueryMatchTester) (ESelectNamesCompletion *, EDestination *, double *score); - -/* - * Nickname query - */ - -static gchar * -sexp_nickname (ESelectNamesCompletion *comp) -{ - return g_strdup_printf ("(beginswith \"nickname\" \"%s\")", comp->priv->query_text); - -} - -static gchar * -match_nickname (ESelectNamesCompletion *comp, EDestination *dest, double *score) -{ - gint len = strlen (comp->priv->query_text); - ECard *card = e_destination_get_card (dest); - - if (card->nickname - && !g_strncasecmp (comp->priv->query_text, card->nickname, len)) { - gchar *name = e_card_name_to_string (card->name); - gchar *str; - - *score = len * 10; /* nickname gives 10 points per matching character */ - - str = g_strdup_printf ("(%s) %s", card->nickname, name); - g_free (name); - return str; - } - - return NULL; -} - -/* - * E-Mail Query - */ - -static gchar * -sexp_email (ESelectNamesCompletion *comp) -{ - return g_strdup_printf ("(beginswith \"email\" \"%s\")", comp->priv->query_text); -} - -static gchar * -match_email (ESelectNamesCompletion *comp, EDestination *dest, double *score) -{ - gint len = strlen (comp->priv->query_text); - ECard *card = e_destination_get_card (dest); - const gchar *email = e_destination_get_email (dest); - - if (email && !g_strncasecmp (comp->priv->query_text, email, len)) { - gchar *name, *str; - *score = len * 2; /* 2 points for each matching character */ - name = e_card_name_to_string (card->name); - if (name && *name) - str = g_strdup_printf ("<%s> %s", email, name); - else - str = g_strdup (email); - g_free (name); - return str; - } - - return NULL; -} - -/* - * Name Query - */ - -static gchar * -sexp_name (ESelectNamesCompletion *comp) -{ - if (comp && comp->priv->query_text && *comp->priv->query_text) { - gchar *cpy = g_strdup (comp->priv->query_text); - gchar **strv; - gchar *query; - gint i, count=0; - - strv = g_strsplit (cpy, " ", 0); - for (i=0; strv[i]; ++i) { - ++count; - g_strstrip (strv[i]); - strv[i] = g_strdup_printf ("(contains \"full_name\" \"%s\")", strv[i]); - } - - if (count == 1) { - query = strv[0]; - strv[0] = NULL; - } else { - gchar *joined = g_strjoinv (" ", strv); - query = g_strdup_printf ("(and %s)", joined); - g_free (joined); - } - - for (i=0; strv[i]; ++i) - g_free (strv[i]); - g_free (cpy); - g_free (strv); - - return query; - } - - return NULL; -} - -enum { - MATCHED_NOTHING = 0, - MATCHED_GIVEN_NAME = 1<<0, - MATCHED_ADDITIONAL_NAME = 1<<1, - MATCHED_FAMILY_NAME = 1<<2 -}; - -/* - Match text against every substring in fragment that follows whitespace. - This allows the fragment "de Icaza" to match against txt "ica". -*/ -static gboolean -match_name_fragment (const gchar *fragment, const gchar *txt) -{ - gint len = strlen (txt); - - while (*fragment) { - if (!g_strncasecmp (fragment, txt, len)) - return TRUE; - - while (*fragment && !isspace ((gint) *fragment)) - ++fragment; - while (*fragment && isspace ((gint) *fragment)) - ++fragment; - } - - return FALSE; -} - -static gchar * -match_name (ESelectNamesCompletion *comp, EDestination *dest, double *score) -{ - ECard *card; - gchar *cpy, **strv; - gint len, i, match_len = 0; - gint match = 0, first_match = 0; - - card = e_destination_get_card (dest); - - if (card->name == NULL) - return NULL; - - cpy = g_strdup (comp->priv->query_text); - strv = g_strsplit (cpy, " ", 0); - - for (i=0; strv[i] && !(match & MATCHED_NOTHING); ++i) { - gint this_match = 0; - - g_strstrip (strv[i]); - len = strlen (strv[i]); - - if (card->name->given - && !(match & MATCHED_GIVEN_NAME) - && match_name_fragment (card->name->given, strv[i])) { - - this_match = MATCHED_GIVEN_NAME; - - } - else if (card->name->additional - && !(match & MATCHED_ADDITIONAL_NAME) - && match_name_fragment (card->name->additional, strv[i])) { - - this_match = MATCHED_ADDITIONAL_NAME; - - } else if (card->name->family - && !(match & MATCHED_FAMILY_NAME) - && match_name_fragment (card->name->family, strv[i])) { - - this_match = MATCHED_FAMILY_NAME; - } - - - if (this_match != MATCHED_NOTHING) { - match_len += len; - match |= this_match; - if (first_match == 0) - first_match = this_match; - } else { - match = first_match = 0; - break; - } - - } - - *score = match_len * 3; /* three points per match character */ - - if (card->nickname) { - /* We massively boost the score if the nickname exists and is the same as one of the "real" names. This keeps the - nickname from matching ahead of the real name for this card. */ - len = strlen (card->nickname); - if ((card->name->given && !g_strncasecmp (card->name->given, card->nickname, MIN (strlen (card->name->given), len))) - || (card->name->family && !g_strncasecmp (card->name->family, card->nickname, MIN (strlen (card->name->family), len))) - || (card->name->additional && !g_strncasecmp (card->name->additional, card->nickname, MIN (strlen (card->name->additional), len)))) - *score *= 100; - } - - if (first_match == MATCHED_GIVEN_NAME) - return g_strdup_printf ("%s %s", card->name->given, card->name->family); - else if (first_match == MATCHED_ADDITIONAL_NAME) - return g_strdup_printf ("%s, %s %s", card->name->family, card->name->given, card->name->additional); - else if (first_match == MATCHED_FAMILY_NAME) - return g_strdup_printf ("%s, %s", card->name->family, card->name->given); - - return NULL; -} - -/* - * Initials Query - */ - -static gchar * -sexp_initials (ESelectNamesCompletion *comp) -{ - return NULL; -} - -static gchar * -match_initials (ESelectNamesCompletion *comp, EDestination *dest, double *score) -{ - return NULL; -} - - -typedef struct _BookQuery BookQuery; -struct _BookQuery { - gboolean primary; - BookQuerySExp builder; - BookQueryMatchTester tester; -}; - -static BookQuery book_queries[] = { - { TRUE, sexp_nickname, match_nickname}, - { TRUE, sexp_email, match_email }, - { TRUE, sexp_name, match_name }, - { FALSE, sexp_initials, match_initials } -}; -static gint book_query_count = sizeof (book_queries) / sizeof (BookQuery); - -/* - * Build up a big compound sexp corresponding to all of our queries. - */ -static gchar * -book_query_sexp (ESelectNamesCompletion *comp) -{ - gint i, j, count = 0; - gchar **queryv, *query; - - g_return_val_if_fail (comp && E_IS_SELECT_NAMES_COMPLETION (comp), NULL); - - if (! (comp->priv->query_text && *comp->priv->query_text)) - return NULL; - - if (comp->priv->primary_only) { - for (i=0; i<book_query_count; ++i) - if (book_queries[i].primary) - ++count; - } else { - count = book_query_count; - } - - queryv = g_new0 (gchar *, count+1); - for (i=0, j=0; i<count; ++i) { - queryv[j] = book_queries[i].builder (comp); - if (queryv[j]) - ++j; - } - - if (j == 0) { - query = NULL; - } else if (j == 1) { - query = queryv[0]; - queryv[0] = NULL; - } else { - gchar *tmp = g_strjoinv (" ", queryv); - query = g_strdup_printf ("(or %s)", tmp); - g_free (tmp); - } - - for (i=0; i<count; ++i) - g_free (queryv[i]); - g_free (queryv); - - return query; -} - -/* - * Sweep across all of our query rules and find the best score/match - * string that applies to a given destination. - */ -static gchar * -book_query_score (ESelectNamesCompletion *comp, EDestination *dest, double *score) -{ - double best_score = -1; - gchar *best_string = NULL; - gint i; - - g_return_val_if_fail (score, NULL); - *score = -1; - - g_return_val_if_fail (comp && E_IS_SELECT_NAMES_COMPLETION (comp), NULL); - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - for (i=0; i<book_query_count; ++i) { - double this_score = -1; - gchar *this_string = NULL; - - if (book_queries[i].primary || !comp->priv->primary_only) { - if (book_queries[i].tester && e_destination_get_card (dest)) - this_string = book_queries[i].tester (comp, dest, &this_score); - if (this_string) { - if (this_score > best_score) { - g_free (best_string); - best_string = this_string; - best_score = this_score; - } else { - g_free (this_string); - } - } - } - } - - /* If this destination corresponds to a card w/ multiple addresses, and if the - address isn't already in the string, append it. */ - if (best_string) { - ECard *card = e_destination_get_card (dest); - if (e_list_length (card->email) > 1) { - const gchar *email = e_destination_get_email (dest); - if (email && strstr (best_string, email) == NULL) { - gchar *tmp = g_strdup_printf ("%s <%s>", best_string, email); - g_free (best_string); - best_string = tmp; - } - } - } - - *score = best_score; - return best_string; -} - -static void -book_query_process_card_list (ESelectNamesCompletion *comp, const GList *cards) -{ - while (cards) { - ECard *card = E_CARD (cards->data); - - if (card->email) { - gint i; - for (i=0; i<e_list_length (card->email); ++i) { - EDestination *dest = e_destination_new (); - gchar *match_text; - double score = -1; - - e_destination_set_card (dest, card, i); - - match_text = book_query_score (comp, dest, &score); - if (match_text && score > 0) { - - e_completion_found_match_full (E_COMPLETION (comp), match_text, score, dest, - (GtkDestroyNotify) gtk_object_unref); - } else { - gtk_object_unref (GTK_OBJECT (dest)); - } - g_free (match_text); - } - } - - cards = g_list_next (cards); - } -} - -#if 0 -static gchar * -initials_query_match_cb (QueryInfo *qi, ECard *card, double *score) -{ - gint len; - gchar f='\0', m='\0', l='\0'; /* initials */ - gchar cf, cm, cl; - - len = strlen (qi->comp->priv->query_text); - - if (len == 2) { - - f = qi->comp->priv->query_text[0]; - m = '\0'; - l = qi->comp->priv->query_text[1]; - - } else if (len == 3) { - - f = qi->comp->priv->query_text[0]; - m = qi->comp->priv->query_text[1]; - l = qi->comp->priv->query_text[2]; - - } else { - return NULL; - } - - cf = card->name->given ? *card->name->given : '\0'; - cm = card->name->additional ? *card->name->additional : '\0'; - cl = card->name->family ? *card->name->family : '\0'; - - if (f && isupper ((gint) f)) - f = tolower ((gint) f); - if (m && isupper ((gint) m)) - m = tolower ((gint) m); - if (l && isupper ((gint) l)) - l = tolower ((gint) l); - - if (cf && isupper ((gint) cf)) - cf = tolower ((gint) cf); - if (cm && isupper ((gint) cm)) - cm = tolower ((gint) cm); - if (cl && isupper ((gint) cl)) - cl = tolower ((gint) cl); - - if ((f == '\0' || (f == cf)) && (m == '\0' || (m == cm)) && (l == '\0' || (l == cl))) { - if (score) - *score = 3; - if (m) - return g_strdup_printf ("%s %s %s", card->name->given, card->name->additional, card->name->family); - else - return g_strdup_printf ("%s %s", card->name->given, card->name->family); - } - - return NULL; -} - -static gboolean -start_initials_query (ESelectNamesCompletion *comp) -{ - gint len; - gchar *query; - - if (comp && comp->priv->query_text && *(comp->priv->query_text)) { - - len = strlen (comp->priv->query_text); - if (len < 2 || len > 3) - return FALSE; - - query = g_strdup_printf ("(contains \"x-evolution-any-field\" \"%c\")", *(comp->priv->query_text)); - query_info_start (comp, comp->priv->query_text, query, initials_query_match_cb); - g_free (query); - return TRUE; - } - - return FALSE; -} -#endif - - -/* - * - * ESelectNamesCompletion code - * - */ - - -GtkType -e_select_names_completion_get_type (void) -{ - static GtkType select_names_complete_type = 0; - - if (!select_names_complete_type) { - GtkTypeInfo select_names_complete_info = { - "ESelectNamesCompletion", - sizeof (ESelectNamesCompletion), - sizeof (ESelectNamesCompletionClass), - (GtkClassInitFunc) e_select_names_completion_class_init, - (GtkObjectInitFunc) e_select_names_completion_init, - NULL, NULL, /* reserved */ - (GtkClassInitFunc) NULL - }; - - select_names_complete_type = gtk_type_unique (e_completion_get_type (), &select_names_complete_info); - } - - return select_names_complete_type; -} - -static void -e_select_names_completion_class_init (ESelectNamesCompletionClass *klass) -{ - GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass); - ECompletionClass *completion_class = E_COMPLETION_CLASS (klass); - - parent_class = GTK_OBJECT_CLASS (gtk_type_class (e_completion_get_type ())); - - object_class->destroy = e_select_names_completion_destroy; - - completion_class->begin_completion = e_select_names_completion_begin; - completion_class->end_completion = e_select_names_completion_end; - completion_class->cancel_completion = e_select_names_completion_cancel; - - if (getenv ("EVO_DEBUG_SELECT_NAMES_COMPLETION")) { - out = fopen ("/tmp/evo-debug-select-names-completion", "w"); - if (out) - setvbuf (out, NULL, _IONBF, 0); - } -} - -static void -e_select_names_completion_init (ESelectNamesCompletion *comp) -{ - comp->priv = g_new0 (struct _ESelectNamesCompletionPrivate, 1); -} - -static void -e_select_names_completion_destroy (GtkObject *object) -{ - ESelectNamesCompletion *comp = E_SELECT_NAMES_COMPLETION (object); - - if (comp->priv->model) - gtk_object_unref (GTK_OBJECT (comp->priv->model)); - - if (comp->priv->book) - gtk_object_unref (GTK_OBJECT (comp->priv->book)); - - if (comp->priv->book_view) - gtk_object_unref (GTK_OBJECT (comp->priv->book_view)); - - g_free (comp->priv->waiting_query); - g_free (comp->priv->query_text); - - g_free (comp->priv->cached_query_text); - g_list_foreach (comp->priv->cached_cards, (GFunc)gtk_object_unref, NULL); - g_list_free (comp->priv->cached_cards); - - g_free (comp->priv); - - if (parent_class->destroy) - parent_class->destroy (object); -} - - -/* - * - * EBook/EBookView Callbacks & Query Stuff - * - */ - -static gchar * -clean_query_text (const gchar *s) -{ - gchar *q = g_new (gchar, strlen(s)+1), *t; - - t = q; - while (*s) { - if (*s != ',' && *s != '"') { - *t = *s; - ++t; - } - ++s; - } - *t = '\0'; - - return q; -} - -static void -e_select_names_completion_clear_cache (ESelectNamesCompletion *comp) -{ - g_free (comp->priv->cached_query_text); - comp->priv->cached_query_text = NULL; - - g_list_foreach (comp->priv->cached_cards, (GFunc)gtk_object_unref, NULL); - g_list_free (comp->priv->cached_cards); - comp->priv->cached_cards = NULL; -} - -static void -e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBookView *view, gpointer user_data) -{ - ESelectNamesCompletion *comp; - - if (status != E_BOOK_STATUS_SUCCESS) - return; - - comp = E_SELECT_NAMES_COMPLETION (user_data); - - comp->priv->cancelled = FALSE; - - comp->priv->book_view_tag = 0; - - comp->priv->book_view = view; - gtk_object_ref (GTK_OBJECT (view)); - - gtk_signal_connect (GTK_OBJECT (view), - "card_added", - GTK_SIGNAL_FUNC (e_select_names_completion_card_added_cb), - comp); - gtk_signal_connect (GTK_OBJECT (view), - "sequence_complete", - GTK_SIGNAL_FUNC (e_select_names_completion_seq_complete_cb), - comp); -} - -static void -e_select_names_completion_card_added_cb (EBookView *book_view, const GList *cards, gpointer user_data) -{ - ESelectNamesCompletion *comp = E_SELECT_NAMES_COMPLETION (user_data); - - if (! comp->priv->cancelled) - book_query_process_card_list (comp, cards); - - /* Save the list of matching cards. */ - while (cards) { - comp->priv->cached_cards = g_list_prepend (comp->priv->cached_cards, cards->data); - gtk_object_ref (GTK_OBJECT (cards->data)); - cards = g_list_next (cards); - } -} - -static void -e_select_names_completion_seq_complete_cb (EBookView *book_view, gpointer user_data) -{ - ESelectNamesCompletion *comp = E_SELECT_NAMES_COMPLETION (user_data); - - gtk_object_unref (GTK_OBJECT (comp->priv->book_view)); - - comp->priv->book_view = NULL; - - g_free (comp->priv->query_text); - comp->priv->query_text = NULL; - - if (out) - fprintf (out, "ending search "); - if (out && !e_completion_searching (E_COMPLETION (comp))) - fprintf (out, "while not searching!"); - if (out) - fprintf (out, "\n"); - e_completion_end_search (E_COMPLETION (comp)); /* That's all folks! */ - - /* Need to launch a new completion if another one is pending. */ - if (comp->priv->waiting_query) { - gchar *s = comp->priv->waiting_query; - comp->priv->waiting_query = NULL; - e_completion_begin_search (E_COMPLETION (comp), s, comp->priv->waiting_pos, comp->priv->waiting_limit); - g_free (s); - } -} - -static void -e_select_names_completion_stop_query (ESelectNamesCompletion *comp) -{ - g_return_if_fail (comp && E_IS_SELECT_NAMES_COMPLETION (comp)); - - if (out) - fprintf (out, "stopping query\n"); - - if (comp->priv->waiting_query) { - if (out) - fprintf (out, "stopped waiting query\n"); - g_free (comp->priv->waiting_query); - comp->priv->waiting_query = NULL; - } - - g_free (comp->priv->query_text); - comp->priv->query_text = NULL; - - if (comp->priv->book_view_tag) { - if (out) - fprintf (out, "cancelled book view creation\n"); - e_book_cancel (comp->priv->book, comp->priv->book_view_tag); - comp->priv->book_view_tag = 0; - } - - if (comp->priv->book_view) { - if (out) - fprintf (out, "unrefed book view\n"); - gtk_object_unref (GTK_OBJECT (comp->priv->book_view)); - comp->priv->book_view = NULL; - } - - /* Clear the cache, which may contain partial results. */ - e_select_names_completion_clear_cache (comp); - -} - -static void -e_select_names_completion_start_query (ESelectNamesCompletion *comp, const gchar *query_text) -{ - g_return_if_fail (comp && E_IS_SELECT_NAMES_COMPLETION (comp)); - g_return_if_fail (query_text); - - e_select_names_completion_stop_query (comp); /* Stop any prior queries. */ - - if (comp->priv->book_ready) { - gchar *sexp; - - g_free (comp->priv->query_text); - comp->priv->query_text = g_strdup (query_text); - - g_free (comp->priv->cached_query_text); - comp->priv->cached_query_text = g_strdup (query_text); - - sexp = book_query_sexp (comp); - if (sexp && *sexp) { - - if (out) - fprintf (out, "\n\n**** starting query: \"%s\"\n", comp->priv->query_text); - - comp->priv->book_view_tag = e_book_get_book_view (comp->priv->book, sexp, - e_select_names_completion_got_book_view_cb, comp); - - if (! comp->priv->book_view_tag) - g_warning ("Exception calling e_book_get_book_view"); - - } else { - g_free (comp->priv->query_text); - } - g_free (sexp); - - } else { - - comp->priv->waiting_query = g_strdup (query_text); - - } -} - -static void -e_select_names_completion_do_query (ESelectNamesCompletion *comp, const gchar *query_text, gint pos, gint limit) -{ - gchar *clean; - gboolean query_is_still_running, can_reuse_cached_cards; - - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - - query_is_still_running = comp->priv->book_view_tag || comp->priv->book_view; - clean = clean_query_text (query_text); - - if (out) { - fprintf (out, "do_query: %s => %s\n", query_text, clean); - if (query_is_still_running) - fprintf (out, "a query is still running!\n"); - } - if (comp->priv->cached_query_text && out) - fprintf (out, "cached: %s\n", comp->priv->cached_query_text); - - can_reuse_cached_cards = (comp->priv->cached_query_text - && (strlen (comp->priv->cached_query_text) <= strlen (clean)) - && !g_strncasecmp (comp->priv->cached_query_text, clean, strlen (comp->priv->cached_query_text))); - - - if (can_reuse_cached_cards) { - - if (out) - fprintf (out, "can reuse cached card!\n"); - - if (query_is_still_running) { - g_free (comp->priv->waiting_query); - comp->priv->waiting_query = clean; - comp->priv->waiting_pos = pos; - comp->priv->waiting_limit = limit; - if (out) - fprintf (out, "waiting for running query to complete: %s\n", comp->priv->waiting_query); - return; - } - - g_free (comp->priv->query_text); - comp->priv->query_text = clean; - if (out) - fprintf (out, "using existing query info: %s (vs %s)\n", comp->priv->query_text, comp->priv->cached_query_text); - comp->priv->cancelled = FALSE; - book_query_process_card_list (comp, comp->priv->cached_cards); - e_completion_end_search (E_COMPLETION (comp)); - return; - } - - e_select_names_completion_start_query (comp, clean); - g_free (clean); -} - - -/* - * - * Completion Search Override - a Framework for Christian-Resurrection-Holiday Edible-Chicken-Embryos - * - */ - -typedef struct _SearchOverride SearchOverride; -struct _SearchOverride { - const gchar *trigger; - const gchar *text[4]; -}; -static SearchOverride override[] = { - { "why?", { "\"I must create a system, or be enslaved by another man's.\"", - " -- Wiliam Blake, \"Jerusalem\"", - NULL } }, - { NULL, { NULL } } }; - -static gboolean -search_override_check (SearchOverride *over, const gchar *text) -{ - if (over == NULL || text == NULL) - return FALSE; - - return !g_strcasecmp (over->trigger, text); -} - - -/* - * - * Completion Callbacks - * - */ - -static void -e_select_names_completion_begin (ECompletion *comp, const gchar *text, gint pos, gint limit) -{ - ESelectNamesCompletion *selcomp = E_SELECT_NAMES_COMPLETION (comp); - const gchar *str; - gint index, j; - - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - g_return_if_fail (text != NULL); - - if (out) { - fprintf (out, "\n\n**** requesting completion\n"); - fprintf (out, "text=\"%s\" pos=%d limit=%d\n", text, pos, limit); - } - - e_select_names_model_text_pos (selcomp->priv->model, pos, &index, NULL, NULL); - str = index >= 0 ? e_select_names_model_get_string (selcomp->priv->model, index) : NULL; - - if (out) - fprintf (out, "index=%d str=\"%s\"\n", index, str); - - if (str == NULL || *str == '\0') { - if (out) - fprintf (out, "aborting empty query\n"); - e_completion_end_search (comp); - return; - } - - for (j=0; override[j].trigger; ++j) { - if (search_override_check (&(override[j]), str)) { - gint k; - - for (k=0; override[j].text[k]; ++k) - e_completion_found_match (comp, override[j].text[k]); - - if (out) - fprintf (out, "aborting on override \"%s\"\n", override[j].trigger); - e_completion_end_search (comp); - return; - } - } - - e_select_names_completion_do_query (selcomp, str, pos, limit); -} - -static void -e_select_names_completion_end (ECompletion *comp) -{ - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_COMPLETION (comp)); - - if (out) - fprintf (out, "completion ended\n"); -} - -static void -e_select_names_completion_cancel (ECompletion *comp) -{ - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_COMPLETION (comp)); - - E_SELECT_NAMES_COMPLETION (comp)->priv->cancelled = TRUE; - - if (out) - fprintf (out, "completion cancelled\n"); -} - -static void -e_select_names_completion_book_ready (EBook *book, EBookStatus status, ESelectNamesCompletion *comp) -{ - comp->priv->book_ready = TRUE; - - g_return_if_fail (book != NULL); - g_return_if_fail (E_IS_BOOK (book)); - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - - /* If waiting_query is non-NULL, someone tried to start a query before the book was ready. - Now that it is, get started. */ - if (comp->priv->waiting_query) { - e_select_names_completion_start_query (comp, comp->priv->waiting_query); - g_free (comp->priv->waiting_query); - comp->priv->waiting_query = NULL; - } - - gtk_object_unref (GTK_OBJECT (comp)); /* post-async unref */ -} - - -/* - * - * Our Pseudo-Constructor - * - */ - -ECompletion * -e_select_names_completion_new (EBook *book, ESelectNamesModel *model) -{ - ESelectNamesCompletion *comp; - - g_return_val_if_fail (book == NULL || E_IS_BOOK (book), NULL); - g_return_val_if_fail (model, NULL); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); - - comp = (ESelectNamesCompletion *) gtk_type_new (e_select_names_completion_get_type ()); - - if (book == NULL) { - - comp->priv->book = e_book_new (); - gtk_object_ref (GTK_OBJECT (comp->priv->book)); - gtk_object_sink (GTK_OBJECT (comp->priv->book)); - - comp->priv->book_ready = FALSE; - gtk_object_ref (GTK_OBJECT (comp)); /* ref ourself before our async call */ - e_book_load_local_address_book (comp->priv->book, (EBookCallback) e_select_names_completion_book_ready, comp); - - } else { - comp->priv->book = book; - gtk_object_ref (GTK_OBJECT (comp->priv->book)); - comp->priv->book_ready = TRUE; - } - - comp->priv->model = model; - gtk_object_ref (GTK_OBJECT (model)); - - return E_COMPLETION (comp); -} - diff --git a/addressbook/gui/component/select-names/e-select-names-completion.h b/addressbook/gui/component/select-names/e-select-names-completion.h deleted file mode 100644 index 1f3de5ea3d..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-completion.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-completion.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef E_SELECT_NAMES_COMPLETION_H -#define E_SELECT_NAMES_COMPLETION_H - -#include <gal/e-text/e-completion.h> -#include <addressbook/backend/ebook/e-book.h> -#include "e-select-names-model.h" - -BEGIN_GNOME_DECLS - -#define E_SELECT_NAMES_COMPLETION_TYPE (e_select_names_completion_get_type ()) -#define E_SELECT_NAMES_COMPLETION(o) (GTK_CHECK_CAST ((o), E_SELECT_NAMES_COMPLETION_TYPE, ESelectNamesCompletion)) -#define E_SELECT_NAMES_COMPLETION_CLASS(k) (GTK_CHECK_CLASS_CAST ((k), E_SELECT_NAMES_COMPLETION_TYPE, ESelectNamesCompletionClass)) -#define E_IS_SELECT_NAMES_COMPLETION(o) (GTK_CHECK_TYPE ((o), E_SELECT_NAMES_COMPLETION_TYPE)) -#define E_IS_SELECT_NAMES_COMPLETION_CLASS(k) (GTK_CHECK_CLASS_TYPE ((k), E_SELECT_NAMES_COMPLETION_TYPE)) - -typedef struct _ESelectNamesCompletion ESelectNamesCompletion; -typedef struct _ESelectNamesCompletionClass ESelectNamesCompletionClass; -struct _ESelectNamesCompletionPrivate; - -struct _ESelectNamesCompletion { - ECompletion parent; - - struct _ESelectNamesCompletionPrivate *priv; -}; - -struct _ESelectNamesCompletionClass { - ECompletionClass parent_class; - -}; - -GtkType e_select_names_completion_get_type (void); - -ECompletion *e_select_names_completion_new (EBook *, ESelectNamesModel *); - -END_GNOME_DECLS - -#endif /* E_SELECT_NAMES_COMPLETION_H */ - diff --git a/addressbook/gui/component/select-names/e-select-names-factory.c b/addressbook/gui/component/select-names/e-select-names-factory.c deleted file mode 100644 index 39fdcf8cee..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-factory.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-factory.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-generic-factory.h> - -#include "e-select-names-bonobo.h" -#include "e-select-names-factory.h" - - -#define COMPONENT_FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_SelectNamesFactory" - -static BonoboGenericFactory *factory = NULL; - - -static BonoboObject * -factory_fn (BonoboGenericFactory *factory, - void *closure) -{ - return BONOBO_OBJECT (e_select_names_bonobo_new ()); -} - - -gboolean -e_select_names_factory_init (void) -{ - if (factory != NULL) - return TRUE; - - factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL); - - if (factory == NULL) - return FALSE; - - return TRUE; -} diff --git a/addressbook/gui/component/select-names/e-select-names-factory.h b/addressbook/gui/component/select-names/e-select-names-factory.h deleted file mode 100644 index f65d5aaa9e..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-factory.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-factory.h - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 2 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, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_SECELT_NAMES_FACTORY_H -#define _E_SECELT_NAMES_FACTORY_H - -#include <glib.h> - -gboolean e_select_names_factory_init (void); - -#endif diff --git a/addressbook/gui/component/select-names/e-select-names-manager.c b/addressbook/gui/component/select-names/e-select-names-manager.c deleted file mode 100644 index 6c06624918..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-manager.c +++ /dev/null @@ -1,434 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <gal/e-text/e-entry.h> - -#include "e-select-names-manager.h" -#include "e-select-names-model.h" -#include "e-select-names-text-model.h" -#include "e-select-names.h" -#include "e-select-names-completion.h" -#include "e-select-names-popup.h" -#include <addressbook/backend/ebook/e-destination.h> - -/* Object argument IDs */ -enum { - ARG_0, - ARG_CARD, -}; - - -typedef struct { - char *id; - char *title; - ESelectNamesModel *model; -} ESelectNamesManagerSection; - -typedef struct { - char *id; - EEntry *entry; -} ESelectNamesManagerEntry; - -static void e_select_names_manager_init (ESelectNamesManager *manager); -static void e_select_names_manager_class_init (ESelectNamesManagerClass *klass); - -static void e_select_names_manager_destroy (GtkObject *object); -static void e_select_names_manager_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); - -/** - * e_select_names_manager_get_type: - * @void: - * - * Registers the &ESelectNamesManager class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ESelectNamesManager class. - **/ -GtkType -e_select_names_manager_get_type (void) -{ - static GtkType manager_type = 0; - - if (!manager_type) { - GtkTypeInfo manager_info = { - "ESelectNamesManager", - sizeof (ESelectNamesManager), - sizeof (ESelectNamesManagerClass), - (GtkClassInitFunc) e_select_names_manager_class_init, - (GtkObjectInitFunc) e_select_names_manager_init, - NULL, /* reserved_1 */ - NULL, /* reserved_2 */ - (GtkClassInitFunc) NULL - }; - - manager_type = gtk_type_unique (gtk_object_get_type (), &manager_info); - } - - return manager_type; -} - -/** - * e_select_names_manager_new: - * @VCard: a string in vCard format - * - * Returns: a new #ESelectNamesManager that wraps the @VCard. - */ -ESelectNamesManager * -e_select_names_manager_new (void) -{ - ESelectNamesManager *manager = E_SELECT_NAMES_MANAGER(gtk_type_new(e_select_names_manager_get_type())); - return manager; -} - -static void -e_select_names_manager_class_init (ESelectNamesManagerClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS(klass); - - gtk_object_add_arg_type ("ESelectNamesManager::card", - GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD); - - object_class->destroy = e_select_names_manager_destroy; - object_class->get_arg = e_select_names_manager_get_arg; - object_class->set_arg = e_select_names_manager_set_arg; -} - -/* - * ESelectNamesManager lifecycle management and vcard loading/saving. - */ - -static void -e_select_names_manager_destroy (GtkObject *object) -{ - ESelectNamesManager *manager; - - manager = E_SELECT_NAMES_MANAGER (object); - - gtk_object_unref(GTK_OBJECT(manager->sections)); - gtk_object_unref(GTK_OBJECT(manager->entries)); -} - - -/* Set_arg handler for the manager */ -static void -e_select_names_manager_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesManager *manager; - - manager = E_SELECT_NAMES_MANAGER (object); - - switch (arg_id) { - case ARG_CARD: - break; - default: - return; - } -} - -/* Get_arg handler for the manager */ -static void -e_select_names_manager_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesManager *manager; - - manager = E_SELECT_NAMES_MANAGER (object); - - switch (arg_id) { - case ARG_CARD: - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void * -section_copy(const void *sec, void *data) -{ - const ESelectNamesManagerSection *section = sec; - ESelectNamesManagerSection *newsec; - - newsec = g_new(ESelectNamesManagerSection, 1); - newsec->id = g_strdup(section->id); - newsec->title = g_strdup(section->title); - newsec->model = section->model; - if (newsec->model) - gtk_object_ref(GTK_OBJECT(newsec->model)); - return newsec; -} - -static void -section_free(void *sec, void *data) -{ - ESelectNamesManagerSection *section = sec; - g_free(section->id); - g_free(section->title); - if (section->model) - gtk_object_unref(GTK_OBJECT(section->model)); - g_free(section); -} - -static void * -entry_copy(const void *ent, void *data) -{ - const ESelectNamesManagerEntry *entry = ent; - ESelectNamesManagerEntry *newent; - - newent = g_new(ESelectNamesManagerEntry, 1); - newent->id = g_strdup(entry->id); - newent->entry = entry->entry; - if (newent->entry) - gtk_object_ref(GTK_OBJECT(newent->entry)); - return newent; -} - -static void -entry_free(void *ent, void *data) -{ - ESelectNamesManagerEntry *entry = ent; - g_free(entry->id); - if (entry->entry) - gtk_object_unref(GTK_OBJECT(entry->entry)); - g_free(entry); -} - -/** - * e_select_names_manager_init: - */ -static void -e_select_names_manager_init (ESelectNamesManager *manager) -{ - manager->sections = e_list_new(section_copy, section_free, manager); - manager->entries = e_list_new(entry_copy, entry_free, manager); -} - -void -e_select_names_manager_add_section (ESelectNamesManager *manager, - const char *id, - const char *title) -{ - ESelectNamesManagerSection *section; - - section = g_new(ESelectNamesManagerSection, 1); - section->id = g_strdup(id); - section->title = g_strdup(title); - section->model = e_select_names_model_new(); - e_list_append(manager->sections, section); - section_free(section, manager); -} - -ESelectNamesModel * -e_select_names_manager_get_source (ESelectNamesManager *manager, const char *id) -{ - EIterator *iterator; - - g_return_val_if_fail (manager && E_IS_SELECT_NAMES_MANAGER (manager), NULL); - g_return_val_if_fail (id, NULL); - - iterator = e_list_get_iterator (manager->sections); - for (e_iterator_reset (iterator); e_iterator_is_valid (iterator); e_iterator_next (iterator)) { - const ESelectNamesManagerSection *section = e_iterator_get (iterator); - if (!strcmp (section->id, id)) { - return section->model; - } - } - - return NULL; -} - -static void -entry_destroyed(EEntry *entry, ESelectNamesManager *manager) -{ - if(!GTK_OBJECT_DESTROYED(manager)) { - EIterator *iterator = e_list_get_iterator(manager->entries); - for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ESelectNamesManagerEntry *this_entry = e_iterator_get(iterator); - if(entry == this_entry->entry) { - e_iterator_delete(iterator); - break; - } - } - } - gtk_object_unref(GTK_OBJECT(manager)); -} - -static void -completion_handler (EEntry *entry, const gchar *text, gpointer user_data) -{ - ESelectNamesModel *snm; - EDestination *dest; - gint i, pos, start_pos, len; - - if (user_data == NULL) - return; - - snm = E_SELECT_NAMES_MODEL (gtk_object_get_data (GTK_OBJECT (entry), "select_names_model")); - dest = E_DESTINATION (user_data); - - /* Sometimes I really long for garbage collection. Reference - counting makes you feel 31337, but sometimes it is just a - bitch. */ - gtk_object_ref (GTK_OBJECT (dest)); - - pos = e_entry_get_position (entry); - e_select_names_model_text_pos (snm, pos, &i, NULL, NULL); - e_select_names_model_replace (snm, i, dest); - e_select_names_model_name_pos (snm, i, &start_pos, &len); - e_entry_set_position (entry, start_pos+len); -} - -static void -popup_cb (EEntry *entry, GdkEventButton *ev, gint pos, ESelectNamesModel *model) -{ - e_select_names_popup (model, ev, pos); -} - -GtkWidget * -e_select_names_manager_create_entry (ESelectNamesManager *manager, const char *id) -{ - ETextModel *model; - EIterator *iterator; - iterator = e_list_get_iterator(manager->sections); - for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ESelectNamesManagerSection *section = e_iterator_get(iterator); - if (!strcmp(section->id, id)) { - ESelectNamesManagerEntry *entry; - EEntry *eentry; - ECompletion *comp; - - eentry = E_ENTRY (e_entry_new ()); - gtk_object_set_data (GTK_OBJECT (eentry), "select_names_model", section->model); - - gtk_signal_connect (GTK_OBJECT (eentry), - "popup", - GTK_SIGNAL_FUNC (popup_cb), - section->model); - - entry = g_new (ESelectNamesManagerEntry, 1); - entry->entry = eentry; - entry->id = (char *)id; - - model = e_select_names_text_model_new (section->model); - e_list_append (manager->entries, entry); - g_free(entry); - - comp = e_select_names_completion_new (NULL, section->model); /* NULL == use local addressbook */ - e_entry_enable_completion_full (eentry, comp, 50, completion_handler); - - gtk_object_set(GTK_OBJECT(eentry), - "model", model, - "editable", TRUE, - "use_ellipsis", TRUE, - "allow_newlines", FALSE, - NULL); - gtk_signal_connect(GTK_OBJECT(eentry), "destroy", - GTK_SIGNAL_FUNC(entry_destroyed), manager); - gtk_object_ref(GTK_OBJECT(manager)); - return GTK_WIDGET(eentry); - } - } - return NULL; -} - -static void -e_select_names_clicked(ESelectNames *dialog, gint button, ESelectNamesManager *manager) -{ - switch(button) { - case 0: { - EList *list = manager->sections; - EIterator *iterator = e_list_get_iterator(list); - for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - ESelectNamesManagerSection *section = (void *) e_iterator_get(iterator); - ESelectNamesModel *source = e_select_names_get_source(dialog, section->id); - if (section->model) - gtk_object_unref(GTK_OBJECT(section->model)); - section->model = source; - /* Don't ref because get_source returns a conceptual ref_count of 1. */ - } - gtk_object_unref(GTK_OBJECT(iterator)); - - list = manager->entries; - iterator = e_list_get_iterator(list); - for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - ESelectNamesManagerEntry *entry = (void *) e_iterator_get(iterator); - ESelectNamesModel *source = e_select_names_get_source(dialog, entry->id); - if (source) { - ETextModel *model = e_select_names_text_model_new(source); - if (model) { - gtk_object_set(GTK_OBJECT(entry->entry), - "model", model, - NULL); - gtk_object_unref(GTK_OBJECT(source)); - } - gtk_object_unref(GTK_OBJECT(model)); - } - } - gtk_object_unref(GTK_OBJECT(iterator)); - break; - } - } - gnome_dialog_close(GNOME_DIALOG(dialog)); -} - -void -e_select_names_manager_activate_dialog (ESelectNamesManager *manager, - const char *id) -{ - EIterator *iterator; - - if (manager->names) { - g_assert (GTK_WIDGET_REALIZED (GTK_WIDGET (manager->names))); - e_select_names_set_default(manager->names, id); - gdk_window_show (GTK_WIDGET (manager->names)->window); - gdk_window_raise (GTK_WIDGET (manager->names)->window); - } else { - manager->names = E_SELECT_NAMES (e_select_names_new ()); - - iterator = e_list_get_iterator(manager->sections); - for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ESelectNamesManagerSection *section = e_iterator_get(iterator); - ESelectNamesModel *newmodel = e_select_names_model_duplicate(section->model); - e_select_names_add_section(manager->names, section->id, section->title, newmodel); - gtk_object_unref(GTK_OBJECT(newmodel)); - } - e_select_names_set_default(manager->names, id); - gtk_signal_connect(GTK_OBJECT(manager->names), "clicked", - GTK_SIGNAL_FUNC(e_select_names_clicked), manager); - gtk_signal_connect(GTK_OBJECT(manager->names), "destroy", - GTK_SIGNAL_FUNC(gtk_widget_destroyed), - &manager->names); - gtk_widget_show(GTK_WIDGET(manager->names)); - } -} - -#if 0 -/* Of type ECard */ -EList * -e_select_names_manager_get_cards (ESelectNamesManager *manager, - const char *id) -{ - EIterator *iterator; - iterator = e_list_get_iterator(manager->sections); - for (e_iterator_reset(iterator); e_iterator_is_valid(iterator); e_iterator_next(iterator)) { - const ESelectNamesManagerSection *section = e_iterator_get(iterator); - if (!strcmp(section->id, id)) { - return e_select_names_model_get_cards(section->model); - } - } - return NULL; -} -#endif diff --git a/addressbook/gui/component/select-names/e-select-names-manager.h b/addressbook/gui/component/select-names/e-select-names-manager.h deleted file mode 100644 index 4c177d1685..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-manager.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#ifndef __E_SELECT_NAMES_MANAGER_H__ -#define __E_SELECT_NAMES_MANAGER_H__ - -#include <stdio.h> -#include <time.h> -#include <gtk/gtkobject.h> -#include <e-util/e-list.h> -#include "e-select-names.h" - -#define E_TYPE_SELECT_NAMES_MANAGER (e_select_names_manager_get_type ()) -#define E_SELECT_NAMES_MANAGER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_MANAGER, ESelectNamesManager)) -#define E_SELECT_NAMES_MANAGER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_MANAGER, ESelectNamesManagerClass)) -#define E_IS_SELECT_NAMES_MANAGER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_MANAGER)) -#define E_IS_SELECT_NAMES_MANAGER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_MANAGER)) - -typedef struct _ESelectNamesManager ESelectNamesManager; -typedef struct _ESelectNamesManagerClass ESelectNamesManagerClass; - -struct _ESelectNamesManager { - GtkObject object; - - EList *sections; - EList *entries; - - ESelectNames *names; -}; - -struct _ESelectNamesManagerClass { - GtkObjectClass parent_class; -}; - -ESelectNamesManager *e_select_names_manager_new (void); -void e_select_names_manager_add_section (ESelectNamesManager *manager, - const char *id, - const char *title); -ESelectNamesModel *e_select_names_manager_get_source (ESelectNamesManager *manager, - const char *id); -GtkWidget *e_select_names_manager_create_entry (ESelectNamesManager *manager, - const char *id); -void e_select_names_manager_activate_dialog (ESelectNamesManager *manager, - const char *id); - -#if 0 -/* Of type ECard */ -EList *e_select_names_manager_get_cards (ESelectNamesManager *manager, - const char *id); -#endif - -/* Standard Gtk function */ -GtkType e_select_names_manager_get_type (void); - -#endif /* ! __E_SELECT_NAMES_MANAGER_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names-model.c b/addressbook/gui/component/select-names/e-select-names-model.c deleted file mode 100644 index 59d7bc7c24..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-model.c +++ /dev/null @@ -1,546 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbidge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <gtk/gtkmarshal.h> -#include <gtk/gtksignal.h> - -#include <gal/util/e-util.h> - -#include "e-select-names-model.h" -#include "addressbook/backend/ebook/e-card-simple.h" - -#define SEPARATOR ", " -#define SEPLEN 2 - - -enum { - E_SELECT_NAMES_MODEL_CHANGED, - E_SELECT_NAMES_MODEL_RESIZED, - E_SELECT_NAMES_MODEL_LAST_SIGNAL -}; - -static guint e_select_names_model_signals[E_SELECT_NAMES_MODEL_LAST_SIGNAL] = { 0 }; - -/* Object argument IDs */ -enum { - ARG_0, - ARG_CARD, -}; - -enum { - NAME_DATA_BLANK, - NAME_DATA_CARD, - NAME_DATA_STRING -}; - -enum { - NAME_FORMAT_GIVEN_FIRST, - NAME_FORMAT_FAMILY_FIRST -}; - -struct _ESelectNamesModelPrivate { - gchar *id; - gchar *title; - - GList *data; /* of EDestination */ - gchar *text; - gchar *addr_text; -}; - - -static void e_select_names_model_init (ESelectNamesModel *model); -static void e_select_names_model_class_init (ESelectNamesModelClass *klass); - -static void e_select_names_model_destroy (GtkObject *object); -static void e_select_names_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_select_names_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); - -GtkType -e_select_names_model_get_type (void) -{ - static GtkType model_type = 0; - - if (!model_type) { - GtkTypeInfo model_info = { - "ESelectNamesModel", - sizeof (ESelectNamesModel), - sizeof (ESelectNamesModelClass), - (GtkClassInitFunc) e_select_names_model_class_init, - (GtkObjectInitFunc) e_select_names_model_init, - NULL, /* reserved_1 */ - NULL, /* reserved_2 */ - (GtkClassInitFunc) NULL - }; - - model_type = gtk_type_unique (gtk_object_get_type (), &model_info); - } - - return model_type; -} - -typedef void (*GtkSignal_NONE__INT_INT_INT) (GtkObject *object, gint arg1, gint arg2, gint arg3, gpointer user_data); -static void -local_gtk_marshal_NONE__INT_INT_INT (GtkObject *object, - GtkSignalFunc func, - gpointer func_data, - GtkArg *args) -{ - GtkSignal_NONE__INT_INT_INT rfunc; - rfunc = (GtkSignal_NONE__INT_INT_INT) func; - (* rfunc) (object, - GTK_VALUE_INT(args[0]), - GTK_VALUE_INT(args[1]), - GTK_VALUE_INT(args[2]), - func_data); -} - - -static void -e_select_names_model_class_init (ESelectNamesModelClass *klass) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS(klass); - - e_select_names_model_signals[E_SELECT_NAMES_MODEL_CHANGED] = - gtk_signal_new ("changed", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (ESelectNamesModelClass, changed), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - e_select_names_model_signals[E_SELECT_NAMES_MODEL_RESIZED] = - gtk_signal_new ("resized", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (ESelectNamesModelClass, resized), - local_gtk_marshal_NONE__INT_INT_INT, - GTK_TYPE_NONE, 3, GTK_TYPE_INT, GTK_TYPE_INT, GTK_TYPE_INT); - - gtk_object_class_add_signals (object_class, e_select_names_model_signals, E_SELECT_NAMES_MODEL_LAST_SIGNAL); - - gtk_object_add_arg_type ("ESelectNamesModel::card", - GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD); - - klass->changed = NULL; - - object_class->destroy = e_select_names_model_destroy; - object_class->get_arg = e_select_names_model_get_arg; - object_class->set_arg = e_select_names_model_set_arg; -} - -/** - * e_select_names_model_init: - */ -static void -e_select_names_model_init (ESelectNamesModel *model) -{ - model->priv = g_new0 (struct _ESelectNamesModelPrivate, 1); -} - -static void -e_select_names_model_destroy (GtkObject *object) -{ - ESelectNamesModel *model = E_SELECT_NAMES_MODEL (object); - - g_free (model->priv->title); - g_free (model->priv->id); - - g_list_foreach (model->priv->data, (GFunc) gtk_object_unref, NULL); - g_list_free (model->priv->data); - - g_free (model->priv->text); - g_free (model->priv->addr_text); - - g_free (model->priv); - -} - - -/* Set_arg handler for the model */ -static void -e_select_names_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesModel *model; - - model = E_SELECT_NAMES_MODEL (object); - - switch (arg_id) { - case ARG_CARD: - break; - default: - return; - } -} - -/* Get_arg handler for the model */ -static void -e_select_names_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesModel *model; - - model = E_SELECT_NAMES_MODEL (object); - - switch (arg_id) { - case ARG_CARD: - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ - -ESelectNamesModel * -e_select_names_model_new (void) -{ - ESelectNamesModel *model; - model = E_SELECT_NAMES_MODEL (gtk_type_new (e_select_names_model_get_type ())); - return model; -} - -ESelectNamesModel * -e_select_names_model_duplicate (ESelectNamesModel *old) -{ - ESelectNamesModel *model = E_SELECT_NAMES_MODEL(gtk_type_new(e_select_names_model_get_type())); - GList *iter; - - model->priv->id = g_strdup (old->priv->id); - model->priv->title = g_strdup (old->priv->title); - - for (iter = old->priv->data; iter != NULL; iter = g_list_next (iter)) { - EDestination *dup = e_destination_copy (E_DESTINATION (iter->data)); - model->priv->data = g_list_append (model->priv->data, dup); - } - - return model; -} - -const gchar * -e_select_names_model_get_textification (ESelectNamesModel *model) -{ - g_return_val_if_fail (model != NULL, NULL); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); - - if (model->priv->text == NULL) { - - if (model->priv->data == NULL) { - - model->priv->text = g_strdup (""); - - } else { - gchar **strv = g_new0 (gchar *, g_list_length (model->priv->data)+1); - gint i = 0; - GList *iter = model->priv->data; - - while (iter) { - EDestination *dest = E_DESTINATION (iter->data); - strv[i] = (gchar *) e_destination_get_string (dest); - if (strv[i] == NULL) - strv[i] = ""; - ++i; - iter = g_list_next (iter); - } - - model->priv->text = g_strjoinv (SEPARATOR, strv); - - g_free (strv); - } - } - - return model->priv->text; -} - -const gchar * -e_select_names_model_get_address_text (ESelectNamesModel *model) -{ - g_return_val_if_fail (model != NULL, NULL); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); - - if (model->priv->addr_text == NULL) { - - if (model->priv->data == NULL) { - - model->priv->addr_text = g_strdup (""); - - } else { - gchar **strv = g_new0 (gchar *, g_list_length (model->priv->data)+1); - gint i = 0; - GList *iter = model->priv->data; - - while (iter) { - EDestination *dest = E_DESTINATION (iter->data); - strv[i] = (gchar *) e_destination_get_email_verbose (dest); - if (strv[i]) - ++i; - iter = g_list_next (iter); - } - - model->priv->addr_text = g_strjoinv (SEPARATOR, strv); - - g_free (strv); - } - } - - return model->priv->addr_text; -} - -gint -e_select_names_model_count (ESelectNamesModel *model) -{ - g_return_val_if_fail (model != NULL, 0); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), 0); - - return g_list_length (model->priv->data); -} - -const EDestination * -e_select_names_model_get_destination (ESelectNamesModel *model, gint index) -{ - g_return_val_if_fail (model != NULL, NULL); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); - g_return_val_if_fail (0 <= index, NULL); - g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); - - return E_DESTINATION (g_list_nth_data (model->priv->data, index)); -} - -ECard * -e_select_names_model_get_card (ESelectNamesModel *model, gint index) -{ - const EDestination *dest; - - g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); - g_return_val_if_fail (0 <= index, NULL); - g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); - - dest = e_select_names_model_get_destination (model, index); - return dest ? e_destination_get_card (dest) : NULL; - -} - -const gchar * -e_select_names_model_get_string (ESelectNamesModel *model, gint index) -{ - const EDestination *dest; - - g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); - g_return_val_if_fail (0 <= index, NULL); - g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); - - dest = e_select_names_model_get_destination (model, index); - - return dest ? e_destination_get_string (dest) : ""; -} - -static void -e_select_names_model_changed (ESelectNamesModel *model) -{ - g_free (model->priv->text); - model->priv->text = NULL; - - g_free (model->priv->addr_text); - model->priv->addr_text = NULL; - - gtk_signal_emit(GTK_OBJECT(model), e_select_names_model_signals[E_SELECT_NAMES_MODEL_CHANGED]); -} - -void -e_select_names_model_insert (ESelectNamesModel *model, gint index, EDestination *dest) -{ - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (0 <= index && index <= g_list_length (model->priv->data)); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - - model->priv->data = g_list_insert (model->priv->data, dest, index); - - gtk_object_ref (GTK_OBJECT (dest)); - gtk_object_sink (GTK_OBJECT (dest)); - - e_select_names_model_changed (model); -} - -void -e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination *dest) -{ - GList *node; - gint old_strlen=0, new_strlen=0; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (model->priv->data == NULL || (0 <= index && index < g_list_length (model->priv->data))); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - - new_strlen = e_destination_get_strlen (dest); - - if (model->priv->data == NULL) { - - model->priv->data = g_list_append (model->priv->data, dest); - gtk_object_ref (GTK_OBJECT (dest)); - gtk_object_sink (GTK_OBJECT (dest)); - - } else { - - node = g_list_nth (model->priv->data, index); - - if (node->data != dest) { - old_strlen = e_destination_get_strlen (E_DESTINATION (node->data)); - - gtk_object_unref (GTK_OBJECT (node->data)); - - node->data = dest; - gtk_object_ref (GTK_OBJECT (dest)); - gtk_object_sink (GTK_OBJECT (dest)); - } - } - - e_select_names_model_changed (model); - - gtk_signal_emit (GTK_OBJECT (model), e_select_names_model_signals[E_SELECT_NAMES_MODEL_RESIZED], - index, old_strlen, new_strlen); -} - -void -e_select_names_model_delete (ESelectNamesModel *model, gint index) -{ - GList *node; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (0 <= index && index < g_list_length (model->priv->data)); - - node = g_list_nth (model->priv->data, index); - gtk_object_unref (GTK_OBJECT (node->data)); - - model->priv->data = g_list_remove_link (model->priv->data, node); - g_list_free_1 (node); - - e_select_names_model_changed (model); -} - -void -e_select_names_model_clean (ESelectNamesModel *model) -{ - GList *iter, *next; - gboolean changed = FALSE; - - g_return_if_fail (model != NULL && E_IS_SELECT_NAMES_MODEL (model)); - - iter = model->priv->data; - - while (iter) { - EDestination *dest; - - next = g_list_next (iter); - dest = iter->data ? E_DESTINATION (iter->data) : NULL; - - if (dest == NULL || e_destination_is_empty (dest)) { - if (dest) - gtk_object_unref (GTK_OBJECT (dest)); - model->priv->data = g_list_remove_link (model->priv->data, iter); - g_list_free_1 (iter); - changed = TRUE; - } - - iter = next; - } - - if (changed) - e_select_names_model_changed (model); -} - -void -e_select_names_model_delete_all (ESelectNamesModel *model) -{ - g_return_if_fail (model != NULL && E_IS_SELECT_NAMES_MODEL (model)); - - g_list_foreach (model->priv->data, (GFunc) gtk_object_unref, NULL); - g_list_free (model->priv->data); - model->priv->data = NULL; - - e_select_names_model_changed (model); -} - -void -e_select_names_model_name_pos (ESelectNamesModel *model, gint index, gint *pos, gint *length) -{ - gint rp = 0, i, len = 0; - GList *iter; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - - i = 0; - iter = model->priv->data; - while (iter && i <= index) { - rp += len + (i > 0 ? SEPLEN : 0); - len = e_destination_get_strlen (E_DESTINATION (iter->data)); - ++i; - iter = g_list_next (iter); - } - - if (i <= index) { - rp = -1; - len = 0; - } - - if (pos) - *pos = rp; - if (length) - *length = len; -} - -void -e_select_names_model_text_pos (ESelectNamesModel *model, gint pos, gint *index, gint *start_pos, gint *length) -{ - GList *iter; - gint len = 0, i = 0, sp = 0, adj = 0; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - - iter = model->priv->data; - - while (iter != NULL) { - len = e_destination_get_strlen (E_DESTINATION (iter->data)); - - if (sp <= pos && pos <= sp + len + adj) - break; - - sp += len + adj + 1; - adj = 1; - ++i; - - iter = g_list_next (iter); - } - - if (i != 0) - ++sp; /* skip past "magic space" */ - - if (iter == NULL) { - i = -1; - sp = -1; - len = 0; - } - - if (index) - *index = i; - if (start_pos) - *start_pos = sp; - if (length) - *length = len; -} diff --git a/addressbook/gui/component/select-names/e-select-names-model.h b/addressbook/gui/component/select-names/e-select-names-model.h deleted file mode 100644 index ab7477762c..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-model.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#ifndef __E_SELECT_NAMES_MODEL_H__ -#define __E_SELECT_NAMES_MODEL_H__ - -#include <time.h> -#include <gtk/gtkobject.h> -#include <stdio.h> -#include <e-util/e-list.h> -#include <addressbook/backend/ebook/e-card.h> -#include <addressbook/backend/ebook/e-destination.h> - -#define E_TYPE_SELECT_NAMES_MODEL (e_select_names_model_get_type ()) -#define E_SELECT_NAMES_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModel)) -#define E_SELECT_NAMES_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModelClass)) -#define E_IS_SELECT_NAMES_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_MODEL)) -#define E_IS_SELECT_NAMES_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_MODEL)) - -typedef struct _ESelectNamesModel ESelectNamesModel; -typedef struct _ESelectNamesModelClass ESelectNamesModelClass; -struct _ESelectNamesModelPrivate; - -struct _ESelectNamesModel { - GtkObject object; - - struct _ESelectNamesModelPrivate *priv; -}; - -struct _ESelectNamesModelClass { - GtkObjectClass parent_class; - - void (*changed) (ESelectNamesModel *model); - void (*resized) (ESelectNamesModel *model, gint index, gint old_len, gint new_len); -}; - -GtkType e_select_names_model_get_type (void); - -ESelectNamesModel *e_select_names_model_new (void); -ESelectNamesModel *e_select_names_model_duplicate (ESelectNamesModel *old); - -const gchar *e_select_names_model_get_textification (ESelectNamesModel *model); -const gchar *e_select_names_model_get_address_text (ESelectNamesModel *model); - -gint e_select_names_model_count (ESelectNamesModel *model); -const EDestination *e_select_names_model_get_destination (ESelectNamesModel *model, gint index); -ECard *e_select_names_model_get_card (ESelectNamesModel *model, gint index); -const gchar *e_select_names_model_get_string (ESelectNamesModel *model, gint index); - -void e_select_names_model_insert (ESelectNamesModel *model, gint index, EDestination *dest); -void e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination *dest); -void e_select_names_model_delete (ESelectNamesModel *model, gint index); -void e_select_names_model_delete_all (ESelectNamesModel *model); - -void e_select_names_model_clean (ESelectNamesModel *model); - -void e_select_names_model_name_pos (ESelectNamesModel *model, gint index, gint *pos, gint *length); -void e_select_names_model_text_pos (ESelectNamesModel *model, gint pos, gint *index, gint *start_pos, gint *length); - -#endif /* ! __E_SELECT_NAMES_MODEL_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names-popup.c b/addressbook/gui/component/select-names/e-select-names-popup.c deleted file mode 100644 index f6164f0022..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-popup.c +++ /dev/null @@ -1,325 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-popup.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> - -#include <stdio.h> -#include <string.h> - -#include <glib.h> -#include <gtk/gtkcheckmenuitem.h> -#include <libgnome/gnome-defs.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-app-helper.h> -#include <libgnomeui/gnome-popup-menu.h> - -#include <addressbook/contact-editor/e-contact-quick-add.h> -#include "e-select-names-popup.h" - -typedef struct _PopupInfo PopupInfo; -struct _PopupInfo { - ESelectNamesModel *model; - const EDestination *dest; - gint pos; - gint index; -}; - -static PopupInfo * -popup_info_new (ESelectNamesModel *model, const EDestination *dest, gint pos, gint index) -{ - PopupInfo *info = g_new0 (PopupInfo, 1); - info->model = model; - info->dest = dest; - info->pos = pos; - info->index = index; - - if (model) - gtk_object_ref (GTK_OBJECT (model)); - - if (dest) - gtk_object_ref (GTK_OBJECT (dest)); - - return info; -} - -static void -popup_info_free (PopupInfo *info) -{ - if (info) { - - if (info->model) - gtk_object_unref (GTK_OBJECT (info->model)); - - if (info->dest) - gtk_object_unref (GTK_OBJECT (info->dest)); - - g_free (info); - } -} - -static void -popup_info_cleanup (GtkWidget *w, gpointer info) -{ - popup_info_free ((PopupInfo *) info); -} - -static void -do_nothing (gpointer foo) -{ - -} - -static void -change_email_num_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - gint n; - EDestination *dest; - - if (info == NULL) - return; - - if (! GTK_CHECK_MENU_ITEM (w)->active) - return; - - n = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (w), "number")); - - if (n != e_destination_get_email_num (info->dest)) { - dest = e_destination_new (); - e_destination_set_card (dest, e_destination_get_card (info->dest), n); - e_select_names_model_replace (info->model, info->index, dest); - - } -} - -static void -remove_recipient_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - e_select_names_model_delete (info->model, info->index); -} - -static void -add_remove_recipient (GnomeUIInfo *uiinfo, PopupInfo *info) -{ - uiinfo->type = GNOME_APP_UI_ITEM; - uiinfo->label = _("Remove"); - uiinfo->moreinfo = remove_recipient_cb; -} - -static void -remove_all_recipients_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - e_select_names_model_delete_all (info->model); -} - -static void -add_remove_all_recipients (GnomeUIInfo *uiinfo, PopupInfo *info) -{ - uiinfo->type = GNOME_APP_UI_ITEM; - uiinfo->label = _("Remove All"); - uiinfo->moreinfo = remove_all_recipients_cb; -} - -#define ARBITRARY_UIINFO_LIMIT 64 -static GtkWidget * -popup_menu_card (PopupInfo *info) -{ - GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT]; - GnomeUIInfo radioinfo[ARBITRARY_UIINFO_LIMIT]; - gboolean using_radio = FALSE; - ECard *card; - gint i=0; - GtkWidget *pop; - EIterator *iterator; - gchar *name_str; - - /* - * Build up our GnomeUIInfo array. - */ - - memset (uiinfo, 0, sizeof (uiinfo)); - memset (radioinfo, 0, sizeof (radioinfo)); - - card = e_destination_get_card (info->dest); - name_str = e_card_name_to_string (card->name); - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = name_str; - ++i; - - uiinfo[i].type = GNOME_APP_UI_SEPARATOR; - ++i; - - if (e_list_length (card->email) > 1) { - gint j = 0; - - using_radio = TRUE; - - iterator = e_list_get_iterator (card->email); - for (e_iterator_reset (iterator); e_iterator_is_valid (iterator); e_iterator_next (iterator)) { - - radioinfo[j].type = GNOME_APP_UI_ITEM; - radioinfo[j].label = (gchar *)e_iterator_get (iterator); - radioinfo[j].moreinfo = change_email_num_cb; - ++j; - } - - radioinfo[j].type = GNOME_APP_UI_ENDOFINFO; - - uiinfo[i].type = GNOME_APP_UI_RADIOITEMS; - uiinfo[i].moreinfo = radioinfo; - ++i; - - } else { - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = (gchar *) e_destination_get_email (info->dest); - ++i; - } - - uiinfo[i].type = GNOME_APP_UI_SEPARATOR; - ++i; - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = N_("Edit Contact Info"); - uiinfo[i].moreinfo = do_nothing; - ++i; - - add_remove_recipient (&(uiinfo[i]), info); - ++i; - - add_remove_all_recipients (&(uiinfo[i]), info); - ++i; - - uiinfo[i].type = GNOME_APP_UI_ENDOFINFO; - - /* - * Now do something with it... - */ - - pop = gnome_popup_menu_new (uiinfo); - g_free (name_str); - - if (using_radio) { - gint n = e_destination_get_email_num (info->dest); - gint j; - for (j=0; radioinfo[j].type != GNOME_APP_UI_ENDOFINFO; ++j) { - gtk_object_set_data (GTK_OBJECT (radioinfo[j].widget), "number", GINT_TO_POINTER (j)); - if (j == n) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (radioinfo[n].widget), TRUE); - } - } - - return pop; -} - -static void -quick_add_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - e_contact_quick_add_free_form (e_destination_get_string (info->dest), NULL, NULL); -} - -static GtkWidget * -popup_menu_nocard (PopupInfo *info) -{ - GnomeUIInfo uiinfo[ARBITRARY_UIINFO_LIMIT]; - gint i=0; - GtkWidget *pop; - const gchar *str; - - memset (uiinfo, 0, sizeof (uiinfo)); - - str = e_destination_get_string (info->dest); - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = (gchar *) str; - ++i; - - uiinfo[i].type = GNOME_APP_UI_SEPARATOR; - ++i; - - uiinfo[i].type = GNOME_APP_UI_ITEM; - uiinfo[i].label = _("Add to Contacts"); - uiinfo[i].moreinfo = quick_add_cb; - ++i; - - add_remove_recipient (&(uiinfo[i]), info); - ++i; - - add_remove_all_recipients (&(uiinfo[i]), info); - ++i; - - uiinfo[i].type = GNOME_APP_UI_ENDOFINFO; - - pop = gnome_popup_menu_new (uiinfo); - - return pop; -} - - -void -e_select_names_popup (ESelectNamesModel *model, GdkEventButton *ev, gint pos) -{ - GtkWidget *popup; - PopupInfo *info; - const EDestination *dest; - ECard *card; - gint index; - - g_return_if_fail (model && E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (ev); - g_return_if_fail (0 <= pos); - - e_select_names_model_text_pos (model, pos, &index, NULL, NULL); - if (index < 0 || index >= e_select_names_model_count (model)) - return; - - dest = e_select_names_model_get_destination (model, index); - card = e_destination_get_card (dest); - - info = popup_info_new (model, dest, pos, index); - - popup = card ? popup_menu_card (info) : popup_menu_nocard (info); - - if (popup) { - /* Clean up our info item after we've made our selection. */ - gtk_signal_connect (GTK_OBJECT (popup), - "selection-done", - GTK_SIGNAL_FUNC (popup_info_cleanup), - info); - - gnome_popup_menu_do_popup (popup, NULL, NULL, ev, info); - - } else { - - popup_info_free (info); - - } -} diff --git a/addressbook/gui/component/select-names/e-select-names-popup.h b/addressbook/gui/component/select-names/e-select-names-popup.h deleted file mode 100644 index cc93534181..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-popup.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-popup.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_SELECT_NAMES_POPUP_H__ -#define __E_SELECT_NAMES_POPUP_H__ - -#include "e-select-names-model.h" - -void e_select_names_popup (ESelectNamesModel *model, GdkEventButton *ev, gint pos); - -#endif /* __E_SELECT_NAMES_POPUP_H__ */ - diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.c b/addressbook/gui/component/select-names/e-select-names-table-model.c deleted file mode 100644 index f0dc52bad7..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-table-model.c +++ /dev/null @@ -1,344 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <gtk/gtksignal.h> -#include <gal/util/e-util.h> - -#include "e-select-names-table-model.h" -#include "addressbook/backend/ebook/e-card-simple.h" - -/* Object argument IDs */ -enum { - ARG_0, - ARG_SOURCE, -}; - -static void e_select_names_table_model_init (ESelectNamesTableModel *model); -static void e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass); - -static void e_select_names_table_model_destroy (GtkObject *object); -static void e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_select_names_table_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); - -static void e_select_names_table_model_model_changed (ESelectNamesModel *source, - ESelectNamesTableModel *model); - - -static void -e_select_names_table_model_add_source (ESelectNamesTableModel *model, - ESelectNamesModel *source) -{ - model->source = source; - if (model->source) - gtk_object_ref(GTK_OBJECT(model->source)); - model->source_changed_id = gtk_signal_connect(GTK_OBJECT(model->source), "changed", - GTK_SIGNAL_FUNC(e_select_names_table_model_model_changed), - model); -} - -static void -e_select_names_table_model_drop_source (ESelectNamesTableModel *model) -{ - if (model->source_changed_id) - gtk_signal_disconnect(GTK_OBJECT(model->source), model->source_changed_id); - if (model->source) - gtk_object_unref(GTK_OBJECT(model->source)); - model->source = NULL; - model->source_changed_id = 0; -} - -/** - * e_select_names_table_model_get_type: - * @void: - * - * Registers the &ESelectNamesTableModel class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ESelectNamesTableModel class. - **/ -GtkType -e_select_names_table_model_get_type (void) -{ - static GtkType model_type = 0; - - if (!model_type) { - GtkTypeInfo model_info = { - "ESelectNamesTableModel", - sizeof (ESelectNamesTableModel), - sizeof (ESelectNamesTableModelClass), - (GtkClassInitFunc) e_select_names_table_model_class_init, - (GtkObjectInitFunc) e_select_names_table_model_init, - NULL, /* reserved_1 */ - NULL, /* reserved_2 */ - (GtkClassInitFunc) NULL - }; - - model_type = gtk_type_unique (e_table_model_get_type (), &model_info); - } - - return model_type; -} - -/** - * e_select_names_table_model_new: - * @VCard: a string in vCard format - * - * Returns: a new #ESelectNamesTableModel that wraps the @VCard. - */ -ETableModel * -e_select_names_table_model_new (ESelectNamesModel *source) -{ - ETableModel *model = E_TABLE_MODEL(gtk_type_new(e_select_names_table_model_get_type())); - gtk_object_set(GTK_OBJECT(model), - "source", source, - NULL); - return model; -} - -static void -fill_in_info (ESelectNamesTableModel *model) -{ - if (model->source) { - int count = e_select_names_model_count (model->source); - gint i; - - model->count = count; - model->data = g_new(ESelectNamesTableModelData, count); - - for (i = 0; i < count; ++i) { - const EDestination *dest = e_select_names_model_get_destination (model->source, i); - ECard *card = dest ? e_destination_get_card (dest) : NULL; - - if (card) { - ECardSimple *simple = e_card_simple_new(card); - model->data[i].name = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_NAME_OR_ORG); - if (model->data[i].name == 0) - model->data[i].name = g_strdup(""); - model->data[i].email = e_card_simple_get(simple, E_CARD_SIMPLE_FIELD_EMAIL); - if (model->data[i].email == 0) - model->data[i].email = g_strdup(""); - gtk_object_unref(GTK_OBJECT(simple)); - } else { - model->data[i].name = g_strdup (e_destination_get_string (dest)); - model->data[i].email = g_strdup (model->data[i].name); - } - } - } else { - model->count = 0; - } -} - -static void -clear_info (ESelectNamesTableModel *model) -{ - int i; - for (i = 0; i < model->count; i++) { - g_free(model->data[i].name); - g_free(model->data[i].email); - } - g_free(model->data); - model->data = NULL; - model->count = -1; -} - -/* - * ESelectNamesTableModel lifecycle management and vcard loading/saving. - */ - -static void -e_select_names_table_model_destroy (GtkObject *object) -{ - ESelectNamesTableModel *model; - - model = E_SELECT_NAMES_TABLE_MODEL (object); - - e_select_names_table_model_drop_source (model); - clear_info(model); -} - -/* This function returns the number of columns in our ETableModel. */ -static int -e_select_names_table_model_col_count (ETableModel *etc) -{ - return 2; -} - -/* This function returns the number of rows in our ETableModel. */ -static int -e_select_names_table_model_row_count (ETableModel *etc) -{ - ESelectNamesTableModel *e_select_names_table_model = E_SELECT_NAMES_TABLE_MODEL(etc); - if (e_select_names_table_model->count == -1) { - if (e_select_names_table_model->source) { - fill_in_info(e_select_names_table_model); - } else { - return 0; - } - } - return e_select_names_table_model->count; -} - -/* This function returns the value at a particular point in our ETableModel. */ -static void * -e_select_names_table_model_value_at (ETableModel *etc, int col, int row) -{ - ESelectNamesTableModel *e_select_names_table_model = E_SELECT_NAMES_TABLE_MODEL(etc); - if (e_select_names_table_model->data == NULL) { - fill_in_info(e_select_names_table_model); - } - switch (col) { - case 0: - if (e_select_names_table_model->data[row].name == NULL) { - fill_in_info(e_select_names_table_model); - } - return e_select_names_table_model->data[row].name; - break; - case 1: - if (e_select_names_table_model->data[row].email == NULL) { - fill_in_info(e_select_names_table_model); - } - return e_select_names_table_model->data[row].email; - break; - } - return ""; -} - -/* This function sets the value at a particular point in our ETableModel. */ -static void -e_select_names_table_model_set_value_at (ETableModel *etc, int col, int row, const void *val) -{ -} - -/* This function returns whether a particular cell is editable. */ -static gboolean -e_select_names_table_model_is_cell_editable (ETableModel *etc, int col, int row) -{ - return FALSE; -} - -/* This function duplicates the value passed to it. */ -static void * -e_select_names_table_model_duplicate_value (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -/* This function frees the value passed to it. */ -static void -e_select_names_table_model_free_value (ETableModel *etc, int col, void *value) -{ - g_free(value); -} - -static void * -e_select_names_table_model_initialize_value (ETableModel *etc, int col) -{ - return g_strdup(""); -} - -static gboolean -e_select_names_table_model_value_is_empty (ETableModel *etc, int col, const void *value) -{ - return !(value && *(char *)value); -} - -static char * -e_select_names_table_model_value_to_string (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -static void -e_select_names_table_model_model_changed (ESelectNamesModel *source, - ESelectNamesTableModel *model) -{ - clear_info(model); - e_table_model_changed(E_TABLE_MODEL(model)); -} - -/* Set_arg handler for the model */ -static void -e_select_names_table_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesTableModel *model; - - model = E_SELECT_NAMES_TABLE_MODEL (object); - - switch (arg_id) { - case ARG_SOURCE: - e_select_names_table_model_drop_source (model); - e_select_names_table_model_add_source (model, E_SELECT_NAMES_MODEL(GTK_VALUE_OBJECT (*arg))); - break; - default: - return; - } -} - -/* Get_arg handler for the model */ -static void -e_select_names_table_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesTableModel *model; - - model = E_SELECT_NAMES_TABLE_MODEL (object); - - switch (arg_id) { - case ARG_SOURCE: - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(model->source); - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -/** - * e_select_names_table_model_init: - */ -static void -e_select_names_table_model_init (ESelectNamesTableModel *model) -{ - model->source = NULL; - model->source_changed_id = 0; - - model->count = -1; - model->data = NULL; -} - -static void -e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass) -{ - GtkObjectClass *object_class; - ETableModelClass *table_model_class; - - object_class = GTK_OBJECT_CLASS(klass); - table_model_class = E_TABLE_MODEL_CLASS(klass); - - gtk_object_add_arg_type ("ESelectNamesTableModel::source", - GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE); - - object_class->destroy = e_select_names_table_model_destroy; - object_class->get_arg = e_select_names_table_model_get_arg; - object_class->set_arg = e_select_names_table_model_set_arg; - - table_model_class->column_count = e_select_names_table_model_col_count; - table_model_class->row_count = e_select_names_table_model_row_count; - table_model_class->value_at = e_select_names_table_model_value_at; - table_model_class->set_value_at = e_select_names_table_model_set_value_at; - table_model_class->is_cell_editable = e_select_names_table_model_is_cell_editable; - table_model_class->duplicate_value = e_select_names_table_model_duplicate_value; - table_model_class->free_value = e_select_names_table_model_free_value; - table_model_class->initialize_value = e_select_names_table_model_initialize_value; - table_model_class->value_is_empty = e_select_names_table_model_value_is_empty; - table_model_class->value_to_string = e_select_names_table_model_value_to_string; -} diff --git a/addressbook/gui/component/select-names/e-select-names-table-model.h b/addressbook/gui/component/select-names/e-select-names-table-model.h deleted file mode 100644 index a7feb4d9c1..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-table-model.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@helixcode.com> - * - * Copyright (C) 2000 Helix Code, Inc. - */ - -#ifndef __E_SELECT_NAMES_TABLE_MODEL_H__ -#define __E_SELECT_NAMES_TABLE_MODEL_H__ - -#include <time.h> -#include <stdio.h> -#include <gtk/gtkobject.h> -#include <gal/e-table/e-table-model.h> -#include "e-select-names-model.h" - -#define E_TYPE_SELECT_NAMES_TABLE_MODEL (e_select_names_table_model_get_type ()) -#define E_SELECT_NAMES_TABLE_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModel)) -#define E_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModelClass)) -#define E_IS_SELECT_NAMES_TABLE_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL)) -#define E_IS_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL)) - -typedef struct { - char *name; - char *email; -} ESelectNamesTableModelData; - -typedef struct _ESelectNamesTableModel ESelectNamesTableModel; -typedef struct _ESelectNamesTableModelClass ESelectNamesTableModelClass; - -struct _ESelectNamesTableModel { - ETableModel parent; - - ESelectNamesModel *source; - int source_changed_id; - - int count; - ESelectNamesTableModelData *data; /* This is used as an array. */ -}; - -struct _ESelectNamesTableModelClass { - ETableModelClass parent_class; -}; - -ETableModel *e_select_names_table_model_new (ESelectNamesModel *source); - -/* Standard Gtk function */ -GtkType e_select_names_table_model_get_type (void); - -#endif /* ! __E_SELECT_NAMES_TABLE_MODEL_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.c b/addressbook/gui/component/select-names/e-select-names-text-model.c deleted file mode 100644 index 6aa6a75a9a..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-text-model.c +++ /dev/null @@ -1,722 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -#include <gal/e-text/e-text-model-repos.h> - -#include <addressbook/contact-editor/e-contact-editor.h> -#include "e-select-names-text-model.h" - -static FILE *out = NULL; /* stream for debugging spew */ - -#define SEPLEN 2 - -/* Object argument IDs */ -enum { - ARG_0, - ARG_SOURCE, -}; - -static void e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass); -static void e_select_names_text_model_init (ESelectNamesTextModel *model); -static void e_select_names_text_model_destroy (GtkObject *object); -static void e_select_names_text_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_select_names_text_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); - -static void e_select_names_text_model_set_source (ESelectNamesTextModel *model, ESelectNamesModel *source); - -static const gchar *e_select_names_text_model_get_text (ETextModel *model); -static void e_select_names_text_model_set_text (ETextModel *model, const gchar *text); -static void e_select_names_text_model_insert (ETextModel *model, gint position, const gchar *text); -static void e_select_names_text_model_insert_length (ETextModel *model, gint position, const gchar *text, gint length); -static void e_select_names_text_model_delete (ETextModel *model, gint position, gint length); - -static gint e_select_names_text_model_obj_count (ETextModel *model); -static const gchar *e_select_names_text_model_get_nth_obj (ETextModel *model, gint n, gint *len); -static void e_select_names_text_model_activate_obj (ETextModel *model, gint n); - - -ETextModelClass *parent_class; -#define PARENT_TYPE e_text_model_get_type() - -/** - * e_select_names_text_model_get_type: - * @void: - * - * Registers the &ESelectNamesTextModel class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ESelectNamesTextModel class. - **/ -GtkType -e_select_names_text_model_get_type (void) -{ - static GtkType model_type = 0; - - if (!model_type) { - GtkTypeInfo model_info = { - "ESelectNamesTextModel", - sizeof (ESelectNamesTextModel), - sizeof (ESelectNamesTextModelClass), - (GtkClassInitFunc) e_select_names_text_model_class_init, - (GtkObjectInitFunc) e_select_names_text_model_init, - NULL, /* reserved_1 */ - NULL, /* reserved_2 */ - (GtkClassInitFunc) NULL - }; - - model_type = gtk_type_unique (PARENT_TYPE, &model_info); - } - - return model_type; -} - -static void -e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass) -{ - GtkObjectClass *object_class; - ETextModelClass *text_model_class; - - object_class = GTK_OBJECT_CLASS(klass); - text_model_class = E_TEXT_MODEL_CLASS(klass); - - parent_class = gtk_type_class(PARENT_TYPE); - - gtk_object_add_arg_type ("ESelectNamesTextModel::source", - GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_SOURCE); - - object_class->destroy = e_select_names_text_model_destroy; - object_class->get_arg = e_select_names_text_model_get_arg; - object_class->set_arg = e_select_names_text_model_set_arg; - - text_model_class->get_text = e_select_names_text_model_get_text; - text_model_class->set_text = e_select_names_text_model_set_text; - text_model_class->insert = e_select_names_text_model_insert; - text_model_class->insert_length = e_select_names_text_model_insert_length; - text_model_class->delete = e_select_names_text_model_delete; - - text_model_class->obj_count = e_select_names_text_model_obj_count; - text_model_class->get_nth_obj = e_select_names_text_model_get_nth_obj; - text_model_class->object_activated = e_select_names_text_model_activate_obj; - - if (getenv ("EVO_DEBUG_SELECT_NAMES_TEXT_MODEL")) { - out = fopen ("/tmp/evo-debug-select-names-text-model", "w"); - if (out) - setvbuf (out, NULL, _IONBF, 0); - } -} - -static void -dump_model (ESelectNamesTextModel *text_model) -{ - ESelectNamesModel *model = text_model->source; - gint i; - - if (out == NULL) - return; - - fprintf (out, "\n*** Model State: count=%d\n", e_select_names_model_count (model)); - - for (i=0; i<e_select_names_model_count (model); ++i) - fprintf (out, "[%d] \"%s\" %s\n", i, - e_select_names_model_get_string (model, i), - e_select_names_model_get_card (model, i) ? "<card>" : ""); - fprintf (out, "\n"); -} - -static void -e_select_names_text_model_init (ESelectNamesTextModel *model) -{ -} - -static void -e_select_names_text_model_destroy (GtkObject *object) -{ - ESelectNamesTextModel *model; - - model = E_SELECT_NAMES_TEXT_MODEL (object); - - e_select_names_text_model_set_source (model, NULL); - - if (GTK_OBJECT_CLASS(parent_class)->destroy) - GTK_OBJECT_CLASS(parent_class)->destroy(object); -} - -static void -e_select_names_text_model_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesTextModel *model; - - model = E_SELECT_NAMES_TEXT_MODEL (object); - - switch (arg_id) { - case ARG_SOURCE: - e_select_names_text_model_set_source(model, E_SELECT_NAMES_MODEL (GTK_VALUE_OBJECT (*arg))); - break; - default: - return; - } -} - -static void -e_select_names_text_model_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - ESelectNamesTextModel *model; - - model = E_SELECT_NAMES_TEXT_MODEL (object); - - switch (arg_id) { - case ARG_SOURCE: - GTK_VALUE_OBJECT(*arg) = GTK_OBJECT(model->source); - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} - -static void -resize_cb (ESelectNamesModel *source, gint index, gint old_len, gint new_len, ETextModel *model) -{ - EReposDeleteShift repos_del; - EReposInsertShift repos_ins; - gint pos; - - e_select_names_model_name_pos (source, index, &pos, NULL); - - if (new_len < old_len) { - - repos_del.model = model; - repos_del.pos = pos; - repos_del.len = old_len - new_len; - e_text_model_reposition (model, e_repos_delete_shift, &repos_del); - - } else if (old_len < new_len) { - - repos_ins.model = model; - repos_ins.pos = pos; - repos_ins.len = new_len - old_len; - e_text_model_reposition (model, e_repos_insert_shift, &repos_ins); - - } -} - - -static void -e_select_names_text_model_set_source (ESelectNamesTextModel *model, - ESelectNamesModel *source) -{ - if (source == model->source) - return; - - if (model->source) { - gtk_signal_disconnect (GTK_OBJECT (model->source), model->source_changed_id); - gtk_signal_disconnect (GTK_OBJECT (model->source), model->source_resize_id); - gtk_object_unref (GTK_OBJECT (model->source)); - } - - model->source = source; - - if (model->source) { - gtk_object_ref (GTK_OBJECT (model->source)); - model->source_changed_id = gtk_signal_connect_object (GTK_OBJECT(model->source), - "changed", - GTK_SIGNAL_FUNC (e_text_model_changed), - GTK_OBJECT (model)); - model->source_resize_id = gtk_signal_connect (GTK_OBJECT(model->source), - "resized", - GTK_SIGNAL_FUNC (resize_cb), - model); - } -} - -ETextModel * -e_select_names_text_model_new (ESelectNamesModel *source) -{ - ETextModel *model = E_TEXT_MODEL (gtk_type_new (e_select_names_text_model_get_type())); - e_select_names_text_model_set_source (E_SELECT_NAMES_TEXT_MODEL (model), source); - return model; -} - -static const gchar * -e_select_names_text_model_get_text (ETextModel *model) -{ - ESelectNamesTextModel *snm = E_SELECT_NAMES_TEXT_MODEL(model); - - return snm ? e_select_names_model_get_textification (snm->source) : ""; -} - -static void -e_select_names_text_model_set_text (ETextModel *model, const gchar *text) -{ - ESelectNamesTextModel *snm = E_SELECT_NAMES_TEXT_MODEL(model); - - e_select_names_model_delete_all (snm->source); - e_select_names_text_model_insert (model, 0, text); -} - -static void -e_select_names_text_model_insert (ETextModel *model, gint position, const gchar *text) -{ - e_select_names_text_model_insert_length (model, position, text, strlen (text)); -} - -static void -e_select_names_text_model_insert_length (ETextModel *model, gint pos, const gchar *text, gint length) -{ - ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - gint i; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_TEXT_MODEL (model)); - - if (out) { - gchar *tmp = g_strndup (text, length); - fprintf (out, ">> insert \"%s\" (len=%d) at %d\n", tmp, length, pos); - g_free (tmp); - } - - pos = CLAMP (pos, 0, strlen (e_select_names_model_get_textification (source))); - - /* We want to control all cursor motions ourselves, rather than taking hints - from the ESelectNamesModel. */ - gtk_signal_handler_block (GTK_OBJECT (source), E_SELECT_NAMES_TEXT_MODEL (model)->source_resize_id); - - /* We handle this one character at a time. */ - - for (i = 0; i < length && text[i]; ++i) { - gint index, start_pos, text_len; - gboolean inside_quote = FALSE; - - if (out) - fprintf (out, "processing [%c]\n", text[i]); - - e_select_names_model_text_pos (source, pos, &index, &start_pos, &text_len); - - if (out) - fprintf (out, "index=%d start_pos=%d text_len=%d\n", index, start_pos, text_len); - - if (text[i] == ',' && index >= 0) { /* Is this a quoted or an unquoted comma we are dealing with? */ - const EDestination *dest = e_select_names_model_get_destination (source, index); - if (dest) { - const gchar *str = e_destination_get_string (dest); - gint j; - if (out) - fprintf (out, "str=%s pos=%d\n", str, pos); - for (j=0; j<pos-start_pos && str[j]; ++j) - if (str[j] == '"') { - inside_quote = !inside_quote; - if (out) - fprintf (out, "flip to %d at %d\n", start_pos+j, inside_quote); - } - } - if (out) - fprintf (out, inside_quote ? "inside quote\n" : "not inside quote\n"); - } - - - if (text[i] == ',' && !inside_quote) { - - /* This is the case of hitting , first thing in an empty entry */ - if (index == -1) { - EReposAbsolute repos; - - e_select_names_model_insert (source, 0, e_destination_new ()); - e_select_names_model_insert (source, 0, e_destination_new ()); - - repos.model = model; - repos.pos = -1; /* At end */ - e_text_model_reposition (model, e_repos_absolute, &repos); - - - } else if (pos <= start_pos || pos == start_pos + text_len) { - EReposInsertShift repos; - gint ins_point = index; - - if (text_len != 0 && pos == start_pos + text_len) - ++ins_point; - - /* Block adjacent blank cards. */ - if (! ((ins_point < e_select_names_model_count (source) && - (e_select_names_model_get_string (source, ins_point) == NULL)) - || (ins_point > 0 && (e_select_names_model_get_string (source, ins_point-1) == NULL)))) { - - e_select_names_model_insert (source, ins_point, e_destination_new ()); - - repos.model = model; - repos.pos = pos; - repos.len = SEPLEN; - e_text_model_reposition (model, e_repos_insert_shift, &repos); - pos += SEPLEN; - } - - } else { - EReposInsertShift repos; - gint offset = MAX (pos - start_pos, 0); - const gchar *str = e_select_names_model_get_string (source, index); - gchar *str1 = g_strndup (str, offset); - gchar *str2 = g_strdup (str+offset); - EDestination *d1 = e_destination_new (), *d2 = e_destination_new (); - - e_destination_set_string (d1, str1); - e_destination_set_string (d2, str2); - - e_select_names_model_replace (source, index, d1); - e_select_names_model_insert (source, index+1, d2); - - g_free (str1); - g_free (str2); - - repos.model = model; - repos.pos = pos; - repos.len = SEPLEN; - e_text_model_reposition (model, e_repos_insert_shift, &repos); - pos += SEPLEN; - } - - } else { - EReposInsertShift repos; - gint offset = MAX (pos - start_pos, 0); - const gchar *str; - gchar *new_str = NULL; - gint this_length = 1; - gboolean whitespace = isspace ((gint) text[i]); - - str = index >= 0 ? e_select_names_model_get_string (source, index) : NULL; - if (str) { - if (pos <= start_pos) { - if (whitespace) { - /* swallow leading whitespace */ - this_length = 0; - } else { - /* Adjust for our "magic white space" */ - new_str = g_strdup_printf("%c%s%s", text[i], pos < start_pos ? " " : "", str); - if (pos < start_pos) - ++this_length; - } - } else { - new_str = g_strdup_printf ("%.*s%c%s", offset, str, text[i], str + offset); - } - } else { - if (whitespace) { - /* swallow leading whitespace */ - this_length = 0; - } else { - new_str = g_strdup_printf ("%c", text[i]); - } - } - - if (new_str) { - - EDestination *dest = e_destination_new (); - e_destination_set_string (dest, new_str); - - e_select_names_model_replace (source, index, dest); - - if (this_length > 0) { - repos.model = model; - repos.pos = pos; - repos.len = this_length; - e_text_model_reposition (model, e_repos_insert_shift, &repos); - - pos += this_length; - } - - g_free (new_str); - } - } - } - - dump_model (E_SELECT_NAMES_TEXT_MODEL (model)); - - gtk_signal_handler_unblock (GTK_OBJECT (source), E_SELECT_NAMES_TEXT_MODEL (model)->source_resize_id); -} - - -static void -e_select_names_text_model_delete (ETextModel *model, gint pos, gint length) -{ - ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - gint index, start_pos, text_len, offset; - - if (out) { - const gchar *str = e_select_names_model_get_textification (source); - gint i, len; - - fprintf (out, ">> delete %d at pos %d\n", length, pos); - - len = strlen (str); - for (i=0; i<pos && i<len; ++i) - fprintf (out, "%c", str[i]); - fprintf (out, "["); - for (i=pos; i<pos+length && i<len; ++i) - fprintf (out, "%c", str[i]); - fprintf (out, "]"); - for (i=pos+length; i<len; ++i) - fprintf (out, "%c", str[i]); - fprintf (out, "\n"); - } - - if (length < 0) - return; - - e_select_names_model_text_pos (source, pos, &index, &start_pos, &text_len); - - if (out) - fprintf (out, "index=%d, start_pos=%d, text_len=%d\n", index, start_pos, text_len); - - /* We want to control all cursor motions ourselves, rather than taking hints - from the ESelectNamesModel. */ - gtk_signal_handler_block (GTK_OBJECT (source), E_SELECT_NAMES_TEXT_MODEL (model)->source_resize_id); - - /* First, we handle a few tricky cases. */ - - if (pos < start_pos) { - EReposAbsolute repos; - - repos.model = model; - repos.pos = pos; - e_text_model_reposition (model, e_repos_absolute, &repos); - - length -= start_pos - pos; - - if (length > 0) - e_select_names_text_model_delete (model, start_pos, length); - goto finished; - } - - if (pos == start_pos + text_len) { - /* We are positioned right at the end of an entry, possibly right in front of a comma. */ - - if (index+1 < e_select_names_model_count (source)) { - EReposDeleteShift repos; - EDestination *new_dest; - const gchar *str1 = e_select_names_model_get_string (source, index); - const gchar *str2 = e_select_names_model_get_string (source, index+1); - gchar *new_str; - - while (str1 && *str1 && isspace ((gint) *str1)) - ++str1; - while (str2 && *str2 && isspace ((gint) *str2)) - ++str2; - - if (str1 && str2) - new_str = g_strdup_printf ("%s %s", str1, str2); - else if (str1) - new_str = g_strdup (str1); - else if (str2) - new_str = g_strdup (str2); - else - new_str = g_strdup (""); - - if (out) - fprintf (out, "joining \"%s\" and \"%s\" to \"%s\"\n", str1, str2, new_str); - - e_select_names_model_delete (source, index+1); - - new_dest = e_destination_new (); - e_destination_set_string (new_dest, new_str); - e_select_names_model_replace (source, index, new_dest); - g_free (new_str); - - repos.model = model; - repos.pos = pos; - repos.len = SEPLEN - 1; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - - if (length > 1) - e_select_names_text_model_delete (model, pos, length-1); - } else { - /* If we are at the end of the last entry (which we must be if we end up in this block), - we can just do nothing. So this else-block is here just to give us a place to - put this comment. */ - } - - goto finished; - } - - if (pos + length > start_pos + text_len) { - /* Uh oh... our changes straddle two objects. */ - - if (pos == start_pos) { /* Delete the whole thing */ - EReposDeleteShift repos; - - e_select_names_model_delete (source, index); - - if (out) - fprintf (out, "deleted all of %d\n", index); - - repos.model = model; - repos.pos = pos; - repos.len = text_len + SEPLEN; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - - length -= text_len + SEPLEN; - if (length > 0) - e_select_names_text_model_delete (model, pos, length); - - } else { - /* Delete right up to the end, and then call e_select_names_text_model_delete again - to finish the job. */ - gint len1, len2; - - len1 = text_len - (pos - start_pos); - len2 = length - len1; - - if (out) - fprintf (out, "two-stage delete: %d, %d\n", len1, len2); - - - e_select_names_text_model_delete (model, pos, len1); - e_select_names_text_model_delete (model, pos, len2); - } - - goto finished; - } - - /* Our changes are confined to just one entry. */ - if (length > 0) { - const gchar *str; - gchar *new_str; - - offset = pos - start_pos; - - str = e_select_names_model_get_string (source, index); - new_str = str ? g_strdup_printf ("%.*s%s", offset, str, str + offset + length) : NULL; - - if (new_str) { - EReposDeleteShift repos; - EDestination *dest; - - dest = e_destination_new (); - e_destination_set_string (dest, new_str); - e_select_names_model_replace (source, index, dest); - - if (out) - fprintf (out, "new_str: \"%s\"\n", new_str); - - g_free (new_str); - - repos.model = model; - repos.pos = pos; - repos.len = length; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - - } else { - EReposDeleteShift repos; - - e_select_names_model_delete (source, index); - - if (out) - fprintf (out, "deleted %d\n", index); - - - repos.model = model; - repos.pos = pos; - repos.len = SEPLEN; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - } - } - - finished: - gtk_signal_handler_unblock (GTK_OBJECT (source), E_SELECT_NAMES_TEXT_MODEL (model)->source_resize_id); - dump_model (E_SELECT_NAMES_TEXT_MODEL (model)); -} - -static gint -e_select_names_text_model_obj_count (ETextModel *model) -{ - ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - gint i, count; - - count = i = e_select_names_model_count (source); - while (i > 0) { - const EDestination *dest; - --i; - dest = e_select_names_model_get_destination (source, i); - if (e_destination_get_card (dest) == NULL) - --count; - } - - return count; -} - -static gint -nth_obj_index (ESelectNamesModel *source, gint n) -{ - gint i, N; - - i = 0; - N = e_select_names_model_count (source); - - do { - const EDestination *dest = e_select_names_model_get_destination (source, i); - if (e_destination_get_card (dest)) - --n; - ++i; - } while (n >= 0 && i < N); - - if (i <= N) - --i; - else - i = -1; - - return i; -} - -static const gchar * -e_select_names_text_model_get_nth_obj (ETextModel *model, gint n, gint *len) -{ - ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - const gchar *txt; - gint i, pos; - - i = nth_obj_index (source, n); - if (i < 0) - return NULL; - - e_select_names_model_name_pos (source, i, &pos, len); - if (pos < 0) - return NULL; - - txt = e_select_names_model_get_textification (source); - return txt + pos; -} - -static void -e_select_names_text_model_activate_obj (ETextModel *model, gint n) -{ - ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - EContactEditor *contact_editor; - ECard *card; - gint i; - - i = nth_obj_index (source, n); - g_return_if_fail (i >= 0); - - card = e_select_names_model_get_card (source, i); - g_return_if_fail (card); - - /* present read-only contact editor when someone double clicks from here */ - contact_editor = e_contact_editor_new ((ECard *) card, FALSE, NULL, TRUE); - e_contact_editor_raise (contact_editor); -} - - - diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.h b/addressbook/gui/component/select-names/e-select-names-text-model.h deleted file mode 100644 index 7a9e0a7396..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-text-model.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#ifndef __E_SELECT_NAMES_TEXT_MODEL_H__ -#define __E_SELECT_NAMES_TEXT_MODEL_H__ - -#include <time.h> -#include <stdio.h> -#include <gtk/gtkobject.h> -#include <gal/e-text/e-text-model.h> -#include "e-select-names-model.h" - -#define E_TYPE_SELECT_NAMES_TEXT_MODEL (e_select_names_text_model_get_type ()) -#define E_SELECT_NAMES_TEXT_MODEL(obj) (GTK_CHECK_CAST ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModel)) -#define E_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModelClass)) -#define E_IS_SELECT_NAMES_TEXT_MODEL(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL)) -#define E_IS_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL)) - -typedef struct _ESelectNamesTextModel ESelectNamesTextModel; -typedef struct _ESelectNamesTextModelClass ESelectNamesTextModelClass; - -struct _ESelectNamesTextModel { - ETextModel parent; - - ESelectNamesModel *source; - gint source_changed_id; - gint source_resize_id; -}; - -struct _ESelectNamesTextModelClass { - ETextModelClass parent_class; -}; - -ETextModel *e_select_names_text_model_new (ESelectNamesModel *source); - -/* Standard Gtk function */ -GtkType e_select_names_text_model_get_type (void); - -#endif /* ! __E_SELECT_NAMES_TEXT_MODEL_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names.c b/addressbook/gui/component/select-names/e-select-names.c deleted file mode 100644 index 30dc482e85..0000000000 --- a/addressbook/gui/component/select-names/e-select-names.c +++ /dev/null @@ -1,650 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-select-names.c - * Copyright (C) 2000 Helix Code, Inc. - * Author: Chris Lahey <clahey@helixcode.com> - * - * This library 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 2 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 library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. |