package.xml0000664000175000017500000032352112700700443011302 0ustar janjan Horde_SyncMl pear.horde.org SyncML Horde_SyncMl provides an API for processing SyncML requests Classes for implementing a SyncML server. Jan Schneider jan jan@horde.org yes 2016-04-05 2.0.7 1.0.0 stable stable LGPL-2.1 * [jan] Update Greek translation (Limperis Antonis <limperis@cti.gr>). 5.3.0 8.0.0alpha1 8.0.0alpha1 1.7.0 Horde_Date pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 Horde_Icalendar pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 Horde_Log pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 Horde_Support pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 Horde_Util pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 Horde_Xml_Wbxml pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 Horde_Translation pear.horde.org 2.2.0 3.0.0alpha1 3.0.0alpha1 Horde_Auth pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 Horde_Core pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 0.0.1 0.0.1 alpha alpha 2004-01-19 LGPL-2.1 Initial implementation 0.0.3 0.0.3 alpha alpha 2005-04-23 LGPL-2.1 Major update 0.6.0 0.6.0 beta beta 2006-01-01 LGPL-2.1 Passes all tests of SyncML conformance suite now. 0.7.0 0.7.0 beta beta 2011-03-06 LGPL-2.1 Make the SyncML package independant from Horde, provide a new Sql backend as a reference implementation for a backend. 1.0.0beta1 1.0.0 beta beta 2011-03-16 LGPL-2.1 * First beta release for Horde 4. 1.0.0RC1 1.0.0 beta beta 2011-03-22 LGPL-2.1 * First release candidate for Horde 4. * [jan] Fix calendar synchronization with certain Nokia phones (Bug #9646). 1.0.0RC2 1.0.0 beta beta 2011-03-29 LGPL-2.1 * Second release candidate for Horde 4. 1.0.0 1.0.0 stable stable 2011-04-06 LGPL-2.1 * First stable release for Horde 4. * [jan] Add removeMaps() method to Horde backend driver. * [jan] Convert database access to use Horde_Db. 1.0.1 1.0.0 stable stable 2011-05-03 LGPL-2.1 * [mms] Fix issue causing slow syncs only (Bug #10008). 1.0.2 1.0.0 stable stable 2011-05-25 LGPL-2.1 * [mms] Complete fix for issue causing slow syncs only (Bug #10008). 1.0.3 1.0.0 stable stable 2011-07-05 LGPL-2.1 * [jan] Update Lithuanian translation. * [jan] Fix duplication of objects during synchronization (joniw@t-online.de, Bug #10081). 1.0.4 1.0.0 stable stable 2011-07-27 LGPL-2.1 * [jan] Fix log level output in log file. * [jan] Update Latvian translation. * [mjr] Use the more efficient getChanges() API. 1.0.5 1.0.0 stable stable 2011-08-17 LGPL-2.1 * [jan] Fix logging errors while retrieving server changes. 1.0.6 1.0.0 stable stable 2011-11-02 LGPL-2.1 * [jan] Fix encoding of CDATA (horde@chk.cksf.de, Bug #10692). 1.0.7 1.0.0 stable stable 2011-12-21 LGPL-2.1 * [jan] Catch exceptions when changing or retrieving objects from the applications. 1.0.8 1.0.0 stable stable 2012-01-17 LGPL-2.1 * [jan] Fix undefined method while synchronizing events with Funambol (Bug #10908). 1.0.9 1.0.0 stable stable 2012-05-01 LGPL-2.1 * [jan] Don't corrupt binary data like images if sent in several messages (Jonathan Westerholt <joniw@t-online.de>, Bug #10864). 2.0.0alpha1 1.0.0 alpha stable 2012-07-06 LGPL-2.1 * First alpha release for Horde 5. 2.0.0beta1 1.0.0 beta stable 2012-07-19 LGPL-2.1 * First beta release for Horde 5. * [jan] Fix session handling (Bug #11242). * [jan] Fix finding locale directory if installed with PEAR. 2.0.0 1.0.0 stable stable 2012-10-30 LGPL-2.1 * First stable release for Horde 5. 2.0.1 1.0.0 stable stable 2012-11-06 LGPL-2.1 * [jan] Update Dutch translation (Arjen de Korte <build+horde@de-korte.org>). 2.0.2 1.0.0 stable stable 2013-01-10 LGPL-2.1 * [jan] Update Basque translation (Ibon Igartua <ibon.igartua@ehu.es>). 2.0.3 1.0.0 stable stable 2013-03-05 LGPL-2.1 * [jan] Improve documentation. 2.0.4 1.0.0 stable stable 2014-07-24 LGPL-2.1 * [mjr] Hotfix to deal with failure exporting non-contact data due to inconsistency in export methods between applications (Bug #13394). 2.0.5 1.0.0 stable stable 2014-12-03 LGPL-2.1 * [jan] Fix exporting notes to Funambol clients (horde@albasoft.com, Bug #9487). * [jan] Fix creating server-client-mapping if backend returns multiple server IDs per client ID (horde@albasoft.com, Bug #13706). 2.0.6 1.0.0 stable stable 2016-02-02 LGPL-2.1 * [jan] Split large objects into multiple messages (thomas@trethan.net, Request #11071). * [jan] Remove workarounds for ancient Synthesis clients (Bug #10942). * [jan] Mark PHP 7 as supported. 2.0.7 1.0.0 stable stable 2016-04-05 LGPL-2.1 * [jan] Update Greek translation (Limperis Antonis <limperis@cti.gr>). Horde_SyncMl-2.0.7/doc/Horde/SyncMl/COPYING0000664000175000017500000005764612700700442016236 0ustar janjan GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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 with this License. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Horde_SyncMl-2.0.7/doc/Horde/SyncMl/INSTALL.p900.txt0000664000175000017500000000271112700700442017520 0ustar janjan How to get SyncML working with your P800/P900: [[somebody with access to other phones might add instructions for these as well. Thanks]] Start "Remote Synchronisation" from you phones app launcher: 1)Select edit/settings and put in the following: "Server" tab: server address: http://yourserver.com/horde/rpc.php user name: your horde user name password: your horde user password "Protocol" tab: Needs not to be filled in. Unless you have your web-server configured to require HTTP Authentification. 2) Configure sync types: Start with Calendar/Tasks: check "activate" name can be anything server database: must be "calendar" For Jotter the server database name is "notes". However you should start with activating one type only. 3) Hit Sync, wait and hope. Now Synchronoisation should take place. During the first sync a set union of the client's and server's data sets are created. Further Sync runs should only transfer the changes since last time. If it's not working: make sure the /tmp/sync directory exists and is writeable by your webserver (user might be wwwrun). Try to Sync once more and check the input/output in this directory. Maybe change your php.ini settings so php logs ERROR messages and NOTICEs in a file as well. Check this file. Your phone gets confused when the XML is cluttered with stuff like "PHP Notice: Undefined index: body in /blah/blub.php on line 256" Consult sync@lists.horde.org and the syncml.org protocol specification. Horde_SyncMl-2.0.7/doc/Horde/SyncMl/README.program_flow.txt0000664000175000017500000000765112700700442021365 0ustar janjanrpc.php in horde's main directory is the starting point for our (and any) RPC call. It determines the $serverType ("syncml" for us) and then does something like this: $server = Horde_RPC::factory($serverType); // [will include RPC/syncml.php and create the class therein] $server->authorize(); $input = $server->getInput(); // [basically the HTTP POST data] $out = $server->getResponse($input, $params); echo $out So the main part takes place in getResponse of framework/RPC/RPC/syncml.php's Horde_RPC_syncml class and there in getResponse: First, XML_WBXML_ContentHandler is installed as an output content handler: $this->output = new XML_WBXML_ContentHandler(); Despite the name, this class has (almost) nothing to do with WBXML. It's a helper to produce xml. To do this, it has 4 main methods: 1) startElement($uri, $element, $attrs) produces an <$element xlmns=$uri attr1=v1 ...> opening tag 2) characters($str) addes $str to the content 3) endElement($uri, $element) produces a closing tag 4) getOutput() returns the output produced so far All subsequent code produces output by calling functions 1)-3) After installing the output content handler, Horde_RPC_syncml::getResponse continues with $this->_parse($request); do do the actual parsing and output creation and then finally $xmlinput = $this->output->getOutput(); to retrieve the created output from the content handler. The name $xmlinput is misleading, it should be called xmloutput instead. So our quest for the code continues withing the Horde_RPC_syncml's _parse function: It creates an XML Parser and registers the class (well, the object) itself as element handlers: _startElement,_endElement, and _characters, which only format the data a bit and call startElement,endElement, and characters respectively. Please note, that start/endElment sounding functions are used for processing the input as well as for creation of the output. This can be somewhat confusing. As a rule of thumb, code that produces xml output contains reference to an output var and looks like this: $this->output->startElement(...); After the XML parser is istalled, it is fired and the execution takes place in the element handler functions. A syncml message (input as well as output) has this structure:: ...stuff... ...stuff... the content handler in Horde_RPC_syncml delegate the work for header and body to the two sub-content handlers SyncML_SyncMLHdr and SyncML_SyncMLBody which reside in framework/SyncML/SyncML.php. So at least we made it to the to the SyncML package by now... The job of SyncML_SyncMLHdr is to read all the values in the header and store them in a php session (custom session, not normal horde session system) of type SyncML_State. After all header data is collected, outputSyncHdr write a SyncHdr as output. SyncML_SyncMLBody is another delegator. First it creates a SyncML_Command_Status to output the status-code of the session (authorized or not). The content of the element are command(-tags): for each element in there, an appropriate handler is created with SyncML_Command::factory($element); and assigned the tasks of handling this command. So execution continues with classes in SyncML/Command/ which are all children of SyncML_Command. >From here, you're on your own. Just two more facts: 1) processing of changes received from the client are handled in SyncML/Sync.php (not to be confused with SyncML/Command/Sync.php) and there in runSyncCommand($command) command is one of SyncML_Command_Sync_(Add|Delete|Replace) 2) The other way around: creating changes on the server for the client is done after the changes from the client have been processed. This is done in TwoWaySync.php. Some care has to be taken to avoid that the changes that are received from the client are considered "new changes" and echoed back to the client. That would result in severe data duplication meltdown. Horde_SyncMl-2.0.7/doc/Horde/SyncMl/README.syncml_primer.txt0000664000175000017500000001101312700700442021535 0ustar janjan SyncML Primer: -------------- A SyncML Protocol Primer The specification can be downloaded from www.syncml.org. This Primer deals with SyncML 1.0.1 only. Basically a SynML Synchronisations consists of 6 steps: Three packages sent from the Client to the Server and three packages the other way round. Here's a brief description of these 2*3 steps. The Chapter references refer to XML examples for these steps in SyncML Sync Protocol, version 1.0.1(pdf) from syncml.org. I found these examples most helpful. Here we go: 1a) Sync Initialization Package from Client (Chapter 4.1.1) Client starts communication, sends authentification and device info and maybe info about previous sync if any. 1b) Sync Initialization Package from Server (chapter 4.2.1) Server responds with session info if authorisation was successfull, provides device info if requested and the synchronisation type (like TwoWaySync or SlowSync) that is suitable for this run. Basically, if both sides "remember" the same timestamp for the previous sync run, a TwoWaySync can be used to transfer only the differences since then. Otherwise or for initial sync, a SlowSync is used. In that the client sends all its data to the server which then handles them. 2a) Client Sending Modifications to Server (Chapter 5.1.1) The client sends all its modifications since the last sync run (or all data for SlowSync) to the server 2b) Server Sending Modifications to Client The server incoporates the changes from the client and now sends its modifications to the client. 3a) Data Update Status to Server (Chapter 5.3.1) A key concept of SyncML is that client and server have their own internal representation of the data and use different primary keys. To identify items there has to be a mapping between the client's keys and the server's keys. (primary keys are relative URIs in SyncML language). This map is maintained by the server. After the client has incoporated the servers data in its own database it sends its new primary keys () for the changed data back to the server. The server can then update its map. 3b) Map Acknowledgement from Server (Chapter 5.4.1) Basically says: "Whoopie, we're through. See you next time". XML Specification: Each SyncML Packet consists of one SyncMLHdr Element an one SyncMLBody Element. The header contains authorisation and session information. A typical header sent from the server might look like this:: 1.0 SyncML/1.0 424242424242 2 111111-00-222222-4 http://mysyncmlserver.com/horde/rpc.php http://mysyncmlserver.com/horde/rpc.php The SyncBody contains the following elements (called "commands") as specified in the DTD: (Alert | Atomic | Copy | Exec | Get | Map | Put | Results | Search | Sequence | Status | Sync)+, Final? CmdID: each command in a packet has a unique command id like 1 We discuss only Alert,Get,Put,Results,Map,Status Sync and Final here. Get The Get request command works similar to HTTP GET: it is intended to request data from the communication partner. Currently it's only use is to retrieve "./devinf10" (or 11 for syncml 1.1) which contains information about the sync capabilitys of the partner. Put Put is similar to HTTP POST: it's designed to transfer data to the communication partner. As with get, the only use at the moment is to publish the "./devinf10" device information to the communication partner. A typcial first packet from the client would include a GET for the servers devinf and a put with the client's own devinf data. Result The Result Element is used to respond to a GET Command and contains the requested data, i.e. the devinf data. Status In General, for each command there must be a status response from the other side. (For exception see the spec.) The Status includes a CmdID (like any command). It has a MsgRef and CmdRef to identify the command it responds to: MsgRef identifies the packet (given in the Header) and CmdRef the CmdId of the original command. There's also a Element to specify the type:: 3 1 2 Put ./devinf10 200 Sync Alert Sync and Alert is where the action takes place. Unfortunately the primer is not yet finished. Stay tuned or check the Spec yourself... Horde_SyncMl-2.0.7/doc/Horde/SyncMl/TODO0000664000175000017500000000151112700700442015647 0ustar janjanTODOs ----- - handle recurring events - handle alarms in sync4j - review session handling. - Deal with "unfinished" sessions after incomplete sync. - use cookies where possible. Otherwise concurrent sessions with device ID "sc-pim-outlook" will cause trouble big time. - implement BUSY feature - try to speedup data retrival inside horde - create configuration in horde preferences: allow fancy stuff like "delete calendar entries from clients for events n days in the past" - create page to view summary of previous sync and ultimately handle collisions as well... - get vcard/icalendar handling right: support ical 1.0/2.0 and vcard 2.1/3.0 creation. Redesign / Refactoring ---------------------- -concentrate business logic where possible (controller class), seperate xml parsing/creation from business logic Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Backend/Horde.php0000664000175000017500000010444212700700443020271 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Backend_Horde extends Horde_SyncMl_Backend { /** * A database instance. * * @var Horde_Db_Adapter_Base */ protected $_db; /** * The session ID used in the Horde session. * * @var string */ protected $_sessionId; /** * Constructor. * * Initializes the logger. * * @param array $params Any parameters the backend might need. */ public function __construct($params) { parent::__construct($params); $this->_db = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Db')->create(); } /** * Sets the user used for this session. * * @param string $user A user name. */ public function setUser($user) { parent::setUser($user); if ($this->_backendMode == Horde_SyncMl_Backend::MODE_TEST) { /* After a session the user gets automatically logged out, so we * have to login again. */ $GLOBALS['registry']->setAuth($this->_user, array()); } } /** * Starts a PHP session. * * @param string $syncDeviceID The device ID. * @param string $session_id The session ID to use. * @param integer $backendMode The backend mode, one of the * Horde_SyncMl_Backend::MODE_* constants. */ public function sessionStart($syncDeviceID, $sessionId, $backendMode = Horde_SyncMl_Backend::MODE_SERVER) { $this->_backendMode = $backendMode; $this->_syncDeviceID = $syncDeviceID; $this->_sessionId = md5($syncDeviceID . $sessionId); /* Only the server needs to start a session. */ if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { /* Reload the Horde SessionHandler if necessary. */ $GLOBALS['session'] = new Horde_Session(); $GLOBALS['session']->destroy(); $GLOBALS['session']->setup(true, null, $this->_sessionId); $this->state = $GLOBALS['session']->get('horde', 'syncml'); } } public function close() { if ($this->state) { $GLOBALS['session']->set('horde', 'syncml', $this->state); } $GLOBALS['session']->close(); parent::close(); } protected function _fastsync($databaseURI, $from_ts, $to_ts) { global $registry; $results = array( 'adds' => array(), 'mods' => array(), 'dels' => array()); $map = array( 'adds' => 'add', 'dels' => 'delete', 'mods' => 'modify'); $database = $this->normalize($databaseURI); // Get ALL server changes from backend try { $changes = $registry->{$database}->getChanges($from_ts, $to_ts); } catch (Horde_Exception $e) { $this->logMessage( sprintf( ' %s getChanges() failed during _fastSync: %s', $database, $e->getMessage()), 'ERR'); } $add_ts = array(); foreach (array_keys($results) as $type) { foreach ($changes[$map[$type]] as $suid) { // Only server needs to check for client sent entries: if ($this->_backendMode != Horde_SyncMl_Backend::MODE_SERVER) { switch ($type) { case 'adds': $id = 0; break; case 'mods': case 'dels': $id = $suid; } $results[$type][$suid] = $id; continue; } try { $change_ts = $registry->{$database}->getActionTimestamp( $suid, $map[$type], Horde_SyncMl_Backend::getParameter($databaseURI, 'source')); } catch (Horde_Exception $e) { $this->logMessage($e->getMessage(), 'ERR'); return; } // If added, then deleted all since last sync, don't bother // sending change if ($type == 'adds') { $add_ts[$suid] = $change_ts; } elseif ($type == 'dels') { if (isset($results['adds'][$suid]) && $add_ts[$suid] < $change_ts) { unset($results['adds'][$suid]); continue; } if (isset($results['mods'][$suid])) { unset($results['mods'][$suid]); } } $sync_ts = $this->_getChangeTS($database, $suid); if ($sync_ts && $sync_ts >= $change_ts) { // Change was done by us upon request of client. Don't // mirror that back to the client. $this->logMessage( "Added to server from client: $suid ignored", 'DEBUG'); continue; } // Sanity check and prepare list of changes if ($type != 'adds') { $cuid = $this->_getCuid($database, $suid); if (empty($cuid) && $type == 'mods') { $this->logMessage( "Unable to create change for server id $suid: client id not found in map, adding instead.", 'WARN'); $results['adds'][$suid] = 0; continue; } elseif (empty($cuid) && $type == 'dels') { $this->logMessage( "Unable to create delete for server id $suid: client id not found in map", 'WARN'); continue; } else { $id = $cuid; } } else { $id = 0; } $results[$type][$suid] = $id; } } return $results; } protected function _slowsync($databaseURI, $from_ts, $to_ts) { global $registry; $results = array( 'adds' => array(), 'dels' => array(), 'mods' => array()); $database = $this->normalize($databaseURI); // Return all db entries directly rather than bother history. But // first check if we only want to sync data from a given start // date: $start = trim(Horde_SyncMl_Backend::getParameter($databaseURI, 'start')); try { if (!empty($start)) { if (strlen($start) == 4) { $start .= '0101000000'; } elseif (strlen($start) == 6) { $start .= '01000000'; } elseif (strlen($start) == 8) { $start .= '000000'; } $start = new Horde_Date($start); $this->logMessage('Slow-syncing all events starting from ' . (string)$start, 'DEBUG'); $data = $registry->{$database}->listUids( Horde_SyncMl_Backend::getParameter($databaseURI, 'source'), $start); } else { $data = $registry->{$database}->listUids( Horde_SyncMl_Backend::getParameter($databaseURI, 'source')); } } catch (Horde_Exception $e) { $this->logMessage( "$database/list or $database/listBy failed while retrieving server additions:" . $e->getMessage(), 'ERR'); return; } foreach ($data as $suid) { // Only server needs to check for client sent entries: if ($this->_backendMode != Horde_SyncMl_Backend::MODE_SERVER) { $results['adds'][$suid] = 0; continue; } // Ignore if a map entry is present $cuid = $this->_getCuid($database, $suid); if ($cuid) { $this->logMessage( "Added to server from client during SlowSync: $suid ignored", 'DEBUG'); continue; } try { $add_ts = $registry->{$database}->getActionTimestamp( $suid, 'add', Horde_SyncMl_Backend::getParameter($databaseURI, 'source')); } catch (Horde_Exception $e) { $this->logMessage($e->getMessage(), 'ERR'); return; } $sync_ts = $this->_getChangeTS($database, $suid); if ($sync_ts && $sync_ts >= $add_ts) { // Change was done by us upon request of client. Don't mirror // that back to the client. $this->logMessage("Added to server from client: $suid ignored", 'DEBUG'); continue; } $this->logMessage( "Adding to client from db $database, server id $suid", 'DEBUG'); $results['adds'][$suid] = 0; } return $results; } /** * Returns entries that have been modified in the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param integer $from_ts Start timestamp. * @param integer $to_ts Exclusive end timestamp. Not yet * implemented. * @param array &$adds Output array: hash of adds suid => 0 * @param array &$mods Output array: hash of modifications * suid => cuid * @param array &$dels Output array: hash of deletions suid => cuid * * @return boolean true */ public function getServerChanges($databaseURI, $from_ts, $to_ts, &$adds, &$mods, &$dels) { global $registry; $slowsync = $from_ts == 0; if ($slowsync) { $results = $this->_slowsync($databaseURI, $from_ts, $to_ts); } else { $results = $this->_fastSync($databaseURI, $from_ts, $to_ts); } $adds = $results['adds']; $mods = $results['mods']; $dels = $results['dels']; // @TODO: No need to return true, since errors are now thrown. H5 should // remove this. return true; } /** * Retrieves an entry from the backend. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid Server unique id of the entry: for horde * this is the guid. * @param string $contentType Content-Type: the MIME type in which the * public function should return the data. * @param array $fields Hash of field names and Horde_SyncMl_Property * properties with the requested fields. * * @return mixed A string with the data entry or a PEAR_Error object. */ public function retrieveEntry($databaseURI, $suid, $contentType, $fields) { // Hotfix hack to work around differing function signatures for // export methods in each database. See Bug: 13394 $parameters = array($suid, $contentType); $database = $this->normalize($databaseURI); if ($database == 'contacts') { $parameters[] = null; $parameters[] = $fields; } try { return $GLOBALS['registry']->call( $database . '/export', $parameters); } catch (Horde_Exception $e) { return PEAR::raiseError($e->getMessage()); } } /** * Adds an entry into the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * @param string $cuid Client ID of this entry. * * @return array PEAR_Error or suid (Horde guid) of new entry */ public function addEntry($databaseURI, $content, $contentType, $cuid = null) { global $registry; $database = $this->normalize($databaseURI); try { $suid = $registry->call( $database . '/import', array($content, $contentType, Horde_SyncMl_Backend::getParameter($databaseURI, 'source'))); $suid = is_array($suid) ? $suid[0] : $suid; $this->logMessage( "Added to server db $database client id $cuid -> server id $suid", 'DEBUG'); $ts = $registry->call( $database . '/getActionTimestamp', array($suid, 'add', Horde_SyncMl_Backend::getParameter($databaseURI, 'source'))); if (!$ts) { $this->logMessage( "Unable to find addition timestamp for server id $suid at $ts", 'ERR'); } // Only server needs to do a cuid<->suid map if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $this->createUidMap($database, $cuid, $suid, $ts); } } catch (Horde_Exception $e) { // Failed import. Maybe the entry is already there. Check if a // guid is returned: /* Not working with exceptions if ($suid->getDebugInfo()) { $suid = $suid->getDebugInfo(); $this->logMessage( 'Adding client entry to server: already exists with server id ' . $suid, 'NOTICE'); if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $this->createUidMap($database, $cuid, $suid, 0); } } */ } return $suid; } /** * Replaces an entry in the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * @param string $cuid Client ID of this entry. * * @return string PEAR_Error or server ID (Horde GUID) of modified entry. */ public function replaceEntry($databaseURI, $content, $contentType, $cuid) { global $registry; $database = $this->normalize($databaseURI); // Only server needs to do a cuid<->suid map if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $suid = $this->_getSuid($database, $cuid); } else { $suid = $cuid; } if (!$suid) { return PEAR::raiseError("No map entry found for client id $cuid replacing on server"); } // Entry exists: replace current one. try { $ok = $registry->call($database . '/replace', array($suid, $content, $contentType)); } catch (Horde_Exception $e) { return PEAR::raiseError($e->getMessage()); } $this->logMessage( "Replaced in server db $database client id $cuid -> server id $suid", 'DEBUG'); $ts = $registry->call( $database . '/getActionTimestamp', array($suid, 'modify', Horde_SyncMl_Backend::getParameter($databaseURI,'source'))); // Only server needs to do a cuid<->suid map if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $this->createUidMap($database, $cuid, $suid, $ts); } return $suid; } /** * Deletes an entry from the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid Client ID of the entry. * * @return boolean True on success or false on failed (item not found). */ public function deleteEntry($databaseURI, $cuid) { global $registry; $database = $this->normalize($databaseURI); // Find server ID for this entry: // Only server needs to do a cuid<->suid map if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { try { $suid = $this->_getSuid($database, $cuid); } catch (Horde_Exception $e) { return false; } } else { $suid = $cuid; } if (empty($suid) || is_a($suid, 'PEAR_Error')) { return false; } try { $registry->call($database. '/delete', array($suid)); } catch (Horde_Exception $e) { return false; } $this->logMessage( "Deleted in server db $database client id $cuid -> server id $suid", 'DEBUG'); $ts = $registry->call($database . '/getActionTimestamp', array($suid, 'delete')); // We can't remove the mapping entry as we need to keep the timestamp // information. // Only server needs to do a cuid<->suid map if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $this->createUidMap($database, $cuid, $suid, $ts); } return true; } /** * Authenticates the user at the backend. * * @param string $username A user name. * @param string $password A password. * * @return boolean|string The user name if authentication succeeded, false * otherwise. */ protected function _checkAuthentication($username, $password) { $auth = $GLOBALS['injector'] ->getInstance('Horde_Core_Factory_Auth') ->create() ->authenticate($username, array('password' => $password)) ? $GLOBALS['registry']->getAuth() : false; /* Horde is regenerating the session id at login, but we need to keep * our own, predictable session to not lose state. */ session_id($this->_sessionId); return $auth; } /** * Sets a user as being authenticated at the backend. * * @abstract * * @param string $username A user name. * @param string $credData Authentication data provided by * in the . * * @return string The user name. */ protected function _setAuthenticated($username, $credData) { global $registry; $registry->setAuth($username, $credData); return $registry->getAuth(); } /** * Stores Sync anchors after a successful synchronization to allow two-way * synchronization next time. * * The backend has to store the parameters in its persistence engine * where user, syncDeviceID and database are the keys while client and * server anchor ar the payload. See readSyncAnchors() for retrieval. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $clientAnchorNext The client anchor as sent by the * client. * @param string $serverAnchorNext The anchor as used internally by the * server. */ public function writeSyncAnchors($databaseURI, $clientAnchorNext, $serverAnchorNext) { $database = $this->normalize($databaseURI); $values = array($clientAnchorNext, $serverAnchorNext, $this->_syncDeviceID, $database, $this->_user); if (!$this->readSyncAnchors($databaseURI)) { $query = 'INSERT INTO horde_syncml_anchors ' . '(syncml_clientanchor, syncml_serveranchor, ' . 'syncml_syncpartner, syncml_db, syncml_uid) ' . 'VALUES (?, ?, ?, ?, ?)'; $this->_db->insert($query, $values); } else { $query = 'UPDATE horde_syncml_anchors ' . 'SET syncml_clientanchor = ?, syncml_serveranchor = ? ' . 'WHERE syncml_syncpartner = ? AND syncml_db = ? AND ' . 'syncml_uid = ?'; $this->_db->update($query, $values); } } /** * Reads the previously written sync anchors from the database. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * * @return mixed Two-element array with client anchor and server anchor as * stored in previous writeSyncAnchor() calls. False if no * data found. */ public function readSyncAnchors($databaseURI) { $database = $this->normalize($databaseURI); $query = 'SELECT syncml_clientanchor, syncml_serveranchor ' . 'FROM horde_syncml_anchors ' . 'WHERE syncml_syncpartner = ? AND syncml_db = ? AND ' . 'syncml_uid = ?'; $values = array($this->_syncDeviceID, $database, $this->_user); try { if ($res = $this->_db->selectOne($query, $values)) { return array( $res['syncml_clientanchor'], $res['syncml_serveranchor'] ); } } catch (Horde_Db_Exception $e) {} return false; } /** * Returns all previously written sync anchors for a user. * * @param string $user A user name. * * @return array A hash tree with all devices, databases and sync anchors * from the specified user. */ public function getUserAnchors($user) { $query = 'SELECT syncml_syncpartner, syncml_db, syncml_clientanchor, ' . 'syncml_serveranchor FROM horde_syncml_anchors ' . 'WHERE syncml_uid = ?'; $values = array($user); return $this->_db->selectAll($query, $values); } /** * Deletes previously written sync anchors for a user. * * If no device or database are specified, anchors for all devices and/or * databases will be deleted. * * @param string $user A user name. * @param string $device The ID of the client device. * @param string $database Normalized URI of database to delete. Like * calendar, tasks, contacts or notes. * * @return array */ public function removeAnchor($user, $device = null, $database = null) { $query = 'DELETE FROM horde_syncml_anchors WHERE syncml_uid = ?'; $values = array($user); if (strlen($device)) { $query .= ' AND syncml_syncpartner = ?'; $values[] = $device; } if (strlen($database)) { $query .= ' AND syncml_db = ?'; $values[] = $database; } $this->_db->delete($query, $values); } /** * Deletes previously written sync maps for a user. * * If no device or database are specified, maps for all devices and/or * databases will be deleted. * * @param string $user A user name. * @param string $device The ID of the client device. * @param string $database Normalized URI of database to delete. Like * calendar, tasks, contacts or notes. * * @return array */ public function removeMaps($user, $device = null, $database = null) { $query = 'DELETE FROM horde_syncml_map WHERE syncml_uid = ?'; $values = array($user); if (strlen($device)) { $query .= ' AND syncml_syncpartner = ?'; $values[] = $device; } if (strlen($database)) { $query .= ' AND syncml_db = ?'; $values[] = $database; } $this->_db->delete($query, $values); } /** * Creates a map entry to map between server and client IDs. * * If an entry already exists, it is overwritten. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid Client ID of the entry. * @param string $suid Server ID of the entry. * @param integer $timestamp Optional timestamp. This can be used to * 'tag' changes made in the backend during the * sync process. This allows to identify these, * and ensure that these changes are not * replicated back to the client (and thus * duplicated). See key concept "Changes and * timestamps". */ public function createUidMap($databaseURI, $cuid, $suid, $timestamp = 0) { $database = $this->normalize($databaseURI); $values = array($suid, (int)$timestamp, $this->_syncDeviceID, $database, $this->_user, $cuid); // Check if entry exists. If not insert, otherwise update. if (!$this->_getSuid($databaseURI, $cuid)) { $query = 'INSERT INTO horde_syncml_map ' . '(syncml_suid, syncml_timestamp, syncml_syncpartner, ' . 'syncml_db, syncml_uid, syncml_cuid) ' . 'VALUES (?, ?, ?, ?, ?, ?)'; $this->_db->insert($query, $values); } else { $query = 'UPDATE horde_syncml_map ' . 'SET syncml_suid = ?, syncml_timestamp = ? ' . 'WHERE syncml_syncpartner = ? AND syncml_db = ? AND ' . 'syncml_uid = ? AND syncml_cuid = ?'; $this->_db->update($query, $values); } } /** * Retrieves the Server ID for a given Client ID from the map. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid The client ID. * * @return mixed The server ID string or false if no entry is found. */ protected function _getSuid($databaseURI, $cuid) { $database = $this->normalize($databaseURI); $query = 'SELECT syncml_suid FROM horde_syncml_map ' . 'WHERE syncml_syncpartner = ? AND syncml_db = ? AND ' . 'syncml_uid = ? AND syncml_cuid = ?'; $values = array($this->_syncDeviceID, $database, $this->_user, $cuid); return $this->_db->selectValue($query, $values); } /** * Retrieves the Client ID for a given Server ID from the map. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid The server ID. * * @return mixed The client ID string or false if no entry is found. */ protected function _getCuid($databaseURI, $suid) { $database = $this->normalize($databaseURI); $query = 'SELECT syncml_cuid FROM horde_syncml_map ' . 'WHERE syncml_syncpartner = ? AND syncml_db = ? AND ' . 'syncml_uid = ? AND syncml_suid = ?'; $values = array($this->_syncDeviceID, $database, $this->_user, $suid); return $this->_db->selectValue($query, $values); } /** * Returns a timestamp stored in the map for a given Server ID. * * The timestamp is the timestamp of the last change to this server ID * that was done inside a sync session (as a result of a change received * by the server). It's important to distinguish changes in the backend a) * made by the user during normal operation and b) changes made by SyncML * to reflect client updates. When the server is sending its changes it * is only allowed to send type a). However the history feature in the * backend my not know if a change is of type a) or type b). So the * timestamp is used to differentiate between the two. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid The server ID. * * @return mixed The previously stored timestamp or false if no entry is * found. */ protected function _getChangeTS($databaseURI, $suid) { $database = $this->normalize($databaseURI); $query = 'SELECT syncml_timestamp FROM horde_syncml_map ' . 'WHERE syncml_syncpartner = ? AND syncml_db = ? AND ' . 'syncml_uid = ? AND syncml_suid = ?'; $values = array($this->_syncDeviceID, $database, $this->_user, $suid); return $this->_db->selectValue($query, $values); } /** * Erases all mapping entries for one combination of user, device ID. * * This is used during SlowSync so that we really sync everything properly * and no old mapping entries remain. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. */ public function eraseMap($databaseURI) { $database = $this->normalize($databaseURI); $query = 'DELETE FROM horde_syncml_map ' . 'WHERE syncml_syncpartner = ? AND syncml_db = ? AND ' . 'syncml_uid = ?'; $values = array($this->_syncDeviceID, $database, $this->_user); $this->_db->delete($query, $values); } /** * Logs a message in the backend. * * @param mixed $message Either a string or a PEAR_Error object. * @param string $priority The priority of the message. One of: * - EMERG * - ALERT * - CRIT * - ERR * - WARN * - NOTICE * - INFO * - DEBUG */ public function logMessage($message, $priority = 'INFO') { $trace = debug_backtrace(); $trace = $trace[1]; // Internal logging to $this->_logtext. parent::logMessage($message, $priority); // Logging to Horde log: Horde::log($message, $priority, array('file' => $trace['file'], 'line' => $trace['line'])); } /** * Creates a clean test environment in the backend. * * Ensures there's a user with the given credentials and an empty data * store. * * @param string $user This user accout has to be created in the backend. * @param string $pwd The password for user $user. * * @throws Horde_Exception */ public function testSetup($user, $pwd) { $this->_user = $user; if (empty($pwd)) { $pwd = rand() . rand(); } /* Get an Auth object. */ $auth = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Auth')->create(); /* Make this user an admin for the time beeing to allow deletion of * user data. */ $GLOBALS['conf']['auth']['admins'][] = $user; /* Always remove test user first. */ if ($auth->exists($user)) { $GLOBALS['registry']->removeUser($user); } $auth->addUser($user, array('password' => $pwd)); } /** * Prepares the test start. * * @param string $user This user accout has to be created in the backend. */ public function testStart($user) { $this->_user = $user; /* Make this user an admin for the time beeing to allow deletion of * user data. */ $GLOBALS['conf']['auth']['admins'][] = $user; $GLOBALS['registry']->setAuth($user, array()); } /** * Tears down the test environment after the test is run. * * Should remove the testuser created during testSetup and all its data. */ public function testTearDown() { /* Get an Auth object. */ try { $auth = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Auth')->create(); } catch (Horde_Exception $e) { // TODO } /* We need to be logged in to call removeUserData, otherwise we run * into permission issues. */ $GLOBALS['registry']->setAuth($this->_user, array()); print "\nCleaning up: removing test user data and test user..."; $registry->removeUser($this->_user); print "OK\n"; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Backend/Sql.php0000664000175000017500000012604512700700443017772 0ustar janjan * @package SyncMl */ /* * The SQL Database must contain five tables as created by the following SQL * script: * * CREATE DATABASE syncml; * * USE syncml; * * CREATE TABLE syncml_data( * syncml_id VARCHAR(255), * syncml_db VARCHAR(255), * syncml_uid VARCHAR(255), * syncml_data TEXT, * syncml_contenttype VARCHAR(255), * syncml_created_ts INTEGER, * syncml_modified_ts INTEGER * ); * * CREATE TABLE syncml_map( * syncml_syncpartner VARCHAR(255), * syncml_db VARCHAR(255), * syncml_uid VARCHAR(255), * syncml_cuid VARCHAR(255), * syncml_suid VARCHAR(255), * syncml_timestamp INTEGER * ); * * CREATE INDEX syncml_syncpartner_idx ON syncml_map (syncml_syncpartner); * CREATE INDEX syncml_db_idx ON syncml_map (syncml_db); * CREATE INDEX syncml_uid_idx ON syncml_map (syncml_uid); * CREATE INDEX syncml_cuid_idx ON syncml_map (syncml_cuid); * CREATE INDEX syncml_suid_idx ON syncml_map (syncml_suid); * * CREATE TABLE syncml_anchors( * syncml_syncpartner VARCHAR(255), * syncml_db VARCHAR(255), * syncml_uid VARCHAR(255), * syncml_clientanchor VARCHAR(255), * syncml_serveranchor VARCHAR(255) * ); * * CREATE TABLE syncml_suidlist( * syncml_syncpartner VARCHAR(255), * syncml_db VARCHAR(255), * syncml_uid VARCHAR(255), * syncml_suid VARCHAR(255) * ); * * CREATE TABLE syncml_uids( * syncml_uid VARCHAR(255), * syncml_password VARCHAR(255) * ); */ /** */ class Horde_SyncMl_Backend_Sql extends Horde_SyncMl_Backend { /** * A PEAR MDB2 instance. * * @var MDB2 */ protected $_db; /** * Constructor. * * @param array $params A hash with parameters. In addition to those * supported by the Horde_SyncMl_Backend class one more * parameter is required for the database connection: * 'dsn' => connection DSN. */ public function __construct($params) { parent::__construct($params); $this->_db = &MDB2::connect($params['dsn']); if (is_a($this->_db, 'PEAR_Error')) { $this->logMessage($this->_db, 'ERR'); } } /** * Returns whether a database URI is valid to be synced with this backend. * * @param string $databaseURI URI of a database. Like calendar, tasks, * contacts or notes. May include optional * parameters: * tasks?options=ignorecompleted. * * @return boolean True if a valid URI. */ public function isValidDatabaseURI($databaseURI) { $database = $this->normalize($databaseURI); switch($database) { case 'tasks': case 'calendar': case 'notes': case 'contacts': case 'events': case 'memo': return true; default: $this->logMessage('Invalid database ' . $database . '. Try tasks, calendar, notes or contacts.', 'ERR'); return false; } } /** * Returns entries that have been modified in the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param integer $from_ts Start timestamp. * @param integer $to_ts Exclusive end timestamp. Not yet * implemented. * @param array &$adds Output array: hash of adds suid => 0 * @param array &$mods Output array: hash of modifications * suid => cuid * @param array &$dels Output array: hash of deletions suid => cuid * * @return mixed True on success or a PEAR_Error object. */ public function getServerChanges($databaseURI, $from_ts, $to_ts, &$adds, &$mods, &$dels) { $database = $this->normalize($databaseURI); $adds = $mods = $dels = array(); // Handle additions: $data = $this->_db->queryAll( 'SELECT syncml_id, syncml_created_ts from syncml_data ' . 'WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_created_ts >= ' . $this->_db->quote($from_ts, 'integer') . ' AND syncml_created_ts < ' . $this->_db->quote($to_ts, 'integer')); if ($this->_checkForError($data)) { return $data; } foreach ($data as $d) { $suid = $d[0]; $suid_ts = $d[1]; $sync_ts = $this->_getChangeTS($databaseURI, $suid); if ($sync_ts && $sync_ts >= $suid_ts) { // Change was done by us upon request of client, don't mirror // that back to the client. $this->logMessage("Added to server from client: $suid ignored", 'DEBUG'); continue; } $adds[$suid] = 0; } // Only compile changes on delta sync: if ($from_ts > 0) { // Handle replaces. We might get IDs that are already in the adds // array but that's ok: The calling code takes care to ignore // these. $data = $this->_db->queryAll( 'SELECT syncml_id, syncml_modified_ts from syncml_data ' .'WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_modified_ts >= ' . $this->_db->quote($from_ts, 'integer') . ' AND syncml_modified_ts < ' . $this->_db->quote($to_ts, 'integer')); if ($this->_checkForError($data)) { return $data; } foreach($data as $d) { // Only the server needs to check the change timestamp do // identify client-sent changes. if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $suid = $d[0]; $suid_ts = $d[1]; $sync_ts = $this->_getChangeTS($databaseURI, $suid); if ($sync_ts && $sync_ts >= $suid_ts) { // Change was done by us upon request of client, don't // mirror that back to the client. $this->logMessage( "Changed on server after sent from client: $suid ignored", 'DEBUG'); continue; } $mods[$suid] = $this->_getCuid($databaseURI, $suid); } else { $mods[$d[0]] = $d[0]; } } } // Handle deletions: // We assume stupid a backend datastore (syncml_data) where deleted // items are simply "gone" from the datastore. So we need to do our // own bookkeeping to identify entries that have been deleted since // the last sync run. // This is done by the _trackDeless() helper function: we feed it with // a current list of all suids and get the ones missing (and thus // deleted) in return. $data = $this->_db->queryCol( 'SELECT syncml_id from syncml_data WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text')); if ($this->_checkForError($data)) { return $data; } // Get deleted items and store current items: // Only use the deleted information on delta sync. On initial slowsync // we just need to call _trackDeletes() once to init the list. $data = $this->_trackDeletes($databaseURI, $data); if ($this->_checkForError($data)) { return $data; } if ($from_ts > 0) { foreach($data as $suid) { // Only the server needs to handle the cuid suid map: if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $dels[$suid] = $this->_getCuid($databaseURI, $suid); } else { $dels[$suid] = $suid; } } } } /** * Retrieves an entry from the backend. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid Server unique id of the entry: for horde * this is the guid. * @param string $contentType Content-Type: the MIME type in which the * public function should return the data. * @param array $fields Hash of field names and Horde_SyncMl_Property * properties with the requested fields. * * @return mixed A string with the data entry or a PEAR_Error object. */ public function retrieveEntry($databaseURI, $suid, $contentType, $fields) { $database = $this->normalize($databaseURI); return $this->_db->queryOne( 'SELECT syncml_data from syncml_data ' . 'WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_id = ' . $this->_db->quote($suid, 'text')); } /** * Adds an entry into the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * @param string $cuid Client ID of this entry. * * @return array PEAR_Error or suid (Horde guid) of new entry */ public function addEntry($databaseURI, $content, $contentType, $cuid = null) { $database = $this->normalize($databaseURI); // Generate an id (suid). It's also possible to use a database // generated primary key here. $suid = strval(new Horde_Support_Uuid()); $created_ts = $this->getCurrentTimeStamp(); $r = $this->_db->exec( 'INSERT INTO syncml_data (syncml_id, syncml_db, syncml_uid, ' . 'syncml_data, syncml_contenttype, syncml_created_ts, ' . 'syncml_modified_ts) VALUES (' . $this->_db->quote($suid, 'text') . ',' . $this->_db->quote($database, 'text') . ',' . $this->_db->quote($this->_user, 'text') . ',' . $this->_db->quote($content, 'text') . ',' . $this->_db->quote($contentType, 'text') . ',' . $this->_db->quote($created_ts, 'integer') . ',' . $this->_db->quote($created_ts, 'integer') . ')'); if ($this->_checkForError($r)) { return $r; } // Only the server needs to handle the cuid suid map: if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $this->createUidMap($databaseURI, $cuid, $suid, $created_ts); } } /** * Replaces an entry in the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * @param string $cuid Client ID of this entry. * * @return string PEAR_Error or server ID (Horde GUID) of modified entry. */ public function replaceEntry($databaseURI, $content, $contentType, $cuid) { $database = $this->normalize($databaseURI); if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $suid = $this->_getSuid($databaseURI, $cuid); } else { $suid = $cuid; } if ($suid) { // Entry exists: replace current one. $modified_ts = $this->getCurrentTimeStamp(); $r = $this->_db->exec( 'UPDATE syncml_data ' . 'SET syncml_modified_ts = ' . $this->_db->quote($modified_ts, 'integer') . ', syncml_data = ' . $this->_db->quote($content, 'text') . ', syncml_contenttype = ' . $this->_db->quote($contentType, 'text') . 'WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_id = ' . $this->_db->quote($suid, 'text')); if ($this->_checkForError($r)) { return $r; } // Only the server needs to keep the map: if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $this->createUidMap($databaseURI, $cuid, $suid, $modified_ts); } } else { return PEAR::raiseError("No map entry found for client id $cuid replacing on server"); } return $suid; } /** * Deletes an entry from the server database. * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid Client ID of the entry. * * @return boolean True on success or false on failed (item not found). */ public function deleteEntry($databaseURI, $cuid) { $database = $this->normalize($databaseURI); // Find ID for this entry: if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $suid = $this->_getSuid($databaseURI, $cuid); } else { $suid = $cuid; } if (!is_a($suid, 'PEAR_Error')) { // A clever backend datastore would store some information about a // deletion so this information can be extracted from the history. // However we do a "stupid" datastore here where deleted items are // simply gone. This allows us to illustrate the _trackDeletes() // bookkeeping mechanism. $r = $this->_db->queryOne( 'DELETE FROM syncml_data ' . ' WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_id = ' . $this->_db->quote($suid, 'text')); if ($this->_checkForError($r)) { return $r; } // Deleted bookkeeping is required for server and client, but not // for test mode: if ($this->_backendMode != Horde_SyncMl_Backend::MODE_TEST) { $this->_removeFromSuidList($databaseURI, $suid); } // @todo: delete from map! } else { return false; } if (is_a($r, 'PEAR_Error')) { return false; } return true; } /** * Authenticates the user at the backend. * * @param string $username A user name. * @param string $password A password. * * @return boolean|string The user name if authentication succeeded, false * otherwise. */ protected function _checkAuthentication($username, $password) { // Empty passwords result in errors for some authentication // backends, don't call the backend in this case. if ($pwd === '') { return false; } $r = $this->_db->queryOne( 'SELECT syncml_uid FROM syncml_uids' . ' WHERE syncml_uid = ' . $this->_db->quote($username, 'text') . ' AND syncml_password = ' . $this->_db->quote($pwd, 'text')); $this->_checkForError($r); if ($r === $username) { return $username; } return false; } /** * Sets a user as being authenticated at the backend. * * @abstract * * @param string $username A user name. * @param string $credData Authentication data provided by * in the . * * @return string The user name. */ protected function _setAuthenticated($username, $credData) { return $username; } /** * Stores Sync anchors after a successful synchronization to allow two-way * synchronization next time. * * The backend has to store the parameters in its persistence engine * where user, syncDeviceID and database are the keys while client and * server anchor ar the payload. See readSyncAnchors() for retrieval. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $clientAnchorNext The client anchor as sent by the * client. * @param string $serverAnchorNext The anchor as used internally by the * server. */ public function writeSyncAnchors($databaseURI, $clientAnchorNext, $serverAnchorNext) { $database = $this->normalize($databaseURI); // Check if entry exists. If not insert, otherwise update. if (!$this->readSyncAnchors($databaseURI)) { $r = $this->_db->exec( 'INSERT INTO syncml_anchors (syncml_syncpartner, ' . 'syncml_db,syncml_uid, syncml_clientanchor, ' . 'syncml_serveranchor) VALUES (' . $this->_db->quote($this->_syncDeviceID, 'text') . ', ' . $this->_db->quote($database, 'text') . ', ' . $this->_db->quote($this->_user, 'text') . ', ' . $this->_db->quote($clientAnchorNext, 'text') . ', ' . $this->_db->quote($serverAnchorNext, 'text') . ')'); } else { $r = $this->_db->exec( 'UPDATE syncml_anchors ' . ' SET syncml_clientanchor = ' . $this->_db->quote($clientAnchorNext, 'text') . ', syncml_serveranchor = ' . $this->_db->quote($serverAnchorNext, 'text') . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text')); } if ($this->_checkForError($r)) { return $r; } return true; } /** * Reads the previously written sync anchors from the database. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * * @return mixed Two-element array with client anchor and server anchor as * stored in previous writeSyncAnchor() calls. False if no * data found. */ public function readSyncAnchors($databaseURI) { $database = $this->normalize($databaseURI); $r = $this->_db->queryRow( 'SELECT syncml_clientanchor, syncml_serveranchor ' . 'FROM syncml_anchors WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text')); $this->_checkForError($r); if (!is_array($r)) { return false; } return array($r[0], $r[1]); } /** * Creates a map entry to map between server and client IDs. * * If an entry already exists, it is overwritten. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid Client ID of the entry. * @param string $suid Server ID of the entry. * @param integer $timestamp Optional timestamp. This can be used to * 'tag' changes made in the backend during the * sync process. This allows to identify these, * and ensure that these changes are not * replicated back to the client (and thus * duplicated). See key concept "Changes and * timestamps". */ public function createUidMap($databaseURI, $cuid, $suid, $timestamp = 0) { $database = $this->normalize($databaseURI); // Check if entry exists. If not insert, otherwise update. if (!$this->_getSuid($databaseURI, $cuid)) { $r = $this->_db->exec( 'INSERT INTO syncml_map (syncml_syncpartner, ' . 'syncml_db, syncml_uid, syncml_cuid, syncml_suid, ' . 'syncml_timestamp) VALUES (' . $this->_db->quote($this->_syncDeviceID, 'text') . ', ' . $this->_db->quote($database, 'text') . ', ' . $this->_db->quote($this->_user, 'text') . ', ' . $this->_db->quote($cuid, 'text') . ', ' . $this->_db->quote($suid, 'text') . ', ' . $this->_db->quote($timestamp, 'integer') . ')'); } else { $r = $this->_db->exec( 'UPDATE syncml_map SET syncml_suid = ' . $this->_db->quote($suid, 'text') . ', syncml_timestamp = ' . $this->_db->quote($timestamp, 'text') . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_cuid = ' . $this->_db->quote($cuid, 'text')); } if ($this->_checkForError($r)) { return $r; } return true; } /** * Retrieves the Server ID for a given Client ID from the map. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid The client ID. * * @return mixed The server ID string or false if no entry is found. */ protected function _getSuid($databaseURI, $cuid) { $database = $this->normalize($databaseURI); $r = $this->_db->queryOne( 'SELECT syncml_suid FROM syncml_map ' . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_cuid = ' . $this->_db->quote($cuid, 'text')); $this->_checkForError($r); if (!empty($r)) { return $r; } return false; } /** * Retrieves the Client ID for a given Server ID from the map. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid The server ID. * * @return mixed The client ID string or false if no entry is found. */ protected function _getCuid($databaseURI, $suid) { $database = $this->normalize($databaseURI); $r = $this->_db->queryOne( 'SELECT syncml_cuid FROM syncml_map ' . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_suid = ' . $this->_db->quote($suid, 'text')); $this->_checkForError($r); if (!empty($r)) { return $r; } return false; } /** * Returns a timestamp stored in the map for a given Server ID. * * The timestamp is the timestamp of the last change to this server ID * that was done inside a sync session (as a result of a change received * by the server). It's important to distinguish changes in the backend a) * made by the user during normal operation and b) changes made by SyncML * to reflect client updates. When the server is sending its changes it * is only allowed to send type a). However the history feature in the * backend my not know if a change is of type a) or type b). So the * timestamp is used to differentiate between the two. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid The server ID. * * @return mixed The previously stored timestamp or false if no entry is * found. */ protected function _getChangeTS($databaseURI, $suid) { $database = $this->normalize($databaseURI); $r = $this->_db->queryOne( 'SELECT syncml_timestamp FROM syncml_map ' . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_suid = ' . $this->_db->quote($suid, 'text')); $this->_checkForError($r); if (!empty($r)) { return $r; } return false; } /** * Erases all mapping entries for one combination of user, device ID. * * This is used during SlowSync so that we really sync everything properly * and no old mapping entries remain. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. */ public function eraseMap($databaseURI) { $database = $this->normalize($databaseURI); $r = $this->_db->exec( 'DELETE FROM syncml_map ' . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text')); if ($this->_checkForError($r)) { return $r; } $r = $this->_db->exec( 'DELETE FROM syncml_suidlist ' . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text')); if ($this->_checkForError($r)) { return $r; } return true; } /** * Cleanup public function called after all message processing is finished. * * Allows for things like closing databases or flushing logs. When * running in test mode, tearDown() must be called rather than close. */ public function close() { parent::close(); $this->_db->disconnect(); } /** * Checks if the parameter is a PEAR_Error object and if so logs the * error. * * @param mixed $o An object or value to check. * * @return mixed The error object if an error has been passed or false if * no error has been passed. */ protected function _checkForError($o) { if (is_a($o, 'PEAR_Error')) { $this->logMessage($o); return $o; } return false; } /** * Returns a list of item IDs that have been deleted since the last sync * run and stores a complete list of IDs for next sync run. * * Some backend datastores don't keep information about deleted entries. * So we have to create a workaround that finds out what entries have been * deleted since the last sync run. This method provides this * functionality: it is called with a list of all IDs currently in the * database. It then compares this list with its own previously stored * list of IDs to identify those missing (and thus deleted). The passed * list is then stored for the next invocation. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param array $currentSuids Array of all SUIDs (primary keys) currently * in the server datastore. * * @return array Array of all entries that have been deleted since the * last call. */ protected function _trackDeletes($databaseURI, $currentSuids) { $database = $this->normalize($databaseURI); if (!is_array($currentSuids)) { $currentSuids = array(); } $this->logMessage('_trackDeletes() with ' . count($currentSuids) . ' current ids', 'DEBUG'); $r = $this->_db->queryCol( 'SELECT syncml_suid FROM syncml_suidlist ' . ' WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text')); if ($this->_checkForError($r)) { return $r; } $this->logMessage('_trackDeletes() found ' . count($r) . ' items in prevlist', 'DEBUG'); // Convert to hash with suid as key. if (is_array($r)) { $prevSuids = array_flip($r); } else { $prevSuids = array(); } foreach ($currentSuids as $suid) { if (isset($prevSuids[$suid])) { // Entry is there now and in $prevSuids. Unset in $prevSuids // array so we end up with only those in $prevSuids that are // no longer there now. unset($prevSuids[$suid]); } else { // Entry is there now but not in $prevSuids. New entry, store // in syncml_suidlist $r = $this->_db->exec( 'INSERT INTO syncml_suidlist ' . ' (syncml_syncpartner, syncml_db, syncml_uid, ' . 'syncml_suid) VALUES (' . $this->_db->quote($this->_syncDeviceID, 'text') . ', ' . $this->_db->quote($database, 'text') . ', ' . $this->_db->quote($this->_user, 'text') . ', ' . $this->_db->quote($suid, 'text') . ')'); if ($this->_checkForError($r)) { return $r; } } } // $prevSuids now contains the deleted suids. Remove those from // syncml_suidlist so we have a current list of all existing suids. foreach ($prevSuids as $suid => $cuid) { $r = $this->_removeFromSuidList($databaseURI, $suid); } $this->logMessage('_trackDeletes() with ' . count($prevSuids) . ' deleted items', 'DEBUG'); return array_keys($prevSuids); } /** * Removes a suid from the suidlist. * * Called by _trackDeletes() when updating the suidlist and deleteEntry() * when removing an entry due to a client request. * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param array $suid The suid to remove from the list. */ protected function _removeFromSuidList($databaseURI, $suid) { $database = $this->normalize($databaseURI); $this->logMessage('_removeFromSuidList(): item ' . $suid, 'DEBUG'); $r = $this->_db->queryCol( 'DELETE FROM syncml_suidlist ' . 'WHERE syncml_syncpartner = ' . $this->_db->quote($this->_syncDeviceID, 'text') . ' AND syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($this->_user, 'text') . ' AND syncml_suid = ' . $this->_db->quote($suid, 'text')); if ($this->_checkForError($r)) { return $r; } $this->logMessage('_removeFromSuidList(): result ' . implode('!', $r), 'DEBUG'); return true; } /** * Creates a clean test environment in the backend. * * Ensures there's a user with the given credentials and an empty data * store. * * @param string $user This user accout has to be created in the backend. * @param string $pwd The password for user $user. */ public function testSetup($user, $pwd) { $this->_user = $user; $this->_cleanUser($user); $this->_backend->_user = $user; $r = $this->_db->exec( 'INSERT INTO syncml_uids (syncml_uid, syncml_password)' . ' VALUES (' . $this->_db->quote($user, 'text') . ', ' . $this->_db->quote($pwd, 'text') . ')'); $this->_checkForError($r); } /** * Prepares the test start. * * @param string $user This user accout has to be created in the backend. */ public function testStart($user) { $this->_user = $user; $this->_backend->_user = $user; } /** * Tears down the test environment after the test is run. * * Should remove the testuser created during testSetup and all its data. */ public function testTearDown() { $this->_cleanUser($this->_user); $this->_db->disconnect(); } /* Database access functions. The following methods are not part of the * backend API. They are here to illustrate how a backend application * (like a web calendar) has to modify the data with respect to the * history. There are three functions: * addEntry_backend(), replaceEntry_backend(), deleteEntry_backend(). * They are very similar to the API methods above, but don't use cuids or * syncDeviceIDs as these are only relevant for syncing. */ /** * Adds an entry into the server database. * * @param string $user The username to use. Not strictly necessery * to store this, but it helps for the test * environment to clean up all entries for a * test user. * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * * @return array PEAR_Error or suid of new entry. */ public function addEntry_backend($user, $databaseURI, $content, $contentType) { $database = $this->normalize($databaseURI); // Generate an id (suid). It's also possible to use a database // generated primary key here. */ $suid = strval(new Horde_Support_Uuid()); $created_ts = $this->getCurrentTimeStamp(); $r = $this->_db->exec( 'INSERT INTO syncml_data (syncml_id, syncml_db, syncml_uid, ' . 'syncml_data, syncml_contenttype, syncml_created_ts, ' . 'syncml_modified_ts) VALUES (' . $this->_db->quote($suid, 'text') . ', ' . $this->_db->quote($database, 'text') . ', ' . $this->_db->quote($user, 'text') . ', ' . $this->_db->quote($content, 'text') . ', ' . $this->_db->quote($contentType, 'text') . ', ' . $this->_db->quote($created_ts, 'integer') . ', ' . $this->_db->quote($created_ts, 'integer') . ')'); if ($this->_checkForError($r)) { return $r; } return $suid; } /** * Replaces an entry in the server database. * * @param string $user The username to use. Not strictly necessery * to store this but, it helps for the test * environment to clean up all entries for a * test user. * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * @param string $suid Server ID of this entry. * * @return string PEAR_Error or suid of modified entry. */ public function replaceEntry_backend($user, $databaseURI, $content, $contentType, $suid) { $database = $this->normalize($databaseURI); $modified_ts = $this->getCurrentTimeStamp(); // Entry exists: replace current one. $r = $this->_db->exec( 'UPDATE syncml_data ' . 'SET syncml_modified_ts = ' . $this->_db->quote($modified_ts, 'integer') . ',syncml_data = ' . $this->_db->quote($content, 'text') . ',syncml_contenttype = ' . $this->_db->quote($contentType, 'text') . 'WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($user, 'text') . ' AND syncml_id = ' . $this->_db->quote($suid, 'text')); if ($this->_checkForError($r)) { return $r; } return $suid; } /** * Deletes an entry from the server database. * * @param string $user The username to use. Not strictly necessery * to store this, but it helps for the test * environment to clean up all entries for a * test user. * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid Server ID of the entry. * * @return boolean True on success or false on failed (item not found). */ public function deleteEntry_backend($user, $databaseURI, $suid) { $database = $this->normalize($databaseURI); $r = $this->_db->queryOne( 'DELETE FROM syncml_data ' . 'WHERE syncml_db = ' . $this->_db->quote($database, 'text') . ' AND syncml_uid = ' . $this->_db->quote($user, 'text') . ' AND syncml_id = ' . $this->_db->quote($suid, 'text')); if ($this->_checkForError($r)) { return false; } return true; } protected function _cleanUser($user) { $r = $this->_db->exec('DELETE FROM syncml_data WHERE syncml_uid = ' . $this->_db->quote($user, 'text')); $this->_checkForError($r); $r = $this->_db->exec('DELETE FROM syncml_map WHERE syncml_uid = ' . $this->_db->quote($user, 'text')); $this->_checkForError($r); $r = $this->_db->exec('DELETE FROM syncml_anchors WHERE syncml_uid = ' . $this->_db->quote($user, 'text')); $this->_checkForError($r); $r = $this->_db->exec('DELETE FROM syncml_uids WHERE syncml_uid = ' . $this->_db->quote($user, 'text')); $this->_checkForError($r); $r = $this->_db->exec('DELETE FROM syncml_suidlist WHERE syncml_uid = ' . $this->_db->quote($user, 'text')); $this->_checkForError($r); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Alert.php0000664000175000017500000002645612700700443020336 0ustar janjan * @author Karsten Fourmont * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Alert extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Alert'; /** * The alert type. Should be one of the Horde_SyncMl::ALERT_* constants. * * @var integer */ protected $_alert; /** * Source database of the Alert command. * * @var string */ protected $_sourceLocURI; /** * Target database of the Alert command. * * @var string */ protected $_targetLocURI; /** * The current time this synchronization happens, from the * element. * * @var string */ protected $_metaAnchorNext; /** * The last time when synchronization happened, from the * element. * * @var integer */ protected $_metaAnchorLast; /** * End element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::endElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. */ public function endElement($uri, $element) { switch (count($this->_stack)) { case 2: if ($element == 'Data') { $this->_alert = intval(trim($this->_chars)); } break; case 4: if ($element == 'LocURI') { switch ($this->_stack[2]) { case 'Source': $this->_sourceLocURI = trim($this->_chars); break; case 'Target': $this->_targetLocURI = trim($this->_chars); break; } } break; case 5: switch ($element) { case 'Next': $this->_metaAnchorNext = trim($this->_chars); break; case 'Last': $this->_metaAnchorLast = trim($this->_chars); break; } break; } parent::endElement($uri, $element); } /** * Implements the actual business logic of the Alert command. */ public function handleCommand($debug = false) { $state = $GLOBALS['backend']->state; // Handle unauthenticated first. if (!$state->authenticated) { $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_INVALID_CREDENTIALS); return; } // Handle NEXT_MESSAGE Alert by sending either pending elements or // OK status response. if ($this->_alert == Horde_SyncMl::ALERT_NEXT_MESSAGE) { if ($sync = &$state->getSync($this->_targetLocURI)) { if ($sync->hasPendingElements()) { $sync->createSyncOutput($this->_outputHandler); return; } } $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_OK); return; } $database = $this->_targetLocURI; if (!$GLOBALS['backend']->isValidDatabaseURI($database)) { $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_NOT_FOUND); return; } if ($database == 'configuration') { $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_OK); } $clientAnchorNext = $this->_metaAnchorNext; if (!$debug && ($this->_alert == Horde_SyncMl::ALERT_TWO_WAY || $this->_alert == Horde_SyncMl::ALERT_ONE_WAY_FROM_CLIENT || $this->_alert == Horde_SyncMl::ALERT_ONE_WAY_FROM_SERVER)) { // Check if we have information about previous sync. $r = $GLOBALS['backend']->readSyncAnchors($this->_targetLocURI); if (is_array($r)) { // Info about previous successful sync sessions found. list($clientlast, $serverAnchorLast) = $r; $GLOBALS['backend']->logMessage( 'Previous sync found for database ' . $database . '; client timestamp: ' . $clientlast, 'DEBUG'); // Check if anchor sent from client matches our own stored // data. if ($clientlast == $this->_metaAnchorLast) { // Last sync anchors matche, TwoWaySync will do. $anchormatch = true; $GLOBALS['backend']->logMessage( 'Anchor timestamps match, TwoWaySync possible. Syncing data since ' . date('Y-m-d H:i:s', $serverAnchorLast), 'DEBUG'); } else { // Server and client have different anchors, enforce // SlowSync/RefreshSync $GLOBALS['backend']->logMessage( 'Client requested sync with anchor timestamp ' . $this->_metaAnchorLast . ' but server has recorded timestamp ' . $clientlast . '. Enforcing SlowSync', 'INFO'); $anchormatch = false; $clientlast = 0; } } else { // No info about previous sync, use SlowSync or RefreshSync. $GLOBALS['backend']->logMessage( 'No info about previous syncs found for device ' . $state->sourceURI . ' and database ' . $database, 'DEBUG'); $clientlast = 0; $serverAnchorLast = 0; $anchormatch = false; } } else { // SlowSync requested, no anchor check required. $anchormatch = true; } // Determine sync type and status response code. switch ($this->_alert) { case Horde_SyncMl::ALERT_TWO_WAY: if ($anchormatch) { $synctype = Horde_SyncMl::ALERT_TWO_WAY; $response = Horde_SyncMl::RESPONSE_OK; } else { $synctype = Horde_SyncMl::ALERT_SLOW_SYNC; $response = Horde_SyncMl::RESPONSE_REFRESH_REQUIRED; } break; case Horde_SyncMl::ALERT_SLOW_SYNC: $synctype = Horde_SyncMl::ALERT_SLOW_SYNC; $response = $anchormatch ? Horde_SyncMl::RESPONSE_OK : Horde_SyncMl::RESPONSE_REFRESH_REQUIRED; break; case Horde_SyncMl::ALERT_ONE_WAY_FROM_CLIENT: if ($anchormatch) { $synctype = Horde_SyncMl::ALERT_ONE_WAY_FROM_CLIENT; $response = Horde_SyncMl::RESPONSE_OK; } else { $synctype = Horde_SyncMl::ALERT_REFRESH_FROM_CLIENT; $response = Horde_SyncMl::RESPONSE_REFRESH_REQUIRED; } break; case Horde_SyncMl::ALERT_REFRESH_FROM_CLIENT: $synctype = Horde_SyncMl::ALERT_REFRESH_FROM_CLIENT; $response = $anchormatch ? Horde_SyncMl::RESPONSE_OK : Horde_SyncMl::RESPONSE_REFRESH_REQUIRED; break; case Horde_SyncMl::ALERT_ONE_WAY_FROM_SERVER: if ($anchormatch) { $synctype = Horde_SyncMl::ALERT_ONE_WAY_FROM_SERVER; $response = Horde_SyncMl::RESPONSE_OK; } else { $synctype = Horde_SyncMl::ALERT_REFRESH_FROM_SERVER; $response = Horde_SyncMl::RESPONSE_REFRESH_REQUIRED; } break; case Horde_SyncMl::ALERT_REFRESH_FROM_SERVER: $synctype = Horde_SyncMl::ALERT_REFRESH_FROM_SERVER; $response = $anchormatch ? Horde_SyncMl::RESPONSE_OK : Horde_SyncMl::RESPONSE_REFRESH_REQUIRED; break; case Horde_SyncMl::ALERT_RESUME: // @TODO: Suspend and Resume is not supported yet $synctype = Horde_SyncMl::ALERT_SLOW_SYNC; $response = Horde_SyncMl::RESPONSE_REFRESH_REQUIRED; break; default: $GLOBALS['backend']->logMessage( 'Unknown sync type ' . $this->_alert, 'ERR'); break; } // Now set interval to retrieve server changes from, defined by // ServerAnchor [Last,Next] if ($synctype != Horde_SyncMl::ALERT_TWO_WAY && $synctype != Horde_SyncMl::ALERT_ONE_WAY_FROM_CLIENT && $synctype != Horde_SyncMl::ALERT_ONE_WAY_FROM_SERVER) { $serverAnchorLast = 0; // Erase existing map: if (!$debug && (($anchormatch && Horde_SyncMl::CONFIG_DELETE_MAP_ON_REQUESTED_SLOWSYNC) || (!$anchormatch && Horde_SyncMl::CONFIG_DELETE_MAP_ON_ANCHOR_MISMATCH_SLOWSYNC))) { $GLOBALS['backend']->eraseMap($this->_targetLocURI); } } $serverAnchorNext = $debug ? time() : $GLOBALS['backend']->getCurrentTimeStamp(); // Now create the actual Horde_SyncMl_Sync object, if it doesn't exist yet. $sync = &$state->getSync($this->_targetLocURI); if (!$sync) { $GLOBALS['backend']->logMessage( 'Creating Horde_SyncMl_Sync object for database ' . $this->_targetLocURI . '; sync type ' . $synctype, 'DEBUG'); $sync = new Horde_SyncMl_Sync($synctype, $this->_targetLocURI, $this->_sourceLocURI, (int)$serverAnchorLast, (int)$serverAnchorNext, $clientAnchorNext); $state->setSync($this->_targetLocURI, $sync); } $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, $response, $this->_targetLocURI, $this->_sourceLocURI, $this->_metaAnchorNext, $this->_metaAnchorLast); $this->_outputHandler->outputAlert($synctype, $sync->getClientLocURI(), $sync->getServerLocURI(), $sync->getServerAnchorLast(), $sync->getServerAnchorNext()); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Final.php0000664000175000017500000000264312700700443020310 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Final extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Final'; /** * Implements the actual business logic of the Alert command. */ public function handleCommand($debug = false) { $state = $GLOBALS['backend']->state; // If the client hasn't sent us device info, request it now. // @todo: only do this once, not in every msg if the client does not // implement DevInf. $di = $state->deviceInfo; if (empty($di->Man)) { $this->_outputHandler->outputGetDevInf(); } $GLOBALS['backend']->logMessage('Received from client.', 'DEBUG'); $state->handleFinal($this->_outputHandler, $debug); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Get.php0000664000175000017500000000264012700700443017773 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Get extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Get'; /** * Implements the actual business logic of the Alert command. */ public function handleCommand($debug = false) { $state = $GLOBALS['backend']->state; // Create status response. $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_OK, $state->getDevInfURI()); if (!$state->authenticated) { return; } $this->_outputHandler->outputDevInf($this->_cmdID); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Map.php0000664000175000017500000000654212700700443017776 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Map extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Map'; /** * Source database of the Map command. * * @var string */ protected $_sourceLocURI; /** * Target database of the Map command. * * @var string */ protected $_targetLocURI; /** * Recipient map item specifiers. * * @var array */ protected $_mapTargets = array(); /** * Originator map item specifiers. * * @var array */ protected $_mapSources = array(); /** * End element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::endElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. */ public function endElement($uri, $element) { switch (count($this->_stack)) { case 3: if ($element == 'LocURI') { if ($this->_stack[1] == 'Source') { $this->_sourceLocURI = trim($this->_chars); } elseif ($this->_stack[1] == 'Target') { $this->_targetLocURI = trim($this->_chars); } } break; case 4: if ($element == 'LocURI') { if ($this->_stack[2] == 'Source') { $this->_mapSources[] = trim($this->_chars); } elseif ($this->_stack[2] == 'Target') { $this->_mapTargets[] = trim($this->_chars); } } break; } parent::endElement($uri, $element); } /** * Implements the actual business logic of the Alert command. * * @todo No OK response on error. */ public function handleCommand($debug = false) { if (!$debug && $this->_mapSources) { $state = $GLOBALS['backend']->state; $sync = &$state->getSync($this->_targetLocURI); if (!$state->authenticated) { $GLOBALS['backend']->logMessage( 'Not authenticated while processing ', 'ERR'); } else { foreach ($this->_mapSources as $key => $source) { $sync->createUidMap($this->_targetLocURI, $source, $this->_mapTargets[$key]); } } } // Create status response. $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_OK, $this->_targetLocURI, $this->_sourceLocURI); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Put.php0000664000175000017500000001772512700700443020036 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Put extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Put'; /** * The Horde_SyncMl_DeviceInfo object where all parsed content is * saved. * * specifies the type of the source synchronization device. * * @var Horde_SyncMl_DeviceInfo */ protected $_devinf; /** * A Horde_SyncMl_DataStore object where the information from the currently * parsed section is saved. * * specifies the properties of a given local datastore. * * @var Horde_SyncMl_DataStore */ protected $_currentDS; /** * The MIME content type as specified by the last element like * text/calendar or text/x-vcard. * * specifies the type of a supported content type. * * @var string */ protected $_currentCTType; /** * The version of the MIME content type in $_currentCTType as specified by * the last element like 1.0 for text/x-vcalendar or 2.1 for * text/x-vcard. * * specifies the version of a supported content type. * * @var string */ protected $_VerCT; /** * A property name of the currently parsed content type (CTType), like * 'DTSTART' for text/calendar or 'BDAY' for text/x-vcard. * * specifies a supported property of a given content type. * * @var string */ protected $_currentPropName; /** * A property name of the currently parsed property name (PropName), like * 'ROLE' for 'ATTENDEE' or 'HOME' for 'ADR'. * * specifies supported parameters of a given content type * property. * * @var string */ protected $_currentParamName; /** * The name of the currently parsed DevInf extension () as specified * by the XNam element. * * specifies the name of one of the DevInf extension element types. * * @var string */ protected $_currentXNam; /** * Start element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::startElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. * @param array $attrs A hash with the element's attributes. */ public function startElement($uri, $element, $attrs) { parent::startElement($uri, $element, $attrs); switch (count($this->_stack)) { case 1: $this->_devinf = new Horde_SyncMl_DeviceInfo(); break; case 5: if ($element == 'DataStore') { $this->_currentDS = new Horde_SyncMl_DataStore(); } break; } } /** * End element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::endElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. */ public function endElement($uri, $element) { switch ($element) { case 'VerDTD': case 'Man': case 'Mod': case 'OEM': case 'FwV': case 'SwV': case 'HwV': case 'DevID': case 'DevTyp': $this->_devinf->$element = trim($this->_chars); break; case 'UTC': case 'SupportLargeObjs': case 'SupportNumberOfChanges': $this->_devinf->$element = true; break; case 'DataStore': $this->_devinf->DataStores[] = $this->_currentDS; break; case 'CTCap': case 'Ext': // Automatically handled by subelements. break; case 'SourceRef': case 'DisplayName': case 'MaxGUIDSize': $this->_currentDS->$element = trim($this->_chars); break; case 'Rx-Pref': case 'Rx': case 'Tx-Pref': case 'Tx': $property = str_replace('-', '_', $element); $this->_currentDS->{$property}[$this->_currentCTType] = $this->_VerCT; break; case 'DSMem': // Currently ignored, to be done. break; case 'SyncCap': // Automatically handled by SyncType subelement. break; case 'CTType': $this->_currentCTType = trim($this->_chars); break; case 'PropName': $this->_currentPropName = trim($this->_chars); // Reset param state. unset($this->_currentParamName); $this->_devinf->CTCaps[$this->_currentCTType][$this->_currentPropName] = new Horde_SyncMl_Property(); break; case 'ParamName': $this->_currentParamName = trim($this->_chars); $this->_devinf->CTCaps[$this->_currentCTType][$this->_currentPropName]->Params[$this->_currentParamName] = new Horde_SyncMl_PropertyParameter(); break; case 'ValEnum': if (!empty($this->_currentParamName)) { // We're in parameter mode. $this->_devinf->CTCaps[$this->_currentCTType][$this->_currentPropName]->Params[$this->_currentParamName]->ValEnum[trim($this->_chars)] = true; } else { $this->_devinf->CTCaps[$this->_currentCTType][$this->_currentPropName]->ValEnum[trim($this->_chars)] = true; } break; case 'DataType': case 'Size': case 'DisplayName': if (!empty($this->_currentParamName)) { // We're in parameter mode. $this->_devinf->CTCaps[$this->_currentCTType][$this->_currentPropName]->Params[$this->_currentParamName]->{'_' . $element} = trim($this->_chars); } else { $this->_devinf->CTCaps[$this->_currentCTType][$this->_currentPropName]->{'_' . $element} = trim($this->_chars); } break; case 'XNam': $this->_currentXNam = trim($this->_chars); break; case 'XVal': $this->_devinf->Exts[$this->_currentXNam][] = trim($this->_chars); break; case 'VerCT': $this->_VerCT = trim($this->_chars); break; case 'SyncType': $this->_currentDS->SyncCap[trim($this->_chars)] = true; break; } parent::endElement($uri, $element); } /** * Implements the actual business logic of the Alert command. */ public function handleCommand($debug = false) { $state = $GLOBALS['backend']->state; // Store received data. $state->deviceInfo = $this->_devinf; // Log DevInf object. $GLOBALS['backend']->logFile(Horde_SyncMl_Backend::LOGFILE_DEVINF, var_export($this->_devinf, true)); // Create status response. $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_OK, '', $state->getDevInfURI()); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Replace.php0000664000175000017500000000137212700700443020630 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Replace extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Replace'; } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Results.php0000664000175000017500000000162312700700443020715 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Command_Results extends Horde_SyncMl_Command_Put { /** * Name of the command. * * @var string */ protected $_cmdName = 'Results'; } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Status.php0000664000175000017500000001176512700700443020547 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Status extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Status'; /** * The command ID (CmdID) of the command sent to the client, that this * Status response refers to. * * @var integer */ protected $_CmdRef; /** * The message ID (Msg) of the message sent to the client, that this Status * response refers to. * * @var integer */ protected $_MsgRef; /** * The status response code, one of the Horde_SyncMl::RESPONSE_* constants. * * @var integer */ protected $_Status; /** * The command (Add, Replace, etc) sent to the client, that this Status * response refers to. * * @var string */ protected $_Cmd; /** * The client ID of the sent object, that this Status response refers to. * * This element is optional. If specified, Status response refers to a * single Item in the command sent to the client. It refers to all Items in * the sent command otherwise. * * @var string */ protected $_TargetRef; /** * The server ID of the sent object, that this Status response refers to. * * This element is optional. If specified, Status response refers to a * single Item in the command sent to the client. It refers to all Items in * the sent command otherwise. * * @var string */ protected $_SourceRef; /** * End element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::endElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. */ public function endElement($uri, $element) { switch (count($this->_stack)) { case 2: switch($element) { case 'CmdRef': case 'MsgRef': case 'Status': $this->{'_' . $element} = intval(trim($this->_chars)); break; case 'Cmd': case 'TargetRef': case 'SourceRef': $this->{'_' . $element} = trim($this->_chars); break; } break; case 1: $state = $GLOBALS['backend']->state; switch ($this->_Cmd) { case 'Replace': case 'Add': case 'Delete': $changes = $state->serverChanges[$this->_MsgRef]; /* Run through all stored changes and check if we find one * that matches this Status' message and command IDs. */ foreach ($changes as $db => $commands) { foreach ($commands as $cmdId => $ids) { if ($cmdId != $this->_CmdRef) { continue; } foreach ($ids as $key => $id) { /* If the Status has a SourceRef and/or TargetRef, * it's a response to a single Item only. */ if ((isset($this->_SourceRef) && $this->_SourceRef != $id[0]) || (isset($this->_TargetRef) && $this->_TargetRef != $id[1])) { continue; } /* Match found, remove from stored changes. */ unset($state->serverChanges[$this->_MsgRef][$db][$this->_CmdRef][$key]); $sync = &$state->getSync($db); /* This was a Replace originally, but the object * wasn't found on the client. Try an Add * instead. */ if ($this->_Cmd == 'Replace' && $this->_Status == Horde_SyncMl::RESPONSE_NOT_FOUND) { $sync->setServerChange('add', $id[0], $id[1]); } if (isset($this->_SourceRef) || isset($this->_TargetRef)) { break 3; } } } } break; } break; } parent::endElement($uri, $element); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/Sync.php0000664000175000017500000002734212700700443020176 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_Sync extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'Sync'; /** * Source database of the command. * * @var string */ protected $_sourceURI; /** * Target database of the command. * * @var string */ protected $_targetURI; /** * Horde_SyncMl_SyncElement object for the currently parsed sync command. * * @var Horde_SyncMl_SyncElement */ protected $_curItem; /** * List of all Horde_SyncMl_SyncElement objects that have parsed. * * @var array */ protected $_syncElements = array(); /** * The MIME content type of the currently parsed sync command as specified * by the element inside a section. * * @var string */ protected $_contentType = 'text/plain'; /** * Encoding format of the content as specified in the * element, like 'b64'. * * @var string */ protected $_contentFormat = 'chr'; /** * The command ID () of the currently parsed sync command. * * This is different from the command ID of the command itself. * * @var integer */ protected $_itemCmdID; /** * Name of the currently parsed sync command, like 'Add'. * * @var string */ protected $_elementType; /** * Whether a element has indicated that the sync command is * split into several SyncML message chunks. * * @var boolean */ protected $_itemMoreData; /** * The size of the data item of the currently parsed sync command in bytes * as specified by a element. * * @var integer */ protected $_itemSize; /** * Start element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::startElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. * @param array $attrs A hash with the element's attributes. */ public function startElement($uri, $element, $attrs) { parent::startElement($uri, $element, $attrs); $state = $GLOBALS['backend']->state; switch (count($this->_stack)) { case 2: if ($element == 'Replace' || $element == 'Add' || $element == 'Delete') { $this->_contentType = 'text/plain'; $this->_elementType = $element; $this->_itemSize = null; } break; case 3: if ($element == 'Item') { if (isset($state->curSyncItem)) { // Copy from state in case of . $this->_curItem = $state->curSyncItem; // Set CmdID to the current CmdId, not the initial one // from the first message. $this->_curItem->cmdID = $this->_itemCmdID; } else { $this->_curItem = new Horde_SyncMl_SyncElement( $state->getSync($this->_targetURI), $this->_elementType, $this->_itemCmdID, $this->_itemSize); } $this->_itemMoreData = false; } } } /** * End element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::endElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. */ public function endElement($uri, $element) { switch (count($this->_stack)) { case 3: switch ($element) { case 'LocURI': if (!isset($this->_currentSyncElement)) { if ($this->_stack[1] == 'Source') { $this->_sourceURI = trim($this->_chars); } elseif ($this->_stack[1] == 'Target') { $this->_targetURI = trim($this->_chars); } } break; case 'Item': if ($this->_itemMoreData) { // Store to continue in next session. $GLOBALS['backend']->state->curSyncItem = $this->_curItem; } else { // Finished. Store to syncElements[]. if (empty($this->_curItem->contentType)) { $this->_curItem->contentType = $this->_contentType; } if (empty($this->_curItem->contentFormat)) { $this->_curItem->contentFormat = $this->_contentFormat; } $this->_syncElements[] = $this->_curItem; // @todo: check if size matches strlen(content) when // size>0, esp. in case of . // Unset the saved state item if it was not unset in // endElement(). if (isset($GLOBALS['backend']->state->curSyncItem)) { unset($GLOBALS['backend']->state->curSyncItem); } unset($this->_curItem); } break; case 'CmdID': $this->_itemCmdID = trim($this->_chars); break; } break; case 4: switch ($element) { case 'Format': if ($this->_stack[2] == 'Meta') { $this->_contentFormat = trim($this->_chars); } break; case 'Type': if ($this->_stack[2] == 'Meta') { $this->_contentType = trim($this->_chars); } break; case 'Data': // Trim only if we had a MoreData tag before to not corrupt // pictures. if (isset($GLOBALS['backend']->state->curSyncItem)) { $this->_curItem->content .= ltrim($this->_chars); unset($GLOBALS['backend']->state->curSyncItem); } else { // Don't trim, because we have to check the raw content's // size. $this->_curItem->content .= $this->_chars; } break; case 'MoreData': $this->_itemMoreData = true; break; case 'Size': $this->_itemSize = $this->_chars; break; } break; case 5: switch ($element) { case 'LocURI': if ($this->_stack[3] == 'Source') { $this->_curItem->cuid = trim($this->_chars); } elseif ($this->_stack[3] == 'Target') { // Not used: we ignore "suid proposals" from client. } break; case 'Format': if ($this->_stack[3] == 'Meta') { $this->_curItem->contentFormat = trim($this->_chars); } break; case 'Type': $this->_curItem->contentType = trim($this->_chars); break; } break; case 6: if ($element == 'Type') { $this->_curItem->contentType = trim($this->_chars); } break; } parent::endElement($uri, $element); } /** * Implements the actual business logic of the Sync command. */ public function handleCommand($debug = false) { $state = $GLOBALS['backend']->state; // Handle unauthenticated first. if (!$state->authenticated) { $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_INVALID_CREDENTIALS); return; } if ($debug) { $sync = &$state->getSync($this->_targetURI); $sync = new Horde_SyncMl_Sync(Horde_SyncMl::ALERT_TWO_WAY, $this->_targetURI, $this->_sourceURI, 0, 0, 0); } else { $sync = &$state->getSync($this->_targetURI); $sync->addSyncReceived(); if (!is_object($sync)) { $GLOBALS['backend']->logMessage( 'No sync object found for URI ' . $this->_targetURI, 'ERR'); // @todo: create meaningful status code here. } } /* @todo: Check: do we send a status for every sync or only once after * one sync is completed? * SE K750 expects Status response to be sent before Sync output * by server is produced. */ $this->_outputHandler->outputStatus($this->_cmdID, $this->_cmdName, Horde_SyncMl::RESPONSE_OK, $this->_targetURI, $this->_sourceURI); // Here's where client modifications are processed. $device = $state->getDevice(); $omit = $device->omitIndividualSyncStatus(); foreach ($this->_syncElements as $item) { $result = $sync->handleClientSyncItem($this->_outputHandler, $item); if (!$omit) { $this->_outputStatus($item); } } if ($this->_itemMoreData) { // Last item had element, produce appropriate response. $this->_outputHandler->outputStatus( $state->curSyncItem->cmdID, $state->curSyncItem->elementType, Horde_SyncMl::RESPONSE_CHUNKED_ITEM_ACCEPTED_AND_BUFFERED, '', $state->curSyncItem->cuid); // @todo: check if we have to send Alert NEXT_MESSAGE here! } } /** * Creates the response for one Add|Replace|Delete SyncElement. * * @param Horde_SyncMl_SyncElement $element The element for which the status is * to be created. */ protected function _outputStatus($element) { // @todo: produce valid status $this->_outputHandler->outputStatus($element->cmdID, $element->elementType, $element->responseCode, '', $element->cuid); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command/SyncHdr.php0000664000175000017500000001532612700700443020633 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command_SyncHdr extends Horde_SyncMl_Command { /** * Name of the command. * * @var string */ protected $_cmdName = 'SyncHdr'; /** * Username as specified in the element. * * @var string */ public $user; /** * Id of this SyncML session as specified in the element. * * This is not to confuse with the PHP session id, though it is part of * the generated PHP session id. * * @var string */ protected $_sessionID; /** * SyncML protocol version as specified in the element. * * 0 for SyncML 1.0, 1 for SyncML 1.1, etc. * * @var integer */ protected $_version; /** * Id of the current message as specified in the element. * * @var integer */ protected $_message; /** * The target URI as specified by the element. * * This is normally the URL of the Horde RPC server. However the client is * free to send anything. * * @var string */ protected $_targetURI; /** * The source URI as specified by the element. * * @var string */ protected $_sourceURI; /** * Authentication credential as specified by the element. * * @var string */ public $credData; /** * Encoding format of $credData as specified in the * element like 'b64'. * * @var string */ public $credFormat; /** * Media type of $credData as specified in the element * like 'auth-basic'. * * @var string */ public $credType; /** * Maximum size of a SyncML message in bytes as specified by the * element. * * @var integer */ protected $_maxMsgSize; /** * Maximum size of a SyncML object in bytes as specified by the * element. * * @var integer */ protected $_maxObjSize; /** * End element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::endElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. */ public function endElement($uri, $element) { switch (count($this->_stack)) { case 2: if ($element == 'VerProto') { // if (trim($this->_chars) == 'SyncML/1.1') { $this->_version = 1; } elseif (trim($this->_chars) == 'SyncML/1.2') { $this->_version = 2; } else { $this->_version = 0; } } elseif ($element == 'SessionID') { // $this->_sessionID = trim($this->_chars); } elseif ($element == 'MsgID') { // $this->_message = intval(trim($this->_chars)); } break; case 3: if ($element == 'LocURI') { if ($this->_stack[1] == 'Source') { // $this->_sourceURI = trim($this->_chars); } elseif ($this->_stack[1] == 'Target') { // $this->_targetURI = trim($this->_chars); } } elseif ($element == 'LocName') { if ($this->_stack[1] == 'Source') { // $this->user = trim($this->_chars); } } elseif ($element == 'Data') { // if ($this->_stack[1] == 'Cred') { $this->credData = trim($this->_chars); } } elseif ($element == 'MaxMsgSize') { // $this->_maxMsgSize = intval($this->_chars); } elseif ($element == 'MaxObjSize') { // $this->_maxObjSize = intval($this->_chars); } break; case 4: if ($this->_stack[1] == 'Cred') { if ($element == 'Format') { // $this->credFormat = trim($this->_chars); } elseif ($element == 'Type') { // $this->credType = trim($this->_chars); } } break; } parent::endElement($uri, $element); } /** * Starts the PHP session and instantiates the global Horde_SyncMl_State object * if doesn't exist yet. */ public function setupState() { global $backend; $backend->sessionStart($this->_sourceURI, $this->_sessionID); if (!$backend->state) { $backend->logMessage( 'New session created: ' . session_id(), 'DEBUG'); $backend->state = new Horde_SyncMl_State($this->_sourceURI, $this->user, $this->_sessionID); } else { $backend->logMessage('Existing session continued: ' . session_id(), 'DEBUG'); } $backend->state->setVersion($this->_version); $backend->state->messageID = $this->_message; $backend->state->targetURI = $this->_targetURI; $backend->state->sourceURI = $this->_sourceURI; $backend->state->sessionID = $this->_sessionID; if (!empty($this->_maxMsgSize)) { $backend->state->maxMsgSize = $this->_maxMsgSize; } if (!empty($this->_maxObjSize)) { $backend->state->maxObjSize = $this->_maxObjSize; } $backend->setupState(); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Device/Nokia.php0000664000175000017500000000644612700700443020146 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Device_Nokia extends Horde_SyncMl_Device { /** * Converts the content received from the client for the backend. * * @param string $content The content to convert. * @param string $contentType The content type of the content. * * @return array Two-element array with the converted content and the * (possibly changed) new content type. */ public function convertClient2Server($content, $contentType) { list($content, $contentType) = parent::convertClient2Server($content, $contentType); /* At least the Nokia E series seems to prefix category values with * X-, see bugs #6849 and #7824. */ $di = $GLOBALS['backend']->state->deviceInfo; if ($di->Mod[0] == 'E') { $content = preg_replace('/(\r\n|\r|\n)CATEGORIES:X-/', '\1CATEGORIES:', $content, 1); } $GLOBALS['backend']->logFile( Horde_SyncMl_Backend::LOGFILE_DATA, "\nInput converted for server ($contentType):\n$content\n"); return array($content, $contentType); } /** * Converts the content from the backend to a format suitable for the * client device. * * Strips the UID (primary key) information as client and server might use * different ones. * * Charset conversions might be added here too. * * @param string $content The content to convert * @param string $contentType The content type of content as returned * from the backend * @param string $database The server database URI. * * @return array Three-element array with the converted content, the * (possibly changed) new content type, and encoding type * (like b64 as used by Funambol). */ public function convertServer2Client($content, $contentType, $database) { $database = $GLOBALS['backend']->normalize($database); list($content, $contentType, $encodingType) = parent::convertServer2Client($content, $contentType, $database); $content = preg_replace('/(\r\n|\r|\n)PHOTO;ENCODING=b[^:]*:(.+?)(\r\n|\r|\n)/', '\1PHOTO;ENCODING=BASE64:\1\2\1\1', $content, 1); $GLOBALS['backend']->logFile( Horde_SyncMl_Backend::LOGFILE_DATA, "\nOutput converted for client ($contentType):\n$content\n"); return array($content, $contentType, null); } public function handleTasksInCalendar() { return true; } /** * Some devices accept datetimes only in local time format: * DTSTART:20061222T130000 * instead of the more robust (and default) UTC time: * DTSTART:20061222T110000Z */ public function useLocalTime() { return true; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Device/P800.php0000664000175000017500000001405712700700443017531 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Device_P800 extends Horde_SyncMl_Device { /** * Convert the content. * * @param string $content The content to convert. * @param string $contentType The contentType of the content. * @return array array($newcontent, $newcontentType): * the converted content and the * (possibly changed) new ContentType. */ public function convertClient2Server($content, $contentType) { list($content, $contentType) = parent::convertClient2Server($content, $contentType); /* P800 sends categories as "X-Category". Remove the "X-". * @todo: This hack only works with a single category. */ $content = preg_replace('/(\r\n|\r|\n)CATEGORIES:X-/', '\1CATEGORIES:', $content, 1); /* P800 sends all day events as s.th. like * DTSTART:20050505T000000Z^M * DTEND:20050505T240000Z^M * This is no longer an all day event when converted to local timezone. * So manually handle this. */ if (preg_match('/(\r\n|\r|\n)DTSTART:.*T000000Z(\r\n|\r|\n)/', $content) && preg_match('/(\r\n|\r|\n)DTEND:(\d\d\d\d)(\d\d)(\d\d)T240000Z(\r\n|\r|\n)/', $content, $m)) { $content = preg_replace( '/(\r\n|\r|\n)DTSTART:(.*)T000000Z(\r\n|\r|\n)/', "$1DTSTART;VALUE=DATE:$2$3", $content); /* End timestamp must be converted to next day's date. Or maybe * not? */ $s = date('Ymd', mktime(0, 0, 0, $m[3], $m[4], $m[2]) /* + 24*3600 */); $content = preg_replace( '/(\r\n|\r|\n)DTEND:(.*)T240000Z(\r\n|\r|\n)/', "$1DTEND;VALUE=DATE:$s$3", $content); } $GLOBALS['backend']->logFile( Horde_SyncMl_Backend::LOGFILE_DATA, "\ninput converted for server ($contentType):\n$content\n"); return array($content, $contentType); } /** * Converts the content from the backend to a format suitable for the * client device. * * Strips the uid (primary key) information as client and server might use * different ones. * * @param string $content The content to convert * @param string $contentType The content type of content as returned * from the backend * @param string $database The server database URI. * * @return array Three-element array with the converted content, the * (possibly changed) new content type, and encoding type * (like b64 as used by Funambol). */ public function convertServer2Client($content, $contentType, $database) { list($content, $contentType, $encodingType) = parent::convertServer2Client($content, $contentType, $database); /* Convert all day events. */ if (preg_match('/(\r\n|\r|\n)DTSTART:(\d{8})T000000/', $content) && preg_match('/(\r\n|\r|\n)DTEND:(\d\d\d\d)(\d\d)(\d\d)T235959/', $content, $m)) { /* @TODO: This is for P990. Check if it's different for P900. * This might require T000000Z rather than T000000 */ /* The P990 seems to require this to recognize an entry as all day: */ $a = $m[1] . 'X-EPOCAGENDAENTRYTYPE:EVENT'; $content = preg_replace('/(\r\n|\r|\n)DTSTART:(\d{8})T000000/', "$a$1DTSTART:$2T000000", $content); /* End date must be converted to timestamp. */ $s = date('Ymd', mktime(0, 0, 0, $m[3], $m[4]+1, $m[2])); $content = preg_replace('/(\r\n|\r|\n)DTEND:(\d{8})T235959/', "$1DTEND:${s}T000000", $content); } $l = "\noutput converted for client ($contentType):\n" . $content . "\n"; $GLOBALS['backend']->logFile(Horde_SyncMl_Backend::LOGFILE_DATA, $l); return array($content, $contentType, $encodingType); } /** * Some devices like the Sony Ericsson P800/P900/P910 handle vtodos (tasks) * and vevents in the same "calendar" sync. * This requires special actions on our side as we store this in different * databases (nag and kronolith). * This public function could directly return true but tries to be a bit more * generic so it might work for other phones as well. */ public function handleTasksInCalendar() { $di = $GLOBALS['backend']->state->deviceInfo; if (isset($di->CTCaps['text/x-vcalendar']) && !empty($di->CTCaps['text/x-vcalendar']['BEGIN']->ValEnum['VEVENT']) && !empty($di->CTCaps['text/x-vcalendar']['BEGIN']->ValEnum['VTODO'])) { return true; } return parent::handleTasksInCalendar(); } /** * Send individual status response for each Add,Delete,Replace. * The P800 class of devices seem to have trouble with too many * status responses. So omit them for these (and only these), */ public function omitIndividualSyncStatus() { return true; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Device/Sync4j.php0000664000175000017500000014046512700700443020257 0ustar janjan' which should be the default anyhow. * * Copyright 2005-2016 Horde LLC (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @author Karsten Fourmont * @package SyncMl */ class Horde_SyncMl_Device_sync4j extends Horde_SyncMl_Device { public function getPreferredContentTypeClient($serverSyncURI, $sourceSyncURI) { $contentType = parent::getPreferredContentTypeClient($serverSyncURI, $sourceSyncURI); switch ($contentType) { case 'text/x-s4j-sifn' : case 'text/x-sifn' : $contentType = 'text/x-vnote'; break; case 'text/x-s4j-sifc' : case 'text/x-sifc' : $contentType = 'text/x-vcard'; break; case 'text/x-s4j-sife' : case 'text/x-sife' : $contentType = 'text/calendar'; break; case 'text/x-s4j-sift' : case 'text/x-sift' : $contentType = 'text/calendar'; break; } return $contentType; } /** * Convert the content. */ public function convertClient2Server($content, $contentType) { list($content, $contentType) = parent::convertClient2Server($content, $contentType); switch ($contentType) { case 'text/x-s4j-sifn' : case 'text/x-sifn' : $content = Horde_SyncMl_Device_sync4j::sif2vnote($content); $contentType = 'text/x-vnote'; break; case 'text/x-s4j-sifc' : case 'text/x-sifc' : $content = Horde_SyncMl_Device_sync4j::sif2vcard($content); $contentType = 'text/x-vcard'; break; case 'text/x-s4j-sife' : case 'text/x-sife' : $content = Horde_SyncMl_Device_sync4j::sif2vevent($content); $contentType = 'text/calendar'; break; case 'text/x-s4j-sift' : case 'text/x-sift' : $content = Horde_SyncMl_Device_sync4j::sif2vtodo($content); $contentType = 'text/calendar'; break; case 'text/calendar': case 'text/x-vcalendar': $si = $GLOBALS['backend']->state->sourceURI; if (stristr($si, 'fol-') !== false) { // The Funambol Outlook connector uses invalid STATUS // values. Actually it maps MeetingStatus values of the // Outlook event to the STATUS property, which is // completely useless. So drop the STATUS altogether. $content = preg_replace('/^STATUS:.*\r?\n/im', '', $content); } break; } $GLOBALS['backend']->logFile( Horde_SyncMl_Backend::LOGFILE_DATA, "\nInput converted for server ($contentType):\n$content\n"); return array($content, $contentType); } /** * Converts the content from the backend to a format suitable for the * client device. * * Strips the uid (primary key) information as client and server might use * different ones. * * @param string $content The content to convert * @param string $contentType The content type of content as returned * from the backend * @param string $database The server database URI. * * @return array Three-element array with the converted content, the * (possibly changed) new content type, and encoding type * (like b64 as used by Funambol). */ public function convertServer2Client($content, $contentType, $database) { $database = $GLOBALS['backend']->normalize($database); list($content, $contentType, $encodingType) = parent::convertServer2Client($content, $contentType, $database); if ($this->requestedContentType == $contentType) { if ($contentType == 'text/calendar' || $contentType == 'text/x-vcalendar') { $si = $GLOBALS['backend']->state->sourceURI; if (stristr($si, 'fol-') !== false) { // The Funambol Outlook connector uses invalid STATUS // values. Actually it maps MeetingStatus values of the // Outlook event to the STATUS property, which is // completely useless. So drop the STATUS altogether. $content = preg_replace('/^STATUS:.*\r?\n/im', '', $content); } } return array($content, $contentType, $encodingType); } switch ($contentType) { case 'text/calendar' : case 'text/x-vcalendar' : switch($database) { case 'calendar': $content = Horde_SyncMl_Device_sync4j::vevent2sif($content); $content = base64_encode($content); $contentType = 'text/x-s4j-sife'; break 2; case 'tasks': $content = Horde_SyncMl_Device_sync4j::vtodo2sif($content); $content = base64_encode($content); $contentType = 'text/x-s4j-sift'; break 2; } break; case 'text/x-vcard' : $content = Horde_SyncMl_Device_sync4j::vcard2sif($content); $content = base64_encode($content); $contentType = 'text/x-s4j-sifc'; break; case 'text/x-vnote': case 'text/plain': $content = Horde_SyncMl_Device_sync4j::vnote2sif($content); $content = base64_encode($content); $contentType = 'text/x-s4j-sifn'; break; } $l = "\nOutput converted for client ($contentType):\n" . base64_decode($content) . "\n"; $GLOBALS['backend']->logFile(Horde_SyncMl_Backend::LOGFILE_DATA, $l); return array($content, $contentType, 'b64'); } /** * Decodes a sif xml string to an associative array. * * Quick hack to convert from text/vcard and text/vcalendar to * Sync4J's proprietery sif datatypes and vice versa. For details * about the sif format see the appendix of the developer guide on * www.sync4j.org. * * @access private * * @param string $sif A sif string like v1>v2 * * @return array Assoc array in utf8 like array ('k1' => 'v1>', 'k2' => 'v2'); */ public function sif2array($sif) { $r = array(); if (preg_match_all('/<([^>]*)>([^<]*)<\/\1>/si', $sif, $matches, PREG_SET_ORDER)) { foreach ($matches as $match) { if (isset($r[$match[1]])) { if (!is_array($r[$match[1]])) { $r[$match[1]] = array($r[$match[1]]); } $r[$match[1]][] = html_entity_decode($match[2]); } else { $r[$match[1]] = html_entity_decode($match[2]); } } } return $r; } /** * Converts a hash to a SIF XML structure. * * @param array $array A hash. * @param string $pre A prefix string for the XML result. * @param string $post A suffix string for the XML result. * * @return string The resulting XML string. */ public function array2sif($array, $pre = '', $post = '') { $xml = $pre; foreach ($array as $key => $value) { if (is_a($value, 'PEAR_Error')) { continue; } if (is_array($value)) { if (is_array($value[0])) { $subxml = ''; foreach ($value as $val) { $subkey = key($val); $subxml .= '<' . $subkey . '>' . htmlspecialchars($val[$subkey]) . ''; } $xml .= '<' . $key . '>' . $subxml . ''; continue; } $value = $value[0]; } $xml .= '<' . $key . '>' . htmlspecialchars($value) . ''; } return $xml . $post; } public function sif2vnote($sif) { $a = Horde_SyncMl_Device_sync4j::sif2array($sif); $iCal = new Horde_Icalendar(); $iCal->setAttribute('VERSION', '1.1'); $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN'); $iCal->setAttribute('METHOD', 'PUBLISH'); $vnote = Horde_Icalendar::newComponent('vnote', $iCal); $vnote->setAttribute('BODY', isset($a['Body']) ? $a['Body'] : ''); if (isset($a['Subject'])) { $vnote->setAttribute('SUMMARY', $a['Subject']); } if (isset($a['Categories'])) { $vnote->setAttribute('CATEGORIES', $a['Categories']); } return $vnote->exportvCalendar(); } public function sif2vcard($sif) { $a = Horde_SyncMl_Device_sync4j::sif2array($sif); $iCal = new Horde_Icalendar(); $iCal->setAttribute('VERSION', '3.0'); $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN'); $iCal->setAttribute('METHOD', 'PUBLISH'); $vcard = Horde_Icalendar::newComponent('vcard', $iCal); $map = array( 'FileAs' => array('FN'), 'NickName' => array('NICKNAME'), 'HomeTelephoneNumber' => array('TEL', array('TYPE' => 'HOME')), 'Home2TelephoneNumber' => array('TEL', array('TYPE' => 'HOME')), 'HomeFaxNumber' => array('TEL', array('TYPE' => 'HOME')), 'BusinessTelephoneNumber' => array('TEL', array('TYPE' => 'WORK')), 'Business2TelephoneNumber' => array('TEL', array('TYPE' => 'WORK')), 'BusinessFaxNumber' => array('TEL', array('TYPE' => 'FAX')), 'PrimaryTelephoneNumber' => array('TEL', array('TYPE' => 'PREF')), 'MobileTelephoneNumber' => array('TEL', array('TYPE' => 'CELL')), 'CarTelephoneNumber' => array('TEL', array('TYPE' => 'CAR')), 'PagerNumber' => array('TEL', array('TYPE' => 'PAGER')), 'OtherTelephoneNumber' => array('TEL'), 'OtherFaxNumber' => array('TEL'), 'Email1Address' => array('EMAIL'), 'Email2Address' => array('EMAIL', array('TYPE' => 'HOME')), 'Email3Address' => array('EMAIL', array('TYPE' => 'WORK')), 'HomeLabel' => array('LABEL', array('TYPE' => 'HOME')), 'BusinessLabel' => array('LABEL', array('TYPE' => 'WORK')), 'OtherLabel' => array('LABEL'), 'Profession' => array('ROLE'), 'JobTitle' => array('TITLE'), 'Body' => array('NOTE'), 'WebPage' => array('URL'), 'Birthday' => array('BDAY'), 'Categories' => array('CATEGORIES'), 'Timezone' => array('TZ'), 'Anniversary' => array('X-ANNIVERSARY'), 'Spouse' => array('X-SPOUSE'), 'Children' => array('X-CHILDREN'), ); foreach ($map as $sif_value => $vcard_value) { if (isset($a[$sif_value])) { $vcard->setAttribute($vcard_value[0], $a[$sif_value], isset($vcard_value[1]) ? $vcard_value[1] : array()); } } $map = array( array( 'N', array(Horde_Icalendar_Vcard::N_FAMILY => 'LastName', Horde_Icalendar_Vcard::N_GIVEN => 'FirstName', Horde_Icalendar_Vcard::N_ADDL => 'MiddleName', Horde_Icalendar_Vcard::N_PREFIX => 'Title', Horde_Icalendar_Vcard::N_SUFFIX => 'Suffix'), array(), false), array( 'ADR', array(Horde_Icalendar_Vcard::ADR_POB => 'HomeAddressPostOfficeBox', Horde_Icalendar_Vcard::ADR_EXTEND => '', Horde_Icalendar_Vcard::ADR_STREET => 'HomeAddressStreet', Horde_Icalendar_Vcard::ADR_LOCALITY => 'HomeAddressCity', Horde_Icalendar_Vcard::ADR_REGION => 'HomeAddressState', Horde_Icalendar_Vcard::ADR_POSTCODE => 'HomeAddressPostalCode', Horde_Icalendar_Vcard::ADR_COUNTRY => 'HomeAddressCountry'), array('TYPE' => 'HOME'), true), array( 'ADR', array(Horde_Icalendar_Vcard::ADR_POB => 'BusinessAddressPostOfficeBox', Horde_Icalendar_Vcard::ADR_EXTEND => '', Horde_Icalendar_Vcard::ADR_STREET => 'BusinessAddressStreet', Horde_Icalendar_Vcard::ADR_LOCALITY => 'BusinessAddressCity', Horde_Icalendar_Vcard::ADR_REGION => 'BusinessAddressState', Horde_Icalendar_Vcard::ADR_POSTCODE => 'BusinessAddressPostalCode', Horde_Icalendar_Vcard::ADR_COUNTRY => 'BusinessAddressCountry'), array('TYPE' => 'WORK'), true), array( 'ADR', array(Horde_Icalendar_Vcard::ADR_POB => 'OtherAddressPostOfficeBox', Horde_Icalendar_Vcard::ADR_EXTEND => '', Horde_Icalendar_Vcard::ADR_STREET => 'OtherAddressStreet', Horde_Icalendar_Vcard::ADR_LOCALITY => 'OtherAddressCity', Horde_Icalendar_Vcard::ADR_REGION => 'OtherAddressState', Horde_Icalendar_Vcard::ADR_POSTCODE => 'OtherAddressPostalCode', Horde_Icalendar_Vcard::ADR_COUNTRY => 'OtherAddressCountry'), array(), true), ); foreach ($map as $struct) { $values = array(); foreach ($struct[1] as $vcard_value => $sif_value) { $values[$vcard_value] = isset($a[$sif_value]) ? $a[$sif_value] : ''; } $check = array_flip($values); if (count($check) > 1 || strlen(key($check))) { $vcard->setAttribute($struct[0], implode(';', $values), $struct[2], $struct[3], $values); } } $org = array(); if (isset($a['CompanyName'])) { $org[] = $a['CompanyName']; if (isset($a['Department'])) { $org[] = $a['Department']; } } if (count($org)) { $vcard->setAttribute('ORG', null, array(), true, $org); } return $vcard->exportvCalendar(); } public function sif2vevent($sif) { $a = Horde_SyncMl_Device_sync4j::sif2array($sif); $iCal = new Horde_Icalendar(); $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN'); $iCal->setAttribute('METHOD', 'PUBLISH'); $vEvent = Horde_Icalendar::newComponent('vevent', $iCal); $vEvent->setAttribute('DTSTAMP', time()); $map = array('Subject' => 'SUMMARY', 'Body' => 'DESCRIPTION', 'Categories' => 'CATEGORIES', 'Location' => 'LOCATION'); foreach ($map as $source => $target) { if (!empty($a[$source])) { $vEvent->setAttribute($target, $a[$source]); } } if ($a['AllDayEvent'] == 1) { // Not exactly correct, we ignore the start and end time of // all-day events and simple assume that the client had set them // correctly to 0:00. $startTime = $iCal->_parseDateTime($a['Start']); $vEvent->setAttribute('DTSTART', array('year' => date('Y', $startTime), 'month' => date('m', $startTime), 'mday' => date('d', $startTime)), array('VALUE' => 'DATE')); $t = $iCal->_parseDateTime($a['End']); $d = new Horde_Date(array('year' => date('Y', $t), 'month' => date('m', $t), 'mday' => date('d', $t) + 1)); $vEvent->setAttribute('DTEND',$d, array('VALUE' => 'DATE')); } else { $startTime = $iCal->_parseDateTime($a['Start']); $vEvent->setAttribute('DTSTART', $startTime); $vEvent->setAttribute('DTEND', $iCal->_parseDateTime($a['End'])); } if (isset($a['IsRecurring']) && $a['IsRecurring'] == 1) { $interval = ''; switch ($a['RecurrenceType']) { case 0: /* olDaily */ if (!empty($a['DayOfWeekMask'])) { $freq = 'WEEKLY'; $interval = ';INTERVAL=1'; } else { $freq = 'DAILY'; $interval = ';INTERVAL=' . $a['Interval']; } break; case 1: /* olWeekly */ $freq = 'WEEKLY'; $interval = ';INTERVAL=' . $a['Interval']; break; case 2: /* olMonthly */ $freq = 'MONTHLY'; $interval = ';INTERVAL=' . $a['Interval']; break; case 3: /* olMonthNth */ $freq = 'MONTHLY'; $interval = ';INTERVAL=' . $a['Interval']; break; case 5: /* olYearly */ $freq = 'YEARLY'; $interval = ';INTERVAL=' . $a['Interval']; break; case 6: /* olYearNth */ $freq = 'YEARLY'; $interval = ';INTERVAL=' . $a['Interval']; break; } $rrule = 'FREQ=' . $freq; if (isset($a['Occurrences'])) { $rrule .= ';COUNT=' . $a['Occurrences']; } elseif (!isset($a['NoEndDate']) || $a['NoEndDate'] != 1) { $rrule .= ';UNTIL=' . $a['PatternEndDate']; } $rrule .= $interval; if (!empty($a['DayOfMonth'])) { $rrule .= ';BYMONTHDAY=' . $a['DayOfMonth']; } if (!empty($a['MonthOfYear'])) { $rrule .= ';BYMONTH=' . $a['MonthOfYear']; } if (!empty($a['DayOfWeekMask'])) { $rrule .= ';BYDAY='; $icaldays = array('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); for ($i = $flag = 0; $i <= 7 ; ++$i) { if (pow(2, $i) & $a['DayOfWeekMask']) { if ($flag) { $rrule .= ','; } $rrule .= $icaldays[$i]; $flag = true; } } } $vEvent->setAttribute('RRULE', $rrule); } if (isset($a['ExcludeDate'])) { $dates = array(); if (!is_array($a['ExcludeDate'])) { $dates[] = $a['AllDayEvent'] == 1 ? $iCal->_parseDate($a['ExcludeDate']) : $iCal->_parseDateTime($a['ExcludeDate']); } else { foreach ($a['ExcludeDate'] as $date) { $dates[] = $a['AllDayEvent'] == 1 ? $iCal->_parseDate($date) : $iCal->_parseDateTime($date); } } if ($a['AllDayEvent'] == 1) { $vEvent->setAttribute('EXDATE', $dates, array('VALUE' => 'DATE')); } else { $vEvent->setAttribute('EXDATE', $dates); } } if (isset($a['ReminderSet']) && $a['ReminderSet'] == 1) { $vEvent->setAttribute('AALARM', $startTime - $a['ReminderMinutesBeforeStart'] * 60); } if (isset($a['BusyStatus'])) { switch ($a['BusyStatus']) { case 0: /* olFree - FREE is not a iCalendar standard value. */ $vEvent->setAttribute('STATUS', 'FREE'); break; case 1: /* olTentative */ $vEvent->setAttribute('STATUS', 'TENTATIVE'); break; case 2: /* olBusy */ case 3: /* olOutOfOffice */ $vEvent->setAttribute('STATUS', 'CONFIRMED'); break; } } if (isset($a['Sensitivity'])) { switch ($a['Sensitivity']) { case 0: /* olNormal - FREE is not a iCalendar standard value. */ $vEvent->setAttribute('CLASS', 'PUBLIC'); break; case 1: /* olPersonal */ case 2: /* olPrivate */ $vEvent->setAttribute('CLASS', 'PRIVATE'); break; case 3: /* olConfidential */ $vEvent->setAttribute('CLASS', 'CONFIDENTIAL'); break; } } return $vEvent->exportvCalendar(); } public function sif2vtodo($sif) { $a = Horde_SyncMl_Device_sync4j::sif2array($sif); $iCal = new Horde_Icalendar(); $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN'); $iCal->setAttribute('METHOD', 'PUBLISH'); $vtodo = Horde_Icalendar::newComponent('vtodo', $iCal); $vtodo->setAttribute('SUMMARY', $a['Subject']); $vtodo->setAttribute('DESCRIPTION', $a['Body']); if ($a['Importance'] == 0) { $vtodo->setAttribute('PRIORITY', 5); } elseif ($a['Importance'] == 2) { $vtodo->setAttribute('PRIORITY', 1); } else { $vtodo->setAttribute('PRIORITY', 3); } if (!empty($a['StartDate']) && $a['StartDate'] != '45001231T230000Z') { $vtodo->setAttribute('DTSTART', $iCal->_parseDateTime($a['StartDate'])); } $dueSet = false; if (!empty($a['DueDate']) && $a['DueDate'] != '45001231T230000Z') { $vtodo->setAttribute('DUE', $iCal->_parseDateTime($a['DueDate'])); $dueSet = true; } if (!empty($a['ReminderSet'])) { if (!$dueSet) { $vtodo->setAttribute('DUE', $iCal->_parseDateTime($a['ReminderTime'])); } $vtodo->setAttribute('AALARM', $iCal->_parseDateTime($a['ReminderTime'])); } if (!empty($a['Complete'])) { $vtodo->setAttribute('STATUS', 'COMPLETED'); } $vtodo->setAttribute('CATEGORIES', isset($a['Categories']) ? $a['Categories'] : ''); if (isset($a['Sensitivity'])) { switch ($a['Sensitivity']) { case 0: /* olNormal */ $vtodo->setAttribute('CLASS', 'PUBLIC'); break; case 1: /* olPersonal */ case 2: /* olPrivate */ $vtodo->setAttribute('CLASS', 'PRIVATE'); break; case 3: /* olConfidential */ $vtodo->setAttribute('CLASS', 'CONFIDENTIAL'); break; } } return $vtodo->exportvCalendar(); } public function vnote2sif($vnote) { $iCal = new Horde_Icalendar(); if (!$iCal->parsevCalendar($vnote)) { // handle plain text: $a = array('Body' => $vnote); } else { $components = $iCal->getComponents(); if (!is_array($components) || count($components) == 0) { $a = array( 'Body' => $GLOBALS['backend']->t("Error converting notes.")); } else { $a = array( 'Body' => $components[0]->getAttribute('BODY'), 'Categories' => $components[0]->getAttributeDefault('CATEGORIES', '')); try { $sum = $components[0]->getAttribute('SUMMARY'); $a['Subject'] = $sum; } catch (Horde_Icalendar_Exception $e) { } } } return Horde_SyncMl_Device_sync4j::array2sif($a, '', ''); } public function vcard2sif($vcard) { $iCal = new Horde_Icalendar(); if (!$iCal->parsevCalendar($vcard)) { // @TODO: NEVER use die() in a library. die("There was an error importing the data."); } $components = $iCal->getComponents(); switch (count($components)) { case 0: // @TODO: NEVER use die() in a library. die("No data was found."); case 1: $content = $components[0]; break; default: // @TODO: NEVER use die() in a library. die("Multiple components found; only one is supported."); } // from here on, the code is taken from // Turba_Driver::toHash, v 1.65 2005/03/12 // and modified for the Sync4J attribute names. $attr = $content->getAllAttributes(); foreach ($attr as $item) { switch ($item['name']) { case 'FN': $hash['FileAs'] = $item['value']; break; case 'N': $name = $item['values']; $hash['LastName'] = $name[Horde_Icalendar_Vcard::N_FAMILY]; $hash['FirstName'] = $name[Horde_Icalendar_Vcard::N_GIVEN]; $hash['MiddleName'] = $name[Horde_Icalendar_Vcard::N_ADDL]; $hash['Title'] = $name[Horde_Icalendar_Vcard::N_PREFIX]; $hash['Suffix'] = $name[Horde_Icalendar_Vcard::N_SUFFIX]; break; case 'NICKNAME': $hash['NickName'] = $item['value']; break; // For vCard 3.0. case 'ADR': if (isset($item['params']['TYPE'])) { if (!is_array($item['params']['TYPE'])) { $item['params']['TYPE'] = array($item['params']['TYPE']); } } else { $item['params']['TYPE'] = array(); if (isset($item['params']['WORK'])) { $item['params']['TYPE'][] = 'WORK'; } if (isset($item['params']['HOME'])) { $item['params']['TYPE'][] = 'HOME'; } } $address = $item['values']; foreach ($item['params']['TYPE'] as $adr) { switch (Horde_String::upper($adr)) { case 'HOME': $prefix = 'HomeAddress'; break; case 'WORK': $prefix = 'BusinessAddress'; break; default: $prefix = 'HomeAddress'; } if ($prefix) { $hash[$prefix . 'Street'] = isset($address[Horde_Icalendar_Vcard::ADR_STREET]) ? $address[Horde_Icalendar_Vcard::ADR_STREET] : null; $hash[$prefix . 'City'] = isset($address[Horde_Icalendar_Vcard::ADR_LOCALITY]) ? $address[Horde_Icalendar_Vcard::ADR_LOCALITY] : null; $hash[$prefix . 'State'] = isset($address[Horde_Icalendar_Vcard::ADR_REGION]) ? $address[Horde_Icalendar_Vcard::ADR_REGION] : null; $hash[$prefix . 'PostalCode'] = isset($address[Horde_Icalendar_Vcard::ADR_POSTCODE]) ? $address[Horde_Icalendar_Vcard::ADR_POSTCODE] : null; $hash[$prefix . 'Country'] = isset($address[Horde_Icalendar_Vcard::ADR_COUNTRY]) ? $address[Horde_Icalendar_Vcard::ADR_COUNTRY] : null; $hash[$prefix . 'PostOfficeBox'] = isset($address[Horde_Icalendar_Vcard::ADR_POB]) ? $address[Horde_Icalendar_Vcard::ADR_POB] : null; } } break; case 'TEL': if (isset($item['params']['FAX'])) { if (isset($item['params']['WORK'])) { $hash['BusinessFaxNumber'] = $item['value']; } elseif (isset($item['params']['HOME'])) { $hash['HomeFaxNumber'] = $item['value']; } else { $hash['OtherFaxNumber'] = $item['value']; } } elseif (isset($item['params']['TYPE'])) { if (!is_array($item['params']['TYPE'])) { $item['params']['TYPE'] = array($item['params']['TYPE']); } // For vCard 3.0. foreach ($item['params']['TYPE'] as $tel) { if (Horde_String::upper($tel) == 'WORK') { $hash['BusinessTelephoneNumber'] = $item['value']; } elseif (Horde_String::upper($tel) == 'HOME') { $hash['HomeTelephoneNumber'] = $item['value']; } elseif (Horde_String::upper($tel) == 'CELL') { $hash['MobileTelephoneNumber'] = $item['value']; } elseif (Horde_String::upper($tel) == 'FAX') { $hash['BusinessFaxNumber'] = $item['value']; } } } else { if (isset($item['params']['HOME'])) { $hash['HomeTelephoneNumber'] = $item['value']; } elseif (isset($item['params']['WORK'])) { $hash['BusinessTelephoneNumber'] = $item['value']; } elseif (isset($item['params']['CELL'])) { $hash['MobileTelephoneNumber'] = $item['value']; } elseif (!isset($hash['HomeTelephoneNumber'])) { $hash['HomeTelephoneNumber'] = $item['value']; } } break; case 'EMAIL': $email_set = false; if (isset($item['params']['HOME']) && (!isset($hash['Email2Address']) || isset($item['params']['PREF']))) { $hash['Email2Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']); $email_set = true; } elseif (isset($item['params']['WORK']) && (!isset($hash['Email3Address']) || isset($item['params']['PREF']))) { $hash['Email3Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']); $email_set = true; } elseif (isset($item['params']['TYPE'])) { if (!is_array($item['params']['TYPE'])) { $item['params']['TYPE'] = array($item['params']['TYPE']); } if (in_array('HOME', $item['params']['TYPE']) && (!isset($hash['Email2Address']) || in_array('PREF', $item['params']['TYPE']))) { $hash['Email2Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']); $email_set = true; } elseif (in_array('WORK', $item['params']['TYPE']) && (!isset($hash['Email3Address']) || in_array('PREF', $item['params']['TYPE']))) { $hash['Email3Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']); $email_set = true; } } if (!$email_set && (!isset($hash['Email1Address']) || isset($item['params']['PREF']))) { $hash['Email1Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']); } break; case 'TITLE': $hash['JobTitle'] = $item['value']; break; case 'ORG': $values = preg_split('/(?', ''); } public function vevent2sif($vcard) { /* Some special handling for all-day vEvents that are not passed * as TYPE=DATE (TYPE=DATE does not exist for vCalendar 1.0) */ if (preg_match('/(\r\n|\r|\n)DTSTART:.*T000000(\r\n|\r|\n)/', $vcard)) { if (preg_match('/(\r\n|\r|\n)DTEND:(\d\d\d\d)(\d\d)(\d\d)T235959(\r\n|\r|\n)/', $vcard, $m)) { $vcard = preg_replace('/(\r\n|\r|\n)DTSTART:(.*)T000000(\r\n|\r|\n)/', "$1DTSTART;VALUE=DATE:$2$3", $vcard); $vcard = preg_replace('/(\r\n|\r|\n)DTEND:(.*)T235959(\r\n|\r|\n)/', "$1DTEND;VALUE=DATE:$2$3", $vcard); } // @TODO: else: handle case with DTEND= T240000 } $iCal = new Horde_Icalendar(); if (!$iCal->parsevCalendar($vcard)) { // @TODO: NEVER use die() in a library. die("There was an error importing the data."); } $components = $iCal->getComponents(); switch (count($components)) { case 0: // @TODO: NEVER use die() in a library. die("No data was found."); case 1: $content = $components[0]; break; default: // @TODO: NEVER use die() in a library. die("Multiple components found; only one is supported."); } $hash = array('ReminderSet' => 0, 'IsRecurring' => 0, 'BusyStatus' => 2); $alarm = $end = null; $start = $content->getAttribute('DTSTART'); $start_params = $content->getAttribute('DTSTART', true); if (!empty($start_params[0]['VALUE']) && $start_params[0]['VALUE'] == 'DATE') { $hash['AllDayEvent'] = 1; $hash['Start'] = sprintf('%04d-%02d-%02d', $start['year'], $start['month'], $start['mday']); $start = mktime(0, 0, 0, $start['month'], $start['mday'], $start['year']); } else { $hash['AllDayEvent'] = 0; $hash['Start'] = Horde_Icalendar::_exportDateTime($start); } foreach ($content->getAllAttributes() as $item) { $GLOBALS['backend']->logMessage( sprintf('Sync4j for name %s, value %s', $item['name'], is_string($item['value']) ? $item['value'] : var_export($item['value'], true)), 'DEBUG'); switch (Horde_String::upper($item['name'])) { case 'DTSTART': break; case 'DTEND': if (!empty($item['params']['VALUE']) && $item['params']['VALUE'] == 'DATE') { $hash['AllDayEvent'] = 1; $date = new Horde_Date($item['value']['year'], $item['value']['month'], $item['value']['mday']); $date->mday--; $hash['End'] = $date->format('Y-m-d'); $end = $date->datestamp(); } else { $hash['AllDayEvent'] = 0; $hash['End'] = Horde_Icalendar::_exportDateTime($item['value']); $end = $item['value']; } break; case 'SUMMARY': $hash['Subject'] = $item['value']; break; case 'DESCRIPTION': $hash['Body'] = $item['value']; break; case 'LOCATION': $hash['Location'] = $item['value']; break; case 'CATEGORIES': $hash['Categories'] = $item['value']; break; case 'AALARM': $hash['ReminderSet'] = 1; $alarm = $item['value']; break; case 'STATUS': switch (Horde_String::upper($item['value'])) { case 'FREE': case 'CANCELLED': $hash['BusyStatus'] = 0; break; case 'TENTATIVE': $hash['BusyStatus'] = 1; break; case 'CONFIRMED': $hash['BusyStatus'] = 2; break; } break; case 'CLASS': switch (Horde_String::upper($item['value'])) { case 'PUBLIC': $hash['Sensitivity'] = 0; break; case 'PRIVATE': $hash['Sensitivity'] = 2; break; case 'CONFIDENTIAL': $hash['Sensitivity'] = 3; break; } break; case 'RRULE': // Parse the recurrence rule into keys and values. $rdata = array(); $parts = explode(';', $item['value']); foreach ($parts as $part) { list($key, $value) = explode('=', $part, 2); $rdata[Horde_String::upper($key)] = $value; } if (!isset($rdata['FREQ'])) { break; } $hash['IsRecurring'] = 1; if (isset($rdata['BYDAY'])) { $maskdays = array('SU' => Horde_Date::MASK_SUNDAY, 'MO' => Horde_Date::MASK_MONDAY, 'TU' => Horde_Date::MASK_TUESDAY, 'WE' => Horde_Date::MASK_WEDNESDAY, 'TH' => Horde_Date::MASK_THURSDAY, 'FR' => Horde_Date::MASK_FRIDAY, 'SA' => Horde_Date::MASK_SATURDAY); $days = explode(',', $rdata['BYDAY']); $mask = 0; foreach ($days as $day) { $instance = (int)$day; $mask |= $maskdays[str_replace($instance, '', $day)]; } } $hash['Interval'] = isset($rdata['INTERVAL']) ? $rdata['INTERVAL'] : 1; switch (Horde_String::upper($rdata['FREQ'])) { case 'DAILY': $hash['RecurrenceType'] = 0; break; case 'WEEKLY': $hash['RecurrenceType'] = 1; if (isset($rdata['BYDAY'])) { $hash['DayOfWeekMask'] = $mask; } break; case 'MONTHLY': if (isset($rdata['BYDAY'])) { $hash['RecurrenceType'] = 3; $hash['Instance'] = $instance; $hash['DayOfWeekMask'] = $mask; } else { $hash['RecurrenceType'] = 2; $hash['DayOfMonth'] = date('j', $start); } break; case 'YEARLY': if (isset($rdata['BYDAY'])) { $hash['RecurrenceType'] = 6; $hash['Instance'] = $instance; $hash['DayOfWeekMask'] = $mask; } else { $hash['RecurrenceType'] = 5; $hash['DayOfMonth'] = date('j', $start); } $hash['MonthOfYear'] = date('n', $start); unset($hash['Interval']); break; } if (isset($rdata['UNTIL'])) { $hash['NoEndDate'] = 0; $hash['PatternEndDate'] = $rdata['UNTIL']; } elseif (isset($rdata['COUNT'])) { $hash['NoEndDate'] = 0; $hash['Occurrences'] = $rdata['COUNT']; } else { $hash['NoEndDate'] = 1; } break; case 'EXDATE': if (empty($hash['Exceptions'])) { $hash['Exceptions'] = array(); } foreach ($item['values'] as $date) { if ($hash['AllDayEvent'] == 1) { $d = new Horde_Date(array('year' => $date['year'], 'month' => $date['month'], 'mday' => $date['mday'] + 1)); $hash['Exceptions'][] = array('ExcludeDate' => $d->format('Y-m-d')); } else { $hash['Exceptions'][] = array('ExcludeDate' => Horde_Icalendar::_exportDate($date)); } } break; } } if (!empty($start)) { if ($hash['ReminderSet'] && !empty($alarm) && $start != $alarm) { $hash['ReminderMinutesBeforeStart'] = ($start - $alarm) / 60; } else { // Parse VALARM components. foreach ($content->getComponents() as $component) { if ($component->getType() != 'vAlarm') { continue; } try { $trigger = $component->getAttribute('TRIGGER'); } catch (Horde_Icalendar_Exception $e) { continue; } if (is_array($trigger) || empty($trigger)) { continue; } $hash['ReminderSet'] = 1; $hash['ReminderMinutesBeforeStart'] = (-$trigger) / 60; } } } if (empty($hash['AllDayEvent']) && !empty($start) && !empty($end) && $start != $end) { $hash['Duration'] = ($end - $start) / 60; $GLOBALS['backend']->logMessage( 'Duration set to ' . $hash['Duration'], 'DEBUG'); } return Horde_SyncMl_Device_sync4j::array2sif( $hash, '', ''); } public function vtodo2sif($vcard) { $iCal = new Horde_Icalendar(); if (!$iCal->parsevCalendar($vcard)) { return PEAR::raiseError('There was an error importing the data.'); } $components = $iCal->getComponents(); switch (count($components)) { case 0: return PEAR::raiseError('No data was found'); case 1: $content = $components[0]; break; default: return PEAR::raiseError('Multiple components found; only one is supported.'); } $hash['Complete'] = 0; $due = false; $attr = $content->getAllAttributes(); foreach ($attr as $item) { switch ($item['name']) { case 'SUMMARY': $hash['Subject'] = $item['value']; break; case 'DESCRIPTION': $hash['Body'] = $item['value']; break; case 'PRIORITY': if ($item['value'] == 1) { $hash['Importance'] = 2; } elseif ($item['value'] == 5) { $hash['Importance'] = 0; } else { $hash['Importance'] = 1; } break; case 'DTSTART': $hash['StartDate'] = Horde_Icalendar::_exportDateTime($item['value']); break; case 'DUE': $hash['DueDate'] = Horde_Icalendar::_exportDateTime($item['value']); $due = $item['value']; break; case 'AALARM': $hash['ReminderTime'] = $item['value']; $hash['ReminderSet'] = 1; break; case 'STATUS': $hash['Complete'] = $item['value'] == 'COMPLETED' ? 1 : 0; break; case 'CATEGORIES': $hash['Categories'] = $item['value']; break; case 'CLASS': switch (Horde_String::upper($item['value'])) { case 'PUBLIC': $hash['Sensitivity'] = 0; break; case 'PRIVATE': $hash['Sensitivity'] = 2; break; case 'CONFIDENTIAL': $hash['Sensitivity'] = 3; break; } break; } } if ($due && !isset($hash['ReminderSet'])) { // Parse VALARM components. foreach ($content->getComponents() as $component) { if ($component->getType() != 'vAlarm') { continue; } try { $trigger = $component->getAttribute('TRIGGER'); } catch (Horde_Icalendar_Exception $e) { continue; } if (is_array($trigger) || empty($trigger)) { continue; } $hash['ReminderSet'] = 1; $hash['ReminderTime'] = Horde_Icalendar::_exportDateTime($due - $trigger); } } return Horde_SyncMl_Device_sync4j::array2sif( $hash, '', ''); } /** * Sync4j as of Funambol Outlook connector 3.0.15 can't deal * with * @package SyncMl */ class Horde_SyncMl_Device_Sync4JMozilla extends Horde_SyncMl_Device { /** * Converts the content from the backend to a format suitable for the * client device. * * Strips the uid (primary key) information as client and server might use * different ones. * * @param string $content The content to convert * @param string $contentType The content type of content as returned * from the backend * @param string $database The server database URI. * * @return array Three-element array with the converted content, the * (possibly changed) new content type, and encoding type * (like b64 as used by Funambol). */ public function convertServer2Client($content, $contentType, $database) { list($content, $contentType, $encodingType) = parent::convertServer2Client($content, $contentType, $database); /* The plugin does currently not handle lines that are both folded * and QUOTED-PRINTABLE encoded. Like this one with a note "abc": * NOTE;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:= * a= * bc */ if (preg_match_all('/\r\n[^:]*ENCODING=QUOTED-PRINTABLE[^:]*:.*?=\r\n.*?[^=](?=\r\n)/mis', $content, $m)) { foreach($m[0] as $v) { /* Remove line folding */ $content = str_replace($v,str_replace("=\r\n", '', $v), $content); } } $l = "\noutput converted for client ($contentType):\n" . $content . "\n"; $GLOBALS['backend']->logFile(Horde_SyncMl_Backend::LOGFILE_DATA, $l); return array($content, $contentType, $encodingType); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Device/Synthesis.php0000664000175000017500000001065412700700443021072 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Device_Synthesis extends Horde_SyncMl_Device { /** * Converts the content from the backend to a format suitable for the * client device. * * Strips the uid (primary key) information as client and server might use * different ones. * * @param string $content The content to convert * @param string $contentType The content type of content as returned * from the backend * @param string $database The server database URI. * * @return array Three-element array with the converted content, the * (possibly changed) new content type, and encoding type * (like b64 as used by Funambol). */ public function convertServer2Client($content, $contentType, $database) { list($content, $contentType, $encodingType) = parent::convertServer2Client($content, $contentType, $database); $di = $GLOBALS['backend']->state->deviceInfo; if (stristr($di->Mod,'palm') === false) { // Some special priority handling is required. Synthesis uses // 1 (high), 2 (medium), 3(low), at least for my windows mobile device. // convert these to valid priority settings: $content = preg_replace('/(\r\n|\r|\n)PRIORITY:[1-2](\r\n|\r|\n)/', '\1PRIORITY:1\2', $content, 1); $content = preg_replace('/(\r\n|\r|\n)PRIORITY:[3](\r\n|\r|\n)/', '\1PRIORITY:2\2', $content, 1); $content = preg_replace('/(\r\n|\r|\n)PRIORITY:[4-9](\r\n|\r|\n)/', '\1PRIORITY:3\2', $content, 1); } // Windows Mobile also expects DUE DATES like DUE:20060419T000000 if (preg_match('/(\r\n|\r|\n)DUE:(........T......Z)(\r\n|\r|\n)/', $content,$m)) { $m[2] = $this->UTC2LocalDate($m[2]); $content = preg_replace('/(\r\n|\r|\n)DUE:(........T......Z)(\r\n|\r|\n)/', '\1DUE:' . $m[2] . '\3', $content, 1); } $l = "\noutput converted for client ($contentType):\n" . $content . "\n"; $GLOBALS['backend']->logFile(Horde_SyncMl_Backend::LOGFILE_DATA, $l); return array($content, $contentType, $encodingType); } /** * Convert the content. * * @param string $content The content to convert. * @param string $contentType The contentType of the content. * @return array array($newcontent, $newcontentType): * the converted content and the * (possibly changed) new ContentType. */ public function convertClient2Server($content, $contentType) { list($content, $contentType) = parent::convertClient2Server($content, $contentType); $di = $GLOBALS['backend']->state->deviceInfo; if (stristr($di->Mod, 'palm') === false) { // Some special priority handling is required. Synthesis uses 1 // (high), 2 (medium), 3(low), at least for my windows mobile // device. convert these to valid priority settings: $content = preg_replace('/(\r\n|\r|\n)PRIORITY:3(\r\n|\r|\n)/', '\1PRIORITY:5\2', $content, 1); $content = preg_replace('/(\r\n|\r|\n)PRIORITY:2(\r\n|\r|\n)/', '\1PRIORITY:3\2', $content, 1); } $GLOBALS['backend']->logFile( Horde_SyncMl_Backend::LOGFILE_DATA, "\ninput converted for server ($contentType):\n$content\n"); return array($content, $contentType); } /* Static helper function: converts a UTC Timestamp like 20060418T220000Z * into a local date like 20060419T000000. This is actually more than * stripping the time part: we need to convert to local time first to ensure * we get the right date! */ public function UTC2LocalDate($s) { $date = new Horde_Date($s); $date->setTimezone(date_default_timezone_get()); return $date->format('Ymd') . 'T000000'; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Backend.php0000664000175000017500000011564412700700443017236 0ustar janjan server ID map * The SyncML protocol does not require clients and servers to use the same * primary keys for the data entries. So a map has to be in place to * convert between client primary keys (called cuid's here) and server * primary keys (called suid's). It's up to the server to maintain this * map. Method for this is createUidMap(). * * 4) Sync anchor handling * After a successful initial sync, the client and server sync timestamps * are stored. This allows to perform subsequent syncs as delta syncs, * where only new changes are replicated. Servers as well as clients need * to be able to store two sync anchors (the client's and the server's) for * a sync. Methods for this are readSyncAnchors() and writeSyncAnchors(). * * 5) Test supporting functions * The SyncML module comes with its own testing framework. All you need to * do is implement the two methods testSetup() and testTearDown() and you * are able to test your backend with all the test cases that are part of * the module. * * 6) Miscellaneous functions * This involves session handling (sessionStart() and sessionClose()), * logging (logMessage() and logFile()), timestamp creation * (getCurrentTimeStamp()), charset handling (getCharset(), setCharset()) * and database identification (isValidDatabaseURI()). For all of these * functions, a default implementation is provided in Horde_SyncMl_Backend. * * If you want to create a backend for your own appliction, you can either * derive from Horde_SyncMl_Backend and implement everything in groups 1 to 5 * or you derive from Horde_SyncMl_Backend_Sql which implements an example * backend based on direct database access using the PEAR MDB2 package. In this * case you only need to implement groups 1 to 3 and can use the implementation * from Horde_SyncMl_Backend_Sql as a guideline for these functions. * * Key Concepts * ------------ * In order to successfully create a backend, some understanding of a few key * concepts in SyncML and the Horde_SyncMl package are certainly helpful. So * here's some stuff that should make some issues clear (or at lest less * obfuscated): * * 1) DatabaseURIs and Databases * The SyncML protocol itself is completly independant from the data that * is replicated. Normally the data are calendar or address book entries * but it may really be anything from browser bookmarks to comeplete * database tables. An ID (string name) of the database you want to * actually replicate has to be configured in the client. Typically that's * something like 'calendar' or 'tasks'. Client and server must agree on * these names. In addition this string may be used to provide additional * arguments. These are provided in a HTTP GET query style: like * tasks?ignorecompletedtasks to replicate only pending tasks. Such a "sync * identifier" is called a DatabaseURI and is really a database name plus * some additional options. * The Horde_SyncMl package completly ignores these options and simply passes * them on to the backend. It's up to the backend to decide what to do with * them. However when dealing with the internal maps (cuid<->suid and sync * anchors), it's most likely to use the database name only rather than the * full databaseURI. The map information saying that server entry * 20070101203040xxa@mypc.org has id 768 in the client device is valid for * the database "tasks", not for "tasks?somesillyoptions". So what you * normally do is calling some kind of $database = * $this->normalize($databaseURI) in every backend method that deals * with databaseURIs and use $database afterwards. However actual usage of * options is up to the backend implementation. SyncML works fine without. * * 2) Suid and Guid mapping * This is the mapping of client IDs to server IDs and vice versa. Please * note that this map is per user and per client device: the server entry * 20070101203040xxa@mypc.org may have ID 720 in your PDA and AA10FC3A in * your mobile phone. * * 3) Sync Anchors * @todo describe sync anchors * Have a look at the SyncML spec * http://www.openmobilealliance.org/tech/affiliates/syncml/syncmlindex.html * to find out more. * * 4) Changes and Timestamps * @todo description of Changes and Timestamps, "mirroring effect" * This is real tricky stuff. * First it's important to know, that the SyncML protocol requires the * ending timestamp of the sync timeframe to be exchanged _before_ the * actual syncing starts. So all changes made during a sync have timestamps * that are in the timeframe for the next upcoming sync. Data exchange in * a sync session works in two steps: 1st) the clients sends its changes to * the server, 2nd) the server sends its changes to the client. * So when in step 2, the backend datastore API is called with a request * like "give me all changes in the server since the last sync". Thus you * also get the changes induced by the client in step 1 as well. You have * to somehow "tag" them to avoid echoing (and thus duplicating) them back * to the client. Simply storing the guids in the session is not * sufficient: the changes are made _after_ the end timestamp (see 1) of * the current sync so you'll dupe them in the next sync. * The current implementation deals with this as follows: whenever a client * induced change is done in the backend, the timestamp for this change is * stored in the cuid<->suid map in an additional field. That's the perfect * place as the tagging needs to be done "per client device": when an add * is received from the PDA it must not be sent back as an add to this * device, but to mobile phone it must be sent. * This is sorted out during the getServerChanges() process: if a server * change has a timestamp that's the same as in the guid<->suid map, it * came from the client and must not be added to the list of changes to be * sent to this client. * See the description of Horde_SyncMl_Backend_Sql::_getChangeTS() for some * more information. * * 5) Messages and Packages * A message is a single HTTP Request. A package is single "logical * message", a sync step. Normally the two coincide. However due to message * size restrictions one package may be transferred in multiple messages * (HTTP requests). * * 7) Server mode, client mode and test mode * Per default, a backend is used for an SyncML server. Regarding the * SyncML protocol, the working of client and server is similar, except * that * a) the client initiates the sync requests and the server respons to them, * and * b) the server must maintain the client id<->server id map. * * Currently the Horde_SyncMl package is designed to create servers. But * is's an obvious (and straightforward) extension to do it for clients as * well. And as a client has actually less work to do than a server, the * backend should work for servers _and_ clients. During the sessionStart(), * the backend gets a parameter to let it know whether it's in client or * server mode (or test, see below). When in client mode, it should behave * slightly different: * a) the client doesn't do suid<->cuid mapping, so all invokations to the * map creation method createUidMap(). * b) the client has only client ids, no server ids. So all arguments are * considered cuids even when named suid. See the Horde_SyncMl_Backend_Sql * implementation, it's actually not that difficult. * * Finally there's the test mode. The test cases consist of replaying * pre-recorded sessions. For that to work, the test script must "simulate" * user entries in the server data store. To do so, it creates a backend in * test mode. This behaves similar to a client: when an server entry is * created (modified) using addEntry() (replaceEntry()), no map entry must * be done. * The test backend uses also the two methods testSetup() and testTearDown() * to create a clean (empty) enviroment for the test user "syncmltest". See * the Horde_SyncMl_Backend_Sql implementation for details. * * Copyright 2005-2016 Horde LLC (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @author Karsten Fourmont * @package SyncMl */ class Horde_SyncMl_Backend { /** Types of logfiles. See logFile() method. */ const LOGFILE_CLIENTMESSAGE = 1; const LOGFILE_SERVERMESSAGE = 2; const LOGFILE_DEVINF = 3; const LOGFILE_DATA = 4; /** Backend modes. */ const MODE_SERVER = 1; const MODE_CLIENT = 2; const MODE_TEST = 3; /** * The State object. * * @var Horde_SyncMl_State */ public $state; /** * The concatenated log messages. * * @var string */ protected $_logtext = ''; /** * The directory where debugging information is stored. * * @see Horde_SyncMl_Backend() * @var string */ protected $_debugDir; /** * Whether to save SyncML messages in the debug directory. * * @see Horde_SyncMl_Backend() * @var boolean */ protected $_debugFiles; /** * The log level. * * @see Horde_SyncMl_Backend() * @var string */ protected $_logLevel = 'INFO'; /** * The charset used in the SyncML messages. * * @var string */ protected $_charset; /** * The current user. * * @var string */ protected $_user; /** * The ID of the client device. * * This is used for all data access as an ID to allow to distinguish * between syncs with different devices. $this->_user together with * $this->_syncDeviceID is used as an additional key for all persistence * operations. * * @var string */ protected $_syncDeviceID; /** * The backend mode. One of the Horde_SyncMl_Backend::MODE_* constants. * * @var integer */ protected $_backendMode; /** * Constructor. * * Sets up the default logging mechanism. * * @param array $params A hash with parameters. The following are * supported by the default implementation. * Individual backends may support other parameters. * - debug_dir: A directory to write debug output * to. Must be writeable by the web * server. * - debug_files: If true, log all incoming and * outgoing packets and data * conversions and devinf log in * debug_dir. * - log_level: Only log entries with at least * this level. Defaults to 'INFO'. */ public function __construct($params) { if (!empty($params['debug_dir']) && is_dir($params['debug_dir'])) { $this->_debugDir = $params['debug_dir']; } $this->_debugFiles = !empty($params['debug_files']); if (isset($params['log_level'])) { $this->_logLevel = $params['log_level']; } $this->logMessage('Backend of class ' . get_class($this) . ' created', 'DEBUG'); } /** * Attempts to return a concrete Horde_SyncMl_Backend instance based on $driver. * * @param string $driver The type of concrete Backend subclass to return. * The code is dynamically included from * Backend/$driver.php if no path is given or * directly with "include_once $driver . '.php'" * if a path is included. So make sure this parameter * is "safe" and not directly taken from web input. * The class in the file must be named * 'Horde_SyncMl_Backend_' . basename($driver) and extend * Horde_SyncMl_Backend. * @param array $params A hash containing any additional configuration or * connection parameters a subclass might need. * * @return Horde_SyncMl_Backend The newly created concrete Horde_SyncMl_Backend * instance, or false on an error. */ public function factory($driver, $params = null) { if (empty($driver) || ($driver == 'none')) { return false; } $driver = basename($driver); $class = 'Horde_SyncMl_Backend_' . $driver; if (class_exists($class)) { $backend = new $class($params); } else { return false; } return $backend; } /** * Sets the charset. * * All data passed to the backend uses this charset and data returned from * the backend must use this charset, too. * * @param string $charset A valid charset. */ public function setCharset($charset) { $this->_charset = $charset; } /** * Returns the charset. * * @return string The charset used when talking to the backend. */ public function getCharset() { return $this->_charset; } /** * Returns the current device's ID. * * @return string The device ID. */ public function getSyncDeviceID() { return $this->_syncDeviceID; } /** * Sets the user used for this session. * * This method is called by SyncML right after sessionStart() when either * authentication is accepted via checkAuthentication() or a valid user * has been retrieved from the state. $this->_user together with * $this->_syncDeviceID is used as an additional key for all persistence * operations. * This method may have to force a "login", when the backend doesn't keep * auth state within a session or when in test mode. * * @param string $user A user name. */ public function setUser($user) { $this->_user = $user; } /** * Returns the current user. * * @return string The current user. */ public function getUser() { return $this->_user; } /** * Is called after the Horde_SyncMl_State object has been set up, either * restored from the session, or freshly created. */ public function setupState() { } /** * Starts a PHP session. * * @param string $syncDeviceID The device ID. * @param string $session_id The session ID to use. * @param integer $backendMode The backend mode, one of the * Horde_SyncMl_Backend::MODE_* constants. */ public function sessionStart($syncDeviceID, $sessionId, $backendMode = Horde_SyncMl_Backend::MODE_SERVER) { $this->_syncDeviceID = $syncDeviceID; $this->_backendMode = $backendMode; // Only the server needs to start a session: if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { $sid = md5($syncDeviceID . $sessionId); session_id($sid); @session_start(); } } /** * Closes the PHP session. */ public function sessionClose() { // Only the server needs to start a session: if ($this->_backendMode == Horde_SyncMl_Backend::MODE_SERVER) { session_unset(); session_destroy(); } } /** * Returns whether a database URI is valid to be synced with this backend. * * This default implementation accepts "tasks", "calendar", "notes" and * "contacts". However individual backends may offer replication of * different or completly other databases (like browser bookmarks or * cooking recipes). * * @param string $databaseURI URI of a database. Like calendar, tasks, * contacts or notes. May include optional * parameters: * tasks?options=ignorecompleted. * * @return boolean True if a valid URI. */ public function isValidDatabaseURI($databaseURI) { $database = $this->normalize($databaseURI); switch($database) { case 'tasks': case 'calendar': case 'notes': case 'contacts': case 'configuration': return true; default: $this->logMessage('Invalid database "' . $database . '". Try tasks, calendar, notes or contacts.', 'ERR'); return false; } } /** * Returns entries that have been modified in the server database. * * @abstract * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param integer $from_ts Start timestamp. * @param integer $to_ts Exclusive end timestamp. Not yet * implemented. * @param array &$adds Output array: hash of adds suid => 0 * @param array &$mods Output array: hash of modifications * suid => cuid * @param array &$dels Output array: hash of deletions suid => cuid * * @return mixed True on success or a PEAR_Error object. */ public function getServerChanges($databaseURI, $from_ts, $to_ts, &$adds, &$mods, &$dels) { die('getServerChanges() not implemented!'); } /** * Retrieves an entry from the backend. * * @abstract * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $suid Server unique id of the entry: for horde * this is the guid. * @param string $contentType Content-Type: the MIME type in which the * public function should return the data. * @param array $fields Hash of field names and Horde_SyncMl_Property * properties with the requested fields. * * @return mixed A string with the data entry or a PEAR_Error object. */ public function retrieveEntry($databaseURI, $suid, $contentType, $fields) { die('retrieveEntry() not implemented!'); } /** * Adds an entry into the server database. * * @abstract * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * @param string $cuid Client ID of this entry. * * @return array PEAR_Error or suid (Horde guid) of new entry */ public function addEntry($databaseURI, $content, $contentType, $cuid) { die('addEntry() not implemented!'); } /** * Replaces an entry in the server database. * * @abstract * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $content The actual data. * @param string $contentType MIME type of the content. * @param string $cuid Client ID of this entry. * * @return string PEAR_Error or server ID (Horde GUID) of modified entry. */ public function replaceEntry($databaseURI, $content, $contentType, $cuid) { die('replaceEntry() not implemented!'); } /** * Deletes an entry from the server database. * * @abstract * * @param string $databaseURI URI of Database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid Client ID of the entry. * * @return boolean True on success or false on failed (item not found). */ public function deleteEntry($databaseURI, $cuid) { die('deleteEntry() not implemented!'); } /** * Authenticates the user at the backend. * * For some types of authentications (notably auth:basic) the username * gets extracted from the authentication data and is then stored in * username. For security reasons the caller must ensure that this is the * username that is used for the session, overriding any username * specified in . * * @param string $username Username as provided in the . * May be overwritten by $credData. * @param string $credData Authentication data provided by * in the . * @param string $credFormat Format of data as in * the . Typically 'b64'. * @param string $credType Auth type as provided by * in the . Typically * 'syncml:auth-basic'. * * @return boolean|string The user name if authentication succeeded, false * otherwise. */ public function checkAuthentication(&$username, $credData, $credFormat, $credType) { if (empty($credData) || empty($credType)) { return false; } switch ($credType) { case 'syncml:auth-basic': list($username, $pwd) = explode(':', base64_decode($credData), 2); $this->logMessage('Checking authentication for user ' . $username, 'DEBUG'); return $this->_checkAuthentication($username, $pwd); case 'syncml:auth-md5': /* syncml:auth-md5 only transfers hash values of passwords. * Currently the syncml:auth-md5 hash scheme is not supported * by the authentication backend. So we can't use Horde to do * authentication. Instead here is a very crude direct manual hook: * To allow authentication for a user 'dummy' with password 'sync', * run * php -r 'print base64_encode(pack("H*",md5("dummy:sync")));' * from the command line. Then create an entry like * 'dummy' => 'ZD1ZeisPeQs0qipHc9tEsw==' in the users array below, * where the value is the command line output. * This user/password combination is then accepted for md5-auth. */ $users = array( // example for user dummy with pass pass: // 'dummy' => 'ZD1ZeisPeQs0qipHc9tEsw==' ); if (empty($users[$username])) { return false; } // @todo: nonce may be specified by client. Use it then. $nonce = ''; if (base64_encode(pack('H*', md5($users[$username] . ':' . $nonce))) === $credData) { return $this->_setAuthenticated($username, $credData); } return false; default: $this->logMessage('Unsupported authentication type ' . $credType, 'ERR'); return false; } } /** * Authenticates the user at the backend. * * @abstract * * @param string $username A user name. * @param string $password A password. * * @return boolean|string The user name if authentication succeeded, false * otherwise. */ protected function _checkAuthentication($username, $password) { die('_checkAuthentication() not implemented!'); } /** * Sets a user as being authenticated at the backend. * * @abstract * * @param string $username A user name. * @param string $credData Authentication data provided by * in the . * * @return string The user name. */ protected function _setAuthenticated($username, $credData) { die('setAuthenticated() not implemented!'); } /** * Stores Sync anchors after a successful synchronization to allow two-way * synchronization next time. * * The backend has to store the parameters in its persistence engine * where user, syncDeviceID and database are the keys while client and * server anchor ar the payload. See readSyncAnchors() for retrieval. * * @abstract * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $clientAnchorNext The client anchor as sent by the * client. * @param string $serverAnchorNext The anchor as used internally by the * server. */ public function writeSyncAnchors($databaseURI, $clientAnchorNext, $serverAnchorNext) { } /** * Reads the previously written sync anchors from the database. * * @abstract * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * * @return mixed Two-element array with client anchor and server anchor as * stored in previous writeSyncAnchor() calls. False if no * data found. */ public function readSyncAnchors($databaseURI) { } /** * Creates a map entry to map between server and client IDs. * * If an entry already exists, it is overwritten. * * @abstract * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. * @param string $cuid Client ID of the entry. * @param string $suid Server ID of the entry. * @param integer $timestamp Optional timestamp. This can be used to * 'tag' changes made in the backend during the * sync process. This allows to identify these, * and ensure that these changes are not * replicated back to the client (and thus * duplicated). See key concept "Changes and * timestamps". */ public function createUidMap($databaseURI, $cuid, $suid, $timestamp = 0) { } /** * Erases all mapping entries for one combination of user, device ID. * * This is used during SlowSync so that we really sync everything properly * and no old mapping entries remain. * * @abstract * * @param string $databaseURI URI of database to sync. Like calendar, * tasks, contacts or notes. May include * optional parameters: * tasks?options=ignorecompleted. */ public function eraseMap($databaseURI) { } /** * Logs a message in the backend. * * TODO: This should be done via Horde_Log or the equivalent. * * @param mixed $message Either a string or a PEAR_Error object. * @param string $file What file was the log public function called from * (e.g. __FILE__)? * @param integer $line What line was the log public function called from * (e.g. __LINE__)? * @param integer $priority The priority of the message. One of: * - EMERG * - ALERT * - CRIT * - ERR * - WARN * - NOTICE * - INFO * - DEBUG */ public function logMessage($message, $priority = 'INFO') { if (is_string($priority)) { $priority = defined('Horde_Log::' . $priority) ? constant('Horde_Log::' . $priority) : Horde_Log::INFO; } if (is_string($this->_logLevel)) { $loglevel = defined('Horde_Log::' . $this->_logLevel) ? constant('Horde_Log::' . $this->_logLevel) : Horde_Log::INFO; } else { $loglevel = $this->_logLevel; } if ($priority > $loglevel) { return; } // Internal logging to logtext if (is_string($this->_logtext)) { switch ($priority) { case Horde_Log::EMERG: $this->_logtext .= 'EMERG: '; break; case Horde_Log::ALERT: $this->_logtext .= 'ALERT: '; break; case Horde_Log::CRIT: $this->_logtext .= 'CRIT: '; break; case Horde_Log::ERR: $this->_logtext .= 'ERR: '; break; case Horde_Log::WARN: $this->_logtext .= 'WARNING:'; break; case Horde_Log::NOTICE: $this->_logtext .= 'NOTICE: '; break; case Horde_Log::INFO: $this->_logtext .= 'INFO: '; break; case Horde_Log::DEBUG: $this->_logtext .= 'DEBUG: '; break; default: $this->_logtext .= 'UNKNOWN:'; } if (is_string($message)) { $this->_logtext .= $message; } elseif (is_a($message, 'PEAR_Error')) { $this->_logtext .= $message->getMessage(); } $this->_logtext .= "\n"; } } /** * Logs data to a file in the debug directory. * * @param integer $type The data type. One of the Horde_SyncMl_Backend::LOGFILE_* * constants. * @param string $content The data content. * @param boolean $wbxml Whether the data is wbxml encoded. * @param boolean $sessionClose Whether this is the last SyncML message * in a session. Bump the file number. */ public function logFile($type, $content, $wbxml = false, $sessionClose = false) { if (empty($this->_debugDir) || !$this->_debugFiles) { return; } switch ($type) { case Horde_SyncMl_Backend::LOGFILE_CLIENTMESSAGE: $filename = 'client_'; $mode = 'wb'; break; case Horde_SyncMl_Backend::LOGFILE_SERVERMESSAGE: $filename = 'server_'; $mode = 'wb'; break; case Horde_SyncMl_Backend::LOGFILE_DEVINF: $filename = 'devinf.txt'; $mode = 'wb'; break; case Horde_SyncMl_Backend::LOGFILE_DATA: $filename = 'data.txt'; $mode = 'a'; break; default: // Unkown type. Use $type as filename: $filename = $type; $mode = 'a'; break; } if ($type === Horde_SyncMl_Backend::LOGFILE_CLIENTMESSAGE || $type === Horde_SyncMl_Backend::LOGFILE_SERVERMESSAGE) { $packetNum = @intval(file_get_contents($this->_debugDir . '/packetnum.txt')); if (empty($packetNum)) { $packetNum = 10; } if ($wbxml) { $filename .= $packetNum . '.wbxml'; } else { $filename .= $packetNum . '.xml'; } } /* Write file */ $fp = @fopen($this->_debugDir . '/' . $filename, $mode); if ($fp) { @fwrite($fp, $content); @fclose($fp); } if ($type === Horde_SyncMl_Backend::LOGFILE_CLIENTMESSAGE) { $this->logMessage('Started at ' . date('Y-m-d H:i:s') . '. Packet logged in ' . $this->_debugDir . '/' . $filename, 'DEBUG'); } /* Increase packet number. */ if ($type === Horde_SyncMl_Backend::LOGFILE_SERVERMESSAGE) { $this->logMessage('Finished at ' . date('Y-m-d H:i:s') . '. Packet logged in ' . $this->_debugDir . '/' . $filename, 'DEBUG'); $fp = @fopen($this->_debugDir . '/packetnum.txt', 'w'); if ($fp) { /* When one complete session is finished: go to next 10th. */ if ($sessionClose) { $packetNum += 10 - $packetNum % 10; } else { $packetNum += 1; } fwrite($fp, $packetNum); fclose($fp); } } } /** * Cleanup public function called after all message processing is finished. * * Allows for things like closing databases or flushing logs. When * running in test mode, tearDown() must be called rather than close. */ public function close() { if (!empty($this->_debugDir)) { $f = @fopen($this->_debugDir . '/log.txt', 'a'); if ($f) { fwrite($f, $this->_logtext . "\n"); fclose($f); } } session_write_close(); } /** * Returns the current timestamp in the same format as used by * getServerChanges(). * * Backends can use their own way to represent timestamps, like unix epoch * integers or UTC Datetime strings. * * @return mixed A timestamp of the current time. */ public function getCurrentTimeStamp() { /* Use unix epoch as default method for timestamps. */ return time(); } /** * Creates a clean test environment in the backend. * * Ensures there's a user with the given credentials and an empty data * store. * * @abstract * * @param string $user This user accout has to be created in the backend. * @param string $pwd The password for user $user. */ public function testSetup($user, $pwd) { die('testSetup() not implemented!'); } /** * Prepares the test start. * * @param string $user This user accout has to be created in the backend. */ public function testStart($user) { die('testStart() not implemented!'); } /** * Tears down the test environment after the test is run. * * @abstract * * Should remove the testuser created during testSetup and all its data. */ public function testTearDown() { die('testTearDown() not implemented!'); } /** * Normalizes a databaseURI to a database name, so that * _normalize('tasks?ignorecompleted') should return just 'tasks'. * * @param string $databaseURI URI of a database. Like calendar, tasks, * contacts or notes. May include optional * parameters: * tasks?options=ignorecompleted. * * @return string The normalized database name. */ public function normalize($databaseURI) { $database = Horde_String::lower( basename(preg_replace('|\?.*$|', '', $databaseURI))); /* Convert some commonly encountered types to a fixed set of known * service names: */ switch($database) { case 'contacts': case 'contact': case 'card': case 'scard': return 'contacts'; case 'calendar': case 'event': case 'events': case 'cal': case 'scal': return 'calendar'; case 'notes': case 'memo': case 'note': case 'snote': return 'notes'; case 'tasks': case 'task': case 'stask': return 'tasks'; default: return $database; } } /** * Extracts an HTTP GET like parameter from an URL. * * Example: getParameter('test?q=1', 'q') == 1 * * @static * * @param string $url The complete URL. * @param string $parameter The parameter name to extract. * @param string $default A default value to return if none has been * provided in the URL. */ public function getParameter($url, $parameter, $default = null) { if (preg_match('|[&\?]' . $parameter . '=([^&]*)|', $url, $m)) { return $m[1]; } return $default; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Command.php0000664000175000017500000001112512700700443017252 0ustar janjan commands. * * A SyncML command is a protocol primitive. Each SyncML command specifies to a * recipient an individual operation that is to be performed. * * The Horde_SyncMl_Command objects are hooked into the XML parser of the * Horde_SyncMl_ContentHandler class and are reponsible for parsing a single * command inside the SyncBody section of a SyncML message. All actions that * must be executed for a single SyncML command are handled by these objects, * by means of the handleCommand() method. * * Copyright 2003-2016 Horde LLC (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @author Anthony Mills * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Command { /** * Name of the command, like 'Put'. * * Must be overwritten by a sub class. * * @var string */ protected $_cmdName; /** * The command ID (). * * @var integer */ protected $_cmdID; /** * Stack for holding the XML elements during creation of the object from * the XML event flow. * * @var array */ protected $_stack = array(); /** * Buffer for the parsed character data. * * @var string */ protected $_chars = ''; /** * A Horde_SyncMl_XmlOutput instance responsible for generating the output. * * @var Horde_SyncMl_XmlOutput */ protected $_outputHandler; /** * Constructor. * * @param Horde_SyncMl_XmlOutput $outputHandler A Horde_SyncMl_XmlOutput object. */ public function __construct(&$outputHandler) { $this->_outputHandler = &$outputHandler; } /** * Start element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::startElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. * @param array $attrs A hash with the element's attributes. */ public function startElement($uri, $element, $attrs) { $this->_stack[] = $element; } /** * End element handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::endElement(). * * @param string $uri The namespace URI of the element. * @param string $element The element tag name. */ public function endElement($uri, $element) { if (count($this->_stack) == 2 && $element == 'CmdID') { $this->_cmdID = intval(trim($this->_chars)); } if (strlen($this->_chars)) { $this->_chars = ''; } array_pop($this->_stack); } /** * Character data handler for the XML parser, delegated from * Horde_SyncMl_ContentHandler::characters(). * * @param string $str The data string. */ public function characters($str) { $this->_chars .= $str; } /** * Returns the command name this instance is reponsible for. * * @return string The command name this object is handling. */ public function getCommandName() { return $this->_cmdName; } /** * This method is supposed to implement the actual business logic of the * command once the XML parsing is complete. * * @abstract */ public function handleCommand($debug = false) { } /** * Attempts to return a concrete Horde_SyncMl_Command instance based on * $command. * * @param string $command The type of the concrete * Horde_SyncMl_Comment subclass to * return. * @param Horde_SyncMl_XmlOutput $outputHandler A Horde_SyncMl_XmlOutput object. * * @return Horde_SyncMl_Command The newly created concrete Horde_SyncMl_Command * instance, or false on error. */ public function &factory($command, &$outputHandler) { $command = basename($command); $class = 'Horde_SyncMl_Command_' . $command; if (class_exists($class)) { $cmd = new $class($outputHandler); } else { $msg = 'Class definition of ' . $class . ' not found.'; $GLOBALS['backend']->logMessage($msg, __FILE__, __LINE__, 'ERR'); $cmd = PEAR::raiseError($msg); } return $cmd; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/ContentHandler.php0000664000175000017500000004343112700700443020611 0ustar janjan * @author Anthony Mills * @package SyncMl */ class Horde_SyncMl_ContentHandler { /** * Stack for holding the xml elements during creation of the object from * the xml event flow. * * @var array */ protected $_Stack = array(); /** * @var string */ protected $_chars; /** * Instance of Horde_SyncMl_Command. Events are passed through to this * ContentHandler. * * @var Horde_SyncMl_Command */ protected $_currentCommand; /** * Whether we received a final element in this message. */ protected $_gotFinal = false; protected $_xmlWriter; protected $_wbxmlparser = null; /** * The response URI as sent by the server. * * This is the endpoint URL of the RPC server. * * @var string */ protected $_respURI; public $debug = false; public function __construct() { /* Set to true to indicate that we expect another message from the * client. If this is still false at the end of processing, the sync * session is finished and we can close the session. */ $GLOBALS['message_expectresponse'] = false; } /** * Here's were all the processing takes place: gets the SyncML request * data and returns a SyncML response. The only thing that needs to be in * place before invoking this public function is a working backend. * * @param string $request The raw request string. * @param string $contentType The MIME content type of the request. Should * be either application/vnd.syncml or * application/vnd.syncml+wbxml. * @param string $respURI The url of the server endpoint. Will be * returned in the RespURI element. */ public function process($request, $contentType, $respURI = null) { $isWBXML = $contentType =='application/vnd.syncml+wbxml'; $this->_respURI = $respURI; /* Catch any errors/warnings/notices that may get thrown while * processing. Don't want to let anything go to the client that's not * part of the valid response. */ ob_start(); $GLOBALS['backend']->logFile(Horde_SyncMl_Backend::LOGFILE_CLIENTMESSAGE, $request, $isWBXML); if (!$isWBXML) { /* XML code. */ /* try to extract charset from XML text */ if (preg_match('/^\s*<\?xml[^>]*encoding\s*=\s*"([^"]*)"/i', $request, $m)) { $charset = $m[1]; } else { $charset = 'UTF-8'; } $GLOBALS['backend']->setCharset($charset); /* Init output handler. */ $this->_xmlWriter = &Horde_SyncMl_XmlOutput::singleton(); /* Horde_Xml_Wbxml_ContentHandler Is a class that produces plain XML * output. */ $this->_xmlWriter->init(new Horde_Xml_Wbxml_ContentHandler()); /* Create the XML parser and set method references. */ $parser = xml_parser_create_ns($charset); xml_set_object($parser, $this); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false); xml_set_element_handler($parser, '_startElement', '_endElement'); xml_set_character_data_handler($parser, '_characters'); xml_set_processing_instruction_handler($parser, ''); xml_set_external_entity_ref_handler($parser, ''); /* Here we go: fire off events: */ if (!xml_parse($parser, $request)) { $s = sprintf('XML error: %s at line %d', xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser)); $GLOBALS['backend']->logMessage($s, 'ERR'); xml_parser_free($parser); return new PEAR_Error($s); } xml_parser_free($parser); } else { /* The decoder works like the parser in the XML code above: It * parses the input and calls the callback functions of $this. */ $this->_wbxmlparser = new Horde_Xml_Wbxml_Decoder(); $this->_wbxmlparser->setContentHandler($this); /* Init output handler. */ $this->_xmlWriter = &Horde_SyncMl_XmlOutput::singleton(); $this->_xmlWriter->init(new Horde_Xml_Wbxml_Encoder()); /* Here we go: fire off events: */ /* @todo catch exceptions */ $this->_wbxmlparser->decode($request); } $id = @session_id(); $sessionclose = empty($id); $output = $this->getOutput(); if (!$isWBXML) { $output = '' . $output; } $GLOBALS['backend']->logFile(Horde_SyncMl_Backend::LOGFILE_SERVERMESSAGE, $output, $isWBXML, $sessionclose); /* Clear the output buffer that we started above, and log anything * that came up for later debugging. */ $errorLogging = ob_get_clean(); if (!empty($errorLogging)) { $GLOBALS['backend']->logMessage('Caught output: ' . $errorLogging, 'WARN'); } return $output; } /* * CONTENTHANDLER CALLBACK FUNCTIONS * The following functions are callback functions that are called by the * XML parser. The XML and WBXML parsers use slightly different functions, * so the methods are duplicated. */ /** * Returns the XML|WBXML output once processing is finished. * * @return string The XML or WBXML output data. */ public function getOutput() { return $this->_xmlWriter->getOutput(); } /** * Callback public function called by XML parser. */ protected function _startElement($parser, $tag, $attributes) { list($uri, $name) = $this->_splitURI($tag); $this->startElement($uri, $name, $attributes); } /** * Callback public function called by XML parser. */ protected function _characters($parser, $chars) { $this->characters($chars); } /** * Callback public function called by XML parser. */ protected function _endElement($parser, $tag) { list($uri, $name) = $this->_splitURI($tag); $this->endElement($uri, $name); } /** * Splits an URI as provided by the XML parser. */ protected function _splitURI($tag) { $parts = explode(':', $tag); $name = array_pop($parts); $uri = implode(':', $parts); return array($uri, $name); } /** * Callback public function called by WBXML parser. */ public function startElement($uri, $element, $attrs) { $this->_Stack[] = $element; // : don't do anyhting yet if (count($this->_Stack) == 1) { return; } // header or body? if ($this->_Stack[1] == 'SyncHdr') { if (count($this->_Stack) == 2) { $this->_currentCommand = new Horde_SyncMl_Command_SyncHdr($this->_xmlWriter); } $this->_currentCommand->startElement($uri, $element, $attrs); } else { switch (count($this->_Stack)) { case 2: // : do nothing yet break; case 3: // new Command: // <[Command]> $this->_currentCommand = &Horde_SyncMl_Command::factory($element,$this->_xmlWriter); $this->_currentCommand->startElement($uri, $element, $attrs); break; default: // pass on to current command handler: // <...> $this->_currentCommand->startElement($uri, $element, $attrs); break; } } } /** * Callback public function called by WBXML parser. */ public function endElement($uri, $element) { // : everything done already by end of SyncBody if (count($this->_Stack) == 1) { return; } // header or body? if ($this->_Stack[1] == 'SyncHdr') { switch (count($this->_Stack)) { case 2: // end of header $this->handleHeader($this->_currentCommand); if ($this->debug) { var_dump($this->_currentCommand); } unset($this->_currentCommand); break; default: // pass on to command handler: $this->_currentCommand->endElement($uri, $element); break; } } else { switch (count($this->_Stack)) { case 2: // end of SyncBody. Finish everything: $this->handleEnd(); break; case 3: // // Command finished. Complete parsing and pass on to Handler $this->_currentCommand->endElement($uri, $element); $this->handleCommand($this->_currentCommand); if ($this->debug) { var_dump($this->_currentCommand); } unset($this->_currentCommand); break; default: // // pass on to command handler: $this->_currentCommand->endElement($uri, $element); break; } } if (isset($this->_chars)) { unset($this->_chars); } array_pop($this->_Stack); } /** * Callback public function called by WBXML parser. */ public function characters($str) { if (isset($this->_currentCommand)) { $this->_currentCommand->characters($str); } else { if (isset($this->_chars)) { $this->_chars = $this->_chars . $str; } else { $this->_chars = $str; } } } /* * PROCESSING FUNCTIONS * * The following functions are called by the callback functions * and do the actual processing. */ /** * Handles the header logic. * * Invoked after header is parsed. */ public function handleHeader(&$hdr) { if (is_object($this->_wbxmlparser)) { /* The WBXML parser only knows about the charset once parsing is * started. So setup charset now. */ $this->_xmlWriter->output->setVersion($this->_wbxmlparser->getVersion()); $this->_xmlWriter->output->setCharset($this->_wbxmlparser->getCharsetStr()); $GLOBALS['backend']->setCharset($this->_wbxmlparser->getCharsetStr()); } /* Start the session. */ $hdr->setupState(); $state = $GLOBALS['backend']->state; $state->wbxml = $this->_xmlWriter->isWBXML(); /* Check auth. */ if (!$state->authenticated) { $auth = $GLOBALS['backend']->checkAuthentication( $hdr->user, $hdr->credData, $hdr->credFormat, $hdr->credType); if ($auth !== false) { $state->authenticated = true; $statuscode = Horde_SyncMl::RESPONSE_AUTHENTICATION_ACCEPTED; $state->user = $auth; $GLOBALS['backend']->setUser($auth); } else { if (!$hdr->credData) { $statuscode = Horde_SyncMl::RESPONSE_CREDENTIALS_MISSING; } else { $statuscode = Horde_SyncMl::RESPONSE_INVALID_CREDENTIALS; } $GLOBALS['backend']->logMessage('Invalid authentication', 'DEBUG'); } } else { $statuscode = Horde_SyncMl::RESPONSE_OK; $GLOBALS['backend']->setUser($state->user); } /* Create . */ $this->_xmlWriter->outputInit(); /* Got the state; now write our SyncHdr header. */ $this->_xmlWriter->outputHeader($this->_respURI); /* Creates . */ $this->_xmlWriter->outputBodyStart(); /* Output status for SyncHdr. */ $this->_xmlWriter->outputStatus('0', 'SyncHdr', $statuscode, $state->targetURI, $state->sourceURI); /* Debug logging string. */ $str = 'Authenticated: ' . ($state->authenticated ? 'yes' : 'no') . '; version: ' . $state->getVerDTD() . '; message ID: ' . $state->messageID . '; source URI: ' . $state->sourceURI . '; target URI: ' . $state->targetURI . '; user: ' . $state->user . '; charset: ' . $GLOBALS['backend']->getCharset() . '; wbxml: ' . ($state->wbxml ? 'yes' : 'no'); $GLOBALS['backend']->logMessage($str, 'DEBUG'); } /** * Processes one command after it has been completely parsed. * * Invoked after a command is parsed. */ public function handleCommand(&$cmd) { $name = $cmd->getCommandName(); if ($name != 'Status' && $name != 'Map' && $name != 'Final' && $name != 'Sync' && $name != 'Results') { /* We've got to do something! This can't be the last packet. */ $GLOBALS['message_expectresponse'] = true; } if ($name == 'Final') { $this->_gotFinal = true; } /* Actual processing takes place here. */ $cmd->handleCommand($this->debug); } /** * Finishes the response. * * Invoked after complete message is parsed. */ public function handleEnd() { global $messageFull; $state = $GLOBALS['backend']->state; /* If there's pending sync data and space left in the message, send * data now. */ if ($messageFull || $state->hasPendingSyncs()) { /* still something to do: don't close session. */ $GLOBALS['message_expectresponse'] = true; } if (!$messageFull && count($p = $state->getPendingSyncs()) > 0) { foreach ($p as $pendingSync) { if (!$messageFull) { $GLOBALS['backend']->logMessage( 'Continuing sync for syncType ' . $pendingSync, 'DEBUG'); $sync = &$state->getSync($pendingSync); $sync->createSyncOutput($this->_xmlWriter); } } } if (isset($state->curSyncItem)) { $this->_xmlWriter->outputAlert( Horde_SyncMl::ALERT_NO_END_OF_DATA, $state->curSyncItem->sync->getClientLocURI(), $state->curSyncItem->sync->getServerLocURI(), $state->curSyncItem->sync->getServerAnchorLast(), $state->curSyncItem->sync->getServerAnchorNext()); } /* Don't send the final tag if we haven't sent all sync data yet. */ if ($this->_gotFinal) { if (!$messageFull && !$state->hasPendingSyncs()) { /* Create . */ $this->_xmlWriter->outputFinal(); $GLOBALS['backend']->logMessage('Sending to client', 'DEBUG'); $state->delayedFinal = false; } else { $GLOBALS['message_expectresponse'] = true; /* Remember to send a Final. */ $state->delayedFinal = true; } } elseif ($state->delayedFinal) { if (!$messageFull && !$state->hasPendingSyncs()) { /* Create . */ $this->_xmlWriter->outputFinal(); $GLOBALS['backend']->logMessage( 'Sending delayed to client', 'DEBUG'); $state->delayedFinal = false; } else { $GLOBALS['message_expectresponse'] = true; } } /* Create . Message is finished now! */ $this->_xmlWriter->outputEnd(); if ($this->_gotFinal && !$GLOBALS['message_expectresponse'] && $state->isAllSyncsComplete()) { /* This packet did not contain any real actions, just status and * map. This means we're done. The session can be closed and the * anchors saved for the next sync. */ foreach ($state->getSyncs() as $sync) { $sync->closeSync(); } $GLOBALS['backend']->logMessage('Session completed and closed', 'DEBUG'); /* Session can be closed here. */ $GLOBALS['backend']->sessionClose(); } else { $GLOBALS['backend']->logMessage('Return message completed', 'DEBUG'); } } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/DataStore.php0000664000175000017500000000603712700700443017570 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_DataStore { /** * The local URI of the datastore. * * @var string */ public $SourceRef; /** * The display name of the datastore * * @var string */ public $DisplayName; /** * The maximum size of a global unique identifier for the datastore in * bytes. * * @var integer */ public $MaxGUIDSize; /** * The preferred types and versions of a content type received by the * device. * * The content types (CTType) are the keys, the versions (VerCT) are the * values. * * @var array */ public $Rx_Pref = array(); /** * The supported types and versions of a content type received by the * device. * * The content types (CTType) are the keys, the versions (VerCT) are the * values. * * @var array */ public $Rx = array(); /** * The preferred types and versions of a content type transmitted by the * device. * * The content types (CTType) are the keys, the versions (VerCT) are the * values. * * @var array */ public $Tx_Pref = array(); /** * The supported types and versions of a content type transmitted by the * device. * * The content types (CTType) are the keys, the versions (VerCT) are the * values. * * @var array */ public $Tx = array(); /** * The maximum memory and item identifier for the datastore. * * Not implemented yet. */ public $DSMem; /** * The synchronization capabilities of the datastore. * * The synchronization types (SyncType) are stored in the keys of the * hash. * * @var array */ public $SyncCap = array(); /** * Returns the preferred content type the client wants to receive. * * @return string The device's preferred content type or null if not * specified (which is not allowed). */ public function getPreferredRXContentType() { reset($this->Rx_Pref); return key($this->Rx_Pref); } /** * Returns the version of the preferred content type the client wants to * receive. * * @return string The device's preferred content type version or null if * not specified (which is not allowed). */ public function getPreferredRXContentTypeVersion() { return reset($this->Rx_Pref); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Device.php0000664000175000017500000002412012700700443017072 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Device { /** * The original preferred content type of the client, if provided through * DevInf. * * @var string */ public $requestedContentType; /** * Attempts to return a concrete Horde_SyncMl_Device instance based on $driver. * * @param string $driver The type of concrete Horde_SyncMl_Device subclass to * return. * * @return Horde_SyncMl_Device The newly created concrete Horde_SyncMl_Device * instance, or false on error. */ public function factory($driver) { $driver = basename($driver); if (empty($driver) || $driver == 'none' || $driver == 'default') { $GLOBALS['backend']->logMessage( 'Using default device class', 'DEBUG'); return new Horde_SyncMl_Device(); } $class = 'Horde_SyncMl_Device_' . $driver; if (!class_exists($class)) { return false; } $device = new $class(); $GLOBALS['backend']->logMessage('Created device class ' . $class, 'DEBUG'); return $device; } /** * Returns the guessed content type for a database URI. * * When a client sends data during a sync but does not provide information * about the MIME content type with this individual item, this function * returns the content type the item is supposed to be in. * * @param string $database A database URI. * * @return string A MIME type that might match the database URI. */ public function getPreferredContentType($database) { $database = $GLOBALS['backend']->normalize($database); /* Use some wild guessings. */ if (strpos($database, 'contact') !== false || strpos($database, 'card') !== false) { return 'text/x-vcard'; } elseif (strpos($database, 'note') !== false || strpos($database, 'snote') !== false || strpos($database, 'memo') !== false) { return 'text/plain'; } elseif (strpos($database, 'task') !== false || strpos($database, 'cal') !== false || strpos($database, 'event') !== false) { return 'text/calendar'; } } /** * Returns the preferrred MIME content type of the client for the given * sync data type (contacts/tasks/notes/calendar). * * The result is passed as an option to the backend export functions. * This is not the content type ultimately passed to the client but rather * the content type presented to the backend export functions. * * After the data is retrieved from the backend, convertServer2Client() * can do some post-processing and set the correct content type acceptable * for the client if necessary. * * The default implementation tries to extract the content type from the * device info. If this does not work, some defaults are used. * * If the client does not provice proper DevInf data, this public function may * have to be overwritten to return the correct values. * * @param string $serverSyncURI The URI for the server database: contacts, * notes, calendar or tasks. * @param string $sourceSyncURI The URI for the client database. This is * needed as the DevInf is grouped by * sourceSyncURIs. */ public function getPreferredContentTypeClient($serverSyncURI, $sourceSyncURI) { $di = $GLOBALS['backend']->state->deviceInfo; $ds = $di->getDataStore($sourceSyncURI); if (!empty($ds)) { $r = $ds->getPreferredRXContentType(); if (!empty($r)) { $this->requestedContentType = $r; return $r; } } $database = $GLOBALS['backend']->normalize($serverSyncURI); /* No information in DevInf, use some wild guessings. */ if (strpos($database, 'contact') !== false || strpos($database, 'card') !== false) { return 'text/x-vcard'; } elseif (strpos($database, 'note') !== false || strpos($database, 'snote') !== false || strpos($database, 'memo') !== false) { // SyncML conformance suite expects this rather than text/x-vnote return 'text/plain'; } elseif (strpos($database, 'task') !== false || strpos($database, 'cal') !== false || strpos($database, 'event') !== false) { return 'text/calendar'; } } /** * Converts the content received from the client for the backend. * * Currently strips UID (primary key) information as client and server * might use different ones. * * Charset conversions might be added here too. * * @todo remove UID stripping or move it anywhere else. * * @param string $content The content to convert. * @param string $contentType The content type of the content. * * @return array Two-element array with the converted content and the * (possibly changed) new content type. */ public function convertClient2Server($content, $contentType) { $GLOBALS['backend']->logFile( Horde_SyncMl_Backend::LOGFILE_DATA, "\nInput received from client ($contentType):\n$content\n"); // Always remove client UID. UID will be seperately passed in XML. $content = preg_replace('/(\r\n|\r|\n)UID:.*?(\r\n|\r|\n)/', '\1', $content, 1); return array($content, $contentType); } /** * Converts the content from the backend to a format suitable for the * client device. * * Strips the UID (primary key) information as client and server might use * different ones. * * Charset conversions might be added here too. * * @param string $content The content to convert * @param string $contentType The content type of content as returned * from the backend * @param string $database The server database URI. * * @return array Three-element array with the converted content, the * (possibly changed) new content type, and encoding type * (like b64 as used by Funambol). */ public function convertServer2Client($content, $contentType, $database) { if (is_array($contentType)) { $contentType = $contentType['ContentType']; } $GLOBALS['backend']->logFile( Horde_SyncMl_Backend::LOGFILE_DATA, "\nOutput received from backend ($contentType):\n" . $content . "\n"); /* Always remove server UID. UID will be seperately passed in XML. */ $content = preg_replace('/(\r\n|\r|\n)UID:.*?(\r\n|\r|\n)/', '\1', $content, 1); if ($this->useLocalTime()) { $content = preg_replace_callback( '/\d{8}T\d{6}Z/', array($this, '_convertUTC2LocalTime'), $content); } return array($content, $contentType, null); } /** * Returns whether the device handles tasks and events in a single * "calendar" sync. * * This requires special actions on our side as we store this in different * backend databases. * * @return boolean True if tasks and events are processed in a single * request. */ public function handleTasksInCalendar() { return false; } /** * Returns whether to send individual status response for each Add, Delete * and Replace. * * @return boolean False if individual status responses should be send. */ public function omitIndividualSyncStatus() { return false; } /** * Returns whether the payload data should be enclosed in a [CDATA[ * section when sending via XML. * * The synchronized data may contain XML special characters like &, * < or >. Clients might choke when sending these embedded in XML. * The data should be enclosed in [CDATA[ in these cases. This applies * only to XML, not to WBXML devices. * * @return boolean True if the data should be enclosed in [CDATA[. */ public function useCdataTag() { return true; } /** * Returns whether the device accepts datetimes only in local time format * (DTSTART:20061222T130000) instead of the more robust UTC time * (DTSTART:20061222T110000Z). * * @return boolean True if the client doesn't accept UTC datetimes. */ public function useLocalTime() { return false; } /** * Converts an UTC timestamp like "20061222T110000Z" into a local * timestamp like "20061222T130000" using the server timezone. * * @param array $utc Array with a datetime string in UTC. * * @return string The datetime string converted to the local timezone. */ protected function _convertUTC2LocalTime($utc) { $date = new Horde_Date($utc[0]); $date->setTimezone(date_default_timezone_get()); return $date->format("Ymd\THis"); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/DeviceInfo.php0000664000175000017500000000644512700700443017720 0ustar janjan entries. * * Copyright 2005-2016 Horde LLC (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @author Karsten Fourmont * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_DeviceInfo { /** * The major and minor version identifier of the Device Information DTD. * * @var string */ public $VerDTD; /** * The name of the manufacturer of the device. * * @var string */ public $Man; /** * The model name or model number of the device. * * @var string */ public $Mod; /** * The OEM (Original Equipment Manufacturer) of the device. * * @var string */ public $OEM; /** * The firmware version of the device. * * @var string */ public $FwV; /** * The software version of the device. * * @var string */ public $SwV; /** * The hardware version of the device. * * @var string */ public $HwV; /** * The (globally unique) identifier of the source synchronization device. * * @var string */ public $DevID; /** * The type of the source synchronization device. * * @var string */ public $DevTyp; /** * Array of Horde_SyncMl_DataStore objects. * * @var array */ public $DataStores = array(); /** * Multidimensional array that specifies the content type capabilities of * the device. * * Example: array('text/x-vcard' => array('FN' => Horde_SyncMl_Property)) * * @var array */ public $CTCaps; /** * The non-standard, experimental extensions supported by the device. * * A hash with elements as keys and arrays of elements as * values. * Example: array('X-Foo-Bar' => array(1, 'foo')) * * @var array */ public $Exts; /** * Whether the device supports UTC based time. * * @var boolean */ public $UTC; /** * Whether the device supports handling of large objects. * * @var boolean */ public $SupportLargeObjs; /** * Whether the device supports number of changes. * * @var boolean */ public $SupportNumberOfChanges; /** * Returns a Horde_SyncMl_DataStore object for a certain source URI. * * @param string $source URI A source URI. * * @return Horde_SyncMl_DataStore A data store object or null if none found for * the source URI. */ public function getDataStore($sourceURI) { foreach ($this->DataStores as $dataStore) { if ($dataStore->SourceRef == $sourceURI) { return $dataStore; } } return null; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Property.php0000664000175000017500000000310012700700443017512 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_Property { /** * The supported enumerated values of the content type property. * * The supported values stored in the keys of the hash, e.g. 'PUBLIC' and * 'PRIVATE' for a text/calendar 'CLASS' property. * * @var array */ public $ValEnum; /** * The datatype of the content type property, e.g. 'chr', 'int', 'bool', * etc. * * @var string */ public $DataType; /** * The size of the content type property in bytes. * * @var integer */ public $Size; /** * The display name of the content type property. * * @var string */ public $DisplayName; /** * The supported parameters of the content type property. * * The parameter name (, e.g. 'WORK' for the text/x-vcard 'TEL' * property) are the keys, Horde_SyncMl_PropertyParameter objects are the * values. * * @var array */ public $Params; } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/PropertyParameter.php0000664000175000017500000000246312700700443021366 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_PropertyParameter { /** * The supported enumerated values of the content type property. * * The supported values stored in the keys of the hash, e.g. 'PUBLIC' and * 'PIVATE' for a text/calendar 'CLASS' property. * * @var array */ public $ValEnum; /** * The datatype of the content type property, e.g. 'chr', 'int', 'bool', * etc. * * @var string */ public $DataType; /** * The size of the content type property in bytes. * * @var integer */ public $Size; /** * The display name of the content type property. * * @var string */ public $DisplayName; } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/State.php0000664000175000017500000002410212700700443016753 0ustar janjan * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_State { /** * Id of this SyncML session. * * This is not to confuse with the PHP session id, though it is part of * the generated PHP session id. * * @var string */ public $sessionID; /** * Id of the current message. * * @var integer */ public $messageID; /** * The target URI as sent by the client. * * This is normally the URL of the RPC server. However the client is * free to send anything. * * @var string */ public $targetURI; /** * The source URI as sent by the client. * * Can be used to identify the client and is part of the PHP session id. * * @var string */ public $sourceURI; /** * SyncML protocol version. * * 0 for SyncML 1.0, 1 for SyncML 1.1, etc. * * @var integer */ public $version; /** * Username used to authenticate with the backend. * * @var string */ public $user; /** * Whether this session has authenticated successfully. * * @var boolean */ public $authenticated = false; /** * namespace uri. * * @var string */ protected $_uri; /** * namespace uri. * * @var string */ public $uriMeta; /** * namespace uri. * * @var string */ public $uriDevInf; /** * Whether WBXML encoding is used. * * @var boolean */ public $wbxml = false; /** * The maximum allowed message size in bytes. * * @todo Change to PHP_INT_MAX. * * @var integer */ public $maxMsgSize = 1000000000; /** * The maximum allowed object size in bytes. * * @todo Change to PHP_INT_MAX. * * @var integer */ public $maxObjSize = 1000000000; /** * Array of Horde_SyncMl_Sync objects. * * @var array */ protected $_syncs = array(); /** * The list of all server changes being sent to the client as a reference * for Status responses from the client. * * @var array */ public $serverChanges = array(); /** * Name of the appropriate device driver. * * @var string */ protected $_deviceDriver; /** * Device info provided by the SyncML DevInf data. * * @var Horde_SyncMl_DeviceInfo */ public $deviceInfo; /** * Current sync element sent from client. * * Stored in state if one element is split into multiple message packets. * * @var Horde_SyncMl_SyncElement */ public $curSyncItem; /** * Flag that is set if the client sends a Final but we are not finished * with the current package and thus can't final this package yet. * * @var boolean */ public $delayedFinal = false; /** * Constructor. */ public function __construct($sourceURI, $user, $sessionID) { $this->sourceURI = $sourceURI; $this->user = $user; $this->sessionID = $sessionID; /* Create empty dummy device info. Will be replaced with real DevInf * information if provided by the client. */ $this->deviceInfo = new Horde_SyncMl_DeviceInfo(); } /** * Returns the content based on the protocol version. */ public function getVerDTD() { switch ($this->version) { case 1: return '1.1'; case 2: return '1.2'; default: return '1.0'; } } /** * Returns the DevInf URI based on the protocol version. */ public function getDevInfURI() { switch ($this->version) { case 1: return './devinf11'; case 2: return './devinf12'; default: return './devinf10'; } } /** * Returns the protocol name based on the protocol version. */ public function getProtocolName() { switch ($this->version) { case 1: return 'SyncML/1.1'; case 2: return 'SyncML/1.2'; default: return 'SyncML/1.0'; } } /** * Sets the protocol version * * @param integer $version The protocol version: 0 for SyncML 1.0, 1 for * SyncML 1.1 etc. */ public function setVersion($version) { switch ($version) { case 1: $this->_uri = Horde_SyncMl::NAME_SPACE_URI_SYNCML_1_1; $this->uriMeta = Horde_SyncMl::NAME_SPACE_URI_METINF_1_1; $this->uriDevInf = Horde_SyncMl::NAME_SPACE_URI_DEVINF_1_1; break; case 2: $this->_uri = Horde_SyncMl::NAME_SPACE_URI_SYNCML_1_2; $this->uriMeta = Horde_SyncMl::NAME_SPACE_URI_METINF_1_2; $this->uriDevInf = Horde_SyncMl::NAME_SPACE_URI_DEVINF_1_2; break; default: $this->_uri = Horde_SyncMl::NAME_SPACE_URI_SYNCML; $this->uriMeta = Horde_SyncMl::NAME_SPACE_URI_METINF; $this->uriDevInf = Horde_SyncMl::NAME_SPACE_URI_DEVINF; break; } $this->version = $version; } /** * Returns the namespace URI for the element. * * @return string The namespace URI to use, if any. */ public function getURI() { /* The non WBXML devices (notably SonyEricsson and Funambol) seem to * get confused by a element. They * require just . So don't use a namespace for non-wbxml * devices. */ if ($this->wbxml || $this->version > 0) { return $this->_uri; } else { return ''; } } /** * Returns a Horde_SyncMl_Device instance for the device used in this session. * * @return Horde_SyncMl_Device A Horde_SyncMl_Device instance. */ public function getDevice() { if (empty($this->_deviceDriver)) { $si = $this->sourceURI; $di = $this->deviceInfo; if (stristr($si, 'sync4j') !== false || stristr($si, 'sc-pim') !== false || stristr($si, 'fol-') !== false || stristr($si, 'fwm-') !== false || stristr($si, 'fbb-') !== false) { $this->_deviceDriver = 'Sync4j'; } elseif (!empty($di->Man) && (stristr($di->Man, 'Sony Ericsson') !== false || stristr($di->Mod, 'A1000') !== false)) { /* The Morola A1000 has a similar (UIQ) firmware as the * P800: */ $this->_deviceDriver = 'P800'; } elseif (!empty($di->Man) && stristr($di->Man, 'nokia') !== false) { $this->_deviceDriver = 'Nokia'; } elseif (stristr($si, 'fmz-') !== false) { $this->_deviceDriver = 'Sync4JMozilla'; } else { $this->_deviceDriver = 'default'; } } return Horde_SyncMl_Device::factory($this->_deviceDriver); } /** * @param string $target * @param Horde_SyncMl_Sync $sync */ public function setSync($target, $sync) { $this->_syncs[$target] = $sync; } /** * @param string $target * @return Horde_SyncMl_Sync */ public function getSync($target) { if (isset($this->_syncs[$target])) { return $this->_syncs[$target]; } else { return false; } } /** * @return array */ public function getSyncs() { return $this->_syncs; } /** * Returns whether there are any pending elements that have not been sent * to due to message size restrictions. These will be sent int the next * message. * * @return boolean True if there are pending elements that have yet to be * sent. */ public function hasPendingSyncs() { if (is_array($this->_syncs)) { foreach ($this->_syncs as $sync) { if ($sync->hasPendingElements()) { return true; } } } return false; } /** * Returns all syncs which have pending elements left. * * @return array Array of TargetLocURIs which can be used as a key in * getSync() calls. */ public function getPendingSyncs() { $pending = array(); if (is_array($this->_syncs)) { foreach ($this->_syncs as $target => $sync) { if ($sync->hasPendingElements()) { $pending[] = $target; } } } return $pending; } /** * Returns whether all syncs are in completed state or no syncs are * present. * * @return boolean True if all syncs are in completed state. */ public function isAllSyncsComplete() { if (is_array($this->_syncs)) { foreach ($this->_syncs as $target => $sync) { if (!$sync->isComplete()) { return false; } } } return true; } /** * Propagates final tags here and then further to every sync. * * This allows the sync objects to determine if they are complete. */ public function handleFinal(&$output, $debug = false) { if (is_array($this->_syncs)) { foreach (array_keys($this->_syncs) as $t) { $this->_syncs[$t]->handleFinal($output, $debug); } } } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Sync.php0000664000175000017500000011307712700700443016621 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Sync { /** * @see Horde_SyncMl_Sync::_state */ const STATE_INIT = 0; const STATE_SYNC = 1; const STATE_MAP = 2; const STATE_COMPLETED = 3; /** * Target (client) URI (database). * * @var string */ protected $_targetLocURI; /** * Source (server) URI (database). * * @var string */ protected $_sourceLocURI; /** * The synchronization method, one of the Horde_SyncMl::ALERT_* constants. * * @var integer */ protected $_syncType; /** * Counts the s sent by the server. * * @var integer */ protected $_syncsSent = 0; /** * Counts the s received by the server. Currently unused. * * @var integer */ protected $_syncsReceived = 0; /** * Map data is expected whenever an add is sent to the client. * * @var boolean */ protected $_expectingMapData = false; /** * State of the current sync. * * A sync starts in Horde_SyncMl_Sync::STATE_INIT and moves on to the next state with every * received from the client: Horde_SyncMl_Sync::STATE_INIT, Horde_SyncMl_Sync::STATE_SYNC, Horde_SyncMl_Sync::STATE_MAP, * Horde_SyncMl_Sync::STATE_COMPLETED. Horde_SyncMl_Sync::STATE_MAP doesn't occur for _FROM_CLIENT syncs. * * @var constant */ protected $_state = Horde_SyncMl_Sync::STATE_INIT; /** * Sync Anchors determine the interval from which changes are retrieved. * * @var integer */ protected $_clientAnchorNext; protected $_serverAnchorLast; protected $_serverAnchorNext; /** * Number of objects that have been sent to the server for adding. * * @var integer */ protected $_client_add_count = 0; /** * Number of objects that have been sent to the server for replacement. * * @var integer */ protected $_client_replace_count = 0; /** * Number of objects that have been sent to the server for deletion. * * @var integer */ protected $_client_delete_count = 0; /** * Add due to client replace request when map entry is not found. Happens * during SlowSync. * * @var integer */ protected $_client_addreplaces = 0; /** * Number of objects that have been sent to the client for adding. * * @var integer */ protected $_server_add_count = 0; /** * Number of objects that have been sent to the client for replacement. * * @var integer */ protected $_server_replace_count = 0; /** * Number of objects that have been sent to the client for deletion. * * @var integer */ protected $_server_delete_count = 0; /** * Number of failed actions, for logging purposes only. * * @var integer */ protected $_errors = 0; /** * List of object UIDs (in the keys) that have been added on the server * since the last synchronization and are supposed to be sent to the * client. * * @var array */ protected $_server_adds; /** * List of object UIDs (in the keys) that have been changed on the server * since the last synchronization and are supposed to be sent to the * client. * * @var array */ protected $_server_replaces; /** * List of object UIDs (in the keys) that have been deleted on the server * since the last synchronization and are supposed to be sent to the * client. * * @var array */ protected $_server_deletes; /** * List of task UIDs (in the keys) that have been added on the server * since the last synchronization and are supposed to be sent to the * client. * * This is only used for clients handling tasks and events in one * database. We need to seperately store the server tasks adds, so when we * get a Map command from the client, we know whether to put this in tasks * or calendar. * * @var array */ protected $_server_task_adds; /** * Array holding the remaining content when splitting a large object into * multiple messages. Keys are numeric, values are: * command, chunkContent, clientContentType, clientEncodingType, cuid, suid * * @var array */ protected $_server_largeobj; /** * * @param string $syncType * @param string $serverURI * @param string $clientURI * @param integer $serverAnchorLast * @param integer $serverAnchorNext * @param string $clientAnchorNext */ public function __construct($syncType, $serverURI, $clientURI, $serverAnchorLast, $serverAnchorNext, $clientAnchorNext) { $this->_syncType = $syncType; $this->_targetLocURI = $serverURI; $this->_sourceLocURI = $clientURI; $this->_clientAnchorNext = $clientAnchorNext; $this->_serverAnchorLast = $serverAnchorLast; $this->_serverAnchorNext = $serverAnchorNext; } /** * Here's where the actual processing of a client-sent Sync Item takes * place. Entries are added, deleted or replaced from the server database * by using backend API calls. * * @todo maybe this should be moved to SyncItem * * @param $output * @param Horde_SyncMl_SyncElement $item */ public function handleClientSyncItem(&$output, &$item) { global $backend; $backend->logMessage( 'Handling <' . $item->elementType . '> sent from client', 'DEBUG'); /* if size of item is set: check it first */ if ($item->size > 0) { if (strlen($item->content) != $item->size && /* For some strange reason the SyncML conformance test suite * sends an item with length n and size tag=n+1 and expects us * the accept it. Happens in test 1301. So ignore this to be * conformant (and wrong). */ strlen($item->content) + 1 != $item->size) { $item->responseCode = Horde_SyncMl::RESPONSE_SIZE_MISMATCH; $backend->logMessage( 'Item size mismatch. Size reported as ' . $item->size . ' but actual size is ' . strlen($item->content), 'ERR'); $this->_errors++; return false; } } $device = $GLOBALS['backend']->state->getDevice(); $hordedatabase = $database = $this->_targetLocURI; $content = $item->content; if ($item->contentFormat == 'b64') { $content = base64_decode($content); } if (($item->contentType == 'text/calendar' || $item->contentType == 'text/x-vcalendar') && $backend->normalize($database) == 'calendar' && $device->handleTasksInCalendar()) { $tasksincalendar = true; /* Check if the client sends us a vtodo in a calendar sync. */ if (preg_match('/(\r\n|\r|\n)BEGIN[^:]*:VTODO/', "\n" . $content)) { $hordedatabase = $this->_taskToCalendar($backend->normalize($database)); } } else { $tasksincalendar = false; } /* Use contentType explicitly specified in this sync command. */ $contentType = $item->contentType; /* If not provided, use default from device info. */ if (!$contentType) { $contentType = $device->getPreferredContentType($hordedatabase); } if ($item->elementType != 'Delete') { list($content, $contentType) = $device->convertClient2Server($content, $contentType); } $cuid = $item->cuid; $suid = false; if ($item->elementType == 'Add') { /* Handle client add requests. * * @todo: check if this $cuid is already present and then maybe do * an replace instead? */ $suid = $backend->addEntry($hordedatabase, $content, $contentType, $cuid); if (!is_a($suid, 'PEAR_Error')) { $this->_client_add_count++; $item->responseCode = Horde_SyncMl::RESPONSE_ITEM_ADDED; $backend->logMessage('Added client entry as ' . $suid, 'DEBUG'); } else { $this->_errors++; /* @todo: better response code. */ $item->responseCode = Horde_SyncMl::RESPONSE_NO_EXECUTED; $backend->logMessage('Error in adding client entry: ' . $suid->message, 'ERR'); } } elseif ($item->elementType == 'Delete') { /* Handle client delete requests. */ $ok = $backend->deleteEntry($database, $cuid); if (!$ok && $tasksincalendar) { $backend->logMessage( 'Task ' . $cuid . ' deletion sent with calendar request', 'DEBUG'); $ok = $backend->deleteEntry($this->_taskToCalendar($backend->normalize($database)), $cuid); } if ($ok) { $this->_client_delete_count++; $item->responseCode = Horde_SyncMl::RESPONSE_OK; $backend->logMessage('Deleted entry ' . $suid . ' due to client request', 'DEBUG'); } else { $this->_errors++; $item->responseCode = Horde_SyncMl::RESPONSE_ITEM_NO_DELETED; $backend->logMessage('Failure deleting client entry, maybe already disappeared from server', 'DEBUG'); } } elseif ($item->elementType == 'Replace') { /* Handle client replace requests. */ $suid = $backend->replaceEntry($hordedatabase, $content, $contentType, $cuid); if (!is_a($suid, 'PEAR_Error')) { $this->_client_replace_count++; $item->responseCode = Horde_SyncMl::RESPONSE_OK; $backend->logMessage('Replaced entry ' . $suid . ' due to client request', 'DEBUG'); } else { $backend->logMessage($suid->message, 'DEBUG'); /* Entry may have been deleted; try adding it. */ $suid = $backend->addEntry($hordedatabase, $content, $contentType, $cuid); if (!is_a($suid, 'PEAR_Error')) { $this->_client_addreplaces++; $item->responseCode = Horde_SyncMl::RESPONSE_ITEM_ADDED; $backend->logMessage( 'Added instead of replaced entry ' . $suid, 'DEBUG'); } else { $this->_errors++; /* @todo: better response code. */ $item->responseCode = Horde_SyncMl::RESPONSE_NO_EXECUTED; $backend->logMessage( 'Error in adding client entry due to replace request: ' . $suid->message, 'ERR'); } } } else { $backend->logMessage( 'Unexpected elementType: ' . $item->elementType, 'ERR'); } return $suid; } /** * Creates a output containing the server changes. * * @todo Check for Mem/FreeMem and Mem/FreeID when checking MaxObjSize */ public function createSyncOutput(&$output) { global $backend, $messageFull; $backend->logMessage( 'Creating output for server changes in database ' . $this->_targetLocURI, 'DEBUG'); /* If sync data from client only, nothing to be done here. */ if($this->_syncType == Horde_SyncMl::ALERT_ONE_WAY_FROM_CLIENT || $this->_syncType == Horde_SyncMl::ALERT_REFRESH_FROM_CLIENT) { return; } /* If one sync has been sent an no pending data: bail out. */ if ($this->_syncsSent > 0 && !$this->hasPendingElements()) { return; } /* $messageFull will be set to true to indicate that there's no room * for other data in this message. If it's false (empty) and there are * pending Sync data, the final command will sent the pending data. */ $messageFull = false; $state = $GLOBALS['backend']->state; $device = $state->getDevice(); $di = $state->deviceInfo; $contentType = $device->getPreferredContentTypeClient( $this->_targetLocURI, $this->_sourceLocURI); $contentTypeTasks = $device->getPreferredContentTypeClient( 'tasks', $this->_sourceLocURI); if ($state->deviceInfo && $state->deviceInfo->CTCaps) { $fields = array($contentType => isset($state->deviceInfo->CTCaps[$contentType]) ? $state->deviceInfo->CTCaps[$contentType] : null, $contentTypeTasks => isset($state->deviceInfo->CTCaps[$contentTypeTasks]) ? $state->deviceInfo->CTCaps[$contentTypeTasks] : null); } else { $fields = array($contentType => null, $contentTypeTasks => null); } /* If server modifications are not retrieved yet (first Sync element), * do it now. */ if (!is_array($this->_server_adds)) { $backend->logMessage( 'Compiling server changes from ' . date('Y-m-d H:i:s', $this->_serverAnchorLast) . ' to ' . date('Y-m-d H:i:s', $this->_serverAnchorNext), 'DEBUG'); $result = $this->_retrieveChanges($this->_targetLocURI, $this->_server_adds, $this->_server_replaces, $this->_server_deletes); if (is_a($result, 'PEAR_Error')) { return; } /* If tasks are handled inside calendar, do the same again for * tasks. Merge resulting arrays. */ if ($backend->normalize($this->_targetLocURI) == 'calendar' && $device->handleTasksInCalendar()) { $this->_server_task_adds = $deletes2 = $replaces2 = array(); $result = $this->_retrieveChanges('tasks', $this->_server_task_adds, $replaces2, $deletes2); if (is_a($result, 'PEAR_Error')) { return; } $this->_server_adds = array_merge($this->_server_adds, $this->_server_task_adds); $this->_server_replaces = array_merge($this->_server_replaces, $replaces2); $this->_server_deletes = array_merge($this->_server_deletes, $deletes2); } $numChanges = count($this->_server_adds) + count($this->_server_replaces) + count($this->_server_deletes); $backend->logMessage( 'Sending ' . $numChanges . ' server changes ' . 'for client URI ' . $this->_targetLocURI, 'DEBUG'); /* Now we know the number of Changes and can send them to the * client. */ if ($di->SupportNumberOfChanges) { $output->outputSyncStart($this->_sourceLocURI, $this->_targetLocURI, $numChanges); } else { $output->outputSyncStart($this->_sourceLocURI, $this->_targetLocURI); } } else { /* Package continued. Sync in subsequent message. */ $output->outputSyncStart($this->_sourceLocURI, $this->_targetLocURI); } /* We sent a Sync. So at least we espect a status response and thus * another message from the client. */ $GLOBALS['message_expectresponse'] = true; /* Handle large objects. */ if (isset($this->_server_largeobj)) { list($command, $chunkContent, $clientContentType, $clientEncodingType, $cuid, $suid) = $this->_server_largeobj; $backend->logMessage("Continuing sending large object from server: ".$suid, 'DEBUG'); $chunkLength = $state->maxMsgSize - $output->getOutputSize() - Horde_SyncMl::MSG_CHUNK_LEN - Horde_SyncMl::MSG_TRAILER_LEN; if (($chunkContent = $this->_getServerLargeObjChunk($chunkLength)) !== false) { $moreData = $messageFull = isset($this->_server_largeobj); $cmdId = $output->outputSyncCommand($command, $chunkContent, $clientContentType, $clientEncodingType, $cuid, $suid, null, $moreData); if ($messageFull) { $output->outputSyncEnd(); $this->_syncsSent += 1; return; } } } /* Handle deletions. */ $deletes = $this->_server_deletes; foreach ($deletes as $suid => $cuid) { /* Check if we have space left in the message. */ if ($state->maxMsgSize - $output->getOutputSize() < Horde_SyncMl::MSG_TRAILER_LEN) { $backend->logMessage( 'Maximum message size ' . $state->maxMsgSize . ' approached during delete; current size: ' . $output->getOutputSize(), 'DEBUG'); $messageFull = true; $output->outputSyncEnd(); $this->_syncsSent += 1; return; } $backend->logMessage( "Sending delete from server: client id $cuid, server id $suid", 'DEBUG'); /* Create a Delete request for client. */ $cmdId = $output->outputSyncCommand('Delete', null, null, null, $cuid, null); unset($this->_server_deletes[$suid]); $state->serverChanges[$state->messageID][$this->_targetLocURI][$cmdId] = array($suid, $cuid); $this->_server_delete_count++; } /* Handle additions. */ $adds = $this->_server_adds; foreach ($adds as $suid => $cuid) { $backend->logMessage("Sending add from server: $suid", 'DEBUG'); $syncDB = isset($this->_server_task_adds[$suid]) ? 'tasks' : $this->_targetLocURI; $ct = isset($this->_server_task_adds[$suid]) ? $contentTypeTasks : $contentType; $c = $backend->retrieveEntry($syncDB, $suid, $ct, $fields[$ct]); /* Item in history but not in database. Strange, but can * happen. */ if (is_a($c, 'PEAR_Error')) { $backend->logMessage( 'API export call for ' . $suid . ' failed: ' . $c->getMessage(), 'ERR'); } else { list($clientContent, $clientContentType, $clientEncodingType) = $device->convertServer2Client($c, $contentType, $syncDB); /* Trim clientContent to calculate correct size. */ $clientContent = trim($clientContent); $clientContentLength = strlen($clientContent); /* Check if we have space left in the message. */ if (($state->maxMsgSize - $output->getOutputSize() - $clientContentLength) < Horde_SyncMl::MSG_TRAILER_LEN) { $backend->logMessage( 'Maximum message size ' . $state->maxMsgSize . ' approached during add; current size: ' . $output->getOutputSize(), 'DEBUG'); if ($clientContentLength + Horde_SyncMl::MSG_DEFAULT_LEN > $state->maxMsgSize) { if (!$di->SupportLargeObjs) { $backend->logMessage( 'Data item won\'t fit into a single message. Client doesn\'t support large objects, so item will be skipped.', 'DEBUG'); unset($this->_server_adds[$suid]); continue; } elseif ($state->maxObjSize < $clientContentLength) { $backend->logMessage( 'Data item won\'t fit into a single message. Item size ' . $clientContentLength . ' exceeds maximum object size ' . $state->maxObjSize . ', so item will be skipped.', 'DEBUG'); unset($this->_server_adds[$suid]); continue; } else { $backend->logMessage( 'Data item won\'t fit into a single message. Split content into chunks and send in multiple messages.', 'DEBUG'); $this->_server_largeobj = array('Add', $clientContent, $clientContentType, $clientEncodingType, null, $suid); $chunkLength = $state->maxMsgSize - $output->getOutputSize() - Horde_SyncMl::MSG_CHUNK_LEN - Horde_SyncMl::MSG_TRAILER_LEN; if (($chunkContent = $this->_getServerLargeObjChunk($chunkLength)) !== false) { $cmdId = $output->outputSyncCommand('Add', $chunkContent, $clientContentType, $clientEncodingType, null, $suid, $clientContentLength, true); /* @todo: _server_add_count, _server_adds and serverChanges on first or last chunk? */ $this->_server_add_count++; unset($this->_server_adds[$suid]); $state->serverChanges[$state->messageID][$this->_targetLocURI][$cmdId] = array($suid, 0); $messageFull = true; $output->outputSyncEnd(); $this->_syncsSent += 1; return; } } } $messageFull = true; $output->outputSyncEnd(); $this->_syncsSent += 1; return; } /* @todo: on SlowSync send Replace instead! */ // $output->outputSyncCommand($refts == 0 ? 'Replace' : 'Add', $cmdId = $output->outputSyncCommand('Add', $clientContent, $clientContentType, $clientEncodingType, null, $suid); $this->_server_add_count++; $state->serverChanges[$state->messageID][$this->_targetLocURI][$cmdId] = array($suid, 0); } unset($this->_server_adds[$suid]); } if ($this->_server_add_count) { $this->_expectingMapData = true; } /* Handle Replaces. */ $replaces = $this->_server_replaces; foreach ($replaces as $suid => $cuid) { $syncDB = isset($replaces2[$suid]) ? 'tasks' : $this->_targetLocURI; $ct = isset($replaces2[$suid]) ? $contentTypeTasks : $contentType; $c = $backend->retrieveEntry($syncDB, $suid, $ct, $fields[$ct]); if (is_a($c, 'PEAR_Error')) { /* Item in history but not in database. */ unset($this->_server_replaces[$suid]); continue; } $backend->logMessage( "Sending replace from server: $suid", 'DEBUG'); list($clientContent, $clientContentType, $clientEncodingType) = $device->convertServer2Client($c, $contentType, $syncDB); /* Trim clientContent to calculate correct size. */ $clientContent = trim($clientContent); $clientContentLength = strlen($clientContent); /* Check if we have space left in the message. */ if (($state->maxMsgSize - $output->getOutputSize() - $clientContentLength) < Horde_SyncMl::MSG_TRAILER_LEN) { $backend->logMessage( 'Maximum message size ' . $state->maxMsgSize . ' approached during replace; current size: ' . $output->getOutputSize(), 'DEBUG'); if ($clientContentLength + Horde_SyncMl::MSG_DEFAULT_LEN > $state->maxMsgSize) { if (!$di->SupportLargeObjs) { $backend->logMessage( 'Data item won\'t fit into a single message. Client doesn\'t support large objects, so item will be skipped.', 'DEBUG'); unset($this->_server_adds[$suid]); continue; } elseif ($state->maxObjSize < $clientContentLength) { $backend->logMessage( 'Data item won\'t fit into a single message. Item size ' . $clientContentLength . ' exceeds maximum object size ' . $state->maxObjSize . ', so item will be skipped.', 'DEBUG'); unset($this->_server_adds[$suid]); continue; } else { $backend->logMessage( 'Data item won\'t fit into a single message. Split content into chunks and send in multiple messages.', 'DEBUG'); $this->_server_largeobj = array('Replace', $clientContent, $clientContentType, $clientEncodingType, $cuid, null); $chunkLength = $state->maxMsgSize - $output->getOutputSize() - Horde_SyncMl::MSG_CHUNK_LEN - Horde_SyncMl::MSG_TRAILER_LEN; if (($chunkContent = $this->_getServerLargeObjChunk($chunkLength)) !== false) { $cmdId = $output->outputSyncCommand('Replace', $chunkContent, $clientContentType, $clientEncodingType, $cuid, null, $clientContentLength, true); /* @todo: _server_replace_count, _server_replaces and serverChanges on first or last chunk? */ $this->_server_replace_count++; unset($this->_server_replaces[$suid]); $state->serverChanges[$state->messageID][$this->_targetLocURI][$cmdId] = array($suid, $cuid); $messageFull = true; $output->outputSyncEnd(); $this->_syncsSent += 1; return; } } } $messageFull = true; $output->outputSyncEnd(); $this->_syncsSent += 1; return; } $cmdId = $output->outputSyncCommand('Replace', $clientContent, $clientContentType, $clientEncodingType, $cuid, null); $this->_server_replace_count++; unset($this->_server_replaces[$suid]); $state->serverChanges[$state->messageID][$this->_targetLocURI][$cmdId] = array($suid, $cuid); } /* Finished! Send closing . */ $output->outputSyncEnd(); $this->_syncsSent += 1; } /** * Retrieves and condenses the changes on the server side since the last * synchronization. * * @param string $syncDB The database being synchronized. * @param array $adds Will be set with the server-client-uid mappings * of added objects. * @param array $replaces Will be set with the server-client-uid mappings * of changed objects. * @param array $deletes Will be set with the server-client-uid mappings * of deleted objects. */ protected function _retrieveChanges($syncDB, &$adds, &$replaces, &$deletes) { $adds = $replaces = $deletes = array(); if ($syncDB == 'configuration') { return; } $result = $GLOBALS['backend']->getServerChanges($syncDB, $this->_serverAnchorLast, $this->_serverAnchorNext, $adds, $replaces, $deletes); if (is_a($result, 'PEAR_Error')) { $GLOBALS['backend']->logMessage($result, 'ERR'); return $result; } } /** * Notifies the sync that a final has been received by the client. * * Depending on the current state of the sync this can mean various * things: * a) Init phase (Alerts) done. Next package contaings actual syncs. * b) Sync sending from client done. Next package are maps (or finish * or finish if ONE_WAY_FROM_CLIENT sync * c) Maps finished, completly done. */ public function handleFinal(&$output, $debug = false) { switch ($this->_state) { case Horde_SyncMl_Sync::STATE_INIT: $state = 'Init'; break; case Horde_SyncMl_Sync::STATE_SYNC: $state = 'Sync'; break; case Horde_SyncMl_Sync::STATE_MAP: $state = 'Map'; break; case Horde_SyncMl_Sync::STATE_COMPLETED: $state = 'Completed'; break; } $GLOBALS['backend']->logMessage('Handle for state ' . $state, 'DEBUG'); switch ($this->_state) { case Horde_SyncMl_Sync::STATE_INIT: $this->_state = Horde_SyncMl_Sync::STATE_SYNC; break; case Horde_SyncMl_Sync::STATE_SYNC: /* Received all client Sync data, now we are allowed to send * server sync data. */ if (!$debug) { $this->createSyncOutput($output); } // FROM_CLIENT_SYNC doeesn't require a MAP package: if ($this->_syncType == Horde_SyncMl::ALERT_ONE_WAY_FROM_CLIENT || $this->_syncType == Horde_SyncMl::ALERT_REFRESH_FROM_CLIENT || !$this->_expectingMapData) { $this->_state = Horde_SyncMl_Sync::STATE_COMPLETED; } else { $this->_state = Horde_SyncMl_Sync::STATE_MAP; } break; case Horde_SyncMl_Sync::STATE_MAP: $this->_state = Horde_SyncMl_Sync::STATE_COMPLETED; break; } } /** * Returns true if there are still outstanding server sync items to * be sent to the client. * * This is the case if the MaxMsgSize has been reached and the pending * elements are to be sent in another message. */ public function hasPendingElements() { if (!is_array($this->_server_adds)) { /* Changes not compiled yet: not pending: */ return false; } return (count($this->_server_adds) + count($this->_server_replaces) + count($this->_server_deletes) + (int)(bool)$this->_server_largeobj) > 0; } public function addSyncReceived() { $this->_syncsReceived++; } /* Currently unused */ public function getSyncsReceived() { return $this->_syncsReceived; } public function isComplete() { return $this->_state == Horde_SyncMl_Sync::STATE_COMPLETED; } /** * Completes a sync once everything is done: store the sync anchors so the * next sync can be a delta sync and produce some debug info. */ public function closeSync() { $GLOBALS['backend']->writeSyncAnchors($this->_targetLocURI, $this->_clientAnchorNext, $this->_serverAnchorNext); $s = sprintf( 'Finished sync of database %s user %s dev %s. Failures: %d; ' . 'changes from client (Add, Replace, Delete, AddReplaces): %d, %d, %d, %d; ' . 'changes from server (Add, Replace, Delete): %d, %d, %d', $this->_targetLocURI, $GLOBALS['backend']->getuser(), $GLOBALS['backend']->getSyncDeviceID(), $this->_errors, $this->_client_add_count, $this->_client_replace_count, $this->_client_delete_count, $this->_client_addreplaces, $this->_server_add_count, $this->_server_replace_count, $this->_server_delete_count); $GLOBALS['backend']->logMessage($s, 'INFO'); } public function getServerLocURI() { return $this->_targetLocURI; } public function getClientLocURI() { return $this->_sourceLocURI; } public function getClientAnchorNext() { return $this->_clientAnchorNext; } public function getServerAnchorNext() { return $this->_serverAnchorNext; } public function getServerAnchorLast() { return $this->_serverAnchorLast; } public function createUidMap($databaseURI, $cuid, $suid) { $device = $GLOBALS['backend']->state->getDevice(); if ($GLOBALS['backend']->normalize($databaseURI) == 'calendar' && $device->handleTasksInCalendar() && isset($this->_server_task_adds[$suid])) { $db = $this->_taskToCalendar($GLOBALS['backend']->normalize($databaseURI)); } else { $db = $databaseURI; } $GLOBALS['backend']->createUidMap($db, $cuid, $suid); $GLOBALS['backend']->logMessage( 'Created map for client id ' . $cuid . ' and server id ' . $suid . ' in database ' . $db, 'DEBUG'); } /** * Returns the client ID of server change identified by the change type * and server ID. * * @param string $change The change type (add, replace, delete). * @param string $id The object's server UID. * * @return string The matching client ID or null if none found. */ public function getServerChange($change, $id) { $property = '_server_' . $change . 's'; return isset($this->{$property[$id]}) ? $this->{$property[$id]} : null; } /** * Sets the client ID of server change identified by the change type and * server ID. * * @param string $change The change type (add, replace, delete). * @param string $sid The object's server UID. * @param string $cid The object's client UID. */ public function setServerChange($change, $sid, $cid) { $property = '_server_' . $change . 's'; $this->{$property[$sid]} = $cid; } /** * Unsets the server-client-map of server change identified by the change * type and server ID. * * @param string $change The change type (add, replace, delete). * @param string $id The object's server UID. */ public function unsetServerChange($change, $id) { $property = '_server_' . $change . 's'; unset($this->{$property[$id]}); } /** * Converts a calendar databaseURI to a tasks databaseURI for devices with * handleTasksInCalendar. */ protected function _taskToCalendar($databaseURI) { return str_replace('calendar', 'tasks', $databaseURI); } /** * Get the next chunk from the cached large object with maximum length * of chunkLength or return false. * * @param int $chunkLength The maximum length of the chunk. * * @return string The next chunk of the cached large object. */ protected function _getServerLargeObjChunk($chunkLength) { if ($this->_server_largeobj) { $chunkContent = $this->_server_largeobj[1]; if ($chunkLength < strlen($chunkContent)) { /* Ensure that no whitespace is on split edge, because it would get trimmed later during sending and size calculation would be wrong. */ if (preg_match('/\A.+\S\S/s', substr($chunkContent, 0, $chunkLength + 1), $matches)) { $this->_server_largeobj[1] = substr($chunkContent, strlen($matches[0]) - 1); $chunkContent = substr($matches[0], 0, -1); } else { /* Error: no fitting chunk found; return empty string to finish partial sending. */ $chunkContent = ''; unset($this->_server_largeobj); } } else { unset($this->_server_largeobj); } return $chunkContent; } else { return false; } } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/SyncElement.php0000664000175000017500000000450412700700443020125 0ustar janjan, and elements found inside a command. * * Instances of this class are created during the XML parsing by * Horde_SyncMl_Command_Sync. * * Copyright 2005-2016 Horde LLC (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @author Karsten Fourmont * @author Jan Schneider * @package SyncMl */ class Horde_SyncMl_SyncElement { /** * The MIME content type of the sync command. * * @var string */ public $contentType; /** * Encoding format of the content as specified in the * element, like 'b64'. * * @var string */ public $contentFormat; /** * The actual data content of the sync command. * * @var string $content */ public $content = ''; /** * The size of the data item of the sync command in bytes as specified by * a element. * * @var integer */ public $size; /** * The command ID () of the sync command. * * @var integer */ public $cmdID; /** * Name of the sync command, like 'Add'. * * @var string */ public $elementType; /** * The client ID for the data item processed in the sync command. * * @var string */ public $cuid; /** * The code to be sent as status response in a element, one of * the Horde_SyncMl::RESPONSE_* constants. * * This is set in Horde_SyncMl_Sync::handleClientSyncItem() when "processing" * the item. * * @var integer */ public $responseCode; /** * The Sync object for this element is part of. * * @var object Horde_SyncMl_Sync */ public $sync; /** * Constructor. * * @param Horde_SyncMl_Sync $sync * @param string $elementType * @param integer $cmdID * @param integer $size */ public function __construct($sync, $elementType, $cmdID, $size) { $this->sync = $sync; $this->elementType = $elementType; $this->cmdID = $cmdID; $this->size = $size; } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/Translation.php0000664000175000017500000000137312700700443020176 0ustar janjan * @package SyncMl */ class Horde_SyncMl_Translation extends Horde_Translation_Autodetect { /** * The translation domain * * @var string */ protected static $_domain = 'Horde_SyncMl'; /** * The absolute PEAR path to the translations for the default gettext handler. * * @var string */ protected static $_pearDirectory = '@data_dir@'; } Horde_SyncMl-2.0.7/lib/Horde/SyncMl/XmlOutput.php0000664000175000017500000006242212700700443017663 0ustar janjan * @package SyncMl */ class Horde_SyncMl_XmlOutput { /** * The CmdID provides a unique ID for each command in a syncml packet. */ protected $_msg_CmdID; /** * The outputhandler to whom the XML is passed: like * Horde_Xml_Wbxml_Encoder */ public $output; protected $_uri; /** * The final output as procuded by the _output Encoder. Either an * XML string or a WBXML string. */ public function getOutput() { return $this->output->getOutput(); } /** * The length of the output as produced by the Encoder. To limit the * size of individual messages. */ public function getOutputSize() { return $this->output->getOutputSize(); } /** * To we create wbxml or not? */ public function isWBXML() { return is_a($this->output, 'Horde_Xml_Wbxml_Encoder'); } public function &singleton() { static $instance; if (!isset($instance)) { $instance = new Horde_SyncMl_XmlOutput(); } return $instance; } public function init(&$theoutputhandler) { $this->output = $theoutputhandler; $this->_msg_CmdID = 1; } /** * Creates a SyncHdr output. * * Required data is retrieved from state. * * @param string $respURI The url of the server endpoint. * * @throws Horde_Xml_Wbxml_Exception */ public function outputHeader($respURI) { $state = $GLOBALS['backend']->state; $this->_uriMeta = $state->uriMeta; $this->output->startElement($this->_uri, 'SyncHdr'); $this->output->startElement($this->_uri, 'VerDTD'); $chars = $state->getVerDTD(); $this->output->characters($chars); $this->output->endElement($this->_uri, 'VerDTD'); $this->output->startElement($this->_uri, 'VerProto'); $chars = $state->getProtocolName(); $this->output->characters($chars); $this->output->endElement($this->_uri, 'VerProto'); $this->output->startElement($this->_uri, 'SessionID'); $this->output->characters($state->sessionID); $this->output->endElement($this->_uri, 'SessionID'); $this->output->startElement($this->_uri, 'MsgID'); $this->output->characters($state->messageID); $this->output->endElement($this->_uri, 'MsgID'); $this->output->startElement($this->_uri, 'Target'); $this->output->startElement($this->_uri, 'LocURI'); // Source URI sent from client is Target for the server $this->output->characters($state->sourceURI); $this->output->endElement($this->_uri, 'LocURI'); if ($state->user) { $this->output->startElement($this->_uri, 'LocName'); $this->output->characters($state->user); $this->output->endElement($this->_uri, 'LocName'); } $this->output->endElement($this->_uri, 'Target'); $this->output->startElement($this->_uri, 'Source'); $this->output->startElement($this->_uri, 'LocURI'); // Target URI sent from client is Source for the server $this->output->characters($state->targetURI); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Source'); if ($respURI) { $this->output->startElement($this->_uri, 'RespURI'); $this->output->characters($respURI); $this->output->endElement($this->_uri, 'RespURI'); } // @Todo: omit this in SyncML1.0? $this->output->startElement($this->_uri, 'Meta'); // Dummy Max MsqSize, this is just put in to make the packet // work, it is not a real value. $this->output->startElement($this->_uriMeta, 'MaxMsgSize'); $chars = Horde_SyncMl::SERVER_MAXMSGSIZE; // 1Meg $this->output->characters($chars); $this->output->endElement($this->_uriMeta, 'MaxMsgSize'); // MaxObjSize, required by protocol for SyncML1.1 and higher. if ($state->version > 0) { $this->output->startElement($this->_uriMeta, 'MaxObjSize'); $this->output->characters(Horde_SyncMl::SERVER_MAXOBJSIZE); $this->output->endElement($this->_uriMeta, 'MaxObjSize'); } $this->output->endElement($this->_uri, 'Meta'); $this->output->endElement($this->_uri, 'SyncHdr'); } public function outputInit() { $this->_uri = $GLOBALS['backend']->state->getURI(); $this->output->startElement($this->_uri, 'SyncML', array()); } public function outputBodyStart() { $this->output->startElement($this->_uri, 'SyncBody', array()); } public function outputFinal() { $this->output->startElement($this->_uri, 'Final', array()); $this->output->endElement($this->_uri, 'Final'); } public function outputEnd() { $this->output->endElement($this->_uri, 'SyncBody', array()); $this->output->endElement($this->_uri, 'SyncML', array()); } public function outputStatus($cmdRef, $cmd, $data, $targetRef = '', $sourceRef = '', $syncAnchorNext = '', $syncAnchorLast = '') { $state = $GLOBALS['backend']->state; $uriMeta = $state->uriMeta; $this->output->startElement($this->_uri, 'Status'); $this->_outputCmdID(); $this->output->startElement($this->_uri, 'MsgRef'); $chars = $state->messageID; $this->output->characters($chars); $this->output->endElement($this->_uri, 'MsgRef'); $this->output->startElement($this->_uri, 'CmdRef'); $chars = $cmdRef; $this->output->characters($chars); $this->output->endElement($this->_uri, 'CmdRef'); $this->output->startElement($this->_uri, 'Cmd'); $chars = $cmd; $this->output->characters($chars); $this->output->endElement($this->_uri, 'Cmd'); if (!empty($targetRef)) { $this->output->startElement($this->_uri, 'TargetRef'); $this->output->characters($targetRef); $this->output->endElement($this->_uri, 'TargetRef'); } if (!empty($sourceRef)) { $this->output->startElement($this->_uri, 'SourceRef'); $this->output->characters($sourceRef); $this->output->endElement($this->_uri, 'SourceRef'); } // If we are responding to the SyncHdr and we are not // authenticated then request basic authorization. if ($cmd == 'SyncHdr' && !$state->authenticated) { // Keep Horde_SyncMl::RESPONSE_CREDENTIALS_MISSING, otherwise set to // Horde_SyncMl::RESPONSE_INVALID_CREDENTIALS. $data = $data == Horde_SyncMl::RESPONSE_CREDENTIALS_MISSING ? Horde_SyncMl::RESPONSE_CREDENTIALS_MISSING : Horde_SyncMl::RESPONSE_INVALID_CREDENTIALS; $this->output->startElement($this->_uri, 'Chal'); $this->output->startElement($this->_uri, 'Meta'); $this->output->startElement($uriMeta, 'Type'); $this->output->characters('syncml:auth-basic'); $this->output->endElement($uriMeta, 'Type'); $this->output->startElement($uriMeta, 'Format'); $this->output->characters('b64'); $this->output->endElement($uriMeta, 'Format'); $this->output->endElement($this->_uri, 'Meta'); $this->output->endElement($this->_uri, 'Chal'); } $this->output->startElement($this->_uri, 'Data'); $this->output->characters($data); $this->output->endElement($this->_uri, 'Data'); if (!empty($syncAnchorNext) || !empty($syncAnchorNLast)) { $this->output->startElement($this->_uri, 'Item'); $this->output->startElement($this->_uri, 'Data'); $this->output->startElement($uriMeta, 'Anchor'); if (!empty($syncAnchorLast)) { $this->output->startElement($uriMeta, 'Last'); $this->output->characters($syncAnchorLast); $this->output->endElement($uriMeta, 'Last'); } if (!empty($syncAnchorNext)) { $this->output->startElement($uriMeta, 'Next'); $this->output->characters($syncAnchorNext); $this->output->endElement($uriMeta, 'Next'); } $this->output->endElement($uriMeta, 'Anchor'); $this->output->endElement($this->_uri, 'Data'); $this->output->endElement($this->_uri, 'Item'); } $this->output->endElement($this->_uri, 'Status'); } public function outputDevInf($cmdRef) { $state = $GLOBALS['backend']->state; $uriMeta = $state->uriMeta; $uriDevInf = $state->uriDevInf; $this->output->startElement($this->_uri, 'Results'); $this->_outputCmdID(); $this->output->startElement($this->_uri, 'MsgRef'); $chars = $state->messageID; $this->output->characters($chars); $this->output->endElement($this->_uri, 'MsgRef'); $this->output->startElement($this->_uri, 'CmdRef'); $chars = $cmdRef; $this->output->characters($chars); $this->output->endElement($this->_uri, 'CmdRef'); $this->output->startElement($this->_uri, 'Meta'); $this->output->startElement($uriMeta, 'Type'); if ($state->wbxml) { $this->output->characters(Horde_SyncMl::MIME_SYNCML_DEVICE_INFO_WBXML); } else { $this->output->characters(Horde_SyncMl::MIME_SYNCML_DEVICE_INFO_XML); } $this->output->endElement($uriMeta, 'Type'); $this->output->endElement($this->_uri, 'Meta'); $this->output->startElement($this->_uri, 'Item'); $this->output->startElement($this->_uri, 'Source'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($state->getDevInfURI()); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Source'); $this->output->startElement($this->_uri, 'Data'); /* DevInf data is stored in wbxml not as a seperate codepage but * rather as a complete wbxml stream as opaque data. So we need a * new Handler. */ $devinfoutput = $this->output->createSubHandler(); $devinfoutput->startElement($uriDevInf , 'DevInf'); $devinfoutput->startElement($uriDevInf , 'VerDTD'); $devinfoutput->characters($state->getVerDTD()); $devinfoutput->endElement($uriDevInf , 'VerDTD'); $devinfoutput->startElement($uriDevInf , 'Man'); $devinfoutput->characters('The Horde Project (http://www.horde.org/)'); $devinfoutput->endElement($uriDevInf , 'Man'); $devinfoutput->startElement($uriDevInf , 'DevID'); $devinfoutput->characters(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost'); $devinfoutput->endElement($uriDevInf , 'DevID'); $devinfoutput->startElement($uriDevInf , 'DevTyp'); $devinfoutput->characters('server'); $devinfoutput->endElement($uriDevInf , 'DevTyp'); if ($state->version > 0) { $devinfoutput->startElement($uriDevInf , 'SupportLargeObjs'); $devinfoutput->endElement($uriDevInf , 'SupportLargeObjs'); $devinfoutput->startElement($uriDevInf , 'SupportNumberOfChanges'); $devinfoutput->endElement($uriDevInf , 'SupportNumberOfChanges'); } $this->_writeDataStore('notes', 'text/plain', '1.0', $devinfoutput); $this->_writeDataStore('contacts', 'text/directory', '3.0', $devinfoutput, array('text/x-vcard' => '2.1')); $this->_writeDataStore('tasks', 'text/calendar', '2.0', $devinfoutput, array('text/x-vcalendar' => '1.0')); $this->_writeDataStore('calendar', 'text/calendar', '2.0', $devinfoutput, array('text/x-vcalendar' => '1.0')); $devinfoutput->endElement($uriDevInf , 'DevInf'); $this->output->opaque($devinfoutput->getOutput()); $this->output->endElement($this->_uri, 'Data'); $this->output->endElement($this->_uri, 'Item'); $this->output->endElement($this->_uri, 'Results'); } /** * Writes DevInf data for one DataStore. * * @param string $sourceref Data for element. * @param string $mimetype Data for and * . * @param string $version Data for and * . * @param Horde_Xml_Wbxml_ContentHandler $output Content handler that will * received the output. * @param array $additionaltypes Array of additional types for * and ; format * array('text/directory' => '3.0') */ protected function _writeDataStore($sourceref, $mimetype, $version, &$output, $additionaltypes = array()) { $uriDevInf = $GLOBALS['backend']->state->uriDevInf; $output->startElement($uriDevInf , 'DataStore'); $output->startElement($uriDevInf , 'SourceRef'); $output->characters($sourceref); $output->endElement($uriDevInf , 'SourceRef'); $output->startElement($uriDevInf , 'Rx-Pref'); $output->startElement($uriDevInf , 'CTType'); $output->characters($mimetype); $output->endElement($uriDevInf , 'CTType'); $output->startElement($uriDevInf , 'VerCT'); $output->characters($version); $output->endElement($uriDevInf , 'VerCT'); $output->endElement($uriDevInf , 'Rx-Pref'); foreach ($additionaltypes as $ct => $ctver){ $output->startElement($uriDevInf , 'Rx'); $output->startElement($uriDevInf , 'CTType'); $output->characters($ct); $output->endElement($uriDevInf , 'CTType'); $output->startElement($uriDevInf , 'VerCT'); $output->characters($ctver); $output->endElement($uriDevInf , 'VerCT'); $output->endElement($uriDevInf , 'Rx'); } $output->startElement($uriDevInf , 'Tx-Pref'); $output->startElement($uriDevInf , 'CTType'); $output->characters($mimetype); $output->endElement($uriDevInf , 'CTType'); $output->startElement($uriDevInf , 'VerCT'); $output->characters($version); $output->endElement($uriDevInf , 'VerCT'); $output->endElement($uriDevInf , 'Tx-Pref'); foreach ($additionaltypes as $ct => $ctver){ $output->startElement($uriDevInf , 'Tx'); $output->startElement($uriDevInf , 'CTType'); $output->characters($ct); $output->endElement($uriDevInf , 'CTType'); $output->startElement($uriDevInf , 'VerCT'); $output->characters($ctver); $output->endElement($uriDevInf , 'VerCT'); $output->endElement($uriDevInf , 'Tx'); } $output->startElement($uriDevInf , 'SyncCap'); // We support all sync Types from 1-6: two way, slow, refresh|update // from client|server for ($i = 1; $i <= 6; ++$i) { $output->startElement($uriDevInf , 'SyncType'); $output->characters($i); $output->endElement($uriDevInf , 'SyncType'); } $output->endElement($uriDevInf , 'SyncCap'); $output->endElement($uriDevInf , 'DataStore'); } public function outputAlert($alertCode, $clientDB = '', $serverDB = '', $lastAnchor = '', $nextAnchor = '') { $uriMeta = $GLOBALS['backend']->state->uriMeta; $this->output->startElement($this->_uri, 'Alert'); $this->_outputCmdID(); $this->output->startElement($this->_uri, 'Data'); $chars = $alertCode; $this->output->characters($chars); $this->output->endElement($this->_uri, 'Data'); $this->output->startElement($this->_uri, 'Item'); if (!empty($clientDB)) { $this->output->startElement($this->_uri, 'Target'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($clientDB); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Target'); } if (!empty($serverDB)) { $this->output->startElement($this->_uri, 'Source'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($serverDB); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Source'); } $this->output->startElement($this->_uri, 'Meta'); $this->output->startElement($uriMeta, 'Anchor'); $this->output->startElement($uriMeta, 'Last'); $this->output->characters($lastAnchor); $this->output->endElement($uriMeta, 'Last'); $this->output->startElement($uriMeta, 'Next'); $this->output->characters($nextAnchor); $this->output->endElement($uriMeta, 'Next'); $this->output->endElement($uriMeta, 'Anchor'); // MaxObjSize, required by protocol for SyncML1.1 and higher. if ($GLOBALS['backend']->state->version > 0) { $this->output->startElement($uriMeta, 'MaxObjSize'); $this->output->characters(Horde_SyncMl::SERVER_MAXOBJSIZE); $this->output->endElement($uriMeta, 'MaxObjSize'); } $this->output->endElement($this->_uri, 'Meta'); $this->output->endElement($this->_uri, 'Item'); $this->output->endElement($this->_uri, 'Alert'); } public function outputGetDevInf() { $state = $GLOBALS['backend']->state; $uriMeta = $state->uriMeta; $this->output->startElement($this->_uri, 'Get'); $this->_outputCmdID(); $this->output->startElement($this->_uri, 'Meta'); $this->output->startElement($uriMeta, 'Type'); if ($state->wbxml) { $chars = Horde_SyncMl::MIME_SYNCML_DEVICE_INFO_WBXML; } else { $chars = Horde_SyncMl::MIME_SYNCML_DEVICE_INFO_XML; } $this->output->characters($chars); $this->output->endElement($uriMeta, 'Type'); $this->output->endElement($this->_uri, 'Meta'); $this->output->startElement($this->_uri, 'Item'); $this->output->startElement($this->_uri, 'Target'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($state->getDevInfURI()); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Target'); $this->output->endElement($this->_uri, 'Item'); $this->output->endElement($this->_uri, 'Get'); } /** * Creates a single Sync command * * @param string $command The Sync command (Add, Delete, Replace). * @param string $content The actual object content. * @param string $contentType The content's MIME type. * @param string $encodingType The content encoding of the object. * @param string $cuid The client's object UID. * @param string $suid The server's object UID. * @param int $contentSize The total content size. * @param bool $moreData Add MoreData tag when splitting messages. * * @return integer The CmdID used for this command. */ public function outputSyncCommand($command, $content = null, $contentType = null, $encodingType = null, $cuid = null, $suid = null, $contentSize = null, $moreData = false) { $uriMeta = $GLOBALS['backend']->state->uriMeta; $this->output->startElement($this->_uri, $command); $this->_outputCmdID(); if (isset($contentType)) { $this->output->startElement($this->_uri, 'Meta'); $this->output->startElement($uriMeta, 'Type'); $this->output->characters($contentType); $this->output->endElement($uriMeta, 'Type'); if (isset($content) && isset($contentSize)) { $this->output->startElement($uriMeta, 'Size'); $this->output->characters($contentSize); $this->output->endElement($uriMeta, 'Size'); } $this->output->endElement($this->_uri, 'Meta'); } if (isset($content) || isset($cuid) || isset($suid)) { $this->output->startElement($this->_uri, 'Item'); if ($suid != null) { $this->output->startElement($this->_uri, 'Source'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($suid); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Source'); } if ($cuid != null) { $this->output->startElement($this->_uri, 'Target'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($cuid); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Target'); } if (!empty($encodingType)) { $this->output->startElement($this->_uri, 'Meta'); $this->output->startElement($uriMeta, 'Format'); $this->output->characters($encodingType); $this->output->endElement($uriMeta, 'Format'); $this->output->endElement($this->_uri, 'Meta'); } if (isset($content)) { $this->output->startElement($this->_uri, 'Data'); if($this->isWBXML()) { $this->output->characters($content); } else { $device = $GLOBALS['backend']->state->getDevice(); if ($device->useCdataTag()) { /* Enclose data in CDATA if possible to avoid */ /* problems with &,< and >. */ $this->output->opaque(''); } else { $this->output->characters($content); } } $this->output->endElement($this->_uri, 'Data'); if ($moreData) { $this->output->startElement($this->_uri, 'MoreData'); $this->output->endElement($this->_uri, 'MoreData'); } } $this->output->endElement($this->_uri, 'Item'); } $this->output->endElement($this->_uri, $command); return $this->_msg_CmdID - 1; } public function outputSyncStart($clientLocURI, $serverLocURI, $numberOfChanges = null) { $this->output->startElement($this->_uri, 'Sync'); $this->_outputCmdID(); $this->output->startElement($this->_uri, 'Target'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($clientLocURI); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Target'); $this->output->startElement($this->_uri, 'Source'); $this->output->startElement($this->_uri, 'LocURI'); $this->output->characters($serverLocURI); $this->output->endElement($this->_uri, 'LocURI'); $this->output->endElement($this->_uri, 'Source'); if (is_int($numberOfChanges)) { $this->output->startElement($this->_uri, 'NumberOfChanges'); $this->output->characters($numberOfChanges); $this->output->endElement($this->_uri, 'NumberOfChanges'); } } public function outputSyncEnd() { $this->output->endElement($this->_uri, 'Sync'); } // internal helper functions: protected function _outputCmdID() { $this->output->startElement($this->_uri, 'CmdID'); $this->output->characters($this->_msg_CmdID); $this->_msg_CmdID++; $this->output->endElement($this->_uri, 'CmdID'); } /** * Output a single $str element. */ protected function _singleEle($tag, $str, $uri = null) { if (empty($uri)) { $uri = $this->_uri; } $this->output->startElement($uri, $tag); $this->output->characters($str); $this->output->endElement($uri, $tag); } } Horde_SyncMl-2.0.7/lib/Horde/SyncMl.php0000664000175000017500000001607312700700443015703 0ustar janjan * @package SyncMl */ class Horde_SyncMl { const ALERT_DISPLAY = 100; const ALERT_TWO_WAY = 200; const ALERT_SLOW_SYNC = 201; const ALERT_ONE_WAY_FROM_CLIENT = 202; const ALERT_REFRESH_FROM_CLIENT = 203; const ALERT_ONE_WAY_FROM_SERVER = 204; const ALERT_REFRESH_FROM_SERVER = 205; // Not implemented. const ALERT_TWO_WAY_BY_SERVER = 206; const ALERT_ONE_WAY_FROM_CLIENT_BY_SERVER = 207; const ALERT_REFRESH_FROM_CLIENT_BY_SERVER = 208; const ALERT_ONE_WAY_FROM_SERVER_BY_SERVER = 209; const ALERT_REFRESH_FROM_SERVER_BY_SERVER = 210; const ALERT_RESULT_ALERT = 221; const ALERT_NEXT_MESSAGE = 222; const ALERT_NO_END_OF_DATA = 223; // Not (really) implemented. const ALERT_SUSPEND = 224; // New in SyncML 1.2 const ALERT_RESUME = 225; // New in SyncML 1.2 const MIME_SYNCML_XML = 'application/vnd.syncml+xml'; const MIME_SYNCML_WBXML = 'application/vnd.syncml+wbxml'; const MIME_SYNCML_DEVICE_INFO_XML = 'application/vnd.syncml-devinf+xml'; const MIME_SYNCML_DEVICE_INFO_WBXML = 'application/vnd.syncml-devinf+wbxml'; const MIME_TEXT_PLAIN = 'text/plain'; const MIME_VCARD_V21 = 'text/x-vcard'; const MIME_VCARD_V30 = 'text/vcard'; const MIME_VCALENDAR = 'text/x-vcalendar'; const MIME_ICALENDAR = 'text/calendar'; const MIME_XML_ICALENDAR = 'application/vnd.syncml-xcal'; const MIME_MESSAGE = 'text/message'; const MIME_SYNCML_XML_EMAIL = 'application/vnd.syncml-xmsg'; const MIME_SYNCML_XML_BOOKMARK = 'application/vnd.syncml-xbookmark'; const MIME_SYNCML_RELATIONAL_OBJECT = 'application/vnd.syncml-xrelational'; const RESPONSE_IN_PROGRESS = 101; const RESPONSE_OK = 200; const RESPONSE_ITEM_ADDED = 201; const RESPONSE_ACCEPTED_FOR_PROCESSING = 202; const RESPONSE_NONAUTHORIATATIVE_RESPONSE = 203; const RESPONSE_NO_CONTENT = 204; const RESPONSE_RESET_CONTENT = 205; const RESPONSE_PARTIAL_CONTENT = 206; const RESPONSE_CONFLICT_RESOLVED_WITH_MERGE = 207; const RESPONSE_CONFLICT_RESOLVED_WITH_CLIENT_WINNING = 208; const RESPONSE_CONFILCT_RESOLVED_WITH_DUPLICATE = 209; const RESPONSE_DELETE_WITHOUT_ARCHIVE = 210; const RESPONSE_ITEM_NO_DELETED = 211; const RESPONSE_AUTHENTICATION_ACCEPTED = 212; const RESPONSE_CHUNKED_ITEM_ACCEPTED_AND_BUFFERED = 213; const RESPONSE_OPERATION_CANCELLED = 214; const RESPONSE_NO_EXECUTED = 215; const RESPONSE_ATOMIC_ROLL_BACK_OK = 216; const RESPONSE_MULTIPLE_CHOICES = 300; // Need to change names. // const RESPONSE_MULTIPLE_CHOICES = 301; // const RESPONSE_MULTIPLE_CHOICES = 302; // const RESPONSE_MULTIPLE_CHOICES = 303; // const RESPONSE_MULTIPLE_CHOICES = 304; const RESPONSE_USE_PROXY = 305; const RESPONSE_BAD_REQUEST = 400; const RESPONSE_INVALID_CREDENTIALS = 401; // Need to change names. // const RESPONSE_INVALID_CREDENTIALS = 402; // const RESPONSE_INVALID_CREDENTIALS = 403; const RESPONSE_NOT_FOUND = 404; // Need to change names. // const RESPONSE_INVALID_CREDENTIALS = 405; // const RESPONSE_INVALID_CREDENTIALS = 406; const RESPONSE_CREDENTIALS_MISSING = 407; // const RESPONSE_INVALID_CREDENTIALS = 408; // const RESPONSE_INVALID_CREDENTIALS = 409; // const RESPONSE_INVALID_CREDENTIALS = 410; const RESPONSE_SIZE_REQUIRED = 411; // const RESPONSE_INVALID_CREDENTIALS = 412; // const RESPONSE_INVALID_CREDENTIALS = 413; // const RESPONSE_INVALID_CREDENTIALS = 414; // const RESPONSE_INVALID_CREDENTIALS = 415; const RESPONSE_REQUEST_SIZE_TOO_BIG = 416; // Need to change names. // const RESPONSE_INVALID_CREDENTIALS = 417; // const RESPONSE_INVALID_CREDENTIALS = 418; // const RESPONSE_INVALID_CREDENTIALS = 419; // const RESPONSE_INVALID_CREDENTIALS = 420; // const RESPONSE_INVALID_CREDENTIALS = 421; // const RESPONSE_INVALID_CREDENTIALS = 422; // const RESPONSE_INVALID_CREDENTIALS = 423; const RESPONSE_SIZE_MISMATCH = 424; const RESPONSE_COMMAND_FAILED = 500; // Need to change names. // const RESPONSE_COMMAND_FAILED = 501; // const RESPONSE_COMMAND_FAILED = 502; // const RESPONSE_COMMAND_FAILED = 503; // const RESPONSE_COMMAND_FAILED = 504; // const RESPONSE_COMMAND_FAILED = 505; // const RESPONSE_COMMAND_FAILED = 506; // const RESPONSE_COMMAND_FAILED = 507; const RESPONSE_REFRESH_REQUIRED = 508; // const RESPONSE_COMMAND_FAILED = 509; // const RESPONSE_COMMAND_FAILED = 510; // const RESPONSE_COMMAND_FAILED = 511; // const RESPONSE_COMMAND_FAILED = 512; // const RESPONSE_COMMAND_FAILED = 513; // const RESPONSE_COMMAND_FAILED = 514; // const RESPONSE_COMMAND_FAILED = 515; // const RESPONSE_ATOMIC_ROLL_BACK_FAILED = 516; const NAME_SPACE_URI_SYNCML = 'syncml:syncml'; const NAME_SPACE_URI_SYNCML_1_1 = 'syncml:syncml1.1'; const NAME_SPACE_URI_SYNCML_1_2 = 'syncml:syncml1.2'; const NAME_SPACE_URI_METINF = 'syncml:metinf'; const NAME_SPACE_URI_METINF_1_1 = 'syncml:metinf'; const NAME_SPACE_URI_METINF_1_2 = 'syncml:metinf'; const NAME_SPACE_URI_DEVINF = 'syncml:devinf'; const NAME_SPACE_URI_DEVINF_1_1 = 'syncml:devinf'; const NAME_SPACE_URI_DEVINF_1_2 = 'syncml:devinf'; /** * Maximum Size of a data object. Currently global for all databases. */ const SERVER_MAXOBJSIZE = 1000000000; /** * Maximum size for one sync message as defined by SyncML protocol spec. */ const SERVER_MAXMSGSIZE = 1000000000; /** * Estimated size of an empty chunk when when splitting a message, * including MoreData tag. * * When splitting a message, we have to ensure that the size of the * complete message does not exceed MaxMsgSize sent by the client. */ const MSG_CHUNK_LEN = 180; /** * The "safety margin" for the closing tags when finishing a message. * * When exporting a data entry, we have to ensure that the size of the * complete message does not exceed MaxMsgSize sent by the client. */ const MSG_TRAILER_LEN = 150; /** * Standard size for a complete but empty SyncML message. Used in estimating * the size for a message. */ const MSG_DEFAULT_LEN = 1000; /** * If true the client uid<->server uid map will be deleted when a SlowSync * is requested. * * This produces duplicates if there are entries in the client and the * server. This need to be true for the test conformance suite. */ const CONFIG_DELETE_MAP_ON_REQUESTED_SLOWSYNC = true; /** * If true the client uid<->server uid map will be deleted when a SlowSync * is done due to an anchor mismatch. An anchor mismatch may happen if a * session terminates unexpectedly. */ const CONFIG_DELETE_MAP_ON_ANCHOR_MISMATCH_SLOWSYNC = false; } Horde_SyncMl-2.0.7/locale/ar/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020467 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/ar/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000123512700700443020464 0ustar janjan# Arabic translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/bg/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020455 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/bg/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000124012700700443020446 0ustar janjan# Bulgarian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/bs/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020471 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/bs/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000123612700700443020467 0ustar janjan# Bosnian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/ca/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020450 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/ca/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000133412700700443020445 0ustar janjan# Catalan translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "S'ha produït un error en obtenir metainformació: %s" Horde_SyncMl-2.0.7/locale/cs/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000070312700700443020463 0ustar janjanÞ•$,8‰9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; Horde_SyncMl-2.0.7/locale/cs/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000143112700700443020465 0ustar janjan# Czech translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "Nastala chyba pÅ™i naÄítání obsahu: %s" Horde_SyncMl-2.0.7/locale/da/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000102612700700443020441 0ustar janjanÞ•,<PQˆi#òError converting notes.Project-Id-Version: Horde_SyncMl Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2014-03-20 21:55+0100 Last-Translator: Erling Preben Hansen Language-Team: i18n@lists.horde.org Language: da MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Fejl under konverteringen af noter.Horde_SyncMl-2.0.7/locale/da/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000144512700700443020451 0ustar janjan# Danish translations for Horde_SyncMl package. # Copyright (C) 2014 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncMl package. # Erling Preben Hansen , 2014. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncMl\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2014-03-20 21:55+0100\n" "Last-Translator: Erling Preben Hansen \n" "Language-Team: i18n@lists.horde.org\n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Fejl under konverteringen af noter." Horde_SyncMl-2.0.7/locale/de/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000100612700700443020443 0ustar janjanÞ•,<PQyi"ãError converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2015-01-08 11:23+0100 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Fehler beim Umwandeln der Notizen.Horde_SyncMl-2.0.7/locale/de/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000140712700700443020453 0ustar janjan# German translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2015-01-08 11:23+0100\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:635 msgid "Error converting notes." msgstr "Fehler beim Umwandeln der Notizen." Horde_SyncMl-2.0.7/locale/el/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000111612700700443020455 0ustar janjanÞ•,<PQ iC Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2015-10-02 16:39+0200 Last-Translator: Antonis Limperis Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Language: el X-Generator: Poedit 1.7.1 Σφάλμα κατά τη μετατÏοπή σημειώσεων.Horde_SyncMl-2.0.7/locale/el/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000151012700700443020456 0ustar janjan# Greek translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2015-10-02 16:39+0200\n" "Last-Translator: Antonis Limperis \n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: el\n" "X-Generator: Poedit 1.7.1\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "Σφάλμα κατά τη μετατÏοπή σημειώσεων." Horde_SyncMl-2.0.7/locale/es/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000105612700700443020467 0ustar janjanÞ•,<PQªiError converting notes.Project-Id-Version: Horde_SyncMl Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2013-06-11 20:26+0200 Last-Translator: Manuel P. Ayala , Juan C. Blanco Language-Team: i18n@lists.horde.org Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Error convirtiendo notas.Horde_SyncMl-2.0.7/locale/es/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000146412700700443020475 0ustar janjan# Spanish translations for Horde_SyncMl package. # Copyright (C) 2013 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncMl package. # Automatically generated, 2013. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncMl \n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2013-06-11 20:26+0200\n" "Last-Translator: Manuel P. Ayala , Juan C. Blanco " "\n" "Language-Team: i18n@lists.horde.org\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Error convirtiendo notas." Horde_SyncMl-2.0.7/locale/et/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000100612700700443020463 0ustar janjanÞ•,<PQ~ièError converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2011-03-15 13:27+0100 PO-Revision-Date: 2010-11-09 01:27+0200 Last-Translator: Alar Sing Language-Team: i18n@lists.horde.org Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Viga märkmete teisendamisel.Horde_SyncMl-2.0.7/locale/et/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000141112700700443020466 0ustar janjan# Estonian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2011-03-15 13:27+0100\n" "PO-Revision-Date: 2010-11-09 01:27+0200\n" "Last-Translator: Alar Sing \n" "Language-Team: i18n@lists.horde.org\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:607 msgid "Error converting notes." msgstr "Viga märkmete teisendamisel." Horde_SyncMl-2.0.7/locale/eu/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000110012700700443020457 0ustar janjanÞ•,<PQºi$Error converting notes.Project-Id-Version: Horde_SyncMl Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2013-01-17 14:49+0100 Last-Translator: Ibon Igartua Language-Team: Euskal Herriko Unibertsitatea Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Language: Basque Errorea oharrak bihurtzean.Horde_SyncMl-2.0.7/locale/eu/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000150512700700443020473 0ustar janjan# Basque translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncMl\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2013-01-17 14:49+0100\n" "Last-Translator: Ibon Igartua \n" "Language-Team: Euskal Herriko Unibertsitatea \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Basque\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Errorea oharrak bihurtzean." Horde_SyncMl-2.0.7/locale/fa/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020453 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/fa/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000131112700700443020443 0ustar janjan# Persian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" # #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "خطا در کسب محتوا:%s" Horde_SyncMl-2.0.7/locale/fi/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000103112700700443020447 0ustar janjanÞ•,<PQ‹i#õError converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2012-03-07 15:11:06+0200 Last-Translator: Leena Heino Language-Team: Finnish Language: fi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Virhe muunnettaessa muistiinpanoja.Horde_SyncMl-2.0.7/locale/fi/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000144312700700443020461 0ustar janjan# Finnish translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Leena Heino , 2010-2012. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2012-03-07 15:11:06+0200\n" "Last-Translator: Leena Heino \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Virhe muunnettaessa muistiinpanoja." Horde_SyncMl-2.0.7/locale/fr/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000112412700700443020463 0ustar janjanÞ•,<PQÂi',Error converting notes.Project-Id-Version: Horde_SyncMl Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2013-01-16 18:14+0100 Last-Translator: Paul De Vlieger Language-Team: French Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); X-Generator: Lokalize 1.4 Erreur lors de la conversion des notes.Horde_SyncMl-2.0.7/locale/fr/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000163612700700443020476 0ustar janjan# French translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # Paul De Vlieger , 2013 msgid "" msgstr "" "Project-Id-Version: Horde_SyncMl \n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2013-01-16 18:14+0100\n" "Last-Translator: Paul De Vlieger \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 1.4\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Erreur lors de la conversion des notes." Horde_SyncMl-2.0.7/locale/gl/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020467 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/gl/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000123712700700443020466 0ustar janjan# Galician translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/he/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000065012700700443020453 0ustar janjanÞ•$,8n9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Horde_SyncMl-2.0.7/locale/he/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000131412700700443020454 0ustar janjan# Hebrew translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/hr/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000114412700700443020467 0ustar janjanÞ•,<PQ×i"AError converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2011-03-15 13:27+0100 PO-Revision-Date: 2011-11-08 16:49+0200 Last-Translator: Valentin Vidic Language-Team: i18n@lists.horde.org Language: hr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); GreÅ¡ka pri pretvaranju biljeÅ¡ki.Horde_SyncMl-2.0.7/locale/hr/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000157412700700443020501 0ustar janjan# Croatian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Valentin Vidic , 2011. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2011-03-15 13:27+0100\n" "PO-Revision-Date: 2011-11-08 16:49+0200\n" "Last-Translator: Valentin Vidic \n" "Language-Team: i18n@lists.horde.org\n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:607 msgid "Error converting notes." msgstr "GreÅ¡ka pri pretvaranju biljeÅ¡ki." Horde_SyncMl-2.0.7/locale/hu/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000104312700700443020470 0ustar janjanÞ•,<PQ‡i1ñError converting notes.Project-Id-Version: Horde_SyncMl Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2014-07-14 11:35+0200 Last-Translator: Andras Galos Language-Team: i18n@lists.horde.org Language: hu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Hiba történt a feljegyzések konvertálásakor.Horde_SyncMl-2.0.7/locale/hu/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000140612700700443020476 0ustar janjan# Hungarian translations for Horde_SyncML module. # Copyright 2010-2013 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncMl \n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2014-07-14 11:35+0200\n" "Last-Translator: Andras Galos \n" "Language-Team: i18n@lists.horde.org\n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Hiba történt a feljegyzések konvertálásakor." Horde_SyncMl-2.0.7/locale/id/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020461 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=ASCII Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/id/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000124112700700443020453 0ustar janjan# Indonesian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/is/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020500 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/is/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000124012700700443020471 0ustar janjan# Icelandic translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/it/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000077512700700443020503 0ustar janjanÞ•,<PQni$ØError converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Errore nella conversione delle note.Horde_SyncMl-2.0.7/locale/it/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000136112700700443020476 0ustar janjan# Italian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "Errore nella conversione delle note." Horde_SyncMl-2.0.7/locale/ja/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000110012700700443020440 0ustar janjanÞ•,<PQŸi6 Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2012-10-14 11:33+0900 Last-Translator: Hiromi Kimura Language-Team: i18n@lists.horde.org Language: ja MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; X-Generator: Poedit 1.5.4 メモã®å¤‰æ›ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚Horde_SyncMl-2.0.7/locale/ja/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000147412700700443020461 0ustar janjan# Japanese translation for Horde. # Copyright 2004-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde package. # Hiromi Kimura # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2012-10-14 11:33+0900\n" "Last-Translator: Hiromi Kimura \n" "Language-Team: i18n@lists.horde.org\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.5.4\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "メモã®å¤‰æ›ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚" Horde_SyncMl-2.0.7/locale/km/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020474 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/km/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000123412700700443020470 0ustar janjan# Khmer translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/ko/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000064112700700443020470 0ustar janjanÞ•$,8g9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; Horde_SyncMl-2.0.7/locale/ko/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000130512700700443020471 0ustar janjan# Korean translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/lt/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000110512700700443020472 0ustar janjanÞ•,<PQ»i%Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2011-05-28 01:09+0300 PO-Revision-Date: 2011-06-28 01:07+0300 Last-Translator: Vilius Å umskas Language-Team: Lithuanian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2); Klaida konvertuojant užraÅ¡us.Horde_SyncMl-2.0.7/locale/lt/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000152112700700443020477 0ustar janjan# Lithuanian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Vilius Å umskas , 2011. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2011-05-28 01:09+0300\n" "PO-Revision-Date: 2011-06-28 01:07+0300\n" "Last-Translator: Vilius Å umskas \n" "Language-Team: Lithuanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:607 msgid "Error converting notes." msgstr "Klaida konvertuojant užraÅ¡us." Horde_SyncMl-2.0.7/locale/lv/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000117612700700443020504 0ustar janjanÞ•,<PQôi^Error converting notes.Project-Id-Version: Horde_SyncMl Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2011-03-15 13:27+0100 PO-Revision-Date: 2011-10-16 15:22+0300 Last-Translator: JÄnis Eisaks Language-Team: i18n@lists.horde.org Language: lv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2); X-Poedit-Language: Latvian X-Poedit-Country: LATVIA X-Poedit-SourceCharset: utf-8 Kļūda konvertÄ“jot piezÄ«mes.Horde_SyncMl-2.0.7/locale/lv/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000162112700700443020502 0ustar janjan# Latvian translations for Horde_SyncMl package. # Copyright 2011-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncMl package. # Automatically generated, 2011. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncMl\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2011-03-15 13:27+0100\n" "PO-Revision-Date: 2011-10-16 15:22+0300\n" "Last-Translator: JÄnis Eisaks \n" "Language-Team: i18n@lists.horde.org\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" "X-Poedit-Language: Latvian\n" "X-Poedit-Country: LATVIA\n" "X-Poedit-SourceCharset: utf-8\n" #: lib/Horde/SyncMl/Device/Sync4j.php:607 msgid "Error converting notes." msgstr "Kļūda konvertÄ“jot piezÄ«mes." Horde_SyncMl-2.0.7/locale/mk/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443020474 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/mk/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000124112700700443020466 0ustar janjan# Macedonian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/nb/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000065012700700443020456 0ustar janjanÞ•$,8n9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Horde_SyncMl-2.0.7/locale/nb/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000137212700700443020463 0ustar janjan# Norwegian Bokmal translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "Feil ved skriving til '%s'." Horde_SyncMl-2.0.7/locale/nl/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000112512700700443020466 0ustar janjanÞ•,<PQ¯i;Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2012-11-02 22:57+0100 Last-Translator: Arjen de Korte Language-Team: Dutch Language: nl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Lokalize 1.4 Er is een fout opgetreden bij het omzetten van de notities.Horde_SyncMl-2.0.7/locale/nl/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000155312700700443020476 0ustar janjan# Dutch translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # # Arjen de Korte , 2012. msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2012-11-02 22:57+0100\n" "Last-Translator: Arjen de Korte \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.4\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Er is een fout opgetreden bij het omzetten van de notities." Horde_SyncMl-2.0.7/locale/nn/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000065012700700443020472 0ustar janjanÞ•$,8n9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Horde_SyncMl-2.0.7/locale/nn/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000132712700700443020477 0ustar janjan# Norwegian Nynorsk translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/pl/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000074212700700443020474 0ustar janjanÞ•$,8¨9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Horde_SyncMl-2.0.7/locale/pl/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000145512700700443020501 0ustar janjan# Polish translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "Błąd przy zapisie \"%s\"." Horde_SyncMl-2.0.7/locale/pt/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000065012700700443020502 0ustar janjanÞ•$,8n9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Horde_SyncMl-2.0.7/locale/pt/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000136412700700443020510 0ustar janjan# Portuguese translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "Erro ao obter conteúdo: %s" Horde_SyncMl-2.0.7/locale/pt_BR/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000077212700700443021072 0ustar janjanÞ•,<PQxiâError converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2012-01-17 12:38+0100 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); Erro convertendo notas.Horde_SyncMl-2.0.7/locale/pt_BR/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000137712700700443021077 0ustar janjan# Portuguese translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2012-01-17 12:38+0100\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: lib/Horde/SyncMl/Device/Sync4j.php:606 msgid "Error converting notes." msgstr "Erro convertendo notas." Horde_SyncMl-2.0.7/locale/ro/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000072612700700443020503 0ustar janjanÞ•$,8œ9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=ASCII Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2; Horde_SyncMl-2.0.7/locale/ro/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000137712700700443020511 0ustar janjan# Romanian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/locale/ru/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000112512700700443020503 0ustar janjanÞ•,<PQ¸i2"Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Ошибка при импорте заметок.Horde_SyncMl-2.0.7/locale/ru/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000151412700700443020510 0ustar janjan# Russian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "Ошибка при импорте заметок." Horde_SyncMl-2.0.7/locale/sk/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000106612700700443020476 0ustar janjanÞ•,<PQ¡i* Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2011-03-15 13:27+0100 PO-Revision-Date: 2011-05-18 17:17+0100 Last-Translator: Martin MatuÅ¡ka Language-Team: i18n@lists.horde.org Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; Nastala chyba pri konvertovaní poznámok.Horde_SyncMl-2.0.7/locale/sk/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000146712700700443020506 0ustar janjan# Slovak translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2011-03-15 13:27+0100\n" "PO-Revision-Date: 2011-05-18 17:17+0100\n" "Last-Translator: Martin MatuÅ¡ka \n" "Language-Team: i18n@lists.horde.org\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: lib/Horde/SyncMl/Device/Sync4j.php:607 msgid "Error converting notes." msgstr "Nastala chyba pri konvertovaní poznámok." Horde_SyncMl-2.0.7/locale/sl/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000073412700700443020500 0ustar janjanÞ•$,8¢9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3); Horde_SyncMl-2.0.7/locale/sl/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000145112700700443020500 0ustar janjan# Slovenian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n" "%100==4 ? 2 : 3);\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "Napaka pri pisanju \"%s\"." Horde_SyncMl-2.0.7/locale/sv/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000065012700700443020507 0ustar janjanÞ•$,8n9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Horde_SyncMl-2.0.7/locale/sv/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000136512700700443020516 0ustar janjan# Swedish translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "Fel när innehÃ¥l hämtades: %s" Horde_SyncMl-2.0.7/locale/tr/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000064112700700443020504 0ustar janjanÞ•$,8g9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=1; plural=0; Horde_SyncMl-2.0.7/locale/tr/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000135512700700443020512 0ustar janjan# Turkish translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "\"%s\"'i yazaken hata oluÅŸtu." Horde_SyncMl-2.0.7/locale/uk/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000113012700700443020470 0ustar janjanÞ•,<PQ¸i5"Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); Помилка конвертації запиÑів.Horde_SyncMl-2.0.7/locale/uk/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000152112700700443020477 0ustar janjan# Ukrainian translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "Помилка конвертації запиÑів." Horde_SyncMl-2.0.7/locale/zh_CN/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000057512700700443021066 0ustar janjanÞ•$,8C9Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Horde_SyncMl-2.0.7/locale/zh_CN/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000130112700700443021055 0ustar janjan# Chinese translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 #, fuzzy msgid "Error converting notes." msgstr "写入“%sâ€æ—¶å‡ºé”™ã€‚" Horde_SyncMl-2.0.7/locale/zh_TW/LC_MESSAGES/Horde_SyncMl.mo0000664000175000017500000000071212700700443021111 0ustar janjanÞ•,<PQCi­Error converting notes.Project-Id-Version: Horde_SyncML Report-Msgid-Bugs-To: dev@lists.horde.org POT-Creation-Date: 2010-10-13 01:27+0200 PO-Revision-Date: 2010-10-13 01:27+0200 Last-Translator: Automatically generated Language-Team: i18n@lists.horde.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 轉æ›äº‹é …時發生錯誤.Horde_SyncMl-2.0.7/locale/zh_TW/LC_MESSAGES/Horde_SyncMl.po0000664000175000017500000000127212700700443021116 0ustar janjan# Chinese translations for Horde_SyncML module. # Copyright 2010-2016 Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncML module. # Automatically generated, 2010. # msgid "" msgstr "" "Project-Id-Version: Horde_SyncML\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2010-10-13 01:27+0200\n" "PO-Revision-Date: 2010-10-13 01:27+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: i18n@lists.horde.org\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: SyncML/Device/Sync4j.php:614 msgid "Error converting notes." msgstr "轉æ›äº‹é …時發生錯誤." Horde_SyncMl-2.0.7/locale/Horde_SyncMl.pot0000664000175000017500000000126312700700443016462 0ustar janjan# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Horde LLC (http://www.horde.org/) # This file is distributed under the same license as the Horde_SyncMl package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Horde_SyncMl\n" "Report-Msgid-Bugs-To: dev@lists.horde.org\n" "POT-Creation-Date: 2015-01-08 11:23+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: lib/Horde/SyncMl/Device/Sync4j.php:635 msgid "Error converting notes." msgstr "" Horde_SyncMl-2.0.7/migration/Horde/SyncML/1_horde_syncml_base_tables.php0000664000175000017500000000410412700700443024310 0ustar janjantables())) { $t = $this->createTable('horde_syncml_map', array('autoincrementKey' => false)); $t->column('syncml_syncpartner', 'string', array('limit' => 255, 'null' => false)); $t->column('syncml_db', 'string', array('limit' => 255, 'null' => false)); $t->column('syncml_uid', 'string', array('limit' => 255, 'null' => false)); $t->column('syncml_cuid', 'string', array('limit' => 255)); $t->column('syncml_suid', 'string', array('limit' => 255)); $t->column('syncml_timestamp', 'integer'); $t->end(); $this->addIndex('horde_syncml_map', array('syncml_syncpartner')); $this->addIndex('horde_syncml_map', array('syncml_db')); $this->addIndex('horde_syncml_map', array('syncml_uid')); $this->addIndex('horde_syncml_map', array('syncml_cuid')); $this->addIndex('horde_syncml_map', array('syncml_suid')); } if (!in_array('horde_syncml_anchors', $this->tables())) { $t = $this->createTable('horde_syncml_anchors', array('autoincrementKey' => false)); $t->column('syncml_syncpartner', 'string', array('limit' => 255, 'null' => false)); $t->column('syncml_db', 'string', array('limit' => 255, 'null' => false)); $t->column('syncml_uid', 'string', array('limit' => 255, 'null' => false)); $t->column('syncml_clientanchor', 'string', array('limit' => 255)); $t->column('syncml_serveranchor', 'string', array('limit' => 255)); $t->end(); $this->addIndex('horde_syncml_anchors', array('syncml_syncpartner')); $this->addIndex('horde_syncml_anchors', array('syncml_db')); $this->addIndex('horde_syncml_anchors', array('syncml_uid')); } } public function down() { $this->dropTable('horde_syncml_anchors'); $this->dropTable('horde_syncml_map'); } } Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/data.txt0000664000175000017500000002433712700700443026473 0ustar janjan input received from client (text/x-s4j-sife) 12007-01-012007-01-01Test Aumlaut: Ä010everywhere0108000new year all day client111002020061231T230000Z1 input converted for server (text/x-vevent): BEGIN:VEVENT DTSTAMP:20070105T213440Z SUMMARY:new year all day client1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:= Test Aumlaut: =C3=84 LOCATION:everywhere DTSTART:20070101T000000 DTEND:20070101T235959 STATUS:FREE CLASS:PUBLIC UID:20070105T213440Z2u5w9rfe2lq8@voltaire.local END:VEVENT input received from client (text/x-s4j-sife) 020070107T220000Z20070107T223000ZAlarm 30minutes before21003010Client2 23:00-23:3011001020070106T230000Z1 input converted for server (text/x-vevent): BEGIN:VEVENT DTSTAMP:20070105T213442Z SUMMARY:Client2 23:00-23:30 DESCRIPTION:Alarm 30minutes before DTSTART:20070107T220000Z DTEND:20070107T223000Z AALARM:20070107T213000Z STATUS:CONFIRMED CLASS:PUBLIC UID:20070105T213442Z7ecv8peqmr48@voltaire.local END:VEVENT output received from horde backend (text/calendar): BEGIN:VCALENDAR VERSION:2.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20070102T050000Z DTEND:20070102T060000Z DTSTAMP:20070105T213445Z UID:20070105223422.1ymx6b99mycg@voltaire.local SUMMARY:server2 6-7 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest CLASS:PUBLIC END:VEVENT END:VCALENDAR output converted for client (text/x-s4j-sife): 026020070102T060000Z00020070102T050000Zserver2 6-7 output received from horde backend (text/calendar): BEGIN:VCALENDAR VERSION:2.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20070106T050000Z DTEND:20070106T060000Z DTSTAMP:20070105T213445Z UID:20070105223408.6wew7kh5jag4@voltaire.local SUMMARY:all day three kings server1 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest DESCRIPTION:test uumlaut\: ü CATEGORIES:holiday LOCATION:almost everywhere CLASS:PUBLIC END:VEVENT END:VCALENDAR output converted for client (text/x-s4j-sife): 0test uumlaut: ü2holiday6020070106T060000Z0almost everywhere0020070106T050000Zall day three kings server1 input received from client (text/x-s4j-sife) 020070105T220000Z20070105T223000Z21001510client99110032020070104T230000Z1 input converted for server (text/x-vevent): BEGIN:VEVENT DTSTAMP:20070105T213608Z SUMMARY:client99 DTSTART:20070105T220000Z DTEND:20070105T223000Z AALARM:20070105T214500Z STATUS:CONFIRMED CLASS:PUBLIC UID:20070105T213608Z97fh32byy88@voltaire.local END:VEVENT input received from client (text/x-s4j-sife) 020070102T050000Z20070102T060000Z2000000server2c2 6-711004020070101T230000Z1 input converted for server (text/x-vevent): BEGIN:VEVENT DTSTAMP:20070105T213608Z SUMMARY:server2c2 6-7 DTSTART:20070102T050000Z DTEND:20070102T060000Z STATUS:CONFIRMED CLASS:PUBLIC UID:20070105T213608Z5ojuhybwlds0@voltaire.local END:VEVENT input received from client (text/x-s4j-sife) 020070106T050000Z20070106T060000Ztest uumlaut: ü2holiday00almost everywhere0000all day three kings server1c1110064020070105T230000Z1 input converted for server (text/x-vevent): BEGIN:VEVENT DTSTAMP:20070105T213609Z SUMMARY:all day three kings server1c1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:= test uumlaut: =C3=BC CATEGORIES:holiday LOCATION:almost everywhere DTSTART:20070106T050000Z DTEND:20070106T060000Z STATUS:CONFIRMED CLASS:PUBLIC UID:20070105T213609Zg9gt7fvplnw@voltaire.local END:VEVENT output received from horde backend (text/calendar): BEGIN:VCALENDAR VERSION:2.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20070103T050000Z DTEND:20070103T060000Z DTSTAMP:20070105T213610Z UID:20070105223456.5x0i61i3nbgo@voltaire.local SUMMARY:server99 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest CLASS:PUBLIC END:VEVENT END:VCALENDAR output converted for client (text/x-s4j-sife): 026020070103T060000Z00020070103T050000Zserver99 output received from horde backend (text/calendar): BEGIN:VCALENDAR VERSION:2.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART;VALUE=DATE:20070101 DTEND;VALUE=DATE:20070101 DTSTAMP:20070105T213610Z UID:20070105T213440Z2u5w9rfe2lq8@voltaire.local SUMMARY:new year all day client1s1 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest DESCRIPTION:Test Aumlaut\: Ä LOCATION:everywhere CLASS:PUBLIC END:VEVENT END:VCALENDAR output converted for client (text/x-s4j-sife): 1Test Aumlaut: Ä22007-01-010everywhere002007-01-01new year all day client1s1 output received from horde backend (text/calendar): BEGIN:VCALENDAR VERSION:2.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20070107T220000Z DTEND:20070107T223000Z DTSTAMP:20070105T213610Z UID:20070105T213442Z7ecv8peqmr48@voltaire.local SUMMARY:Client2s2 23\:00-23\:30 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest DESCRIPTION:Alarm 30minutes before CLASS:PUBLIC AALARM:20070107T213000Z END:VEVENT END:VCALENDAR output converted for client (text/x-s4j-sife): 0Alarm 30minutes before23020070107T223000Z0301020070107T220000ZClient2s2 23:00-23:30 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_10.xml0000664000175000017500000000133312700700443030675 0ustar janjan 1.1 SyncML/1.1 1168032875 1 http://voltaire.local/horde/rpc.php sc-pim-outlook b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 250000 1 201 calendar calendar 0 1168032875 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_11.xml0000664000175000017500000000706612700700443030707 0ustar janjan 1.1 SyncML/1.1 1168032875 2 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 1 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 1 3 Alert calendar calendar 200 1168032879 3 calendar calendar 4 text/x-s4j-sife 000000004FCBE97B738E984EAF085560B1DD2D50049C2000 b64 PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4xPC9BbGxEYXlFdmVudD48U3RhcnQ+MjAwNy0wMS0wMTwvU3RhcnQ+PEVuZD4yMDA3LTAxLTAxPC9FbmQ+PEJpbGxpbmdJbmZvcm1hdGlvbj48L0JpbGxpbmdJbmZvcm1hdGlvbj48Qm9keT5UZXN0IEF1bWxhdXQ6IMOEPC9Cb2R5PjxCdXN5U3RhdHVzPjA8L0J1c3lTdGF0dXM+PENhdGVnb3JpZXM+PC9DYXRlZ29yaWVzPjxDb21wYW5pZXM+PC9Db21wYW5pZXM+PEltcG9ydGFuY2U+MTwvSW1wb3J0YW5jZT48SXNSZWN1cnJpbmc+MDwvSXNSZWN1cnJpbmc+PExvY2F0aW9uPmV2ZXJ5d2hlcmU8L0xvY2F0aW9uPjxNZWV0aW5nU3RhdHVzPjA8L01lZXRpbmdTdGF0dXM+PE1pbGVhZ2U+PC9NaWxlYWdlPjxSZW1pbmRlck1pbnV0ZXNCZWZvcmVTdGFydD4xMDgwPC9SZW1pbmRlck1pbnV0ZXNCZWZvcmVTdGFydD48UmVtaW5kZXJTZXQ+MDwvUmVtaW5kZXJTZXQ+PFJlcGx5VGltZT48L1JlcGx5VGltZT48U2Vuc2l0aXZpdHk+MDwvU2Vuc2l0aXZpdHk+PFN1YmplY3Q+bmV3IHllYXIgYWxsIGRheSBjbGllbnQxPC9TdWJqZWN0PjxSZWN1cnJlbmNlVHlwZT4xPC9SZWN1cnJlbmNlVHlwZT48SW50ZXJ2YWw+MTwvSW50ZXJ2YWw+PE1vbnRoT2ZZZWFyPjA8L01vbnRoT2ZZZWFyPjxEYXlPZk1vbnRoPjA8L0RheU9mTW9udGg+PERheU9mV2Vla01hc2s+MjwvRGF5T2ZXZWVrTWFzaz48SW5zdGFuY2U+MDwvSW5zdGFuY2U+PFBhdHRlcm5TdGFydERhdGU+MjAwNjEyMzFUMjMwMDAwWjwvUGF0dGVyblN0YXJ0RGF0ZT48Tm9FbmREYXRlPjE8L05vRW5kRGF0ZT48UGF0dGVybkVuZERhdGU+PC9QYXR0ZXJuRW5kRGF0ZT48T2NjdXJyZW5jZXM+PC9PY2N1cnJlbmNlcz48L2FwcG9pbnRtZW50Pg== 000000004FCBE97B738E984EAF085560B1DD2D50249C2000 b64 PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48U3RhcnQ+MjAwNzAxMDdUMjIwMDAwWjwvU3RhcnQ+PEVuZD4yMDA3MDEwN1QyMjMwMDBaPC9FbmQ+PEJpbGxpbmdJbmZvcm1hdGlvbj48L0JpbGxpbmdJbmZvcm1hdGlvbj48Qm9keT5BbGFybSAzMG1pbnV0ZXMgYmVmb3JlPC9Cb2R5PjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PENhdGVnb3JpZXM+PC9DYXRlZ29yaWVzPjxDb21wYW5pZXM+PC9Db21wYW5pZXM+PEltcG9ydGFuY2U+MTwvSW1wb3J0YW5jZT48SXNSZWN1cnJpbmc+MDwvSXNSZWN1cnJpbmc+PExvY2F0aW9uPjwvTG9jYXRpb24+PE1lZXRpbmdTdGF0dXM+MDwvTWVldGluZ1N0YXR1cz48TWlsZWFnZT48L01pbGVhZ2U+PFJlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjMwPC9SZW1pbmRlck1pbnV0ZXNCZWZvcmVTdGFydD48UmVtaW5kZXJTZXQ+MTwvUmVtaW5kZXJTZXQ+PFJlcGx5VGltZT48L1JlcGx5VGltZT48U2Vuc2l0aXZpdHk+MDwvU2Vuc2l0aXZpdHk+PFN1YmplY3Q+Q2xpZW50MiAyMzowMC0yMzozMDwvU3ViamVjdD48UmVjdXJyZW5jZVR5cGU+MTwvUmVjdXJyZW5jZVR5cGU+PEludGVydmFsPjE8L0ludGVydmFsPjxNb250aE9mWWVhcj4wPC9Nb250aE9mWWVhcj48RGF5T2ZNb250aD4wPC9EYXlPZk1vbnRoPjxEYXlPZldlZWtNYXNrPjE8L0RheU9mV2Vla01hc2s+PEluc3RhbmNlPjA8L0luc3RhbmNlPjxQYXR0ZXJuU3RhcnREYXRlPjIwMDcwMTA2VDIzMDAwMFo8L1BhdHRlcm5TdGFydERhdGU+PE5vRW5kRGF0ZT4xPC9Ob0VuZERhdGU+PFBhdHRlcm5FbmREYXRlPjwvUGF0dGVybkVuZERhdGU+PE9jY3VycmVuY2VzPjwvT2NjdXJyZW5jZXM+PC9hcHBvaW50bWVudD4= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_12.xml0000664000175000017500000000135012700700443030676 0ustar janjan 1.1 SyncML/1.1 1168032875 3 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 2 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_13.xml0000664000175000017500000000314512700700443030703 0ustar janjan 1.1 SyncML/1.1 1168032875 4 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 3 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 3 3 Sync calendar calendar 200 3 3 4 Add 201 20070105223422.1ymx6b99mycg@voltaire.local 4 3 5 Add 201 20070105223408.6wew7kh5jag4@voltaire.local 5 calendar calendar 20070105223422.1ymx6b99mycg@voltaire.local 000000004FCBE97B738E984EAF085560B1DD2D50449C2000 20070105223408.6wew7kh5jag4@voltaire.local 000000004FCBE97B738E984EAF085560B1DD2D50649C2000 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_20.xml0000664000175000017500000000134412700700443030700 0ustar janjan 1.1 SyncML/1.1 1168032964 1 http://voltaire.local/horde/rpc.php sc-pim-outlook b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 250000 1 200 calendar calendar 1168032875 1168032964 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_21.xml0000664000175000017500000001154512700700443030705 0ustar janjan 1.1 SyncML/1.1 1168032964 2 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 1 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 1 3 Alert calendar calendar 200 1168032967 3 calendar calendar 4 text/x-s4j-sife 000000004FCBE97B738E984EAF085560B1DD2D50849C2000 b64 PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48U3RhcnQ+MjAwNzAxMDVUMjIwMDAwWjwvU3RhcnQ+PEVuZD4yMDA3MDEwNVQyMjMwMDBaPC9FbmQ+PEJpbGxpbmdJbmZvcm1hdGlvbj48L0JpbGxpbmdJbmZvcm1hdGlvbj48Qm9keT48L0JvZHk+PEJ1c3lTdGF0dXM+MjwvQnVzeVN0YXR1cz48Q2F0ZWdvcmllcz48L0NhdGVnb3JpZXM+PENvbXBhbmllcz48L0NvbXBhbmllcz48SW1wb3J0YW5jZT4xPC9JbXBvcnRhbmNlPjxJc1JlY3VycmluZz4wPC9Jc1JlY3VycmluZz48TG9jYXRpb24+PC9Mb2NhdGlvbj48TWVldGluZ1N0YXR1cz4wPC9NZWV0aW5nU3RhdHVzPjxNaWxlYWdlPjwvTWlsZWFnZT48UmVtaW5kZXJNaW51dGVzQmVmb3JlU3RhcnQ+MTU8L1JlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjxSZW1pbmRlclNldD4xPC9SZW1pbmRlclNldD48UmVwbHlUaW1lPjwvUmVwbHlUaW1lPjxTZW5zaXRpdml0eT4wPC9TZW5zaXRpdml0eT48U3ViamVjdD5jbGllbnQ5OTwvU3ViamVjdD48UmVjdXJyZW5jZVR5cGU+MTwvUmVjdXJyZW5jZVR5cGU+PEludGVydmFsPjE8L0ludGVydmFsPjxNb250aE9mWWVhcj4wPC9Nb250aE9mWWVhcj48RGF5T2ZNb250aD4wPC9EYXlPZk1vbnRoPjxEYXlPZldlZWtNYXNrPjMyPC9EYXlPZldlZWtNYXNrPjxJbnN0YW5jZT4wPC9JbnN0YW5jZT48UGF0dGVyblN0YXJ0RGF0ZT4yMDA3MDEwNFQyMzAwMDBaPC9QYXR0ZXJuU3RhcnREYXRlPjxOb0VuZERhdGU+MTwvTm9FbmREYXRlPjxQYXR0ZXJuRW5kRGF0ZT48L1BhdHRlcm5FbmREYXRlPjxPY2N1cnJlbmNlcz48L09jY3VycmVuY2VzPjwvYXBwb2ludG1lbnQ+ 5 text/x-s4j-sife 000000004FCBE97B738E984EAF085560B1DD2D50449C2000 b64 PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48U3RhcnQ+MjAwNzAxMDJUMDUwMDAwWjwvU3RhcnQ+PEVuZD4yMDA3MDEwMlQwNjAwMDBaPC9FbmQ+PEJpbGxpbmdJbmZvcm1hdGlvbj48L0JpbGxpbmdJbmZvcm1hdGlvbj48Qm9keT48L0JvZHk+PEJ1c3lTdGF0dXM+MjwvQnVzeVN0YXR1cz48Q2F0ZWdvcmllcz48L0NhdGVnb3JpZXM+PENvbXBhbmllcz48L0NvbXBhbmllcz48SW1wb3J0YW5jZT4wPC9JbXBvcnRhbmNlPjxJc1JlY3VycmluZz4wPC9Jc1JlY3VycmluZz48TG9jYXRpb24+PC9Mb2NhdGlvbj48TWVldGluZ1N0YXR1cz4wPC9NZWV0aW5nU3RhdHVzPjxNaWxlYWdlPjwvTWlsZWFnZT48UmVtaW5kZXJNaW51dGVzQmVmb3JlU3RhcnQ+MDwvUmVtaW5kZXJNaW51dGVzQmVmb3JlU3RhcnQ+PFJlbWluZGVyU2V0PjA8L1JlbWluZGVyU2V0PjxSZXBseVRpbWU+PC9SZXBseVRpbWU+PFNlbnNpdGl2aXR5PjA8L1NlbnNpdGl2aXR5PjxTdWJqZWN0PnNlcnZlcjJjMiA2LTc8L1N1YmplY3Q+PFJlY3VycmVuY2VUeXBlPjE8L1JlY3VycmVuY2VUeXBlPjxJbnRlcnZhbD4xPC9JbnRlcnZhbD48TW9udGhPZlllYXI+MDwvTW9udGhPZlllYXI+PERheU9mTW9udGg+MDwvRGF5T2ZNb250aD48RGF5T2ZXZWVrTWFzaz40PC9EYXlPZldlZWtNYXNrPjxJbnN0YW5jZT4wPC9JbnN0YW5jZT48UGF0dGVyblN0YXJ0RGF0ZT4yMDA3MDEwMVQyMzAwMDBaPC9QYXR0ZXJuU3RhcnREYXRlPjxOb0VuZERhdGU+MTwvTm9FbmREYXRlPjxQYXR0ZXJuRW5kRGF0ZT48L1BhdHRlcm5FbmREYXRlPjxPY2N1cnJlbmNlcz48L09jY3VycmVuY2VzPjwvYXBwb2ludG1lbnQ+ 000000004FCBE97B738E984EAF085560B1DD2D50649C2000 b64 PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48U3RhcnQ+MjAwNzAxMDZUMDUwMDAwWjwvU3RhcnQ+PEVuZD4yMDA3MDEwNlQwNjAwMDBaPC9FbmQ+PEJpbGxpbmdJbmZvcm1hdGlvbj48L0JpbGxpbmdJbmZvcm1hdGlvbj48Qm9keT50ZXN0IHV1bWxhdXQ6IMO8PC9Cb2R5PjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PENhdGVnb3JpZXM+aG9saWRheTwvQ2F0ZWdvcmllcz48Q29tcGFuaWVzPjwvQ29tcGFuaWVzPjxJbXBvcnRhbmNlPjA8L0ltcG9ydGFuY2U+PElzUmVjdXJyaW5nPjA8L0lzUmVjdXJyaW5nPjxMb2NhdGlvbj5hbG1vc3QgZXZlcnl3aGVyZTwvTG9jYXRpb24+PE1lZXRpbmdTdGF0dXM+MDwvTWVldGluZ1N0YXR1cz48TWlsZWFnZT48L01pbGVhZ2U+PFJlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjA8L1JlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjxSZW1pbmRlclNldD4wPC9SZW1pbmRlclNldD48UmVwbHlUaW1lPjwvUmVwbHlUaW1lPjxTZW5zaXRpdml0eT4wPC9TZW5zaXRpdml0eT48U3ViamVjdD5hbGwgZGF5IHRocmVlIGtpbmdzIHNlcnZlcjFjMTwvU3ViamVjdD48UmVjdXJyZW5jZVR5cGU+MTwvUmVjdXJyZW5jZVR5cGU+PEludGVydmFsPjE8L0ludGVydmFsPjxNb250aE9mWWVhcj4wPC9Nb250aE9mWWVhcj48RGF5T2ZNb250aD4wPC9EYXlPZk1vbnRoPjxEYXlPZldlZWtNYXNrPjY0PC9EYXlPZldlZWtNYXNrPjxJbnN0YW5jZT4wPC9JbnN0YW5jZT48UGF0dGVyblN0YXJ0RGF0ZT4yMDA3MDEwNVQyMzAwMDBaPC9QYXR0ZXJuU3RhcnREYXRlPjxOb0VuZERhdGU+MTwvTm9FbmREYXRlPjxQYXR0ZXJuRW5kRGF0ZT48L1BhdHRlcm5FbmREYXRlPjxPY2N1cnJlbmNlcz48L09jY3VycmVuY2VzPjwvYXBwb2ludG1lbnQ+ Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_22.xml0000664000175000017500000000135012700700443030677 0ustar janjan 1.1 SyncML/1.1 1168032964 3 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 2 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_23.xml0000664000175000017500000000321012700700443030675 0ustar janjan 1.1 SyncML/1.1 1168032964 4 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 3 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 3 3 Sync calendar calendar 200 3 3 4 Add 201 20070105223456.5x0i61i3nbgo@voltaire.local 4 3 5 Replace 200 000000004FCBE97B738E984EAF085560B1DD2D50049C2000 5 3 6 Replace 200 000000004FCBE97B738E984EAF085560B1DD2D50249C2000 6 calendar calendar 20070105223456.5x0i61i3nbgo@voltaire.local 000000004FCBE97B738E984EAF085560B1DD2D50A49C2000 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_30.xml0000664000175000017500000000134412700700443030701 0ustar janjan 1.1 SyncML/1.1 1168032979 1 http://voltaire.local/horde/rpc.php sc-pim-outlook b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 250000 1 200 calendar calendar 1168032964 1168032979 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_31.xml0000664000175000017500000000167012700700443030704 0ustar janjan 1.1 SyncML/1.1 1168032979 2 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 1 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 1 3 Alert calendar calendar 200 1168032981 3 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_32.xml0000664000175000017500000000135012700700443030700 0ustar janjan 1.1 SyncML/1.1 1168032979 3 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 2 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_33.xml0000664000175000017500000000137212700700443030705 0ustar janjan 1.1 SyncML/1.1 1168032979 4 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 3 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 3 3 Sync calendar calendar 200 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_40.xml0000664000175000017500000000134412700700443030702 0ustar janjan 1.1 SyncML/1.1 1168033004 1 http://voltaire.local/horde/rpc.php sc-pim-outlook b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 250000 1 200 calendar calendar 1168032979 1168033004 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_41.xml0000664000175000017500000000215012700700443030677 0ustar janjan 1.1 SyncML/1.1 1168033004 2 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 1 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 1 3 Alert calendar calendar 200 1168033007 3 calendar calendar 4 text/x-s4j-sife 000000004FCBE97B738E984EAF085560B1DD2D50A49C2000 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_42.xml0000664000175000017500000000135012700700443030701 0ustar janjan 1.1 SyncML/1.1 1168033004 3 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 2 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_43.xml0000664000175000017500000000171012700700443030702 0ustar janjan 1.1 SyncML/1.1 1168033004 4 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 3 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 3 3 Sync calendar calendar 200 3 3 4 Delete 200 000000004FCBE97B738E984EAF085560B1DD2D50849C2000 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_50.xml0000664000175000017500000000134412700700443030703 0ustar janjan 1.1 SyncML/1.1 1168033013 1 http://voltaire.local/horde/rpc.php sc-pim-outlook b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 250000 1 200 calendar calendar 1168033004 1168033013 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_51.xml0000664000175000017500000000167012700700443030706 0ustar janjan 1.1 SyncML/1.1 1168033013 2 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 1 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 1 3 Alert calendar calendar 200 1168033015 3 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_52.xml0000664000175000017500000000135012700700443030702 0ustar janjan 1.1 SyncML/1.1 1168033013 3 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 2 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_client_53.xml0000664000175000017500000000137212700700443030707 0ustar janjan 1.1 SyncML/1.1 1168033013 4 http://voltaire.local/horde/rpc.php sc-pim-outlook 250000 1 3 0 SyncHdr http://voltaire.local/horde/rpc.php sc-pim-outlook 200 2 3 3 Sync calendar calendar 200 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_log.txt0000664000175000017500000004460312700700443027726 0ustar janjanDEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncmlscpimoutlook1168032875 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=1 msgid=1 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Create new sync for calendar; synctype=201 DEBUG: HandleFinal for state=0 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:34:39. Packet logged in /tmp/sync/syncml_server_10.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032875 DEBUG: authorized=1 version=1 msgid=2 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 000000004FCBE97B738E984EAF085560B1DD2D50049C2000 suid DEBUG: No map entry found DEBUG: add to server db calendar cuid 000000004FCBE97B738E984EAF085560B1DD2D50049C2000 -> suid 20070105T213440Z2u5w9rfe2lq8@voltaire.local DEBUG: added client entry due to replace request as 20070105T213440Z2u5w9rfe2lq8@voltaire.local DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 000000004FCBE97B738E984EAF085560B1DD2D50249C2000 suid DEBUG: No map entry found DEBUG: add to server db calendar cuid 000000004FCBE97B738E984EAF085560B1DD2D50249C2000 -> suid 20070105T213442Z7ecv8peqmr48@voltaire.local DEBUG: added client entry due to replace request as 20070105T213442Z7ecv8peqmr48@voltaire.local DEBUG: HandleFinal for state=1 DEBUG: Not yet sending server sync data: special Funambol handling. DEBUG: Received Final from client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:34:44. Packet logged in /tmp/sync/syncml_server_11.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032875 DEBUG: authorized=1 version=1 msgid=3 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes from 1970-01-01 01:00:00 to 2007-01-05 22:34:39 DEBUG: add: 20070105223422.1ymx6b99mycg@voltaire.local with add-ts=2007-01-05 22:34:22 DEBUG: add: 20070105T213440Z2u5w9rfe2lq8@voltaire.local ignored, came from client DEBUG: add: 20070105T213442Z7ecv8peqmr48@voltaire.local ignored, came from client DEBUG: add: 20070105223408.6wew7kh5jag4@voltaire.local with add-ts=2007-01-05 22:34:08 DEBUG: sending 2 server changes for syncType=calendar DEBUG: add: 20070105223422.1ymx6b99mycg@voltaire.local DEBUG: Sync4j for name=DTSTART, value=1167714000 DEBUG: Sync4j for name=DTEND, value=1167717600 DEBUG: Sync4j for name=DTSTAMP, value=1168032885 DEBUG: Sync4j for name=SUMMARY, value=server2 6-7 DEBUG: Sync4j for name=TRANSP, value=OPAQUE DEBUG: Sync4j for name=ORGANIZER, value=MAILTO:syncmltest DEBUG: Sync4j for name=CLASS, value=PUBLIC DEBUG: add: 20070105223408.6wew7kh5jag4@voltaire.local DEBUG: Sync4j for name=DTSTART, value=1168059600 DEBUG: Sync4j for name=DTEND, value=1168063200 DEBUG: Sync4j for name=DTSTAMP, value=1168032885 DEBUG: Sync4j for name=SUMMARY, value=all day three kings server1 DEBUG: Sync4j for name=TRANSP, value=OPAQUE DEBUG: Sync4j for name=ORGANIZER, value=MAILTO:syncmltest DEBUG: Sync4j for name=DESCRIPTION, value=test uumlaut: ü DEBUG: Sync4j for name=CATEGORIES, value=holiday DEBUG: Sync4j for name=LOCATION, value=almost everywhere DEBUG: Sync4j for name=CLASS, value=PUBLIC DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:34:45. Packet logged in /tmp/sync/syncml_server_12.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032875 DEBUG: authorized=1 version=1 msgid=4 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: created Map for cuid=000000004FCBE97B738E984EAF085560B1DD2D50449C2000 and suid=20070105223422.1ymx6b99mycg@voltaire.local in db calendar DEBUG: created Map for cuid=000000004FCBE97B738E984EAF085560B1DD2D50649C2000 and suid=20070105223408.6wew7kh5jag4@voltaire.local in db calendar DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,0,2; server(Add,Replace,Delete)=2,0,0 DEBUG: Finished at 2007-01-05 22:34:46. Packet logged in /tmp/sync/syncml_server_13.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncmlscpimoutlook1168032964 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=1 msgid=1 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 1168032875 DEBUG: SyncML: Anchor match, TwoWaySync since 1168032875 DEBUG: Create new sync for calendar; synctype=200 DEBUG: HandleFinal for state=0 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:07. Packet logged in /tmp/sync/syncml_server_20.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032964 DEBUG: authorized=1 version=1 msgid=2 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: Handling client sent Add DEBUG: add to server db calendar cuid 000000004FCBE97B738E984EAF085560B1DD2D50849C2000 -> suid 20070105T213608Z97fh32byy88@voltaire.local DEBUG: added client entry as 20070105T213608Z97fh32byy88@voltaire.local DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 000000004FCBE97B738E984EAF085560B1DD2D50449C2000 suid 20070105223422.1ymx6b99mycg@voltaire.local DEBUG: replaced entry 20070105223422.1ymx6b99mycg@voltaire.local due to client request DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 000000004FCBE97B738E984EAF085560B1DD2D50649C2000 suid 20070105223408.6wew7kh5jag4@voltaire.local DEBUG: replaced entry 20070105223408.6wew7kh5jag4@voltaire.local due to client request DEBUG: HandleFinal for state=1 DEBUG: Not yet sending server sync data: special Funambol handling. DEBUG: Received Final from client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:09. Packet logged in /tmp/sync/syncml_server_21.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032964 DEBUG: authorized=1 version=1 msgid=3 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes from 2007-01-05 22:34:39 to 2007-01-05 22:36:07 DEBUG: add: 20070105223456.5x0i61i3nbgo@voltaire.local with add-ts=2007-01-05 22:34:56 DEBUG: add: 20070105T213440Z2u5w9rfe2lq8@voltaire.local ignored, came from client DEBUG: add: 20070105T213442Z7ecv8peqmr48@voltaire.local ignored, came from client DEBUG: add: 20070105T213608Z97fh32byy88@voltaire.local ignored, came from client DEBUG: change: 20070105223408.6wew7kh5jag4@voltaire.local ignored, came from client DEBUG: change: 20070105223422.1ymx6b99mycg@voltaire.local ignored, came from client DEBUG: sending 3 server changes for syncType=calendar DEBUG: add: 20070105223456.5x0i61i3nbgo@voltaire.local DEBUG: Sync4j for name=DTSTART, value=1167800400 DEBUG: Sync4j for name=DTEND, value=1167804000 DEBUG: Sync4j for name=DTSTAMP, value=1168032970 DEBUG: Sync4j for name=SUMMARY, value=server99 DEBUG: Sync4j for name=TRANSP, value=OPAQUE DEBUG: Sync4j for name=ORGANIZER, value=MAILTO:syncmltest DEBUG: Sync4j for name=CLASS, value=PUBLIC DEBUG: replace: 20070105T213440Z2u5w9rfe2lq8@voltaire.local DEBUG: Sync4j for name=DTSTART, value=Array DEBUG: Sync4j for name=DTEND, value=Array DEBUG: Sync4j for name=DTSTAMP, value=1168032970 DEBUG: Sync4j for name=SUMMARY, value=new year all day client1s1 DEBUG: Sync4j for name=TRANSP, value=OPAQUE DEBUG: Sync4j for name=ORGANIZER, value=MAILTO:syncmltest DEBUG: Sync4j for name=DESCRIPTION, value=Test Aumlaut: Ä DEBUG: Sync4j for name=LOCATION, value=everywhere DEBUG: Sync4j for name=CLASS, value=PUBLIC DEBUG: replace: 20070105T213442Z7ecv8peqmr48@voltaire.local DEBUG: Sync4j for name=DTSTART, value=1168207200 DEBUG: Sync4j for name=DTEND, value=1168209000 DEBUG: Sync4j for name=DTSTAMP, value=1168032970 DEBUG: Sync4j for name=SUMMARY, value=Client2s2 23:00-23:30 DEBUG: Sync4j for name=TRANSP, value=OPAQUE DEBUG: Sync4j for name=ORGANIZER, value=MAILTO:syncmltest DEBUG: Sync4j for name=DESCRIPTION, value=Alarm 30minutes before DEBUG: Sync4j for name=CLASS, value=PUBLIC DEBUG: Sync4j for name=AALARM, value=1168205400 DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:10. Packet logged in /tmp/sync/syncml_server_22.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032964 DEBUG: authorized=1 version=1 msgid=4 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: created Map for cuid=000000004FCBE97B738E984EAF085560B1DD2D50A49C2000 and suid=20070105223456.5x0i61i3nbgo@voltaire.local in db calendar DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=1,2,0,0; server(Add,Replace,Delete)=1,2,0 DEBUG: Finished at 2007-01-05 22:36:11. Packet logged in /tmp/sync/syncml_server_23.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncmlscpimoutlook1168032979 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=1 msgid=1 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 1168032964 DEBUG: SyncML: Anchor match, TwoWaySync since 1168032964 DEBUG: Create new sync for calendar; synctype=200 DEBUG: HandleFinal for state=0 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:21. Packet logged in /tmp/sync/syncml_server_30.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032979 DEBUG: authorized=1 version=1 msgid=2 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: HandleFinal for state=1 DEBUG: Not yet sending server sync data: special Funambol handling. DEBUG: Received Final from client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:21. Packet logged in /tmp/sync/syncml_server_31.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032979 DEBUG: authorized=1 version=1 msgid=3 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes from 2007-01-05 22:36:07 to 2007-01-05 22:36:21 DEBUG: add: 20070105T213608Z97fh32byy88@voltaire.local ignored, came from client DEBUG: change: 20070105223422.1ymx6b99mycg@voltaire.local ignored, came from client DEBUG: change: 20070105223408.6wew7kh5jag4@voltaire.local ignored, came from client DEBUG: sending 0 server changes for syncType=calendar DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:22. Packet logged in /tmp/sync/syncml_server_32.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168032979 DEBUG: authorized=1 version=1 msgid=4 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,0,0; server(Add,Replace,Delete)=0,0,0 DEBUG: Finished at 2007-01-05 22:36:22. Packet logged in /tmp/sync/syncml_server_33.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncmlscpimoutlook1168033004 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=1 msgid=1 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 1168032979 DEBUG: SyncML: Anchor match, TwoWaySync since 1168032979 DEBUG: Create new sync for calendar; synctype=200 DEBUG: HandleFinal for state=0 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:47. Packet logged in /tmp/sync/syncml_server_40.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168033004 DEBUG: authorized=1 version=1 msgid=2 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: Handling client sent Delete DEBUG: deleted entry due to client request DEBUG: HandleFinal for state=1 DEBUG: Not yet sending server sync data: special Funambol handling. DEBUG: Received Final from client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:48. Packet logged in /tmp/sync/syncml_server_41.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168033004 DEBUG: authorized=1 version=1 msgid=3 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes from 2007-01-05 22:36:21 to 2007-01-05 22:36:47 DEBUG: SyncML: delete 20070105223456.5x0i61i3nbgo@voltaire.local ignored, came from client DEBUG: sending 1 server changes for syncType=calendar DEBUG: delete: cuid=000000004FCBE97B738E984EAF085560B1DD2D50849C2000 suid=20070105T213608Z97fh32byy88@voltaire.local DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:48. Packet logged in /tmp/sync/syncml_server_42.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168033004 DEBUG: authorized=1 version=1 msgid=4 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,1,0; server(Add,Replace,Delete)=0,0,1 DEBUG: Finished at 2007-01-05 22:36:48. Packet logged in /tmp/sync/syncml_server_43.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncmlscpimoutlook1168033013 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=1 msgid=1 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 1168033004 DEBUG: SyncML: Anchor match, TwoWaySync since 1168033004 DEBUG: Create new sync for calendar; synctype=200 DEBUG: HandleFinal for state=0 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:55. Packet logged in /tmp/sync/syncml_server_50.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168033013 DEBUG: authorized=1 version=1 msgid=2 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: HandleFinal for state=1 DEBUG: Not yet sending server sync data: special Funambol handling. DEBUG: Received Final from client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:56. Packet logged in /tmp/sync/syncml_server_51.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168033013 DEBUG: authorized=1 version=1 msgid=3 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_sync4j DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes from 2007-01-05 22:36:47 to 2007-01-05 22:36:55 DEBUG: sending 0 server changes for syncType=calendar DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-05 22:36:56. Packet logged in /tmp/sync/syncml_server_52.xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncmlscpimoutlook1168033013 DEBUG: authorized=1 version=1 msgid=4 source=sc-pim-outlook target=http://voltaire.local/horde/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: HandleFinal for state=3 DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,0,0; server(Add,Replace,Delete)=0,0,0 DEBUG: Finished at 2007-01-05 22:36:56. Packet logged in /tmp/sync/syncml_server_53.xml Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_10.xml0000664000175000017500000000252212700700443030726 0ustar janjan1.1SyncML/1.111680328751sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200211Alertcalendarcalendar20011680328753201calendarcalendar01168032879310004application/vnd.syncml-devinf+xml./devinf11 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_11.xml0000664000175000017500000000247012700700443030731 0ustar janjan1.1SyncML/1.111680328752sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200223Synccalendarcalendar200324Replace000000004FCBE97B738E984EAF085560B1DD2D50049C2000201424Replace000000004FCBE97B738E984EAF085560B1DD2D50249C20002015application/vnd.syncml-devinf+xml./devinf11 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_12.xml0000664000175000017500000000466112700700443030736 0ustar janjan1.1SyncML/1.111680328753sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200232Alert2003calendarcalendar4text/x-s4j-sife20070105223422.1ymx6b99mycg@voltaire.localb64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48QnVzeVN0YXR1cz4yPC9CdXN5U3RhdHVzPjxEdXJhdGlvbj42MDwvRHVyYXRpb24+PEVuZD4yMDA3MDEwMlQwNjAwMDBaPC9FbmQ+PElzUmVjdXJyaW5nPjA8L0lzUmVjdXJyaW5nPjxSZW1pbmRlclNldD4wPC9SZW1pbmRlclNldD48U2Vuc2l0aXZpdHk+MDwvU2Vuc2l0aXZpdHk+PFN0YXJ0PjIwMDcwMTAyVDA1MDAwMFo8L1N0YXJ0PjxTdWJqZWN0PnNlcnZlcjIgNi03PC9TdWJqZWN0PjwvYXBwb2ludG1lbnQ+5text/x-s4j-sife20070105223408.6wew7kh5jag4@voltaire.localb64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48Qm9keT50ZXN0IHV1bWxhdXQ6IMO8PC9Cb2R5PjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PENhdGVnb3JpZXM+aG9saWRheTwvQ2F0ZWdvcmllcz48RHVyYXRpb24+NjA8L0R1cmF0aW9uPjxFbmQ+MjAwNzAxMDZUMDYwMDAwWjwvRW5kPjxJc1JlY3VycmluZz4wPC9Jc1JlY3VycmluZz48TG9jYXRpb24+YWxtb3N0IGV2ZXJ5d2hlcmU8L0xvY2F0aW9uPjxSZW1pbmRlclNldD4wPC9SZW1pbmRlclNldD48U2Vuc2l0aXZpdHk+MDwvU2Vuc2l0aXZpdHk+PFN0YXJ0PjIwMDcwMTA2VDA1MDAwMFo8L1N0YXJ0PjxTdWJqZWN0PmFsbCBkYXkgdGhyZWUga2luZ3Mgc2VydmVyMTwvU3ViamVjdD48L2FwcG9pbnRtZW50Pg==6application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_13.xml0000664000175000017500000000173212700700443030733 0ustar janjan1.1SyncML/1.111680328754sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000140SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200245Mapcalendarcalendar2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_20.xml0000664000175000017500000000256112700700443030732 0ustar janjan1.1SyncML/1.111680329641sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook212211Alertcalendarcalendar200116803287511680329643200calendarcalendar11680328791168032967310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_21.xml0000664000175000017500000000272212700700443030732 0ustar janjan1.1SyncML/1.111680329642sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200223Synccalendarcalendar200324Add000000004FCBE97B738E984EAF085560B1DD2D50849C2000201425Replace000000004FCBE97B738E984EAF085560B1DD2D50449C2000200525Replace000000004FCBE97B738E984EAF085560B1DD2D50649C20002006application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_22.xml0000664000175000017500000000616412700700443030737 0ustar janjan1.1SyncML/1.111680329643sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200232Alert2003calendarcalendar4text/x-s4j-sife20070105223456.5x0i61i3nbgo@voltaire.localb64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48QnVzeVN0YXR1cz4yPC9CdXN5U3RhdHVzPjxEdXJhdGlvbj42MDwvRHVyYXRpb24+PEVuZD4yMDA3MDEwM1QwNjAwMDBaPC9FbmQ+PElzUmVjdXJyaW5nPjA8L0lzUmVjdXJyaW5nPjxSZW1pbmRlclNldD4wPC9SZW1pbmRlclNldD48U2Vuc2l0aXZpdHk+MDwvU2Vuc2l0aXZpdHk+PFN0YXJ0PjIwMDcwMTAzVDA1MDAwMFo8L1N0YXJ0PjxTdWJqZWN0PnNlcnZlcjk5PC9TdWJqZWN0PjwvYXBwb2ludG1lbnQ+5text/x-s4j-sife000000004FCBE97B738E984EAF085560B1DD2D50049C2000b64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4xPC9BbGxEYXlFdmVudD48Qm9keT5UZXN0IEF1bWxhdXQ6IMOEPC9Cb2R5PjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PEVuZD4yMDA3LTAxLTAxPC9FbmQ+PElzUmVjdXJyaW5nPjA8L0lzUmVjdXJyaW5nPjxMb2NhdGlvbj5ldmVyeXdoZXJlPC9Mb2NhdGlvbj48UmVtaW5kZXJTZXQ+MDwvUmVtaW5kZXJTZXQ+PFNlbnNpdGl2aXR5PjA8L1NlbnNpdGl2aXR5PjxTdGFydD4yMDA3LTAxLTAxPC9TdGFydD48U3ViamVjdD5uZXcgeWVhciBhbGwgZGF5IGNsaWVudDFzMTwvU3ViamVjdD48L2FwcG9pbnRtZW50Pg==6text/x-s4j-sife000000004FCBE97B738E984EAF085560B1DD2D50249C2000b64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxBbGxEYXlFdmVudD4wPC9BbGxEYXlFdmVudD48Qm9keT5BbGFybSAzMG1pbnV0ZXMgYmVmb3JlPC9Cb2R5PjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PER1cmF0aW9uPjMwPC9EdXJhdGlvbj48RW5kPjIwMDcwMTA3VDIyMzAwMFo8L0VuZD48SXNSZWN1cnJpbmc+MDwvSXNSZWN1cnJpbmc+PFJlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjMwPC9SZW1pbmRlck1pbnV0ZXNCZWZvcmVTdGFydD48UmVtaW5kZXJTZXQ+MTwvUmVtaW5kZXJTZXQ+PFNlbnNpdGl2aXR5PjA8L1NlbnNpdGl2aXR5PjxTdGFydD4yMDA3MDEwN1QyMjAwMDBaPC9TdGFydD48U3ViamVjdD5DbGllbnQyczIgMjM6MDAtMjM6MzA8L1N1YmplY3Q+PC9hcHBvaW50bWVudD4=7application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_23.xml0000664000175000017500000000173212700700443030734 0ustar janjan1.1SyncML/1.111680329644sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000140SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200246Mapcalendarcalendar2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_30.xml0000664000175000017500000000256112700700443030733 0ustar janjan1.1SyncML/1.111680329791sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook212211Alertcalendarcalendar200116803296411680329793200calendarcalendar11680329671168032981310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_31.xml0000664000175000017500000000171412700700443030733 0ustar janjan1.1SyncML/1.111680329792sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200223Synccalendarcalendar2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_32.xml0000664000175000017500000000201712700700443030731 0ustar janjan1.1SyncML/1.111680329793sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200232Alert2003calendarcalendar4application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_33.xml0000664000175000017500000000147112700700443030735 0ustar janjan1.1SyncML/1.111680329794sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000140SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook2002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_40.xml0000664000175000017500000000256112700700443030734 0ustar janjan1.1SyncML/1.111680330041sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook212211Alertcalendarcalendar200116803297911680330043200calendarcalendar11680329811168033007310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_41.xml0000664000175000017500000000217112700700443030732 0ustar janjan1.1SyncML/1.111680330042sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200223Synccalendarcalendar200324Delete000000004FCBE97B738E984EAF085560B1DD2D50A49C20002004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_42.xml0000664000175000017500000000221712700700443030734 0ustar janjan1.1SyncML/1.111680330043sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200232Alert2003calendarcalendar4000000004FCBE97B738E984EAF085560B1DD2D50849C20005application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_43.xml0000664000175000017500000000147112700700443030736 0ustar janjan1.1SyncML/1.111680330044sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000140SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook2002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_50.xml0000664000175000017500000000256112700700443030735 0ustar janjan1.1SyncML/1.111680330131sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook212211Alertcalendarcalendar200116803300411680330133200calendarcalendar11680330071168033015310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_51.xml0000664000175000017500000000171412700700443030735 0ustar janjan1.1SyncML/1.111680330132sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200223Synccalendarcalendar2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_52.xml0000664000175000017500000000201712700700443030733 0ustar janjan1.1SyncML/1.111680330133sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook200232Alert2003calendarcalendar4application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_funambol_outlook3015_calendar/syncml_server_53.xml0000664000175000017500000000147112700700443030737 0ustar janjan1.1SyncML/1.111680330134sc-pim-outlooksyncmltesthttp://voltaire.local/horde/rpc.php100000031000140SyncHdrhttp://voltaire.local/horde/rpc.phpsc-pim-outlook2002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/data.txt0000664000175000017500000002760512700700443024765 0ustar janjan input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT UID:667 SUMMARY:client1 12-1 DTSTART:20061222T110000Z DTEND:20061222T120000Z X-EPOCAGENDAENTRYTYPE:APPOINTMENT AALARM;TYPE=X-EPOCSOUND:20061222T105000Z;;0;c:\system\data\themes\sound\Reminder\Classical.mp3 CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205000Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT SUMMARY:client1 12-1 DTSTART:20061222T110000Z DTEND:20061222T120000Z X-EPOCAGENDAENTRYTYPE:APPOINTMENT AALARM;TYPE=X-EPOCSOUND:20061222T105000Z;;0;c:\system\data\themes\sound\Reminder\Classical.mp3 CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205000Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT UID:678 SUMMARY:cIient1 christmas all day DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:uumlaut:=20=C3=BC DTSTART:20061225T000000Z DTEND:20061225T240000Z X-EPOCAGENDAENTRYTYPE:EVENT CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205200Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT SUMMARY:cIient1 christmas all day DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:uumlaut:=20=C3=BC DTSTART;VALUE=DATE:20061225 DTEND;VALUE=DATE:20061225 X-EPOCAGENDAENTRYTYPE:EVENT CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205200Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VTODO UID:679 SUMMARY:clienttask1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Aumlaut:=20=C3=84 X-EPOCTODOLIST:To-do list STATUS:NEEDS ACTION X-EPOCAGENDAENTRYTYPE:TODO CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205200Z CATEGORIES:X-65536 PRIORITY:1 END:VTODO END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VTODO SUMMARY:clienttask1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Aumlaut:=20=C3=84 X-EPOCTODOLIST:To-do list STATUS:NEEDS ACTION X-EPOCAGENDAENTRYTYPE:TODO CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205200Z CATEGORIES:65536 PRIORITY:1 END:VTODO END:VCALENDAR output received from horde backend (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20070101T000000 DTEND:20070101T235959 DTSTAMP:20070102T180655Z UID:20070102190218.5fbc16hzzroc@voltaire.local SUMMARY:server1allday new year TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest LOCATION:everywhere CLASS:PUBLIC END:VEVENT END:VCALENDAR output converted for client (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT X-EPOCAGENDAENTRYTYPE:EVENT DTSTART:20070101T000000 DTEND:20070102T000000 DTSTAMP:20070102T180655Z SUMMARY:server1allday new year TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest LOCATION:everywhere CLASS:PUBLIC END:VEVENT END:VCALENDAR output received from horde backend (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20070102T050000Z DTEND:20070102T060000Z DTSTAMP:20070102T180655Z UID:20070102190234.3wz9alsndh0k@voltaire.local SUMMARY:server2 6-7 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest CLASS:PUBLIC END:VEVENT END:VCALENDAR output converted for client (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20070102T050000Z DTEND:20070102T060000Z DTSTAMP:20070102T180655Z SUMMARY:server2 6-7 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest CLASS:PUBLIC END:VEVENT END:VCALENDAR output received from horde backend (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 PRODID:-//The Horde Project//Nag H3 (2.2-cvs)//EN METHOD:PUBLISH BEGIN:VTODO UID:20070102183704.6l75i6x9a2gw@voltaire.local ORGANIZER:syncmltest SUMMARY:servertask1 DESCRIPTION: PRIORITY:3 STATUS:NEEDS ACTION CATEGORIES:65536 LAST-MODIFIED:20070102T180247Z END:VTODO END:VCALENDAR output converted for client (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 PRODID:-//The Horde Project//Nag H3 (2.2-cvs)//EN METHOD:PUBLISH BEGIN:VTODO ORGANIZER:syncmltest SUMMARY:servertask1 DESCRIPTION: PRIORITY:3 STATUS:NEEDS ACTION CATEGORIES:65536 LAST-MODIFIED:20070102T180247Z END:VTODO END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT UID:680 SUMMARY:server1alldayc1 new year DTSTART:20070101T000000Z DTEND:20070101T240000Z X-EPOCAGENDAENTRYTYPE:EVENT CLASS:PUBLIC LOCATION:everywhere DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205600Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT SUMMARY:server1alldayc1 new year DTSTART;VALUE=DATE:20070101 DTEND;VALUE=DATE:20070101 X-EPOCAGENDAENTRYTYPE:EVENT CLASS:PUBLIC LOCATION:everywhere DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205600Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT UID:681 SUMMARY:server2c1 6-7 DESCRIPTION:alarm half hour before. DTSTART:20070102T050000Z DTEND:20070102T060000Z X-EPOCAGENDAENTRYTYPE:APPOINTMENT AALARM;TYPE=X-EPOCSOUND:20070102T043000Z;;0;c:\system\data\themes\sound\Reminder\Classical.mp3 CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205700Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT SUMMARY:server2c1 6-7 DESCRIPTION:alarm half hour before. DTSTART:20070102T050000Z DTEND:20070102T060000Z X-EPOCAGENDAENTRYTYPE:APPOINTMENT AALARM;TYPE=X-EPOCSOUND:20070102T043000Z;;0;c:\system\data\themes\sound\Reminder\Classical.mp3 CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205700Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VTODO UID:682 SUMMARY:servertask1c1 X-EPOCTODOLIST:To-do list STATUS:NEEDS ACTION X-EPOCAGENDAENTRYTYPE:TODO CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205500Z CATEGORIES:X-65536 PRIORITY:1 END:VTODO END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VTODO SUMMARY:servertask1c1 X-EPOCTODOLIST:To-do list STATUS:NEEDS ACTION X-EPOCAGENDAENTRYTYPE:TODO CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205500Z CATEGORIES:65536 PRIORITY:1 END:VTODO END:VCALENDAR output received from horde backend (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20061222T110000Z DTEND:20061222T120000Z DTSTAMP:20070102T181054Z UID:20070102190646.11w7isgi2ywg@fourmont.dyndns.org SUMMARY:client1s1 12-1 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest CLASS:PUBLIC AALARM:20061222T105000Z END:VEVENT END:VCALENDAR output converted for client (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20061222T110000Z DTEND:20061222T120000Z DTSTAMP:20070102T181054Z SUMMARY:client1s1 12-1 TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest CLASS:PUBLIC AALARM:20061222T105000Z END:VEVENT END:VCALENDAR output received from horde backend (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT DTSTART:20061225T000000 DTEND:20061225T235959 DTSTAMP:20070102T181054Z UID:20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org SUMMARY:cIient1s1 christmas all day TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:= uumlaut: =C3=BC CLASS:PUBLIC END:VEVENT END:VCALENDAR output converted for client (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 X-WR-CALNAME:syncmltest's Calendar PRODID:-//The Horde Project//Horde_iCalendar Library//EN METHOD:PUBLISH BEGIN:VEVENT X-EPOCAGENDAENTRYTYPE:EVENT DTSTART:20061225T000000 DTEND:20061226T000000 DTSTAMP:20070102T181054Z SUMMARY:cIient1s1 christmas all day TRANSP:OPAQUE ORGANIZER;CN=syncmltest:MAILTO:syncmltest DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:= uumlaut: =C3=BC CLASS:PUBLIC END:VEVENT END:VCALENDAR output received from horde backend (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 PRODID:-//The Horde Project//Nag H3 (2.2-cvs)//EN METHOD:PUBLISH BEGIN:VTODO UID:20070102190651.31xjl2phtjy8@fourmont.dyndns.org ORGANIZER:syncmltest SUMMARY:clienttask1s1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:= Aumlaut: =C3=84 PRIORITY:5 STATUS:NEEDS ACTION CATEGORIES:65536 DCREATED:20070102T180651Z LAST-MODIFIED:20070102T180740Z END:VTODO END:VCALENDAR output converted for client (text/x-vcalendar): BEGIN:VCALENDAR VERSION:1.0 PRODID:-//The Horde Project//Nag H3 (2.2-cvs)//EN METHOD:PUBLISH BEGIN:VTODO ORGANIZER:syncmltest SUMMARY:clienttask1s1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:= Aumlaut: =C3=84 PRIORITY:5 STATUS:NEEDS ACTION CATEGORIES:65536 DCREATED:20070102T180651Z LAST-MODIFIED:20070102T180740Z END:VTODO END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT UID:667 SUMMARY:client1s1 12-1 DTSTART:20061222T110000Z DTEND:20061222T120000Z X-EPOCAGENDAENTRYTYPE:APPOINTMENT AALARM;TYPE=X-EPOCSOUND:20061222T105000Z;;0;c:\system\data\themes\sound\DefaultAlarm\Classical.mp3 CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205700Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT SUMMARY:client1s1 12-1 DTSTART:20061222T110000Z DTEND:20061222T120000Z X-EPOCAGENDAENTRYTYPE:APPOINTMENT AALARM;TYPE=X-EPOCSOUND:20061222T105000Z;;0;c:\system\data\themes\sound\DefaultAlarm\Classical.mp3 CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205700Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT UID:678 SUMMARY:cIient1s1 christmas all day DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:uumlaut:=20=C3=BC DTSTART:20061225T000000Z DTEND:20061225T240000Z X-EPOCAGENDAENTRYTYPE:EVENT CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205700Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VEVENT SUMMARY:cIient1s1 christmas all day DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:uumlaut:=20=C3=BC DTSTART;VALUE=DATE:20061225 DTEND;VALUE=DATE:20061225 X-EPOCAGENDAENTRYTYPE:EVENT CLASS:PUBLIC DCREATED:20061221T230000Z LAST-MODIFIED:20061222T205700Z PRIORITY:0 STATUS:NEEDS ACTION END:VEVENT END:VCALENDAR input received from client (text/calendar) BEGIN:VCALENDAR VERSION:1.0 BEGIN:VTODO UID:679 SUMMARY:clienttask1s1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Aumlaut:=20=C3=84 X-EPOCTODOLIST:To-do list STATUS:NEEDS ACTION X-EPOCAGENDAENTRYTYPE:TODO CLASS:PUBLIC DCREATED:20070101T230000Z LAST-MODIFIED:20061222T205700Z CATEGORIES:X-65536 PRIORITY:5 END:VTODO END:VCALENDAR input converted for server (text/calendar): BEGIN:VCALENDAR VERSION:1.0 BEGIN:VTODO SUMMARY:clienttask1s1 DESCRIPTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Aumlaut:=20=C3=84 X-EPOCTODOLIST:To-do list STATUS:NEEDS ACTION X-EPOCAGENDAENTRYTYPE:TODO CLASS:PUBLIC DCREATED:20070101T230000Z LAST-MODIFIED:20061222T205700Z CATEGORIES:65536 PRIORITY:5 END:VTODO END:VCALENDAR Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/devinf.txt0000664000175000017500000001612012700700443025315 0ustar janjanSyncML_DeviceInfo::__set_state(array( '_VerDTD' => '1.0', '_Man' => 'Sony Ericsson', '_Mod' => 'P900', '_OEM' => 'Symbian', '_FwV' => 'R5B02', '_SwV' => '1.0', '_HwV' => 'R1A', '_DevID' => '351965-00-340413-3', '_DevTyp' => 'smartphone', '_DataStore' => array ( 0 => SyncML_DataStore::__set_state(array( '_SourceRef' => 'c:\\Documents\\agenda\\agenda', '_DisplayName' => NULL, '_MaxGUIDSize' => '4', '_Rx_Pref' => array ( 'text/x-vcalendar' => '1.0', ), '_Rx' => NULL, '_Tx_Pref' => array ( 'text/x-vcalendar' => '1.0', ), '_Tx' => NULL, '_DSMem' => NULL, '_SyncCap' => array ( 1 => true, 2 => true, ), )), ), '_CTCap' => array ( 'text/x-vcalendar' => array ( 'AALARM' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'ATTACH' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'ATTENDEE' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => array ( 'EXPECT' => SyncML_PropertyParameter::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, )), 'ROLE' => SyncML_PropertyParameter::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, )), 'RSVP' => SyncML_PropertyParameter::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, )), 'STATUS' => SyncML_PropertyParameter::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, )), ), )), 'BEGIN' => SyncML_Property::__set_state(array( '_ValEnum' => array ( 'VCALENDAR' => true, 'VEVENT' => true, 'VTODO' => true, ), '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'CATEGORIES' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'COMPLETED' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'CLASS' => SyncML_Property::__set_state(array( '_ValEnum' => array ( 'PUBLIC' => true, 'PRIVATE' => true, 'CONFIDENTIAL' => true, ), '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'DAYLIGHT' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'DCREATED' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'DESCRIPTION' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'DTSTART' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'DTEND' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'DUE' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'END' => SyncML_Property::__set_state(array( '_ValEnum' => array ( 'VEVENT' => true, 'VCALENDAR' => true, 'VTODO' => true, ), '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'EXDATE' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'LAST-MODIFIED' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'LOCATION' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'PRIORITY' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'RRULE' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'STATUS' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'SUMMARY' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'UID' => SyncML_Property::__set_state(array( '_ValEnum' => NULL, '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), 'VERSION' => SyncML_Property::__set_state(array( '_ValEnum' => array ( '1.0' => true, ), '_DataType' => NULL, '_Size' => NULL, '_DisplayName' => NULL, '_params' => NULL, )), ), ), '_Ext' => NULL, '_UTC' => NULL, '_supportLargeObjs' => NULL, '_supportNumberOfChanges' => NULL, ))Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_10.xml0000664000175000017500000000554412700700443027176 0ustar janjan1.0SyncML/1.016134684361http://example.com/rpc.php351965-00-340413-3b64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN02000001application/vnd.syncml-devinf+xml./devinf101.0 Sony Ericsson P900 Symbian R5B02 1.0 R1A smartphone 351965-00-340413-3c:\Documents\agenda\agenda 4 text/x-vcalendar 1.0 text/x-vcalendar 1.0 1 2 text/x-vcalendar AALARM ATTACH ATTENDEE EXPECT ROLE RSVP STATUS BEGIN VCALENDAR VEVENT VTODO CATEGORIES COMPLETED CLASS PUBLIC PRIVATE CONFIDENTIAL DAYLIGHT DCREATED DESCRIPTION DTSTART DTEND DUE END VEVENT VCALENDAR VTODO EXDATE LAST-MODIFIED LOCATION PRIORITY RRULE STATUS SUMMARY UID VERSION 1.0 2application/vnd.syncml-devinf+xml./devinf103200calendarc:\Documents\agenda\agenda20061222T204212Z20061222T205323ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_11.xml0000664000175000017500000000516612700700443027177 0ustar janjan1.0SyncML/1.016134684362http://example.com/rpc.php351965-00-340413-3200000110SyncHdr351965-00-340413-3http://example.com/rpc.php200214Results200316Alertc:\Documents\agenda\agendacalendar20011677611964calendarc:\Documents\agenda\agenda5text/calendar6676text/calendar6787text/calendar679Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_12.xml0000664000175000017500000000400612700700443027170 0ustar janjan1.0SyncML/1.016134684363http://example.com/rpc.php351965-00-340413-3200000120SyncHdr351965-00-340413-3http://example.com/rpc.php200223Syncc:\Documents\agenda\agendacalendar200324Add20070102190218.5fbc16hzzroc@voltaire.local201425Add20070102190234.3wz9alsndh0k@voltaire.local201526Add20070102183704.6l75i6x9a2gw@voltaire.local2016calendarc:\Documents\agenda\agenda20070102190218.5fbc16hzzroc@voltaire.local6807calendarc:\Documents\agenda\agenda20070102190234.3wz9alsndh0k@voltaire.local6818calendarc:\Documents\agenda\agenda20070102183704.6l75i6x9a2gw@voltaire.local682Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_20.xml0000664000175000017500000000554312700700443027176 0ustar janjan1.0SyncML/1.02885535801http://example.com/rpc.php351965-00-340413-3b64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN02000001application/vnd.syncml-devinf+xml./devinf101.0 Sony Ericsson P900 Symbian R5B02 1.0 R1A smartphone 351965-00-340413-3c:\Documents\agenda\agenda 4 text/x-vcalendar 1.0 text/x-vcalendar 1.0 1 2 text/x-vcalendar AALARM ATTACH ATTENDEE EXPECT ROLE RSVP STATUS BEGIN VCALENDAR VEVENT VTODO CATEGORIES COMPLETED CLASS PUBLIC PRIVATE CONFIDENTIAL DAYLIGHT DCREATED DESCRIPTION DTSTART DTEND DUE END VEVENT VCALENDAR VTODO EXDATE LAST-MODIFIED LOCATION PRIORITY RRULE STATUS SUMMARY UID VERSION 1.0 2application/vnd.syncml-devinf+xml./devinf103200calendarc:\Documents\agenda\agenda20061222T205323Z20061222T205735ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_21.xml0000664000175000017500000000504312700700443027172 0ustar janjan1.0SyncML/1.02885535802http://example.com/rpc.php351965-00-340413-3200000110SyncHdr351965-00-340413-3http://example.com/rpc.php200214Results200316Alertc:\Documents\agenda\agendacalendar20011677614474calendarc:\Documents\agenda\agenda5text/calendar6806text/calendar6817text/calendar682Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_22.xml0000664000175000017500000000221512700700443027171 0ustar janjan1.0SyncML/1.02885535803http://example.com/rpc.php351965-00-340413-3200000120SyncHdr351965-00-340413-3http://example.com/rpc.php200223Syncc:\Documents\agenda\agendacalendar200324Replace667200425Replace678200526Replace679200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_30.xml0000664000175000017500000000554312700700443027177 0ustar janjan1.0SyncML/1.05394419081http://example.com/rpc.php351965-00-340413-3b64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN02000001application/vnd.syncml-devinf+xml./devinf101.0 Sony Ericsson P900 Symbian R5B02 1.0 R1A smartphone 351965-00-340413-3c:\Documents\agenda\agenda 4 text/x-vcalendar 1.0 text/x-vcalendar 1.0 1 2 text/x-vcalendar AALARM ATTACH ATTENDEE EXPECT ROLE RSVP STATUS BEGIN VCALENDAR VEVENT VTODO CATEGORIES COMPLETED CLASS PUBLIC PRIVATE CONFIDENTIAL DAYLIGHT DCREATED DESCRIPTION DTSTART DTEND DUE END VEVENT VCALENDAR VTODO EXDATE LAST-MODIFIED LOCATION PRIORITY RRULE STATUS SUMMARY UID VERSION 1.0 2application/vnd.syncml-devinf+xml./devinf103200calendarc:\Documents\agenda\agenda20061222T205735Z20061222T205851ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_31.xml0000664000175000017500000000517712700700443027203 0ustar janjan1.0SyncML/1.05394419082http://example.com/rpc.php351965-00-340413-3200000110SyncHdr351965-00-340413-3http://example.com/rpc.php200214Results200316Alertc:\Documents\agenda\agendacalendar20011677615244calendarc:\Documents\agenda\agenda5text/calendar6676text/calendar6787text/calendar679Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_32.xml0000664000175000017500000000141212700700443027170 0ustar janjan1.0SyncML/1.05394419083http://example.com/rpc.php351965-00-340413-3200000120SyncHdr351965-00-340413-3http://example.com/rpc.php200223Syncc:\Documents\agenda\agendacalendar200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_40.xml0000664000175000017500000000554312700700443027200 0ustar janjan1.0SyncML/1.08903896261http://example.com/rpc.php351965-00-340413-3b64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN02000001application/vnd.syncml-devinf+xml./devinf101.0 Sony Ericsson P900 Symbian R5B02 1.0 R1A smartphone 351965-00-340413-3c:\Documents\agenda\agenda 4 text/x-vcalendar 1.0 text/x-vcalendar 1.0 1 2 text/x-vcalendar AALARM ATTACH ATTENDEE EXPECT ROLE RSVP STATUS BEGIN VCALENDAR VEVENT VTODO CATEGORIES COMPLETED CLASS PUBLIC PRIVATE CONFIDENTIAL DAYLIGHT DCREATED DESCRIPTION DTSTART DTEND DUE END VEVENT VCALENDAR VTODO EXDATE LAST-MODIFIED LOCATION PRIORITY RRULE STATUS SUMMARY UID VERSION 1.0 2application/vnd.syncml-devinf+xml./devinf103200calendarc:\Documents\agenda\agenda20061222T205851Z20061222T210039ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_41.xml0000664000175000017500000000211512700700443027171 0ustar janjan1.0SyncML/1.08903896262http://example.com/rpc.php351965-00-340413-3200000110SyncHdr351965-00-340413-3http://example.com/rpc.php200214Results200316Alertc:\Documents\agenda\agendacalendar20011677616534calendarc:\Documents\agenda\agendaHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_42.xml0000664000175000017500000000141212700700443027171 0ustar janjan1.0SyncML/1.08903896263http://example.com/rpc.php351965-00-340413-3200000120SyncHdr351965-00-340413-3http://example.com/rpc.php200223Syncc:\Documents\agenda\agendacalendar200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_50.xml0000664000175000017500000000554412700700443027202 0ustar janjan1.0SyncML/1.014321696291http://example.com/rpc.php351965-00-340413-3b64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN02000001application/vnd.syncml-devinf+xml./devinf101.0 Sony Ericsson P900 Symbian R5B02 1.0 R1A smartphone 351965-00-340413-3c:\Documents\agenda\agenda 4 text/x-vcalendar 1.0 text/x-vcalendar 1.0 1 2 text/x-vcalendar AALARM ATTACH ATTENDEE EXPECT ROLE RSVP STATUS BEGIN VCALENDAR VEVENT VTODO CATEGORIES COMPLETED CLASS PUBLIC PRIVATE CONFIDENTIAL DAYLIGHT DCREATED DESCRIPTION DTSTART DTEND DUE END VEVENT VCALENDAR VTODO EXDATE LAST-MODIFIED LOCATION PRIORITY RRULE STATUS SUMMARY UID VERSION 1.0 2application/vnd.syncml-devinf+xml./devinf103200calendarc:\Documents\agenda\agenda20061222T210039Z20061222T210325ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_51.xml0000664000175000017500000000236412700700443027200 0ustar janjan1.0SyncML/1.014321696292http://example.com/rpc.php351965-00-340413-3200000110SyncHdr351965-00-340413-3http://example.com/rpc.php200214Results200316Alertc:\Documents\agenda\agendacalendar20011677617974calendarc:\Documents\agenda\agenda56816682Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_52.xml0000664000175000017500000000201312700700443027170 0ustar janjan1.0SyncML/1.014321696293http://example.com/rpc.php351965-00-340413-3200000120SyncHdr351965-00-340413-3http://example.com/rpc.php200223Syncc:\Documents\agenda\agendacalendar200324Delete667200425Delete679200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_60.xml0000664000175000017500000000554412700700443027203 0ustar janjan1.0SyncML/1.015232486741http://example.com/rpc.php351965-00-340413-3b64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN02000001application/vnd.syncml-devinf+xml./devinf101.0 Sony Ericsson P900 Symbian R5B02 1.0 R1A smartphone 351965-00-340413-3c:\Documents\agenda\agenda 4 text/x-vcalendar 1.0 text/x-vcalendar 1.0 1 2 text/x-vcalendar AALARM ATTACH ATTENDEE EXPECT ROLE RSVP STATUS BEGIN VCALENDAR VEVENT VTODO CATEGORIES COMPLETED CLASS PUBLIC PRIVATE CONFIDENTIAL DAYLIGHT DCREATED DESCRIPTION DTSTART DTEND DUE END VEVENT VCALENDAR VTODO EXDATE LAST-MODIFIED LOCATION PRIORITY RRULE STATUS SUMMARY UID VERSION 1.0 2application/vnd.syncml-devinf+xml./devinf103200calendarc:\Documents\agenda\agenda20061222T210325Z20061222T210353ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_61.xml0000664000175000017500000000211612700700443027174 0ustar janjan1.0SyncML/1.015232486742http://example.com/rpc.php351965-00-340413-3200000110SyncHdr351965-00-340413-3http://example.com/rpc.php200214Results200316Alertc:\Documents\agenda\agendacalendar20011677618244calendarc:\Documents\agenda\agendaHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_client_62.xml0000664000175000017500000000141312700700443027174 0ustar janjan1.0SyncML/1.015232486743http://example.com/rpc.php351965-00-340413-3200000120SyncHdr351965-00-340413-3http://example.com/rpc.php200223Syncc:\Documents\agenda\agendacalendar200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_log.txt0000664000175000017500000004072412700700443026217 0ustar janjanDEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncml3519650034041331613468436 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=0 msgid=1 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: SyncML: No info about previous syncs found for device 351965-00-340413-3 and database calendar DEBUG: Create new sync for calendar; synctype=201 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:06:36. Packet logged in /tmp/sync/syncml_server_11.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml3519650034041331613468436 DEBUG: authorized=1 version=0 msgid=2 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_P800 DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 667 suid DEBUG: No map entry found DEBUG: add to server db calendar cuid 667 -> suid 20070102190646.11w7isgi2ywg@fourmont.dyndns.org DEBUG: added client entry due to replace request as 20070102190646.11w7isgi2ywg@fourmont.dyndns.org DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 678 suid DEBUG: No map entry found DEBUG: add to server db calendar cuid 678 -> suid 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org DEBUG: added client entry due to replace request as 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org DEBUG: Handling client sent Replace DEBUG: replace in db tasks cuid 679 suid DEBUG: No map entry found DEBUG: add to server db tasks cuid 679 -> suid 20070102190651.31xjl2phtjy8@fourmont.dyndns.org DEBUG: added client entry due to replace request as 20070102190651.31xjl2phtjy8@fourmont.dyndns.org DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes DEBUG: add: 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org ignored, came from client DEBUG: add: 20070102190646.11w7isgi2ywg@fourmont.dyndns.org ignored, came from client DEBUG: handling tasks in calendar sync DEBUG: add: 20070102190651.31xjl2phtjy8@fourmont.dyndns.org ignored, came from client DEBUG: sending 3 server changes for syncType=calendar DEBUG: add: 20070102190218.5fbc16hzzroc@voltaire.local DEBUG: add: 20070102190234.3wz9alsndh0k@voltaire.local DEBUG: add: 20070102183704.6l75i6x9a2gw@voltaire.local DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:06:55. Packet logged in /tmp/sync/syncml_server_12.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml3519650034041331613468436 DEBUG: authorized=1 version=0 msgid=3 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_P800 DEBUG: created Map for cuid=680 and suid=20070102190218.5fbc16hzzroc@voltaire.local in db calendar DEBUG: created Map for cuid=681 and suid=20070102190234.3wz9alsndh0k@voltaire.local in db calendar DEBUG: created Map for cuid=682 and suid=20070102183704.6l75i6x9a2gw@voltaire.local in db tasks DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,0,3; server(Add,Replace,Delete)=3,0,0 DEBUG: Finished at 2007-01-02 19:07:03. Packet logged in /tmp/sync/syncml_server_20.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncml351965003404133288553580 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=0 msgid=1 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 20061222T205323Z DEBUG: SyncML: Anchor match, TwoWaySync since 20061222T205323Z DEBUG: Create new sync for calendar; synctype=200 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:10:47. Packet logged in /tmp/sync/syncml_server_21.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml351965003404133288553580 DEBUG: authorized=1 version=0 msgid=2 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_P800 DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 680 suid 20070102190218.5fbc16hzzroc@voltaire.local DEBUG: replaced entry 20070102190218.5fbc16hzzroc@voltaire.local due to client request DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 681 suid 20070102190234.3wz9alsndh0k@voltaire.local DEBUG: replaced entry 20070102190234.3wz9alsndh0k@voltaire.local due to client request DEBUG: Handling client sent Replace DEBUG: replace in db tasks cuid 682 suid 20070102183704.6l75i6x9a2gw@voltaire.local DEBUG: replaced entry 20070102183704.6l75i6x9a2gw@voltaire.local due to client request DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes DEBUG: add: 20070102190646.11w7isgi2ywg@fourmont.dyndns.org ignored, came from client DEBUG: add: 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org ignored, came from client DEBUG: change: 20070102190218.5fbc16hzzroc@voltaire.local ignored, came from client DEBUG: change: 20070102190234.3wz9alsndh0k@voltaire.local ignored, came from client DEBUG: handling tasks in calendar sync DEBUG: add: 20070102190651.31xjl2phtjy8@fourmont.dyndns.org ignored, came from client DEBUG: change: 20070102183704.6l75i6x9a2gw@voltaire.local ignored, came from client DEBUG: sending 3 server changes for syncType=calendar DEBUG: replace: 20070102190646.11w7isgi2ywg@fourmont.dyndns.org DEBUG: replace: 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org DEBUG: replace: 20070102190651.31xjl2phtjy8@fourmont.dyndns.org DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:10:54. Packet logged in /tmp/sync/syncml_server_22.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml351965003404133288553580 DEBUG: authorized=1 version=0 msgid=3 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,3,0,0; server(Add,Replace,Delete)=0,3,0 DEBUG: Finished at 2007-01-02 19:11:01. Packet logged in /tmp/sync/syncml_server_30.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncml351965003404133539441908 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=0 msgid=1 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 20061222T205735Z DEBUG: SyncML: Anchor match, TwoWaySync since 20061222T205735Z DEBUG: Create new sync for calendar; synctype=200 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:12:04. Packet logged in /tmp/sync/syncml_server_31.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml351965003404133539441908 DEBUG: authorized=1 version=0 msgid=2 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_P800 DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 667 suid 20070102190646.11w7isgi2ywg@fourmont.dyndns.org DEBUG: replaced entry 20070102190646.11w7isgi2ywg@fourmont.dyndns.org due to client request DEBUG: Handling client sent Replace DEBUG: replace in db calendar cuid 678 suid 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org DEBUG: replaced entry 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org due to client request DEBUG: Handling client sent Replace DEBUG: replace in db tasks cuid 679 suid 20070102190651.31xjl2phtjy8@fourmont.dyndns.org DEBUG: replaced entry 20070102190651.31xjl2phtjy8@fourmont.dyndns.org due to client request DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes DEBUG: change: 20070102190218.5fbc16hzzroc@voltaire.local ignored, came from client DEBUG: change: 20070102190234.3wz9alsndh0k@voltaire.local ignored, came from client DEBUG: change: 20070102190646.11w7isgi2ywg@fourmont.dyndns.org ignored, came from client DEBUG: change: 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org ignored, came from client DEBUG: handling tasks in calendar sync DEBUG: change: 20070102183704.6l75i6x9a2gw@voltaire.local ignored, came from client DEBUG: change: 20070102190651.31xjl2phtjy8@fourmont.dyndns.org ignored, came from client DEBUG: sending 0 server changes for syncType=calendar DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:12:09. Packet logged in /tmp/sync/syncml_server_32.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml351965003404133539441908 DEBUG: authorized=1 version=0 msgid=3 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,3,0,0; server(Add,Replace,Delete)=0,0,0 DEBUG: Finished at 2007-01-02 19:12:12. Packet logged in /tmp/sync/syncml_server_40.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncml351965003404133890389626 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=0 msgid=1 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 20061222T205851Z DEBUG: SyncML: Anchor match, TwoWaySync since 20061222T205851Z DEBUG: Create new sync for calendar; synctype=200 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:14:13. Packet logged in /tmp/sync/syncml_server_41.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml351965003404133890389626 DEBUG: authorized=1 version=0 msgid=2 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_P800 DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes DEBUG: change: 20070102190646.11w7isgi2ywg@fourmont.dyndns.org ignored, came from client DEBUG: change: 20070102190649.6fhtdnkvlrsw@fourmont.dyndns.org ignored, came from client DEBUG: handling tasks in calendar sync DEBUG: change: 20070102190651.31xjl2phtjy8@fourmont.dyndns.org ignored, came from client DEBUG: sending 0 server changes for syncType=calendar DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:14:19. Packet logged in /tmp/sync/syncml_server_42.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml351965003404133890389626 DEBUG: authorized=1 version=0 msgid=3 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,0,0; server(Add,Replace,Delete)=0,0,0 DEBUG: Finished at 2007-01-02 19:14:22. Packet logged in /tmp/sync/syncml_server_50.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncml3519650034041331432169629 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=0 msgid=1 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 20061222T210039Z DEBUG: SyncML: Anchor match, TwoWaySync since 20061222T210039Z DEBUG: Create new sync for calendar; synctype=200 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:16:37. Packet logged in /tmp/sync/syncml_server_51.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml3519650034041331432169629 DEBUG: authorized=1 version=0 msgid=2 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_P800 DEBUG: Handling client sent Delete DEBUG: deleted entry due to client request DEBUG: Handling client sent Delete DEBUG: special tasks delete due to client request DEBUG: deleted entry due to client request DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes DEBUG: SyncML: delete 20070102190234.3wz9alsndh0k@voltaire.local ignored, came from client DEBUG: handling tasks in calendar sync DEBUG: SyncML: delete 20070102183704.6l75i6x9a2gw@voltaire.local ignored, came from client DEBUG: sending 2 server changes for syncType=calendar DEBUG: delete: cuid=667 suid=20070102190646.11w7isgi2ywg@fourmont.dyndns.org DEBUG: delete: cuid=679 suid=20070102190651.31xjl2phtjy8@fourmont.dyndns.org DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:16:43. Packet logged in /tmp/sync/syncml_server_52.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml3519650034041331432169629 DEBUG: authorized=1 version=0 msgid=3 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,2,0; server(Add,Replace,Delete)=0,0,2 DEBUG: Finished at 2007-01-02 19:16:45. Packet logged in /tmp/sync/syncml_server_60.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: New session created: syncml3519650034041331523248674 DEBUG: checking auth for user=syncmltest DEBUG: authorized=1 version=0 msgid=1 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: previous sync found for database: calendar; client-ts: 20061222T210325Z DEBUG: SyncML: Anchor match, TwoWaySync since 20061222T210325Z DEBUG: Create new sync for calendar; synctype=200 DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:17:04. Packet logged in /tmp/sync/syncml_server_61.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml3519650034041331523248674 DEBUG: authorized=1 version=0 msgid=2 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Using device class SyncML_Device_P800 DEBUG: server create sync output for syncType=calendar DEBUG: Compiling server changes DEBUG: SyncML: delete 20070102190234.3wz9alsndh0k@voltaire.local ignored, came from client DEBUG: handling tasks in calendar sync DEBUG: SyncML: delete 20070102183704.6l75i6x9a2gw@voltaire.local ignored, came from client DEBUG: sending 0 server changes for syncType=calendar DEBUG: Received Final from client. DEBUG: Sending Final to client. DEBUG: SyncML: return message completed DEBUG: Finished at 2007-01-02 19:17:09. Packet logged in /tmp/sync/syncml_server_62.(wb)xml DEBUG: Backend of class SyncML_Backend_Horde created DEBUG: Existing session continued: syncml3519650034041331523248674 DEBUG: authorized=1 version=0 msgid=3 source=351965-00-340413-3 target=http://example.com/rpc.php user=syncmltest charset=UTF-8 wbxml= DEBUG: Received Final from client. DEBUG: Sending Final to client. INFO: Successful sync of calendar! Summary: failures=0; client(Add,Replace,Delete,AddReplaces)=0,0,0,0; server(Add,Replace,Delete)=0,0,0 DEBUG: Finished at 2007-01-02 19:17:12. Packet logged in /tmp/sync/syncml_server_70.(wb)xml Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_10.xml0000664000175000017500000000663112700700443027224 0ustar janjan1.0SyncML/1.016134684361351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000110SyncHdrhttp://example.com/rpc.php351965-00-340413-3200211Put./devinf10200312Get./devinf10200412application/vnd.syncml-devinf+xml./devinf101.0The Horde Project (http://www.horde.org/)fourmont.dyndns.orgservernotestext/plain1.0text/plain1.0123456contactstext/directory3.0text/x-vcard2.1text/directory3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456513Alertcalendarc:\Documents\agenda\agenda50820061222T204212Z20061222T205323Z6201c:\Documents\agenda\agendacalendar01167761196 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_11.xml0000664000175000017500000000472612700700443027230 0ustar janjan1.0SyncML/1.016134684362351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000120SyncHdrhttp://example.com/rpc.php351965-00-340413-3200224Synccalendarc:\Documents\agenda\agenda2003c:\Documents\agenda\agendacalendar4text/x-vcalendar20070102190218.5fbc16hzzroc@voltaire.local5text/x-vcalendar20070102190234.3wz9alsndh0k@voltaire.local6text/x-vcalendar20070102183704.6l75i6x9a2gw@voltaire.localHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_12.xml0000664000175000017500000000212612700700443027221 0ustar janjan1.0SyncML/1.016134684363351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000130SyncHdrhttp://example.com/rpc.php351965-00-340413-3200236Mapcalendarc:\Documents\agenda\agenda200337Mapcalendarc:\Documents\agenda\agenda200438Mapcalendarc:\Documents\agenda\agenda200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_20.xml0000664000175000017500000000701412700700443027221 0ustar janjan1.0SyncML/1.02885535801351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000110SyncHdrhttp://example.com/rpc.php351965-00-340413-3212211Put./devinf10200312Get./devinf10200412application/vnd.syncml-devinf+xml./devinf101.0The Horde Project (http://www.horde.org/)fourmont.dyndns.orgservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456513Alertcalendarc:\Documents\agenda\agenda20020061222T205323Z20061222T205735Z6200c:\Documents\agenda\agendacalendar11677611961167761447Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_21.xml0000664000175000017500000000505312700700443027223 0ustar janjan1.0SyncML/1.02885535802351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000120SyncHdrhttp://example.com/rpc.php351965-00-340413-3200224Synccalendarc:\Documents\agenda\agenda2003c:\Documents\agenda\agendacalendar4text/x-vcalendar6675text/x-vcalendar6786text/x-vcalendar679Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_22.xml0000664000175000017500000000107412700700443027223 0ustar janjan1.0SyncML/1.02885535803351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000130SyncHdrhttp://example.com/rpc.php351965-00-340413-3200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_30.xml0000664000175000017500000000701412700700443027222 0ustar janjan1.0SyncML/1.05394419081351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000110SyncHdrhttp://example.com/rpc.php351965-00-340413-3212211Put./devinf10200312Get./devinf10200412application/vnd.syncml-devinf+xml./devinf101.0The Horde Project (http://www.horde.org/)fourmont.dyndns.orgservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456513Alertcalendarc:\Documents\agenda\agenda20020061222T205735Z20061222T205851Z6200c:\Documents\agenda\agendacalendar11677614471167761524Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_31.xml0000664000175000017500000000156312700700443027226 0ustar janjan1.0SyncML/1.05394419082351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000120SyncHdrhttp://example.com/rpc.php351965-00-340413-3200224Synccalendarc:\Documents\agenda\agenda2003c:\Documents\agenda\agendacalendarHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_32.xml0000664000175000017500000000107412700700443027224 0ustar janjan1.0SyncML/1.05394419083351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000130SyncHdrhttp://example.com/rpc.php351965-00-340413-3200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_40.xml0000664000175000017500000000701412700700443027223 0ustar janjan1.0SyncML/1.08903896261351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000110SyncHdrhttp://example.com/rpc.php351965-00-340413-3212211Put./devinf10200312Get./devinf10200412application/vnd.syncml-devinf+xml./devinf101.0The Horde Project (http://www.horde.org/)fourmont.dyndns.orgservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456513Alertcalendarc:\Documents\agenda\agenda20020061222T205851Z20061222T210039Z6200c:\Documents\agenda\agendacalendar11677615241167761653Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_41.xml0000664000175000017500000000156312700700443027227 0ustar janjan1.0SyncML/1.08903896262351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000120SyncHdrhttp://example.com/rpc.php351965-00-340413-3200224Synccalendarc:\Documents\agenda\agenda2003c:\Documents\agenda\agendacalendarHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_42.xml0000664000175000017500000000107412700700443027225 0ustar janjan1.0SyncML/1.08903896263351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000130SyncHdrhttp://example.com/rpc.php351965-00-340413-3200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_50.xml0000664000175000017500000000701512700700443027225 0ustar janjan1.0SyncML/1.014321696291351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000110SyncHdrhttp://example.com/rpc.php351965-00-340413-3212211Put./devinf10200312Get./devinf10200412application/vnd.syncml-devinf+xml./devinf101.0The Horde Project (http://www.horde.org/)fourmont.dyndns.orgservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456513Alertcalendarc:\Documents\agenda\agenda20020061222T210039Z20061222T210325Z6200c:\Documents\agenda\agendacalendar11677616531167761797Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_51.xml0000664000175000017500000000203212700700443027220 0ustar janjan1.0SyncML/1.014321696292351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000120SyncHdrhttp://example.com/rpc.php351965-00-340413-3200224Synccalendarc:\Documents\agenda\agenda2003c:\Documents\agenda\agendacalendar46675679Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_52.xml0000664000175000017500000000107512700700443027227 0ustar janjan1.0SyncML/1.014321696293351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000130SyncHdrhttp://example.com/rpc.php351965-00-340413-3200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_60.xml0000664000175000017500000000701512700700443027226 0ustar janjan1.0SyncML/1.015232486741351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000110SyncHdrhttp://example.com/rpc.php351965-00-340413-3212211Put./devinf10200312Get./devinf10200412application/vnd.syncml-devinf+xml./devinf101.0The Horde Project (http://www.horde.org/)fourmont.dyndns.orgservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456513Alertcalendarc:\Documents\agenda\agenda20020061222T210325Z20061222T210353Z6200c:\Documents\agenda\agendacalendar11677617971167761824Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_61.xml0000664000175000017500000000156412700700443027232 0ustar janjan1.0SyncML/1.015232486742351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000120SyncHdrhttp://example.com/rpc.php351965-00-340413-3200224Synccalendarc:\Documents\agenda\agenda2003c:\Documents\agenda\agendacalendarHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_P900_tasksandcalendar/syncml_server_62.xml0000664000175000017500000000107512700700443027230 0ustar janjan1.0SyncML/1.015232486743351965-00-340413-3syncmltesthttp://example.com/rpc.php1000000130SyncHdrhttp://example.com/rpc.php351965-00-340413-3200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_10.xml0000664000175000017500000000133312700700443030107 0ustar janjan 1.1 SyncML/1.1 32288706 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 calendar calendar 0 32288706 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_11.xml0000664000175000017500000000430312700700443030110 0ustar janjan 1.1 SyncML/1.1 32288706 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert calendar calendar 200 1161009197 3 calendar calendar 4 text/x-s4j-sife 184558443 b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YXBwb2ludG1lbnQ+PFN1YmplY3Q+Y2xpZW50MTwvU3ViamVjdD48TG9jYXRpb24+TG9jYXRpb248L0xvY2F0aW9uPjxDYXRlZ29yaWVzPkdlc2Now6RmdGxpY2g8L0NhdGVnb3JpZXM+PFJlbWluZGVyU291bmRGaWxlPnJlbWluZGVyPC9SZW1pbmRlclNvdW5kRmlsZT48Qm9keT7DnGJlcnNpY2h0PC9Cb2R5PjxTdGFydD4yMDA2MTAxOFQwMzMwMDBaPC9TdGFydD48RW5kPjIwMDYxMDE4VDA2MDAwMFo8L0VuZD48QWxsRGF5RXZlbnQ+MDwvQWxsRGF5RXZlbnQ+PFJlbWluZGVyU2V0PjE8L1JlbWluZGVyU2V0PjxCdXN5U3RhdHVzPjA8L0J1c3lTdGF0dXM+PFNlbnNpdGl2aXR5PjA8L1NlbnNpdGl2aXR5PjxSZW1pbmRlck9wdGlvbnM+MTM8L1JlbWluZGVyT3B0aW9ucz48UmVtaW5kZXJNaW51dGVzQmVmb3JlU3RhcnQ+MTU8L1JlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjxJc1JlY3VycmluZz4wPC9Jc1JlY3VycmluZz48UmVjdXJyZW5jZVR5cGU+MDwvUmVjdXJyZW5jZVR5cGU+PEludGVydmFsPjA8L0ludGVydmFsPjxEYXlPZk1vbnRoPjA8L0RheU9mTW9udGg+PE1vbnRoT2ZZZWFyPjA8L01vbnRoT2ZZZWFyPjxEYXlPZldlZWtNYXNrPjA8L0RheU9mV2Vla01hc2s+PEluc3RhbmNlPjA8L0luc3RhbmNlPjxQYXR0ZXJuU3RhcnREYXRlPjIwMDYxMDE3VDIyMDAwMFo8L1BhdHRlcm5TdGFydERhdGU+PE5vRW5kRGF0ZT4xPC9Ob0VuZERhdGU+PFBhdHRlcm5FbmREYXRlPjwvUGF0dGVybkVuZERhdGU+PE9jY3VycmVuY2VzPjA8L09jY3VycmVuY2VzPjwvYXBwb2ludG1lbnQ+ Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_12.xml0000664000175000017500000000135712700700443030117 0ustar janjan 1.1 SyncML/1.1 32288706 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_13.xml0000664000175000017500000000230512700700443030112 0ustar janjan 1.1 SyncML/1.1 32288706 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync calendar calendar 200 3 3 5 Add 201 20061016163151.x61x2ng9dcg@trinity.wg.de 4 calendar calendar 20061016163151.x61x2ng9dcg@trinity.wg.de 83899779 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_20.xml0000664000175000017500000000134212700700443030110 0ustar janjan 1.1 SyncML/1.1 32291312 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 calendar calendar 32288706 32291312 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_21.xml0000664000175000017500000000666112700700443030122 0ustar janjan 1.1 SyncML/1.1 32291312 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert calendar calendar 200 1161009979 3 calendar calendar 4 text/x-s4j-sife 67117561 b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YXBwb2ludG1lbnQ+PFN1YmplY3Q+Y2xpZW50MjwvU3ViamVjdD48TG9jYXRpb24+PC9Mb2NhdGlvbj48Q2F0ZWdvcmllcz5HZXNjaMOkZnRsaWNoPC9DYXRlZ29yaWVzPjxSZW1pbmRlclNvdW5kRmlsZT5yZW1pbmRlcjwvUmVtaW5kZXJTb3VuZEZpbGU+PEJvZHk+PC9Cb2R5PjxTdGFydD4yMDA2MTAyOFQwNTAwMDBaPC9TdGFydD48RW5kPjIwMDYxMDI4VDA5MzAwMFo8L0VuZD48QWxsRGF5RXZlbnQ+MDwvQWxsRGF5RXZlbnQ+PFJlbWluZGVyU2V0PjA8L1JlbWluZGVyU2V0PjxCdXN5U3RhdHVzPjM8L0J1c3lTdGF0dXM+PFNlbnNpdGl2aXR5PjI8L1NlbnNpdGl2aXR5PjxSZW1pbmRlck9wdGlvbnM+MTM8L1JlbWluZGVyT3B0aW9ucz48UmVtaW5kZXJNaW51dGVzQmVmb3JlU3RhcnQ+MTU8L1JlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjxJc1JlY3VycmluZz4wPC9Jc1JlY3VycmluZz48UmVjdXJyZW5jZVR5cGU+MDwvUmVjdXJyZW5jZVR5cGU+PEludGVydmFsPjA8L0ludGVydmFsPjxEYXlPZk1vbnRoPjA8L0RheU9mTW9udGg+PE1vbnRoT2ZZZWFyPjA8L01vbnRoT2ZZZWFyPjxEYXlPZldlZWtNYXNrPjA8L0RheU9mV2Vla01hc2s+PEluc3RhbmNlPjA8L0luc3RhbmNlPjxQYXR0ZXJuU3RhcnREYXRlPjIwMDYxMDI3VDIyMDAwMFo8L1BhdHRlcm5TdGFydERhdGU+PE5vRW5kRGF0ZT4xPC9Ob0VuZERhdGU+PFBhdHRlcm5FbmREYXRlPjwvUGF0dGVybkVuZERhdGU+PE9jY3VycmVuY2VzPjA8L09jY3VycmVuY2VzPjwvYXBwb2ludG1lbnQ+ 5 text/x-s4j-sife 83899779 b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48YXBwb2ludG1lbnQ+PFN1YmplY3Q+c2VydmVyMWMxPC9TdWJqZWN0PjxMb2NhdGlvbj5Mb2NhdGlvbiBTZXJ2ZXI8L0xvY2F0aW9uPjxDYXRlZ29yaWVzPk15IENhdGVnb3J5PC9DYXRlZ29yaWVzPjxSZW1pbmRlclNvdW5kRmlsZT5yZW1pbmRlcjwvUmVtaW5kZXJTb3VuZEZpbGU+PEJvZHk+w5xiZXJzaWNodDwvQm9keT48U3RhcnQ+MjAwNjEwMjNUMDQwMDAwWjwvU3RhcnQ+PEVuZD4yMDA2MTAyM1QwOTAwMDBaPC9FbmQ+PEFsbERheUV2ZW50PjA8L0FsbERheUV2ZW50PjxSZW1pbmRlclNldD4wPC9SZW1pbmRlclNldD48QnVzeVN0YXR1cz4yPC9CdXN5U3RhdHVzPjxTZW5zaXRpdml0eT4wPC9TZW5zaXRpdml0eT48UmVtaW5kZXJPcHRpb25zPjEzPC9SZW1pbmRlck9wdGlvbnM+PFJlbWluZGVyTWludXRlc0JlZm9yZVN0YXJ0PjE1PC9SZW1pbmRlck1pbnV0ZXNCZWZvcmVTdGFydD48SXNSZWN1cnJpbmc+MDwvSXNSZWN1cnJpbmc+PFJlY3VycmVuY2VUeXBlPjA8L1JlY3VycmVuY2VUeXBlPjxJbnRlcnZhbD4wPC9JbnRlcnZhbD48RGF5T2ZNb250aD4wPC9EYXlPZk1vbnRoPjxNb250aE9mWWVhcj4wPC9Nb250aE9mWWVhcj48RGF5T2ZXZWVrTWFzaz4wPC9EYXlPZldlZWtNYXNrPjxJbnN0YW5jZT4wPC9JbnN0YW5jZT48UGF0dGVyblN0YXJ0RGF0ZT4yMDA2MTAyMlQyMjAwMDBaPC9QYXR0ZXJuU3RhcnREYXRlPjxOb0VuZERhdGU+MTwvTm9FbmREYXRlPjxQYXR0ZXJuRW5kRGF0ZT48L1BhdHRlcm5FbmREYXRlPjxPY2N1cnJlbmNlcz4wPC9PY2N1cnJlbmNlcz48L2FwcG9pbnRtZW50Pg== Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_22.xml0000664000175000017500000000135712700700443030120 0ustar janjan 1.1 SyncML/1.1 32291312 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_23.xml0000664000175000017500000000256012700700443030116 0ustar janjan 1.1 SyncML/1.1 32291312 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync calendar calendar 200 3 3 5 Add 201 20061016163645.7g6pl2sp85wc@trinity.wg.de 4 3 6 Replace 200 184558443 5 calendar calendar 20061016163645.7g6pl2sp85wc@trinity.wg.de 201340279 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_30.xml0000664000175000017500000000134212700700443030111 0ustar janjan 1.1 SyncML/1.1 32291424 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 calendar calendar 32291312 32291424 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_31.xml0000664000175000017500000000167712700700443030125 0ustar janjan 1.1 SyncML/1.1 32291424 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert calendar calendar 200 1161009995 3 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_32.xml0000664000175000017500000000135712700700443030121 0ustar janjan 1.1 SyncML/1.1 32291424 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_33.xml0000664000175000017500000000140112700700443030110 0ustar janjan 1.1 SyncML/1.1 32291424 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync calendar calendar 200 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_40.xml0000664000175000017500000000134212700700443030112 0ustar janjan 1.1 SyncML/1.1 32302258 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 calendar calendar 32291424 32302258 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_41.xml0000664000175000017500000000211012700700443030105 0ustar janjan 1.1 SyncML/1.1 32302258 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert calendar calendar 200 1161010852 3 calendar calendar 4 text/x-s4j-sife 201340279 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_42.xml0000664000175000017500000000135712700700443030122 0ustar janjan 1.1 SyncML/1.1 32302258 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 calendar calendar Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_client_43.xml0000664000175000017500000000164712700700443030125 0ustar janjan 1.1 SyncML/1.1 32302258 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync calendar calendar 200 3 3 5 Delete 200 67117561 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_10.xml0000664000175000017500000000253012700700443030137 0ustar janjan1.1SyncML/1.1322887061fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200211Alertcalendarcalendar508322887063201calendarcalendar01161009197310004application/vnd.syncml-devinf+xml./devinf11 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_11.xml0000664000175000017500000000215312700700443030141 0ustar janjan1.1SyncML/1.1322887062fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccalendarcalendar200324Replace1845584432014application/vnd.syncml-devinf+xml./devinf11 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_12.xml0000664000175000017500000000337412700700443030150 0ustar janjan1.1SyncML/1.1322887063fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114calendarcalendar5text/x-s4j-sife20061016163151.x61x2ng9dcg@trinity.wg.deb64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxEdXJhdGlvbj4wPC9EdXJhdGlvbj48QWxsRGF5RXZlbnQ+RmFsc2U8L0FsbERheUV2ZW50PjxTdGFydD4yMDA2MTAyM1QwNDAwMDBaPC9TdGFydD48RW5kPjIwMDYxMDIzVDA5MDAwMFo8L0VuZD48U3ViamVjdD5zZXJ2ZXIxPC9TdWJqZWN0PjxCb2R5PsOcYmVyc2ljaHQ8L0JvZHk+PENhdGVnb3JpZXM+TXkgQ2F0ZWdvcnk8L0NhdGVnb3JpZXM+PExvY2F0aW9uPkxvY2F0aW9uIFNlcnZlcjwvTG9jYXRpb24+PElzUmVjdXJyaW5nPkZhbHNlPC9Jc1JlY3VycmluZz48TWVldGluZ1N0YXR1cz4wPC9NZWV0aW5nU3RhdHVzPjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PC9hcHBvaW50bWVudD4=Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_13.xml0000664000175000017500000000174212700700443030146 0ustar janjan1.1SyncML/1.1322887064fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200244Mapcalendarcalendar2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_20.xml0000664000175000017500000000255312700700443030145 0ustar janjan1.1SyncML/1.1322913121fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertcalendarcalendar20032288706322913123200calendarcalendar11610091971161009979310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_21.xml0000664000175000017500000000233412700700443030143 0ustar janjan1.1SyncML/1.1322913122fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccalendarcalendar200324Add67117561201425Replace838997792005application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_22.xml0000664000175000017500000000457312700700443030153 0ustar janjan1.1SyncML/1.1322913123fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114calendarcalendar5text/x-s4j-sife20061016163645.7g6pl2sp85wc@trinity.wg.deb64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxEdXJhdGlvbj4wPC9EdXJhdGlvbj48QWxsRGF5RXZlbnQ+RmFsc2U8L0FsbERheUV2ZW50PjxTdGFydD4yMDA2MTAyNVQwNDAwMDBaPC9TdGFydD48RW5kPjIwMDYxMDI1VDA1MDAwMFo8L0VuZD48U3ViamVjdD5zZXJ2ZXIyPC9TdWJqZWN0PjxDYXRlZ29yaWVzPkdlc2Now6RmdGxpY2g8L0NhdGVnb3JpZXM+PElzUmVjdXJyaW5nPkZhbHNlPC9Jc1JlY3VycmluZz48TWVldGluZ1N0YXR1cz4wPC9NZWV0aW5nU3RhdHVzPjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PC9hcHBvaW50bWVudD4=6text/x-s4j-sife184558443b64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGFwcG9pbnRtZW50PjxEdXJhdGlvbj4wPC9EdXJhdGlvbj48QWxsRGF5RXZlbnQ+RmFsc2U8L0FsbERheUV2ZW50PjxTdGFydD4yMDA2MTAxOFQwMzMwMDBaPC9TdGFydD48RW5kPjIwMDYxMDE4VDA2MDAwMFo8L0VuZD48U3ViamVjdD5jbGllbnQxczE8L1N1YmplY3Q+PEJvZHk+w5xiZXJzaWNodDwvQm9keT48Q2F0ZWdvcmllcz5HZXNjaMOkZnRsaWNoPC9DYXRlZ29yaWVzPjxMb2NhdGlvbj5Mb2NhdGlvbjwvTG9jYXRpb24+PElzUmVjdXJyaW5nPkZhbHNlPC9Jc1JlY3VycmluZz48TWVldGluZ1N0YXR1cz4wPC9NZWV0aW5nU3RhdHVzPjxCdXN5U3RhdHVzPjI8L0J1c3lTdGF0dXM+PC9hcHBvaW50bWVudD4=Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_23.xml0000664000175000017500000000174212700700443030147 0ustar janjan1.1SyncML/1.1322913124fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200245Mapcalendarcalendar2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_30.xml0000664000175000017500000000255312700700443030146 0ustar janjan1.1SyncML/1.1322914241fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertcalendarcalendar20032291312322914243200calendarcalendar11610099791161009995310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_31.xml0000664000175000017500000000172412700700443030146 0ustar janjan1.1SyncML/1.1322914242fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccalendarcalendar2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_32.xml0000664000175000017500000000202712700700443030144 0ustar janjan1.1SyncML/1.1322914243fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114calendarcalendarHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_33.xml0000664000175000017500000000150112700700443030141 0ustar janjan1.1SyncML/1.1322914244fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE02002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_40.xml0000664000175000017500000000255312700700443030147 0ustar janjan1.1SyncML/1.1323022581fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertcalendarcalendar20032291424323022583200calendarcalendar11610099951161010852310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_41.xml0000664000175000017500000000213212700700443030141 0ustar janjan1.1SyncML/1.1323022582fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccalendarcalendar200324Delete2013402792004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_42.xml0000664000175000017500000000215712700700443030151 0ustar janjan1.1SyncML/1.1323022583fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114calendarcalendar567117561Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_calendar/syncml_server_43.xml0000664000175000017500000000150112700700443030142 0ustar janjan1.1SyncML/1.1323022584fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE02002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_10.xml0000664000175000017500000000133212700700443030153 0ustar janjan 1.1 SyncML/1.1 26429128 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 contacts contact 0 26429128 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_11.xml0000664000175000017500000000675012700700443030165 0ustar janjan 1.1 SyncML/1.1 26429128 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert contacts contact 200 1160775338 3 contacts contact 4 text/x-s4j-sifc 83899317 b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29udGFjdD48Rmlyc3ROYW1lPjwvRmlyc3ROYW1lPjxMYXN0TmFtZT5DbGllbnQxPC9MYXN0TmFtZT48Q29tcGFueU5hbWU+Q29tcGFueTwvQ29tcGFueU5hbWU+PEJ1c2luZXNzRmF4TnVtYmVyPjwvQnVzaW5lc3NGYXhOdW1iZXI+PERlcGFydG1lbnQ+PC9EZXBhcnRtZW50PjxFbWFpbDFBZGRyZXNzPmNsaWVudEBleGFtcGxlLmNvbTwvRW1haWwxQWRkcmVzcz48TW9iaWxlVGVsZXBob25lTnVtYmVyPjwvTW9iaWxlVGVsZXBob25lTnVtYmVyPjxPZmZpY2VMb2NhdGlvbj48L09mZmljZUxvY2F0aW9uPjxQYWdlck51bWJlcj48L1BhZ2VyTnVtYmVyPjxCdXNpbmVzc1RlbGVwaG9uZU51bWJlcj41NTUtMTIzPC9CdXNpbmVzc1RlbGVwaG9uZU51bWJlcj48Sm9iVGl0bGU+PC9Kb2JUaXRsZT48SG9tZVRlbGVwaG9uZU51bWJlcj48L0hvbWVUZWxlcGhvbmVOdW1iZXI+PEVtYWlsMkFkZHJlc3M+PC9FbWFpbDJBZGRyZXNzPjxTcG91c2U+PC9TcG91c2U+PEVtYWlsM0FkZHJlc3M+PC9FbWFpbDNBZGRyZXNzPjxIb21lMlRlbGVwaG9uZU51bWJlcj48L0hvbWUyVGVsZXBob25lTnVtYmVyPjxIb21lRmF4TnVtYmVyPjwvSG9tZUZheE51bWJlcj48Q2FyVGVsZXBob25lTnVtYmVyPjwvQ2FyVGVsZXBob25lTnVtYmVyPjxBc3Npc3RhbnROYW1lPjwvQXNzaXN0YW50TmFtZT48QXNzaXN0YW50VGVsZXBob25lTnVtYmVyPjwvQXNzaXN0YW50VGVsZXBob25lTnVtYmVyPjxDaGlsZHJlbj48L0NoaWxkcmVuPjxDYXRlZ29yaWVzPjwvQ2F0ZWdvcmllcz48V2ViUGFnZT48L1dlYlBhZ2U+PEJ1c2luZXNzMlRlbGVwaG9uZU51bWJlcj48L0J1c2luZXNzMlRlbGVwaG9uZU51bWJlcj48UmFkaW9UZWxlcGhvbmVOdW1iZXI+PC9SYWRpb1RlbGVwaG9uZU51bWJlcj48RmlsZUFzPkNsaWVudDE8L0ZpbGVBcz48WW9taUNvbXBhbnlOYW1lPjwvWW9taUNvbXBhbnlOYW1lPjxZb21pRmlyc3ROYW1lPjwvWW9taUZpcnN0TmFtZT48WW9taUxhc3ROYW1lPjwvWW9taUxhc3ROYW1lPjxUaXRsZT48L1RpdGxlPjxNaWRkbGVOYW1lPjwvTWlkZGxlTmFtZT48U3VmZml4PjwvU3VmZml4PjxIb21lQWRkcmVzc1N0cmVldD48L0hvbWVBZGRyZXNzU3RyZWV0PjxIb21lQWRkcmVzc0NpdHk+PC9Ib21lQWRkcmVzc0NpdHk+PEhvbWVBZGRyZXNzU3RhdGU+PC9Ib21lQWRkcmVzc1N0YXRlPjxIb21lQWRkcmVzc1Bvc3RhbENvZGU+PC9Ib21lQWRkcmVzc1Bvc3RhbENvZGU+PEhvbWVBZGRyZXNzQ291bnRyeT48L0hvbWVBZGRyZXNzQ291bnRyeT48T3RoZXJBZGRyZXNzU3RyZWV0PjwvT3RoZXJBZGRyZXNzU3RyZWV0PjxPdGhlckFkZHJlc3NDaXR5PjwvT3RoZXJBZGRyZXNzQ2l0eT48T3RoZXJBZGRyZXNzUG9zdGFsQ29kZT48L090aGVyQWRkcmVzc1Bvc3RhbENvZGU+PE90aGVyQWRkcmVzc0NvdW50cnk+PC9PdGhlckFkZHJlc3NDb3VudHJ5PjxPdGhlckFkZHJlc3NTdGF0ZT48L090aGVyQWRkcmVzc1N0YXRlPjxCdXNpbmVzc0FkZHJlc3NTdHJlZXQ+PC9CdXNpbmVzc0FkZHJlc3NTdHJlZXQ+PEJ1c2luZXNzQWRkcmVzc0NpdHk+PC9CdXNpbmVzc0FkZHJlc3NDaXR5PjxCdXNpbmVzc0FkZHJlc3NTdGF0ZT48L0J1c2luZXNzQWRkcmVzc1N0YXRlPjxCdXNpbmVzc0FkZHJlc3NQb3N0YWxDb2RlPjwvQnVzaW5lc3NBZGRyZXNzUG9zdGFsQ29kZT48QnVzaW5lc3NBZGRyZXNzQ291bnRyeT48L0J1c2luZXNzQWRkcmVzc0NvdW50cnk+PEJvZHk+PC9Cb2R5PjxCaXJ0aGRheT48L0JpcnRoZGF5PjxBbm5pdmVyc2FyeT48L0Fubml2ZXJzYXJ5PjwvY29udGFjdD4= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_12.xml0000664000175000017500000000135612700700443030163 0ustar janjan 1.1 SyncML/1.1 26429128 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 contacts contact Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_13.xml0000664000175000017500000000230112700700443030153 0ustar janjan 1.1 SyncML/1.1 26429128 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync contacts contact 200 3 3 5 Add 201 20061013233527.htyrg8wmc2o@192.168.60.3 4 contacts contact 20061013233527.htyrg8wmc2o@192.168.60.3 50344628 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_20.xml0000664000175000017500000000134112700700443030154 0ustar janjan 1.1 SyncML/1.1 26430116 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 contacts contact 26429128 26430116 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_21.xml0000664000175000017500000001401412700700443030156 0ustar janjan 1.1 SyncML/1.1 26430116 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert contacts contact 200 1160775641 3 contacts contact 4 text/x-s4j-sifc 251660424 b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29udGFjdD48Rmlyc3ROYW1lPjwvRmlyc3ROYW1lPjxMYXN0TmFtZT5DbGllbnQyPC9MYXN0TmFtZT48Q29tcGFueU5hbWU+PC9Db21wYW55TmFtZT48QnVzaW5lc3NGYXhOdW1iZXI+PC9CdXNpbmVzc0ZheE51bWJlcj48RGVwYXJ0bWVudD48L0RlcGFydG1lbnQ+PEVtYWlsMUFkZHJlc3M+Y2xpZW50MkBleGFtcGxlLmNvbTwvRW1haWwxQWRkcmVzcz48TW9iaWxlVGVsZXBob25lTnVtYmVyPjwvTW9iaWxlVGVsZXBob25lTnVtYmVyPjxPZmZpY2VMb2NhdGlvbj48L09mZmljZUxvY2F0aW9uPjxQYWdlck51bWJlcj48L1BhZ2VyTnVtYmVyPjxCdXNpbmVzc1RlbGVwaG9uZU51bWJlcj4rNDkgNTIxIDE3MDM3MjwvQnVzaW5lc3NUZWxlcGhvbmVOdW1iZXI+PEpvYlRpdGxlPjwvSm9iVGl0bGU+PEhvbWVUZWxlcGhvbmVOdW1iZXI+PC9Ib21lVGVsZXBob25lTnVtYmVyPjxFbWFpbDJBZGRyZXNzPjwvRW1haWwyQWRkcmVzcz48U3BvdXNlPjwvU3BvdXNlPjxFbWFpbDNBZGRyZXNzPjwvRW1haWwzQWRkcmVzcz48SG9tZTJUZWxlcGhvbmVOdW1iZXI+PC9Ib21lMlRlbGVwaG9uZU51bWJlcj48SG9tZUZheE51bWJlcj48L0hvbWVGYXhOdW1iZXI+PENhclRlbGVwaG9uZU51bWJlcj48L0NhclRlbGVwaG9uZU51bWJlcj48QXNzaXN0YW50TmFtZT48L0Fzc2lzdGFudE5hbWU+PEFzc2lzdGFudFRlbGVwaG9uZU51bWJlcj48L0Fzc2lzdGFudFRlbGVwaG9uZU51bWJlcj48Q2hpbGRyZW4+PC9DaGlsZHJlbj48Q2F0ZWdvcmllcz48L0NhdGVnb3JpZXM+PFdlYlBhZ2U+PC9XZWJQYWdlPjxCdXNpbmVzczJUZWxlcGhvbmVOdW1iZXI+PC9CdXNpbmVzczJUZWxlcGhvbmVOdW1iZXI+PFJhZGlvVGVsZXBob25lTnVtYmVyPjwvUmFkaW9UZWxlcGhvbmVOdW1iZXI+PEZpbGVBcz5DbGllbnQyPC9GaWxlQXM+PFlvbWlDb21wYW55TmFtZT48L1lvbWlDb21wYW55TmFtZT48WW9taUZpcnN0TmFtZT48L1lvbWlGaXJzdE5hbWU+PFlvbWlMYXN0TmFtZT48L1lvbWlMYXN0TmFtZT48VGl0bGU+PC9UaXRsZT48TWlkZGxlTmFtZT48L01pZGRsZU5hbWU+PFN1ZmZpeD48L1N1ZmZpeD48SG9tZUFkZHJlc3NTdHJlZXQ+PC9Ib21lQWRkcmVzc1N0cmVldD48SG9tZUFkZHJlc3NDaXR5PjwvSG9tZUFkZHJlc3NDaXR5PjxIb21lQWRkcmVzc1N0YXRlPjwvSG9tZUFkZHJlc3NTdGF0ZT48SG9tZUFkZHJlc3NQb3N0YWxDb2RlPjwvSG9tZUFkZHJlc3NQb3N0YWxDb2RlPjxIb21lQWRkcmVzc0NvdW50cnk+PC9Ib21lQWRkcmVzc0NvdW50cnk+PE90aGVyQWRkcmVzc1N0cmVldD48L090aGVyQWRkcmVzc1N0cmVldD48T3RoZXJBZGRyZXNzQ2l0eT48L090aGVyQWRkcmVzc0NpdHk+PE90aGVyQWRkcmVzc1Bvc3RhbENvZGU+PC9PdGhlckFkZHJlc3NQb3N0YWxDb2RlPjxPdGhlckFkZHJlc3NDb3VudHJ5PjwvT3RoZXJBZGRyZXNzQ291bnRyeT48T3RoZXJBZGRyZXNzU3RhdGU+PC9PdGhlckFkZHJlc3NTdGF0ZT48QnVzaW5lc3NBZGRyZXNzU3RyZWV0PjwvQnVzaW5lc3NBZGRyZXNzU3RyZWV0PjxCdXNpbmVzc0FkZHJlc3NDaXR5PjwvQnVzaW5lc3NBZGRyZXNzQ2l0eT48QnVzaW5lc3NBZGRyZXNzU3RhdGU+PC9CdXNpbmVzc0FkZHJlc3NTdGF0ZT48QnVzaW5lc3NBZGRyZXNzUG9zdGFsQ29kZT48L0J1c2luZXNzQWRkcmVzc1Bvc3RhbENvZGU+PEJ1c2luZXNzQWRkcmVzc0NvdW50cnk+PC9CdXNpbmVzc0FkZHJlc3NDb3VudHJ5PjxCb2R5PjwvQm9keT48QmlydGhkYXk+PC9CaXJ0aGRheT48QW5uaXZlcnNhcnk+PC9Bbm5pdmVyc2FyeT48L2NvbnRhY3Q+ 5 text/x-s4j-sifc 50344628 b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29udGFjdD48Rmlyc3ROYW1lPlNlcnZlcjFjMTwvRmlyc3ROYW1lPjxMYXN0TmFtZT48L0xhc3ROYW1lPjxDb21wYW55TmFtZT48L0NvbXBhbnlOYW1lPjxCdXNpbmVzc0ZheE51bWJlcj48L0J1c2luZXNzRmF4TnVtYmVyPjxEZXBhcnRtZW50PjwvRGVwYXJ0bWVudD48RW1haWwxQWRkcmVzcz5zZXJ2ZXIxQGV4YW1wbGUuY29tPC9FbWFpbDFBZGRyZXNzPjxNb2JpbGVUZWxlcGhvbmVOdW1iZXI+PC9Nb2JpbGVUZWxlcGhvbmVOdW1iZXI+PE9mZmljZUxvY2F0aW9uPjwvT2ZmaWNlTG9jYXRpb24+PFBhZ2VyTnVtYmVyPjwvUGFnZXJOdW1iZXI+PEJ1c2luZXNzVGVsZXBob25lTnVtYmVyPjwvQnVzaW5lc3NUZWxlcGhvbmVOdW1iZXI+PEpvYlRpdGxlPjwvSm9iVGl0bGU+PEhvbWVUZWxlcGhvbmVOdW1iZXI+PC9Ib21lVGVsZXBob25lTnVtYmVyPjxFbWFpbDJBZGRyZXNzPjwvRW1haWwyQWRkcmVzcz48U3BvdXNlPjwvU3BvdXNlPjxFbWFpbDNBZGRyZXNzPjwvRW1haWwzQWRkcmVzcz48SG9tZTJUZWxlcGhvbmVOdW1iZXI+PC9Ib21lMlRlbGVwaG9uZU51bWJlcj48SG9tZUZheE51bWJlcj48L0hvbWVGYXhOdW1iZXI+PENhclRlbGVwaG9uZU51bWJlcj48L0NhclRlbGVwaG9uZU51bWJlcj48QXNzaXN0YW50TmFtZT48L0Fzc2lzdGFudE5hbWU+PEFzc2lzdGFudFRlbGVwaG9uZU51bWJlcj48L0Fzc2lzdGFudFRlbGVwaG9uZU51bWJlcj48Q2hpbGRyZW4+PC9DaGlsZHJlbj48Q2F0ZWdvcmllcz48L0NhdGVnb3JpZXM+PFdlYlBhZ2U+PC9XZWJQYWdlPjxCdXNpbmVzczJUZWxlcGhvbmVOdW1iZXI+PC9CdXNpbmVzczJUZWxlcGhvbmVOdW1iZXI+PFJhZGlvVGVsZXBob25lTnVtYmVyPjwvUmFkaW9UZWxlcGhvbmVOdW1iZXI+PEZpbGVBcz5TZXJ2ZXIxYzE8L0ZpbGVBcz48WW9taUNvbXBhbnlOYW1lPjwvWW9taUNvbXBhbnlOYW1lPjxZb21pRmlyc3ROYW1lPjwvWW9taUZpcnN0TmFtZT48WW9taUxhc3ROYW1lPjwvWW9taUxhc3ROYW1lPjxUaXRsZT48L1RpdGxlPjxNaWRkbGVOYW1lPjwvTWlkZGxlTmFtZT48U3VmZml4PjwvU3VmZml4PjxIb21lQWRkcmVzc1N0cmVldD7DnGJlcnNpY2h0PC9Ib21lQWRkcmVzc1N0cmVldD48SG9tZUFkZHJlc3NDaXR5PjwvSG9tZUFkZHJlc3NDaXR5PjxIb21lQWRkcmVzc1N0YXRlPjwvSG9tZUFkZHJlc3NTdGF0ZT48SG9tZUFkZHJlc3NQb3N0YWxDb2RlPjwvSG9tZUFkZHJlc3NQb3N0YWxDb2RlPjxIb21lQWRkcmVzc0NvdW50cnk+PC9Ib21lQWRkcmVzc0NvdW50cnk+PE90aGVyQWRkcmVzc1N0cmVldD48L090aGVyQWRkcmVzc1N0cmVldD48T3RoZXJBZGRyZXNzQ2l0eT48L090aGVyQWRkcmVzc0NpdHk+PE90aGVyQWRkcmVzc1Bvc3RhbENvZGU+PC9PdGhlckFkZHJlc3NQb3N0YWxDb2RlPjxPdGhlckFkZHJlc3NDb3VudHJ5PjwvT3RoZXJBZGRyZXNzQ291bnRyeT48T3RoZXJBZGRyZXNzU3RhdGU+PC9PdGhlckFkZHJlc3NTdGF0ZT48QnVzaW5lc3NBZGRyZXNzU3RyZWV0PjwvQnVzaW5lc3NBZGRyZXNzU3RyZWV0PjxCdXNpbmVzc0FkZHJlc3NDaXR5PjwvQnVzaW5lc3NBZGRyZXNzQ2l0eT48QnVzaW5lc3NBZGRyZXNzU3RhdGU+PC9CdXNpbmVzc0FkZHJlc3NTdGF0ZT48QnVzaW5lc3NBZGRyZXNzUG9zdGFsQ29kZT48L0J1c2luZXNzQWRkcmVzc1Bvc3RhbENvZGU+PEJ1c2luZXNzQWRkcmVzc0NvdW50cnk+PC9CdXNpbmVzc0FkZHJlc3NDb3VudHJ5PjxCb2R5PjwvQm9keT48QmlydGhkYXk+PC9CaXJ0aGRheT48QW5uaXZlcnNhcnk+PC9Bbm5pdmVyc2FyeT48L2NvbnRhY3Q+ Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_22.xml0000664000175000017500000000135612700700443030164 0ustar janjan 1.1 SyncML/1.1 26430116 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 contacts contact Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_23.xml0000664000175000017500000000255312700700443030165 0ustar janjan 1.1 SyncML/1.1 26430116 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync contacts contact 200 3 3 5 Add 201 20061013233958.53s4q2q5bwso@192.168.60.3 4 3 6 Replace 200 83899317 5 contacts contact 20061013233958.53s4q2q5bwso@192.168.60.3 151008046 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_30.xml0000664000175000017500000000134112700700443030155 0ustar janjan 1.1 SyncML/1.1 26430524 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 contacts contact 26430116 26430524 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_31.xml0000664000175000017500000000167512700700443030170 0ustar janjan 1.1 SyncML/1.1 26430524 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert contacts contact 200 1160775756 3 contacts contact Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_32.xml0000664000175000017500000000135612700700443030165 0ustar janjan 1.1 SyncML/1.1 26430524 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 contacts contact Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_33.xml0000664000175000017500000000140012700700443030154 0ustar janjan 1.1 SyncML/1.1 26430524 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync contacts contact 200 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_40.xml0000664000175000017500000000134112700700443030156 0ustar janjan 1.1 SyncML/1.1 26430854 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 contacts contact 26430524 26430854 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_41.xml0000664000175000017500000000220012700700443030152 0ustar janjan 1.1 SyncML/1.1 26430854 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert contacts contact 200 1160775842 3 contacts contact 4 text/x-s4j-sifc 83899317 151008046 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_42.xml0000664000175000017500000000135612700700443030166 0ustar janjan 1.1 SyncML/1.1 26430854 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 contacts contact Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_client_43.xml0000664000175000017500000000164712700700443030172 0ustar janjan 1.1 SyncML/1.1 26430854 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync contacts contact 200 3 3 5 Delete 200 251660424 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_10.xml0000664000175000017500000000251312700700443030205 0ustar janjan1.1SyncML/1.1264291281fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertcontactscontact508264291283201contactcontacts01160775338310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_11.xml0000664000175000017500000000213112700700443030202 0ustar janjan1.1SyncML/1.1264291282fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccontactscontact200324Replace838993172014application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_12.xml0000664000175000017500000000516612700700443030216 0ustar janjan1.1SyncML/1.1264291283fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114contactcontacts5text/x-s4j-sifc20061013233527.htyrg8wmc2o@192.168.60.3b64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGNvbnRhY3Q+PEZpbGVBcz5zZXJ2ZXIxPC9GaWxlQXM+PEVtYWlsMUFkZHJlc3M+c2VydmVyMUBleGFtcGxlLmNvbTwvRW1haWwxQWRkcmVzcz48RW1haWwxQWRkcmVzc1R5cGU+U01UUDwvRW1haWwxQWRkcmVzc1R5cGU+PE5pY2tOYW1lPjwvTmlja05hbWU+PEhvbWVUZWxlcGhvbmVOdW1iZXI+PC9Ib21lVGVsZXBob25lTnVtYmVyPjxCdXNpbmVzc1RlbGVwaG9uZU51bWJlcj48L0J1c2luZXNzVGVsZXBob25lTnVtYmVyPjxNb2JpbGVUZWxlcGhvbmVOdW1iZXI+PC9Nb2JpbGVUZWxlcGhvbmVOdW1iZXI+PEJ1c2luZXNzRmF4TnVtYmVyPjwvQnVzaW5lc3NGYXhOdW1iZXI+PEpvYlRpdGxlPjwvSm9iVGl0bGU+PENvbXBhbnlOYW1lPjwvQ29tcGFueU5hbWU+PEJvZHk+PC9Cb2R5PjxMYXN0TmFtZT5zZXJ2ZXIxPC9MYXN0TmFtZT48Rmlyc3ROYW1lPjwvRmlyc3ROYW1lPjxNaWRkbGVOYW1lPjwvTWlkZGxlTmFtZT48VGl0bGU+PC9UaXRsZT48U3VmZml4PjwvU3VmZml4PjxIb21lQWRkcmVzc1N0cmVldD7DnGJlcnNpY2h0PC9Ib21lQWRkcmVzc1N0cmVldD48SG9tZUFkZHJlc3NDaXR5PjwvSG9tZUFkZHJlc3NDaXR5PjxIb21lQWRkcmVzc1N0YXRlPjwvSG9tZUFkZHJlc3NTdGF0ZT48SG9tZUFkZHJlc3NQb3N0YWxDb2RlPjwvSG9tZUFkZHJlc3NQb3N0YWxDb2RlPjxIb21lQWRkcmVzc0NvdW50cnk+PC9Ib21lQWRkcmVzc0NvdW50cnk+PEhvbWVBZGRyZXNzUG9zdE9mZmljZUJveD48L0hvbWVBZGRyZXNzUG9zdE9mZmljZUJveD48V29ya0FkZHJlc3NTdHJlZXQ+PC9Xb3JrQWRkcmVzc1N0cmVldD48V29ya0FkZHJlc3NDaXR5PjwvV29ya0FkZHJlc3NDaXR5PjxXb3JrQWRkcmVzc1N0YXRlPjwvV29ya0FkZHJlc3NTdGF0ZT48V29ya0FkZHJlc3NQb3N0YWxDb2RlPjwvV29ya0FkZHJlc3NQb3N0YWxDb2RlPjxXb3JrQWRkcmVzc0NvdW50cnk+PC9Xb3JrQWRkcmVzc0NvdW50cnk+PFdvcmtBZGRyZXNzUG9zdE9mZmljZUJveD48L1dvcmtBZGRyZXNzUG9zdE9mZmljZUJveD48L2NvbnRhY3Q+Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_13.xml0000664000175000017500000000174112700700443030212 0ustar janjan1.1SyncML/1.1264291284fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200244Mapcontactscontact2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_20.xml0000664000175000017500000000255112700700443030210 0ustar janjan1.1SyncML/1.1264301161fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertcontactscontact20026429128264301163200contactcontacts11607753381160775641310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_21.xml0000664000175000017500000000233412700700443030210 0ustar janjan1.1SyncML/1.1264301162fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccontactscontact200324Add251660424201425Replace503446282005application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_22.xml0000664000175000017500000001030412700700443030205 0ustar janjan1.1SyncML/1.1264301163fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114contactcontacts5text/x-s4j-sifc20061013233958.53s4q2q5bwso@192.168.60.3b64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGNvbnRhY3Q+PEZpbGVBcz5zZXJ2ZXIyPC9GaWxlQXM+PEVtYWlsMUFkZHJlc3M+PC9FbWFpbDFBZGRyZXNzPjxFbWFpbDFBZGRyZXNzVHlwZT5TTVRQPC9FbWFpbDFBZGRyZXNzVHlwZT48Tmlja05hbWU+PC9OaWNrTmFtZT48SG9tZVRlbGVwaG9uZU51bWJlcj48L0hvbWVUZWxlcGhvbmVOdW1iZXI+PEJ1c2luZXNzVGVsZXBob25lTnVtYmVyPjEyMzQtNTY3ODwvQnVzaW5lc3NUZWxlcGhvbmVOdW1iZXI+PE1vYmlsZVRlbGVwaG9uZU51bWJlcj48L01vYmlsZVRlbGVwaG9uZU51bWJlcj48QnVzaW5lc3NGYXhOdW1iZXI+PC9CdXNpbmVzc0ZheE51bWJlcj48Sm9iVGl0bGU+PC9Kb2JUaXRsZT48Q29tcGFueU5hbWU+PC9Db21wYW55TmFtZT48Qm9keT48L0JvZHk+PExhc3ROYW1lPnNlcnZlcjI8L0xhc3ROYW1lPjxGaXJzdE5hbWU+PC9GaXJzdE5hbWU+PE1pZGRsZU5hbWU+PC9NaWRkbGVOYW1lPjxUaXRsZT48L1RpdGxlPjxTdWZmaXg+PC9TdWZmaXg+PEhvbWVBZGRyZXNzU3RyZWV0PjwvSG9tZUFkZHJlc3NTdHJlZXQ+PEhvbWVBZGRyZXNzQ2l0eT48L0hvbWVBZGRyZXNzQ2l0eT48SG9tZUFkZHJlc3NTdGF0ZT48L0hvbWVBZGRyZXNzU3RhdGU+PEhvbWVBZGRyZXNzUG9zdGFsQ29kZT48L0hvbWVBZGRyZXNzUG9zdGFsQ29kZT48SG9tZUFkZHJlc3NDb3VudHJ5PjwvSG9tZUFkZHJlc3NDb3VudHJ5PjxIb21lQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PC9Ib21lQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PFdvcmtBZGRyZXNzU3RyZWV0PldvcmsgYWRkcmVzczwvV29ya0FkZHJlc3NTdHJlZXQ+PFdvcmtBZGRyZXNzQ2l0eT48L1dvcmtBZGRyZXNzQ2l0eT48V29ya0FkZHJlc3NTdGF0ZT48L1dvcmtBZGRyZXNzU3RhdGU+PFdvcmtBZGRyZXNzUG9zdGFsQ29kZT48L1dvcmtBZGRyZXNzUG9zdGFsQ29kZT48V29ya0FkZHJlc3NDb3VudHJ5PjwvV29ya0FkZHJlc3NDb3VudHJ5PjxXb3JrQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PC9Xb3JrQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PC9jb250YWN0Pg==6text/x-s4j-sifc83899317b64PD94bWwgdmVyc2lvbj0iMS4wIj8+PGNvbnRhY3Q+PEZpbGVBcz5DbGllbnQxczE8L0ZpbGVBcz48RW1haWwxQWRkcmVzcz5jbGllbnRAZXhhbXBsZS5jb208L0VtYWlsMUFkZHJlc3M+PEVtYWlsMUFkZHJlc3NUeXBlPlNNVFA8L0VtYWlsMUFkZHJlc3NUeXBlPjxOaWNrTmFtZT48L05pY2tOYW1lPjxIb21lVGVsZXBob25lTnVtYmVyPjwvSG9tZVRlbGVwaG9uZU51bWJlcj48QnVzaW5lc3NUZWxlcGhvbmVOdW1iZXI+NTU1LTEyMzwvQnVzaW5lc3NUZWxlcGhvbmVOdW1iZXI+PE1vYmlsZVRlbGVwaG9uZU51bWJlcj48L01vYmlsZVRlbGVwaG9uZU51bWJlcj48QnVzaW5lc3NGYXhOdW1iZXI+PC9CdXNpbmVzc0ZheE51bWJlcj48Sm9iVGl0bGU+PC9Kb2JUaXRsZT48Q29tcGFueU5hbWU+Q29tcGFueTwvQ29tcGFueU5hbWU+PEJvZHk+PC9Cb2R5PjxMYXN0TmFtZT5DbGllbnQxczE8L0xhc3ROYW1lPjxGaXJzdE5hbWU+PC9GaXJzdE5hbWU+PE1pZGRsZU5hbWU+PC9NaWRkbGVOYW1lPjxUaXRsZT48L1RpdGxlPjxTdWZmaXg+PC9TdWZmaXg+PEhvbWVBZGRyZXNzU3RyZWV0PjwvSG9tZUFkZHJlc3NTdHJlZXQ+PEhvbWVBZGRyZXNzQ2l0eT48L0hvbWVBZGRyZXNzQ2l0eT48SG9tZUFkZHJlc3NTdGF0ZT48L0hvbWVBZGRyZXNzU3RhdGU+PEhvbWVBZGRyZXNzUG9zdGFsQ29kZT48L0hvbWVBZGRyZXNzUG9zdGFsQ29kZT48SG9tZUFkZHJlc3NDb3VudHJ5PjwvSG9tZUFkZHJlc3NDb3VudHJ5PjxIb21lQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PC9Ib21lQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PFdvcmtBZGRyZXNzU3RyZWV0PjwvV29ya0FkZHJlc3NTdHJlZXQ+PFdvcmtBZGRyZXNzQ2l0eT48L1dvcmtBZGRyZXNzQ2l0eT48V29ya0FkZHJlc3NTdGF0ZT48L1dvcmtBZGRyZXNzU3RhdGU+PFdvcmtBZGRyZXNzUG9zdGFsQ29kZT48L1dvcmtBZGRyZXNzUG9zdGFsQ29kZT48V29ya0FkZHJlc3NDb3VudHJ5PjwvV29ya0FkZHJlc3NDb3VudHJ5PjxXb3JrQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PC9Xb3JrQWRkcmVzc1Bvc3RPZmZpY2VCb3g+PC9jb250YWN0Pg==Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_23.xml0000664000175000017500000000174112700700443030213 0ustar janjan1.1SyncML/1.1264301164fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200245Mapcontactscontact2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_30.xml0000664000175000017500000000255112700700443030211 0ustar janjan1.1SyncML/1.1264305241fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertcontactscontact20026430116264305243200contactcontacts11607756411160775756310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_31.xml0000664000175000017500000000172312700700443030212 0ustar janjan1.1SyncML/1.1264305242fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccontactscontact2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_32.xml0000664000175000017500000000202612700700443030210 0ustar janjan1.1SyncML/1.1264305243fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114contactcontactsHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_33.xml0000664000175000017500000000150112700700443030206 0ustar janjan1.1SyncML/1.1264305244fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE02002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_40.xml0000664000175000017500000000255112700700443030212 0ustar janjan1.1SyncML/1.1264308541fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertcontactscontact20026430524264308543200contactcontacts11607757561160775842310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_41.xml0000664000175000017500000000233612700700443030214 0ustar janjan1.1SyncML/1.1264308542fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Synccontactscontact200324Delete83899317200424Delete1510080462005application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_42.xml0000664000175000017500000000215712700700443030216 0ustar janjan1.1SyncML/1.1264308543fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114contactcontacts5251660424Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_contacts/syncml_server_43.xml0000664000175000017500000000150112700700443030207 0ustar janjan1.1SyncML/1.1264308544fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE02002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_10.xml0000664000175000017500000000133312700700443027466 0ustar janjan 1.1 SyncML/1.1 28182112 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 notes note 26433678 28182112 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_11.xml0000664000175000017500000000246012700700443027471 0ustar janjan 1.1 SyncML/1.1 28182112 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert notes note 200 1160816429 3 notes note 4 text/x-s4j-sifn Y2xpZW50MS5wd2k= b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48bm90ZT48U3ViamVjdD5jbGllbnQxPC9TdWJqZWN0PjxCb2R5PmNsaWVudDENCsOcYmVyc2ljaHQNCjwvQm9keT48RGF0ZT4yMDA2MTAxNFQwOTAwNTNaPC9EYXRlPjwvbm90ZT4= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_12.xml0000664000175000017500000000135012700700443027467 0ustar janjan 1.1 SyncML/1.1 28182112 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 notes note Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_13.xml0000664000175000017500000000227712700700443027501 0ustar janjan 1.1 SyncML/1.1 28182112 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync notes note 200 3 3 5 Add 201 20061013235622.3a6dszb96so4@192.168.60.3 4 notes note 20061013235622.3a6dszb96so4@192.168.60.3 c2VydmVyMS5wd2k= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_20.xml0000664000175000017500000000133312700700443027467 0ustar janjan 1.1 SyncML/1.1 28182466 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 notes note 28182112 28182466 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_21.xml0000664000175000017500000000334712700700443027477 0ustar janjan 1.1 SyncML/1.1 28182466 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert notes note 200 1160816525 3 notes note 4 text/x-s4j-sifn Y2xpZW50Mi5wd2k= b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48bm90ZT48U3ViamVjdD5jbGllbnQyPC9TdWJqZWN0PjxCb2R5PmNsaWVudDINClRlc3QNCjwvQm9keT48RGF0ZT4yMDA2MTAxNFQwOTAyMzBaPC9EYXRlPjwvbm90ZT4= c2VydmVyMWMxLnB3aQ== b64 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48bm90ZT48U3ViamVjdD5zZXJ2ZXIxYzE8L1N1YmplY3Q+PEJvZHk+c2VydmVyMQ0Kw5xiZXJzaWNodA0KPC9Cb2R5PjxEYXRlPjIwMDYxMDE0VDA5MDIzMFo8L0RhdGU+PC9ub3RlPg== 5 text/x-s4j-sifn c2VydmVyMS5wd2k= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_22.xml0000664000175000017500000000135012700700443027470 0ustar janjan 1.1 SyncML/1.1 28182466 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 notes note Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_23.xml0000664000175000017500000000256012700700443027475 0ustar janjan 1.1 SyncML/1.1 28182466 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync notes note 200 3 3 5 Add 201 20061014110154.6ro4zfnmes0s@trinity.wg.de 4 3 6 Replace 200 Y2xpZW50MS5wd2k= 5 notes note 20061014110154.6ro4zfnmes0s@trinity.wg.de c2VydmVyMi5wd2k= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_30.xml0000664000175000017500000000133312700700443027470 0ustar janjan 1.1 SyncML/1.1 28182518 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 notes note 28182466 28182518 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_31.xml0000664000175000017500000000166112700700443027475 0ustar janjan 1.1 SyncML/1.1 28182518 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert notes note 200 1160816553 3 notes note Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_32.xml0000664000175000017500000000135012700700443027471 0ustar janjan 1.1 SyncML/1.1 28182518 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 notes note Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_33.xml0000664000175000017500000000137212700700443027476 0ustar janjan 1.1 SyncML/1.1 28182518 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync notes note 200 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_40.xml0000664000175000017500000000133312700700443027471 0ustar janjan 1.1 SyncML/1.1 28182658 1 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 b64 syncml:auth-basic c3luY21sdGVzdDpzeW5jbWx0ZXN0 16384 1 200 notes note 28182518 28182658 Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_41.xml0000664000175000017500000000210112700700443027464 0ustar janjan 1.1 SyncML/1.1 28182658 2 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 1 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 1 3 Alert notes note 200 1160816582 3 notes note 4 text/x-s4j-sifn c2VydmVyMi5wd2k= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_42.xml0000664000175000017500000000135012700700443027472 0ustar janjan 1.1 SyncML/1.1 28182658 3 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 2 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 222 notes note Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_client_43.xml0000664000175000017500000000165012700700443027476 0ustar janjan 1.1 SyncML/1.1 28182658 4 http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 16384 1 3 0 SyncHdr http://192.168.60.3/headhorde/rpc.php fwm-0E232B741AFE0 200 2 3 4 Sync notes note 200 3 3 5 Delete 200 Y2xpZW50Mi5wd2k= Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_10.xml0000664000175000017500000000252412700700443027521 0ustar janjan1.1SyncML/1.1281821121fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertnotesnote50826433678281821123201notenotes01160816429310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_11.xml0000664000175000017500000000213312700700443027516 0ustar janjan1.1SyncML/1.1281821122fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Syncnotesnote200324ReplaceY2xpZW50MS5wd2k=2014application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_12.xml0000664000175000017500000000276512700700443027532 0ustar janjan1.1SyncML/1.1281821123fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114notenotes5text/x-s4j-sifn20061013235622.3a6dszb96so4@192.168.60.3b64PG5vdGU+PEJvZHk+c2VydmVyMQ0Kw5xiZXJzaWNodDwvQm9keT48Q2F0ZWdvcmllcz5NeSBDYXRlZ29yeTwvQ2F0ZWdvcmllcz48U3ViamVjdD5zZXJ2ZXIxPC9TdWJqZWN0PjxDb2xvcj48L0NvbG9yPjxIZWlnaHQ+PC9IZWlnaHQ+PFdpZHRoPjwvV2lkdGg+PExlZnQ+PC9MZWZ0PjxUb3A+PC9Ub3A+PC9ub3RlPg==Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_13.xml0000664000175000017500000000173312700700443027525 0ustar janjan1.1SyncML/1.1281821124fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200244Mapnotesnote2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_20.xml0000664000175000017500000000253512700700443027524 0ustar janjan1.1SyncML/1.1281824661fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertnotesnote20028182112281824663200notenotes11608164291160816525310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_21.xml0000664000175000017500000000256212700700443027525 0ustar janjan1.1SyncML/1.1281824662fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Syncnotesnote200324AddY2xpZW50Mi5wd2k=201424Addc2VydmVyMWMxLnB3aQ==201525Deletec2VydmVyMS5wd2k=2006application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_22.xml0000664000175000017500000000355712700700443027533 0ustar janjan1.1SyncML/1.1281824663fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114notenotes5text/x-s4j-sifn20061014110154.6ro4zfnmes0s@trinity.wg.deb64PG5vdGU+PEJvZHk+c2VydmVyMg0KU2VydmVyIFRlc3Q8L0JvZHk+PFN1YmplY3Q+c2VydmVyMjwvU3ViamVjdD48Q29sb3I+PC9Db2xvcj48SGVpZ2h0PjwvSGVpZ2h0PjxXaWR0aD48L1dpZHRoPjxMZWZ0PjwvTGVmdD48VG9wPjwvVG9wPjwvbm90ZT4=6text/x-s4j-sifnY2xpZW50MS5wd2k=b64PG5vdGU+PEJvZHk+Y2xpZW50MXMxDQrDnGJlcnNpY2h0PC9Cb2R5PjxTdWJqZWN0PmNsaWVudDFzMTwvU3ViamVjdD48Q29sb3I+PC9Db2xvcj48SGVpZ2h0PjwvSGVpZ2h0PjxXaWR0aD48L1dpZHRoPjxMZWZ0PjwvTGVmdD48VG9wPjwvVG9wPjwvbm90ZT4=Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_23.xml0000664000175000017500000000173312700700443027526 0ustar janjan1.1SyncML/1.1281824664fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200245Mapnotesnote2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_30.xml0000664000175000017500000000253512700700443027525 0ustar janjan1.1SyncML/1.1281825181fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertnotesnote20028182466281825183200notenotes11608165251160816553310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_31.xml0000664000175000017500000000171512700700443027525 0ustar janjan1.1SyncML/1.1281825182fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Syncnotesnote2003application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_32.xml0000664000175000017500000000202012700700443027514 0ustar janjan1.1SyncML/1.1281825183fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114notenotesHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_33.xml0000664000175000017500000000150112700700443027520 0ustar janjan1.1SyncML/1.1281825184fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE02002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_40.xml0000664000175000017500000000253512700700443027526 0ustar janjan1.1SyncML/1.1281826581fwm-0E232B741AFE0http://192.168.60.3/headhorde/rpc.php100000031000110SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0212211Alertnotesnote20028182518281826583200notenotes11608165531160816582310004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_41.xml0000664000175000017500000000213212700700443027520 0ustar janjan1.1SyncML/1.1281826582fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000120SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200223Syncnotesnote200324Deletec2VydmVyMi5wd2k=2004application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_42.xml0000664000175000017500000000216012700700443027522 0ustar janjan1.1SyncML/1.1281826583fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000130SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE0200232Alert2003application/vnd.syncml-devinf+xml./devinf114notenotes5Y2xpZW50Mi5wd2k=Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_sync4j_pocketpc_notes/syncml_server_43.xml0000664000175000017500000000150112700700443027521 0ustar janjan1.1SyncML/1.1281826584fwm-0E232B741AFE0syncmltesthttp://192.168.60.3/headhorde/rpc.php100000031000140SyncHdrhttp://192.168.60.3/headhorde/rpc.phpfwm-0E232B741AFE02002application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_10.xml0000664000175000017500000000516212700700443026416 0ustar janjan1.1SyncML/1.1101http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltestb64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN010000640001application/vnd.syncml-devinf+xml./devinf111.1Synthesis AGSySync Client PalmOS STDSynthesis AGv. 5.4.0.232.5.0.460SERIALNUMBERpda./tasks64text/x-vcalendar1.0text/x-vcalendar1.0123456text/x-vcalendarBEGINVCALENDARVEVENTVTODOENDVCALENDARVEVENTVTODOVERSION1.0SUMMARYCATEGORIESCLASSDESCRIPTIONDTSTARTDTENDRRULEEXDATEAALARMDALARMDUEPRIORITYSTATUS2application/vnd.syncml-devinf+xml./devinf113201tasks./tasks20060722T215039ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_11.xml0000664000175000017500000000307112700700443026414 0ustar janjan1.1SyncML/1.1102http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000110SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200214Results./devinf11200316Alert./taskstasks20011535690584tasks./tasks5text/x-vcalendar1798145Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_12.xml0000664000175000017500000000250712700700443026420 0ustar janjan1.1SyncML/1.1103http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000120SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200223Sync./taskstasks200324Add20060722134917.76iotty9niww@voltaire.local2015tasks./tasks20060722134917.76iotty9niww@voltaire.local1798146Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_20.xml0000664000175000017500000000221612700700443026414 0ustar janjan1.1SyncML/1.1151http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltestb64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN010000640001application/vnd.syncml-devinf+xml./devinf112200tasks./tasks20060722T215039Z20060722T215204ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_21.xml0000664000175000017500000000704712700700443026424 0ustar janjan1.1SyncML/1.1152http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000110SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200213Results./devinf11200315Alert./taskstasks2001153569142416Get./devinf11200516application/vnd.syncml-devinf+xml./devinf111.1Synthesis AGSySync Client PalmOS STDSynthesis AGv. 5.4.0.232.5.0.460SERIALNUMBERpda./tasks64text/x-vcalendar1.0text/x-vcalendar1.0123456text/x-vcalendarBEGINVCALENDARVEVENTVTODOENDVCALENDARVEVENTVTODOVERSION1.0SUMMARYCATEGORIESCLASSDESCRIPTIONDTSTARTDTENDRRULEEXDATEAALARMDALARMDUEPRIORITYSTATUS6tasks./tasks7text/x-vcalendar17981468text/x-vcalendar1798147Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_22.xml0000664000175000017500000000271412700700443026421 0ustar janjan1.1SyncML/1.1153http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000120SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200225Sync./taskstasks200326Add20060722135201.11hupchy2s80@voltaire.local201427Replace17981452006tasks./tasks20060722135201.11hupchy2s80@voltaire.local1798148Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_30.xml0000664000175000017500000000221612700700443026415 0ustar janjan1.1SyncML/1.1201http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltestb64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN010000640001application/vnd.syncml-devinf+xml./devinf112200tasks./tasks20060722T215204Z20060722T215217ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_31.xml0000664000175000017500000000565712700700443026432 0ustar janjan1.1SyncML/1.1202http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000110SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200213Results./devinf11200315Alert./taskstasks2001153569155416Get./devinf11200516application/vnd.syncml-devinf+xml./devinf111.1Synthesis AGSySync Client PalmOS STDSynthesis AGv. 5.4.0.232.5.0.460SERIALNUMBERpda./tasks64text/x-vcalendar1.0text/x-vcalendar1.0123456text/x-vcalendarBEGINVCALENDARVEVENTVTODOENDVCALENDARVEVENTVTODOVERSION1.0SUMMARYCATEGORIESCLASSDESCRIPTIONDTSTARTDTENDRRULEEXDATEAALARMDALARMDUEPRIORITYSTATUS6tasks./tasksHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_32.xml0000664000175000017500000000166012700700443026421 0ustar janjan1.1SyncML/1.1203http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000120SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200223Sync./taskstasks200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_40.xml0000664000175000017500000000221612700700443026416 0ustar janjan1.1SyncML/1.1251http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltestb64syncml:auth-basicc3luY21sdGVzdDpzeW5jbWx0ZXN010000640001application/vnd.syncml-devinf+xml./devinf112200tasks./tasks20060722T215217Z20060722T215457ZHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_41.xml0000664000175000017500000000610612700700443026421 0ustar janjan1.1SyncML/1.1252http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000110SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200213Results./devinf11200315Alert./taskstasks2001153569316416Get./devinf11200516application/vnd.syncml-devinf+xml./devinf111.1Synthesis AGSySync Client PalmOS STDSynthesis AGv. 5.4.0.232.5.0.460SERIALNUMBERpda./tasks64text/x-vcalendar1.0text/x-vcalendar1.0123456text/x-vcalendarBEGINVCALENDARVEVENTVTODOENDVCALENDARVEVENTVTODOVERSION1.0SUMMARYCATEGORIESCLASSDESCRIPTIONDTSTARTDTENDRRULEEXDATEAALARMDALARMDUEPRIORITYSTATUS6tasks./tasks7text/x-vcalendar1798148Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_client_42.xml0000664000175000017500000000206412700700443026421 0ustar janjan1.1SyncML/1.1253http://voltaire.local/horde/rpc.phpSERIALNUMBERsyncmltest1000064000120SyncHdrSERIALNUMBERhttp://voltaire.local/horde/rpc.php200224Sync./taskstasks200325Delete1798147200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_10.xml0000664000175000017500000000742712700700443026454 0ustar janjan1.1SyncML/1.1101SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER212211Put./devinf11200312Get./devinf11200412application/vnd.syncml-devinf+xml./devinf111.1The Horde Project (http://www.horde.org/)voltaire.localservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456513Alerttasks./tasks20020060722T215039Z6201./taskstasks0115356905831000Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_11.xml0000664000175000017500000000316412700700443026447 0ustar janjan1.1SyncML/1.1102SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200224Synctasks./tasks200325Replace17981452014./taskstasks15text/x-vcalendar20060722134917.76iotty9niww@voltaire.localHorde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_12.xml0000664000175000017500000000166112700700443026450 0ustar janjan1.1SyncML/1.1103SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200235Maptasks./tasks200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_20.xml0000664000175000017500000000753612700700443026456 0ustar janjan1.1SyncML/1.1151SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER212211Get./devinf11200311application/vnd.syncml-devinf+xml./devinf111.1The Horde Project (http://www.horde.org/)voltaire.localservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456412Alerttasks./tasks20020060722T215039Z20060722T215204Z5200./taskstasks11535690581153569142310006application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_21.xml0000664000175000017500000000454012700700443026447 0ustar janjan1.1SyncML/1.1152SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200225Results./devinf11200326Synctasks./tasks200427Replace1798146200528Replace17981472016./taskstasks27text/x-vcalendar20060722135201.11hupchy2s80@voltaire.local8text/x-vcalendar1798145Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_22.xml0000664000175000017500000000166112700700443026451 0ustar janjan1.1SyncML/1.1153SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200236Maptasks./tasks200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_30.xml0000664000175000017500000000753612700700443026457 0ustar janjan1.1SyncML/1.1201SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER212211Get./devinf11200311application/vnd.syncml-devinf+xml./devinf111.1The Horde Project (http://www.horde.org/)voltaire.localservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456412Alerttasks./tasks20020060722T215204Z20060722T215217Z5200./taskstasks11535691421153569155310006application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_31.xml0000664000175000017500000000231312700700443026444 0ustar janjan1.1SyncML/1.1202SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200225Results./devinf11200326Synctasks./tasks2004./taskstasks0Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_32.xml0000664000175000017500000000142412700700443026447 0ustar janjan1.1SyncML/1.1203SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_40.xml0000664000175000017500000000753612700700443026460 0ustar janjan1.1SyncML/1.1251SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000110SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER212211Get./devinf11200311application/vnd.syncml-devinf+xml./devinf111.1The Horde Project (http://www.horde.org/)voltaire.localservernotestext/x-vnote1.1text/plain1.0text/x-vnote1.1text/plain1.0123456contactstext/x-vcard3.0text/x-vcard2.1text/x-vcard3.0text/x-vcard2.1123456taskstext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456calendartext/calendar2.0text/x-vcalendar1.0text/calendar2.0text/x-vcalendar1.0123456412Alerttasks./tasks20020060722T215217Z20060722T215457Z5200./taskstasks11535691551153569316310006application/vnd.syncml-devinf+xml./devinf11Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_41.xml0000664000175000017500000000264612700700443026456 0ustar janjan1.1SyncML/1.1252SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000120SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200225Results./devinf11200326Synctasks./tasks200427Delete17981482005./taskstasks161798147Horde_SyncMl-2.0.7/test/Horde/SyncMl/testcase_synthesis_tasks/syncml_server_42.xml0000664000175000017500000000142412700700443026450 0ustar janjan1.1SyncML/1.1253SERIALNUMBERsyncmltesthttp://voltaire.local/horde/rpc.php100000031000130SyncHdrhttp://voltaire.local/horde/rpc.phpSERIALNUMBER200Horde_SyncMl-2.0.7/test/Horde/SyncMl/sif.phpt0000664000175000017500000001452612700700443017062 0ustar janjan--TEST-- SIF tests. --FILE-- vevent2sif($data); echo "\n\n"; $data = <<vevent2sif($data); echo "\n\n"; $data = <<vevent2sif($data); echo "\n\n"; $data = << 2008-10-18 Comments More comments And just a couple more Golden Hills Australia 4009 Qld Company Unit 2, 123 St Freds Tce +61 712341234 Company test@domain.com SMTP user@seconddomain.com SMTP Lastname, Firstname Firstname DEFAULT_FOLDER 0 1 F.L. Lastname Company Unit 2, 123 St Freds Tce Golden Hills Qld 4009 Australia +61 123123123 0 Firstname Lastname <WebPage/> <YomiCompanyName/> <YomiFirstName/> <YomiLastName/> </contact> CONTACT; echo $device->sif2vcard($data); ?> --EXPECT-- <?xml version="1.0"?><appointment><ReminderSet>1</ReminderSet><IsRecurring>0</IsRecurring><BusyStatus>2</BusyStatus><AllDayEvent>0</AllDayEvent><Start>20080630T110000Z</Start><End>20080630T120000Z</End><Subject>Server02</Subject><Sensitivity>0</Sensitivity><ReminderMinutesBeforeStart>15</ReminderMinutesBeforeStart><Duration>60</Duration></appointment> <?xml version="1.0"?><appointment><ReminderSet>1</ReminderSet><IsRecurring>0</IsRecurring><BusyStatus>2</BusyStatus><AllDayEvent>1</AllDayEvent><Start>2008-06-30</Start><End>2008-06-30</End><Subject>Server02</Subject><Sensitivity>0</Sensitivity><ReminderMinutesBeforeStart>15</ReminderMinutesBeforeStart></appointment> <?xml version="1.0"?><appointment><ReminderSet>1</ReminderSet><IsRecurring>1</IsRecurring><BusyStatus>2</BusyStatus><AllDayEvent>0</AllDayEvent><Start>20101101T090000Z</Start><End>20101101T100000Z</End><Subject>Cinco-Lunes</Subject><Categories>Trabajo</Categories><Location>Korta</Location><Sensitivity>0</Sensitivity><Interval>1</Interval><RecurrenceType>1</RecurrenceType><DayOfWeekMask>2</DayOfWeekMask><NoEndDate>0</NoEndDate><PatternEndDate>20101130T225959Z</PatternEndDate><ReminderMinutesBeforeStart>15</ReminderMinutesBeforeStart><Duration>60</Duration></appointment> BEGIN:VCARD VERSION:3.0 FN:Lastname\, Firstname TEL;TYPE=WORK:+61 712341234 TEL;TYPE=CELL:+61 123123123 EMAIL:test@domain.com EMAIL;TYPE=HOME:user@seconddomain.com NOTE:Comments\nMore comments\nAnd just a couple more BDAY:2008-10-18 N:Lastname;Firstname;;; ADR;TYPE=WORK:;;Company\nUnit 2\, 123 St Freds Tce;Golden Hills;Qld;4009;Australia ORG:Company END:VCARD ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������Horde_SyncMl-2.0.7/test/Horde/SyncMl/testpacket.php�������������������������������������������������0000775�0001750�0001750�00000004540�12700700443�020262 �0����������������������������������������������������������������������������������������������������ustar �jan�����������������������������jan��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env php <?php /** * Script to test individual SyncML messages. * * The scripts takes a single client message, either XML or WBXML encoded, and * tries to parse it and generate a response message. It doesn't talk to any * backend, so it's not able to test the actualy command being sent in the * message. Its purpose is to make sure that SyncML messages are correctly and * completely parsed and distributed into the business logic. * * Copyright 2009-2016 Horde LLC (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @author Jan Schneider <jan@horde.org> * @package SyncMl */ require_once 'Horde/Autoloader/Default.php'; class Backend extends Horde_SyncMl_Backend { protected $_logLevel = 'DEBUG'; public function logMessage($message, $priority = 'INFO') { parent::logMessage($message, $priority); echo $this->_logtext; $this->_logtext = ''; } public function logFile() { } protected function _checkAuthentication($username) { return strlen($username) ? $username : true; } public function setupState() { $this->state->user = 'dummyUser'; $this->state->authenticated = true; } public function addEntry($databaseURI, $content, $contentType, $cuid) { echo "Adding $cuid of $contentType to $databaseURI:\n$content\n"; } public function replaceEntry($databaseURI, $content, $contentType, $cuid) { echo "Replacing $cuid of $contentType in $databaseURI:\n$content\n"; } public function deleteEntry($databaseURI, $cuid) { echo "Deleting $cuid from $databaseURI\n"; } } if (!isset($argc)) { die("argv/argc has to be enabled.\n"); } if ($argc != 2) { die('Usage: ' . basename($argv[0]) . " syncml_client_nn.[wb]xml\n"); } $backend = new Backend(array()); $sync = new Horde_SyncMl_ContentHandler(); $sync->debug = true; $sync->process(file_get_contents($argv[1]), strpos($argv[1], '.wbxml') ? 'application/vnd.syncml+wbxml' : 'application/vnd.syncml'); $output = $sync->getOutput(); if (function_exists('tidy_repair_string')) { $output = tidy_repair_string($output, array('indent' => true, 'input-xml' => true, 'output-xml' => true)); } echo $output, "\n"; @session_destroy(); ����������������������������������������������������������������������������������������������������������������������������������������������������������������Horde_SyncMl-2.0.7/test/Horde/SyncMl/testsync.php���������������������������������������������������0000775�0001750�0001750�00000052042�12700700443�017767 �0����������������������������������������������������������������������������������������������������ustar �jan�����������������������������jan��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/env php <?php /** * Script to test the SyncML implementation. * * Takes a pre-recorded testcase, stuffs the data into the SyncML server, and * then compares the output to see if it matches. * * See http://wiki.horde.org/SyncHowTo for a description how to create a test * case. * * Copyright 2006-2016 Horde LLC (http://www.horde.org/) * * See the enclosed file COPYING for license information (LGPL). If you * did not receive this file, see http://www.horde.org/licenses/lgpl21. * * @author Karsten Fourmont <karsten@horde.org> * @package SyncML */ /* Current limitations: * * - $service is set globally, so syncing multiple databases at once is not * dealt with: should be fixed easily by retrieving service using some * regular expression magic. * * - Limited to 3 messages per session style. This is more serious. * * - Currently the test case has to start with a slowsync. Maybe we can remove * this restriction and thus allow test cases with "production phones". * An idea to deal with this: make testsync.php work with *any* recorded * sessions: * - change any incoming auth to syncmltest:syncmltest * - identify twowaysync and create fake anchors for that */ require_once 'SyncML.php'; define('SYNCMLTEST_USERNAME', 'syncmltest'); // Setup default backend parameters: $syncml_backend_driver = 'Horde'; $syncml_backend_parms = array( /* debug output to this dir, must be writeable be web server: */ 'debug_dir' => Horde::getTempDir().'/sync', /* log all (wb)xml packets received or sent to debug_dir: */ 'debug_files' => true, /* Log everything: */ 'log_level' => 'DEBUG'); /* Get any options. */ if (!isset($argv)) { print_usage(); } /* Get rid of the first arg which is the script name. */ $this_script = array_shift($argv); while ($arg = array_shift($argv)) { if ($arg == '--help') { print_usage(); } elseif (strstr($arg, '--setup')) { $testsetuponly = true; } elseif (strstr($arg, '--url')) { list(, $url) = explode('=', $arg); } elseif (strstr($arg, '--dir')) { list(, $dir) = explode('=', $arg); } elseif (strstr($arg, '--dsn')) { list(, $dsn) = explode('=', $arg); $syncml_backend_parms['dsn'] = $dsn; $syncml_backend_driver = 'Sql'; } elseif (strstr($arg, '--debug')) { if (strstr($arg, '=') !== false) { list(, $debuglevel) = explode('=', $arg); } else { $debuglevel = 5; } } else { print_usage("Unrecognised option $arg"); } } require_once 'Log.php'; require_once 'SyncML/Device.php'; require_once 'SyncML/Device/Sync4j.php'; require_once 'SyncML/Backend.php'; /* Do Horde includes if test for horde backend: */ if ($syncml_backend_driver == 'Horde') { require_once __DIR__ . '/../../../lib/Application.php'; Horde_Registry::appInit('horde', array('cli' => true, 'session_control' => 'none')); } if (!empty($testsetuponly)) { $testbackend = Horde_SyncMl_Backend::factory($syncml_backend_driver, $syncml_backend_parms); $testbackend->testSetup(SYNCMLTEST_USERNAME, 'syncmltest'); echo "Test setup for user syncmltest done. Now you can start to record a test case.\n"; exit(0); } /* Set this to true to skip cleanup after tests. */ $skipcleanup = false; /* mapping from LocUris to UIDs. Currently unused */ $mapping_locuri2uid = array(); /* The actual testing takes place her: */ if (!empty($dir)) { test($dir); } else { $d = dir('./'); while (false !== ($entry = $d->read())) { if (preg_match('/^testcase_/', $entry) && is_dir($d->path . $entry)) { test($d->path . $entry); } } $d->close(); } /** * Retrieves the reference data for one packet. */ function getServer($name, $number) { if (!file_exists($name . '/syncml_server_' . $number . '.xml')) { return false; } return file_get_contents($name . '/syncml_server_' . $number . '.xml'); } /** * Retrieves the client data to be sent to the server */ function getClient($name, $number) { if (!file_exists($name . '/syncml_client_' . $number . '.xml')) { return false; } return file_get_contents($name . '/syncml_client_' . $number . '.xml'); } /** * Compares $r and $ref. * * Exits if any nontrivial differences are found. */ function check($name, $r, $ref, $packetnum = 'unknown') { $r = trim(decodebase64data($r)); $ref = trim(decodebase64data($ref)); /* various tweaking: */ // case issues: $search = array( '| xmlns="syncml:SYNCML1.1"|i', '|<DevID>.*?</DevID>|i', '|<\?xml[^>]*>|i', '|<!DOCTYPE[^>]*>|i', /* Ignore timestamps used by various devices. */ '/(\r\n|\r|\n)DCREATED.*?(\r\n|\r|\n)/', '/(\r\n|\r|\n)LAST-MODIFIED.*?(\r\n|\r|\n)/', '/(\r\n|\r|\n)DTSTAMP.*?(\r\n|\r|\n)/', '/(\r\n|\r|\n)X-WR-CALNAME.*?(\r\n|\r|\n)/', /* Issues with priority, ignore for now. */ '/(\r\n|\r|\n)PRIORITY.*?(\r\n|\r|\n)/', '|<Data>\s*(.*?)\s*</Data>|s', '/\r/', '/\n/'); $replace = array( ' xmlns="syncml:SYNCML1.1"', '<DevID>IGNORED</DevID>', '', '', /* Ignore timestamps used by various devices. */ '$1', '$1', '$1', '$1', /* Issues with priority, ignore for now. */ '$1PRIORITY: IGNORED$2', '<Data>$1</Data>', '\r', '\n'); $r = preg_replace($search, $replace, $r); $ref = preg_replace($search, $replace, $ref); if (strcasecmp($r, $ref) !== 0) { echo "Error in test case $name packet $packetnum\nReference:\n$ref\nResult:\n$r\n"; for($i = 0; $r[$i] == $ref[$i] && $i <= strlen($r); ++$i) { // Noop. } echo "at position $i\n"; echo '"' . substr($ref, $i, 10) . '" vs. "' . substr($r, $i, 10) . "\"\n"; exit(1); } } /** * Simulates a call to the SyncML server by sending data to the server. * Returns the result received from the server. */ function getResponse($data) { if (!empty($GLOBALS['url'])) { /* Call externally using curl. */ $tmpfile = tempnam('tmp','syncmltest'); $fh = fopen($tmpfile, 'w'); fwrite($fh, $data); fclose($fh); $output = shell_exec(sprintf('curl -s -H "Content-Type: application/vnd.syncml+xml" --data-binary @%s "%s"', $tmpfile, $GLOBALS['url'])); unlink($tmpfile); return $output; } /* Create and setup the test backend */ $GLOBALS['backend'] = Horde_SyncMl_Backend::factory( $GLOBALS['syncml_backend_driver'], $GLOBALS['syncml_backend_parms']); $h = new Horde_SyncMl_ContentHandler(); $response = $h->process($data, 'application/vnd.syncml+xml'); $GLOBALS['backend']->close(); return $response; } function getUIDs($data) { // <LocURI>20060130082509.4nz5ng6sm9wk@127.0.0.1</LocURI> if (!preg_match('|<Sync>.*</Sync>|s', $data, $m)) { return array(); } $data = $m[0]; // echo $data; $count = preg_match_all('|(?<=<LocURI>)\d+[^<]*@[^<]*(?=</LocURI>)|is', $data, $m); // if(count($m[0])>0) { var_dump($m[0]); } return $m[0]; } /* Decode sync4j base64 decoded data for readable debug outout. */ function decodebase64data($s) { return preg_replace_callback('|(?<=<Data>)[0-9a-zA-Z\+\/=]{6,}(?=</Data>)|i', create_function('$matches','return base64_decode($matches[0]);'), $s); } function convertAnchors(&$ref,$r, $anchor = '') { if ($anchor) { $count = preg_match_all('|<Last>(\d+)</Last>|i', $ref, $m); if ($count > 0 ) { $temp = $m[1][$count-1]; } $ref = str_replace("<Last>$temp</Last>", "<Last>$anchor</Last>" , $ref); } $count = preg_match_all('|<Next>(\d+)</Next>|i', $r, $m); if ($count > 0 ) { $anchor = $m[1][$count-1]; $count = preg_match_all('|<Next>(\d+)</Next>|i', $ref, $m); if ($count > 0 ) { $temp = $m[1][$count-1]; $ref = str_replace("<Next>$temp</Next>", "<Next>$anchor</Next>" , $ref); } } else { $anchor = ''; } return $anchor; } /** * Tests one sync session. * * Returns true on successful test and false on no (more) test data available * for this $startnumber. Exits if test fails. */ function testSession($name, $startnumber, &$anchor) { global $debuglevel; $uids = $refuids = array(); $number = $startnumber; while ($ref = getServer($name, $number)) { if ($debuglevel >= 2) { } testPre($name, $number); $number++; } $number = $startnumber; while ($ref = getServer($name, $number)) { if ($debuglevel >= 2) { echo "handling packet $number\n"; } $c = str_replace($refuids, $uids, getClient($name, $number)); $resp = getResponse($c); /* Set anchor from prev sync as last anchor: */ /* @TODO: this assumes startnumber in first packet */ if ($number == $startnumber) { $anchor = convertAnchors($ref, $resp, $anchor); } $resp = sortChanges($resp); $ref = sortChanges($ref); $tuids = getUIDs($resp); $trefuids = getUIDs($ref); $uids = array_merge($uids, $tuids); $refuids = array_merge($refuids, $trefuids); $ref = str_replace($refuids, $uids, $ref); parse_map($c); check($name, $resp, $ref, $number); $number++; } if ($number == $startnumber) { // No packet found at all, end of test. return false; } return true; } /** * Parses and stores the map info sent by the client. */ function parse_map($content) { /* Example: <MapItem> <Target><LocURI>20060610121904.4svcwdpc5lkw@voltaire.local</LocURI></Target> <Source><LocURI>000000004FCBE97B738E984EAF085560B1DD2D50A4412000</LocURI></Source> </MapItem> */ global $mapping_locuri2uid; if (preg_match_all('|<MapItem>\s*<Target>\s*<LocURI>(.*?)</LocURI>.*?<Source>\s*<LocURI>(.*?)</LocURI>.*?</MapItem>|si', $content, $m, PREG_SET_ORDER)) { foreach ($m as $c) { $mapping_locuri2uid[$c[2]] = $c[1]; // store UID used by server } } } /** * When a test case contains adds/modifies/deletes being sent to the server, * these changes must be extracted from the test data and manually performed * using the api to achieve the desired behaviour by the server * * @throws Horde_Exception */ function testPre($name, $number) { global $debuglevel; $ref0 = getClient($name, $number); // Extract database (in horde: service). if (preg_match('|<Alert>.*?<Target>\s*<LocURI>([^>]*)</LocURI>.*?</Alert>|si', $ref0, $m)) { $GLOBALS['service'] = $m[1]; } if (!preg_match('|<SyncHdr>.*?<Source>\s*<LocURI>(.*?)</LocURI>.*?</SyncHdr>|si', $ref0, $m)) { echo $ref0; throw new Horde_Exception('Unable to find device id'); } $device_id = $m[1]; // Start backend session if not already done. if ($GLOBALS['testbackend']->getSyncDeviceID() != $device_id) { $GLOBALS['testbackend']->sessionStart($device_id, null, Horde_SyncMl_Backend::MODE_TEST); } // This makes a login even when a logout has occured when the session got // deleted. $GLOBALS['testbackend']->setUser(SYNCMLTEST_USERNAME); $ref1 = getServer($name, $number + 1); if (!$ref1) { return; } $ref1 = str_replace(array('<![CDATA[', ']]>', '<?xml version="1.0"?><!DOCTYPE SyncML PUBLIC "-//SYNCML//DTD SyncML 1.1//EN" "http://www.syncml.org/docs/syncml_represent_v11_20020213.dtd">'), '', $ref1); // Check for Adds. if (preg_match_all('|<Add>.*?<type[^>]*>(.*?)</type>.*?<LocURI[^>]*>(.*?)</LocURI>.*?<data[^>]*>(.*?)</data>.*?</Add|si', $ref1, $m, PREG_SET_ORDER)) { foreach ($m as $c) { list(, $contentType, $locuri, $data) = $c; // Some Sync4j tweaking. switch (Horde_String::lower($contentType)) { case 'text/x-s4j-sifn' : $data = Horde_SyncMl_Device_sync4j::sif2vnote(base64_decode($data)); $contentType = 'text/x-vnote'; $service = 'notes'; break; case 'text/x-s4j-sifc' : $data = Horde_SyncMl_Device_sync4j::sif2vcard(base64_decode($data)); $contentType = 'text/x-vcard'; $service = 'contacts'; break; case 'text/x-s4j-sife' : $data = Horde_SyncMl_Device_sync4j::sif2vevent(base64_decode($data)); $contentType = 'text/calendar'; $service = 'calendar'; break; case 'text/x-s4j-sift' : $data = Horde_SyncMl_Device_sync4j::sif2vtodo(base64_decode($data)); $contentType = 'text/calendar'; $service = 'tasks'; break; case 'text/x-vcalendar': case 'text/calendar': if (preg_match('/(\r\n|\r|\n)BEGIN:\s*VTODO/', $data)) { $service = 'tasks'; } else { $service = 'calendar'; } break; default: throw new Horde_Exception("Unable to find service for contentType=$contentType"); } $result = $GLOBALS['testbackend']->addEntry($service, $data, $contentType); if (is_a($result, 'PEAR_Error')) { echo "error importing data into $service:\n$data\n"; throw new Horde_Exception_Wrapped($result); } if ($debuglevel >= 2) { echo "simulated $service add of $result as $locuri!\n"; echo ' at ' . date('Y-m-d H:i:s') . "\n"; if ($debuglevel >= 10) { echo "data: $data\nsuid=$result\n"; } } // Store UID used by server. $GLOBALS['mapping_locuri2uid'][$locuri] = $result; } } // Check for Replaces. if (preg_match_all('|<Replace>.*?<type[^>]*>(.*?)</type>.*?<LocURI[^>]*>(.*?)</LocURI>.*?<data[^>]*>(.*?)</data>.*?</Replace|si', $ref1, $m, PREG_SET_ORDER)) { foreach ($m as $c) { list(, $contentType, $locuri, $data) = $c; // Some Sync4j tweaking. switch (Horde_String::lower($contentType)) { case 'sif/note' : case 'text/x-s4j-sifn' : $data = Horde_SyncMl_Device_sync4j::sif2vnote(base64_decode($data)); $contentType = 'text/x-vnote'; $service = 'notes'; break; case 'sif/contact' : case 'text/x-s4j-sifc' : $data = Horde_SyncMl_Device_sync4j::sif2vcard(base64_decode($data)); $contentType = 'text/x-vcard'; $service = 'contacts'; break; case 'sif/calendar' : case 'text/x-s4j-sife' : $data = Horde_SyncMl_Device_sync4j::sif2vevent(base64_decode($data)); $contentType = 'text/calendar'; $service = 'calendar'; break; case 'sif/task' : case 'text/x-s4j-sift' : $data = Horde_SyncMl_Device_sync4j::sif2vtodo(base64_decode($data)); $contentType = 'text/calendar'; $service = 'tasks'; break; case 'text/x-vcalendar': case 'text/calendar': if (preg_match('/(\r\n|\r|\n)BEGIN:\s*VTODO/', $data)) { $service = 'tasks'; } else { $service = 'calendar'; } break; default: throw new Horde_Exception("Unable to find service for contentType=$contentType"); } /* Get SUID. */ $suid = $GLOBALS['testbackend']->getSuid($service, $locuri); if (empty($suid)) { throw new Horde_Exception("Unable to find SUID for CUID $locuri for simulating replace"); } $result = $GLOBALS['testbackend']->replaceEntry($service, $data, $contentType, $suid); if (is_a($result, 'PEAR_Error')) { echo "Error replacing data $locuri suid=$suid!\n"; throw new Horde_Exception_Wrapped($result); } if ($debuglevel >= 2) { echo "simulated $service replace of $locuri suid=$suid!\n"; if ($debuglevel >= 10) { echo "data: $data\nnew id=$result\n"; } } } } // Check for Deletes. // <Delete><CmdID>5</CmdID><Item><Target><LocURI>1798147</LocURI></Target></Item></Delete> if (preg_match_all('|<Delete>.*?<Target>\s*<LocURI>(.*?)</LocURI>|si', $ref1, $m, PREG_SET_ORDER)) { foreach ($m as $d) { list(, $locuri) = $d; /* Get SUID. */ $service = $GLOBALS['service']; $suid = $GLOBALS['testbackend']->getSuid($service, $locuri); if (empty($suid)) { // Maybe we have a handletaskincalendar. if ($service == 'calendar') { if ($debuglevel >= 2) { echo "special tasks delete...\n"; } $service = 'tasks'; $suid = $GLOBALS['testbackend']->getSuid($service, $locuri); } } if (empty($suid)) { throw new Horde_Exception("Unable to find SUID for CUID $locuri for simulating $service delete"); } $result = $GLOBALS['testbackend']->deleteEntry($service, $suid); // @TODO: simulate a delete by just faking some history data. if (is_a($result, 'PEAR_Error')) { echo "Error deleting data $locuri!"; throw new Horde_Exception_Wrapped($result); } if ($debuglevel >= 2) { echo "simulated $service delete of $suid!\n"; } } } } /** * Executes one test case. * * A test cases consists of various pre-recorded .xml packets in directory * $name. */ function test($name) { system($GLOBALS['this_script'] . ' --setup'); $GLOBALS['testbackend'] = Horde_SyncMl_Backend::factory( $GLOBALS['syncml_backend_driver'], $GLOBALS['syncml_backend_parms']); $GLOBALS['testbackend']->testStart(SYNCMLTEST_USERNAME, 'syncmltest'); $packetNum = 10; $anchor = ''; while (testsession($name, $packetNum, $anchor) === true) { $packetNum += 10; } /* Cleanup */ if (!$GLOBALS['skipcleanup']) { $GLOBALS['testbackend'] ->testTearDown(); } echo "testcase $name: passed\n"; } /** * We can't know in which ordeer changes (Add|Replace|Delete) changes are * reported by the backend. One time it may list change1 and then change2, * another time first change2 and then change1. So we just sort them to get * a comparable result. The LocURIs must be ignored for the sort as we * fake them during the test. * * @throws Horde_Exception */ function sortChanges($content) { $bak = $content; if (preg_match_all('!<(?:Add|Replace|Delete)>.*?</(?:Add|Replace|Delete)>!si', $content, $ma)) { $eles = $ma[0]; preg_match('!^(.*?)<(?:Add|Replace|Delete)>.*</(?:Add|Replace|Delete)>(.*?)$!si', $content, $m); // var_dump($eles); // var_dump($m); usort($eles, 'cmp'); $r = $m[1] . implode('',$eles) . $m[2]; if (strlen($r) != strlen($bak)) { echo "error!\nbefore: $bak\nafter: $r\n"; var_dump($m); throw new Horde_Exception('failed'); } // the CmdID may no longer fit. So we have to remove this: $r = preg_replace('|<CmdID>[^<]*</CmdID>|','<CmdID>IGNORED</CmdID>', $r); //echo 'sorted: ' . implode('',$eles) . "\n"; return $r; } return $content; } function cmp($a, $b) { if (preg_match('|<Data>.*?</Data>|si', $a, $m)) { $a = $m[0]; //echo "MATCH: $a\n"; } else { $a = preg_replace('|<LocURI>.*?<LocURI>|s','', $a); } if (preg_match('|<Data>.*?</Data>|si', $b, $m)) { $b = $m[0]; } else { $b = preg_replace('|<LocURI>.*?<LocURI>|s','', $b); } if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } function print_usage($message = '') { if (!empty($message)) { echo "testsync.php: $message\n"; } echo <<<USAGE Usage: testsync.php [OPTIONS] Possible options: --url=RPCURL Use curl to simulate access to URL for rpc.php. If not specified, rpc.php is called internally. --dir=DIR Run test with data in directory DIR. If not spefied use all directories starting with testcase_. --setup Don not run any tests. Just create test user syncmltest with clean database. This does the setup before recording a test case. --debug Produce some debug output. USAGE; exit; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������