pax_global_header00006660000000000000000000000064146461421220014514gustar00rootroot0000000000000052 comment=135e55d092cae59e7c8c1dc93227a175cde4b44b belcard-5.3.105/000077500000000000000000000000001464614212200132635ustar00rootroot00000000000000belcard-5.3.105/.clang-format000066400000000000000000000021161464614212200156360ustar00rootroot00000000000000# Copyright (c) 2010-2023 Belledonne Communications SARL. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . --- Language: Cpp BasedOnStyle: LLVM AccessModifierOffset: -4 AllowShortFunctionsOnASingleLine: None AllowShortIfStatementsOnASingleLine: AllIfsAndElse AlwaysBreakTemplateDeclarations: Yes BinPackParameters: false ColumnLimit: 120 PointerAlignment: Right IndentCaseLabels: true IndentWidth: 4 Standard: c++14 TabWidth: 4 UseTab: ForIndentation ... belcard-5.3.105/.gitattributes000066400000000000000000000000151464614212200161520ustar00rootroot00000000000000*.vcf binary belcard-5.3.105/.github/000077500000000000000000000000001464614212200146235ustar00rootroot00000000000000belcard-5.3.105/.github/ISSUE_TEMPLATE/000077500000000000000000000000001464614212200170065ustar00rootroot00000000000000belcard-5.3.105/.github/ISSUE_TEMPLATE/bug_report.yml000066400000000000000000000134721464614212200217100ustar00rootroot00000000000000--- name: Bug report description: File a bug/issue title: "[Bug]: " labels: ["bug"] body: - type: markdown attributes: value: '# Reminder' - type: markdown attributes: value: | The responses are provided by the **community** and, on a **best effort** basis, by some Belledonne Communications SARL engineers working on Linphone and its related projects. The community means any people all around the world simply willing to participate to the discussions. Belledonne Communications SARL **disclaims any WARRANTY** that the content posted on github issues or mailing lists is technically correct. Responses from Belledonne Communications SARL engineers shall be considered as individual contributions and shall not be seen as Belledonne Communications's official point of view or commitment. The Github issue tracker must be seen as a place for **collaboration**. Issues submitted should be of general interest, in the goal of improving the software. Consider that a **well documented** issue (with precise reproduction procedure, logs, stack trace if relevant, possibly a corrective patch) has a higher chance to receive interest and feedback from community members and Belledonne Communications' engineers. __Issues poorly documented, with no facts, or asking for debugging assistance for a custom app using Linphone's libraries, or for a modified version of Linphone are unlikely to receive any kind of response.__ People using Linphone or its related projects within the scope of their company job are invited to contact [Belledonne Communications](https://linphone.org/contact#content-bottom3) in order to obtain commercial support. - type: markdown attributes: value: | # Well ordered issues are treated issues **In our apps, the [Linphone-SDK](https://github.com/BelledonneCommunications/linphone-sdk) is used.** Please report your issue here **ONLY** if you are sure that the origin of the error is in this module. Otherwise, open an issue in the repository of the app you are using or in the Linphone-SDK, and we will move it to the related module. - type: markdown attributes: value: | # Useful links [Linphone.org](https://linphone.org) [Linphone commercial contact](https://linphone.org/contact#content-bottom3) Linphone Vulnerability/Security contact: vulnerabilities@linphone.org [Contributor agreement (to sign and to return to sales@belledonne-communications.com for a pull request)](https://linphone.org/sites/default/files/bc-contributor-agreement_0.pdf) - type: textarea attributes: label: | Context description: | - For which purpose do you use the project ? - With which software/hardware it is integrated ? - Did you use sip.linphone.org or a different SIP service (in this case specify which one and which version) ? value: | I use this project in a custom app running on Linux with the sip.linphone.org service for my company. I want to do a simple call between an Android phone and a Linux client. There is an error with a method of this project and I'm sure that I followed the documentation and double checked before posting. validations: required: true - type: textarea attributes: label: General information description: | Complete it multiple time if there are multiple devices involved. Please note that the issue has more chances to be read if you report a bug seen in the latest version of the module. Ex: - Device: [e.g. Samsung Note 20 Ultra] - OS: [e.g. Android 11] - Version of the App [e.g. 4.3.1] - Version of the SDK [e.g 4.4.16] value: | - Device: - OS: - Version of the App: - Version of the SDK: validations: required: true - type: textarea attributes: label: Expected behaviour description: "A clear and concise description of what you expected to happen." value: | I wanted to do a simple call with the Linux client calling the Android phone. However, the phone doesn't ring when it is asleep. validations: required: true - type: textarea attributes: label: To Reproduce description: "Steps to reproduce the behavior:" value: | 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error validations: required: true - type: textarea attributes: label: 'Additional context' value: Add any other context about the problem here. - type: markdown attributes: value: | # Logs ## Module logs Enable debug logs in advanced section of the settings, restart the app, reproduce the issue and then go to About page, click on "Send logs" and copy/paste the link here. If you doesn't have such an option, just provide the logs in attachments. - type: input attributes: label: 'SDK logs URL' - type: markdown attributes: value: | ## Module crash logs In case of a crash related to this module, please also provide the backtrace of the crash in attachments using adb logcat (Android) or the device console (iOS). For desktop versions, you can get the backtrace from a core dump. - type: markdown attributes: value: | # Screenshots Please add screenshots in attachments to help us to understand your problem. - type: markdown attributes: value: | # Pcap file If this is a network issue, join a pcap file of your attempt in attachments (done with Wireshark or TCPDump, for example) belcard-5.3.105/.gitignore000066400000000000000000000006261464614212200152570ustar00rootroot00000000000000INSTALL aclocal.m4 *~ configure Makefile.in Makefile build-aux m4 autom4te.cache *.o *.lo *.la config.log config.status .deps .libs libtool compile depcomp missing install-sh config.guess config.h.in config.sub ltmain.sh stamp-h1 .kdev4/ config.h *.orig belcard.kdev4 tests/belcard-tester tests/belcard-folder tests/belcard-unfolder tests/belcard-parser tools/output.vcf tester/belcard-tester belcard.spec belcard-5.3.105/BelCardConfig.cmake.in000066400000000000000000000033561464614212200173230ustar00rootroot00000000000000############################################################################ # BelCardConfig.cmake # Copyright (C) 2015-2023 Belledonne Communications, Grenoble France # ############################################################################ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################################################ # # Config file for the belcard package. # # Targets # ^^^^^^^ # # The following targets are defined: # belcard - The belcard library target # # # Result variables # ^^^^^^^^^^^^^^^^ # # This config file will set the following variables in your project: # # BelCard_FOUND - The belcard library has been found # BelCard_TARGET - The name of the CMake target for the belcard library @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/BelCardTargets.cmake") set(BelCard_TARGET belcard) # We must propagate the public dependencies and the private dependencies for static build include(CMakeFindDependencyMacro) find_dependency(Belr) if(@BUILD_SHARED_LIBS@) else() find_dependency(BCToolbox) endif() check_required_components(BelCard) belcard-5.3.105/CHANGELOG.md000066400000000000000000000007041464614212200150750ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.0.2] - 2017-07-20 ### Changed - Minor enhancements and bugfixes. ## [1.0.1] - 2017-02-23 ### Changed - Minor enhancements and bugfixes. ## [1.0.0] - 2016-08-09 ### Added - Initial release belcard-5.3.105/CMakeLists.txt000066400000000000000000000111711464614212200160240ustar00rootroot00000000000000############################################################################ # CMakeLists.txt # Copyright (C) 2010-2023 Belledonne Communications, Grenoble France # ############################################################################ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################################################ cmake_minimum_required(VERSION 3.22) project(BelCard VERSION 5.3.0 LANGUAGES C CXX) set(BELCARD_SO_VERSION "1") option(ENABLE_STRICT "Build with strict compile options." YES) option(ENABLE_TOOLS "Enable compilation of tools." YES) option(ENABLE_UNIT_TESTS "Enable compilation of unit tests." YES) option(ENABLE_PACKAGE_SOURCE "Create 'package_source' target for source archive making" OFF) set(CMAKE_CXX_STANDARD 17) if(NOT CPACK_GENERATOR AND NOT CMAKE_INSTALL_RPATH AND CMAKE_INSTALL_PREFIX) set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR}) message(STATUS "Setting install rpath to ${CMAKE_INSTALL_RPATH}") endif() include(GNUInstallDirs) include(CheckSymbolExists) include(CMakePushCheckState) if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_definitions(-D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING) endif() find_package(Belr 5.3.0 REQUIRED) find_package(BCToolbox 5.3.0 REQUIRED OPTIONAL_COMPONENTS tester) if(UNIX AND NOT APPLE) include(CheckIncludeFiles) check_include_files(libudev.h HAVE_LIBUDEV_H) endif() include_directories( include/ src/ ${CMAKE_CURRENT_BINARY_DIR} ) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/config.h") set_source_files_properties("${CMAKE_CURRENT_BINARY_DIR}/config.h" PROPERTIES GENERATED ON) add_definitions("-DHAVE_CONFIG_H") set(BELCARD_CPPFLAGS ) if(NOT BUILD_SHARED_LIBS) list(APPEND BELCARD_CPPFLAGS "-DBELCARD_STATIC") endif() if(BELCARD_CPPFLAGS) list(REMOVE_DUPLICATES BELCARD_CPPFLAGS) add_definitions(${BELCARD_CPPFLAGS}) endif() add_definitions("-DBELCARD_EXPORTS") set(STRICT_OPTIONS_CPP ) set(STRICT_OPTIONS_C ) set(STRICT_OPTIONS_CXX ) set(STRICT_OPTIONS_OBJC ) if(MSVC) if(ENABLE_STRICT) list(APPEND STRICT_OPTIONS_CPP "/WX") endif() else() list(APPEND STRICT_OPTIONS_CPP "-Wall" "-Wuninitialized" "-Wno-error=deprecated-declarations") list(APPEND STRICT_OPTIONS_C "-Wdeclaration-after-statement" "-Wstrict-prototypes" "-Wno-error=strict-prototypes") if(CMAKE_C_COMPILER_ID MATCHES "Clang") list(APPEND STRICT_OPTIONS_CPP "-Qunused-arguments" "-Wno-array-bounds") endif() if(APPLE) list(APPEND STRICT_OPTIONS_CPP "-Wno-error=unknown-warning-option" "-Qunused-arguments" "-Wno-tautological-compare" "-Wno-unused-function" "-Wno-array-bounds") endif() if(ENABLE_STRICT) list(APPEND STRICT_OPTIONS_CPP "-Werror" "-Wextra" "-Wno-unused-parameter" "-fno-strict-aliasing") endif() endif() if(STRICT_OPTIONS_CPP) list(REMOVE_DUPLICATES STRICT_OPTIONS_CPP) endif() if(STRICT_OPTIONS_C) list(REMOVE_DUPLICATES STRICT_OPTIONS_C) endif() add_subdirectory(include) add_subdirectory(src) if(ENABLE_UNIT_TESTS) add_subdirectory(tester) endif() if(ENABLE_TOOLS) add_subdirectory(tools) endif() include(CMakePackageConfigHelpers) set(CMAKE_MODULES_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/cmake") configure_package_config_file("${PROJECT_NAME}Config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" INSTALL_DESTINATION "${CMAKE_MODULES_INSTALL_DIR}" NO_SET_AND_CHECK_MACRO ) write_basic_package_version_file("${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion ) install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" DESTINATION ${CMAKE_MODULES_INSTALL_DIR} ) install(EXPORT ${PROJECT_NAME}Targets FILE "${PROJECT_NAME}Targets.cmake" DESTINATION ${CMAKE_MODULES_INSTALL_DIR} ) if(ENABLE_PACKAGE_SOURCE) add_subdirectory(build) endif() belcard-5.3.105/LICENSE.txt000066400000000000000000000773311464614212200151210ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS belcard-5.3.105/Makefile.am000066400000000000000000000004561464614212200153240ustar00rootroot00000000000000pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = belcard.pc EXTRA_DIST= \ CMakeLists.txt \ cmake/BelcardConfig.cmake \ config.h.cmake \ include/CMakeLists.txt \ src/CMakeLists.txt \ tester/CMakeLists.txt \ tools/CMakeLists.txt \ belcard.pc.in \ README.md SUBDIRS=include src tester tools belcard-5.3.105/README.md000066400000000000000000000027221464614212200145450ustar00rootroot00000000000000[![pipeline status](https://gitlab.linphone.org/BC/public/belcard/badges/master/pipeline.svg)](https://gitlab.linphone.org/BC/public/belcard/commits/master) BelCard ======= Belcard is a C++ library to manipulate VCard standard format Dependencies ------------ - *bctoolbox[1]* : portability layer. - *belr[2]* : used to parse VCard format. Build instrucitons ------------------ cmake . -DCMAKE_INSTALL_PREFIX= -DCMAKE_PREFIX_PATH= make make install Options ------- - `CMAKE_INSTALL_PREFIX=` : installation prefix - `CMAKE_PREFIX_PATH=` : prefix where depedencies are installed - `ENABLE_UNIT_TESTS=NO` : do not compile non-regression tests - `ENABLE_STRICT=NO` : do not build with strict complier flags e.g. `-Wall -Werror` Note for packagers ------------------ Our CMake scripts may automatically add some paths into research paths of generated binaries. To ensure that the installed binaries are striped of any rpath, use `-DCMAKE_SKIP_INSTALL_RPATH=ON` while you invoke cmake. Rpm packaging belcard can be generated with cmake3 using the following command: mkdir WORK cd WORK cmake3 ../ make package_source rpmbuild -ta --clean --rmsource --rmspec belcard--.tar.gz ------------------ - [1] git://git.linphone.org/bctoolbox.git or - [2] git://git.linphone.org/belr.git or belcard-5.3.105/autogen.sh000077500000000000000000000012641464614212200152670ustar00rootroot00000000000000#!/bin/sh if ! type aclocal-$AM_VERSION 1>/dev/null 2>&1; then # automake-1.10 (recommended) is not available on Fedora 8 AUTOMAKE=automake ACLOCAL=aclocal else ACLOCAL=aclocal-${AM_VERSION} AUTOMAKE=automake-${AM_VERSION} fi if test -f /opt/local/bin/glibtoolize ; then # darwin LIBTOOLIZE=/opt/local/bin/glibtoolize else LIBTOOLIZE=libtoolize fi if test -d /opt/local/share/aclocal ; then ACLOCAL_ARGS="-I /opt/local/share/aclocal" fi if test -d /share/aclocal ; then ACLOCAL_ARGS="-I /share/aclocal" fi echo "Generating build scripts in myantlr..." set -x $LIBTOOLIZE --copy --force $ACLOCAL $ACLOCAL_ARGS autoheader $AUTOMAKE --force-missing --add-missing --copy autoconf belcard-5.3.105/belcard.pc.in000066400000000000000000000004441464614212200156120ustar00rootroot00000000000000# This is a comment prefix=@CMAKE_INSTALL_PREFIX@ Name: @PROJECT_NAME@ Description: Belcard is Belledonne Communications' vCard 4 parsing library Version: @PROJECT_VERSION@ Libs: -L@CMAKE_INSTALL_FULL_LIBDIR@ -lbelcard Libs.private: @LIBS_PRIVATE@ Cflags: -I@CMAKE_INSTALL_FULL_INCLUDEDIR@ belcard-5.3.105/build/000077500000000000000000000000001464614212200143625ustar00rootroot00000000000000belcard-5.3.105/build/CMakeLists.txt000066400000000000000000000023061464614212200171230ustar00rootroot00000000000000############################################################################ # CMakeLists.txt # Copyright (C) 2010-2019 Belledonne Communications, Grenoble France # ############################################################################ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################################################ if(NOT CPACK_PACKAGE_NAME) set(CPACK_PACKAGE_NAME "belcard") endif() set(CPACK_SOURCE_IGNORE_FILES "${CMAKE_BINARY_DIR}" "^${PROJECT_SOURCE_DIR}/.git*" ) bc_make_package_source_target() belcard-5.3.105/build/android/000077500000000000000000000000001464614212200160025ustar00rootroot00000000000000belcard-5.3.105/build/android/Android.mk000066400000000000000000000013131464614212200177110ustar00rootroot00000000000000LOCAL_PATH:= $(call my-dir)/../../src include $(CLEAR_VARS) LOCAL_CPP_EXTENSION := .cpp LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/../include \ $(LOCAL_PATH)/../../belr/include \ LOCAL_SRC_FILES := \ belcard_addressing.cpp \ belcard_communication.cpp \ belcard_explanatory.cpp \ belcard_geographical.cpp \ belcard_organizational.cpp \ belcard_parser.cpp \ belcard_rfc6474.cpp \ belcard_utils.cpp \ belcard_calendar.cpp \ belcard.cpp \ belcard_general.cpp \ belcard_identification.cpp \ belcard_params.cpp \ belcard_property.cpp \ belcard_security.cpp \ vcard_grammar.cpp \ LOCAL_STATIC_LIBRARIES += libbelr LOCAL_MODULE:= libbelcard include $(BUILD_STATIC_LIBRARY)belcard-5.3.105/build/osx/000077500000000000000000000000001464614212200151735ustar00rootroot00000000000000belcard-5.3.105/build/osx/Info.plist.in000066400000000000000000000026451464614212200175570ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable belcard CFBundleGetInfoString ${MACOSX_BUNDLE_INFO_STRING} CFBundleIconFile ${MACOSX_BUNDLE_ICON_FILE} CFBundleIdentifier ${MACOSX_FRAMEWORK_IDENTIFIER} LSMinimumSystemVersion ${CMAKE_OSX_DEPLOYMENT_TARGET} MinimumOSVersion ${CMAKE_OSX_DEPLOYMENT_TARGET} CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString ${MACOSX_BUNDLE_LONG_VERSION_STRING} CFBundleName ${MACOSX_BUNDLE_BUNDLE_NAME} CFBundlePackageType FMWK CFBundleShortVersionString ${BELCARD_SO_VERSION} CFBundleSignature ???? CFBundleVersion ${BELCARD_SO_VERSION} CSResourcesFileMapped NSHumanReadableCopyright ${MACOSX_BUNDLE_COPYRIGHT} NSPrincipalClass NSApplication NSHighResolutionCapable True belcard-5.3.105/build/rpm/000077500000000000000000000000001464614212200151605ustar00rootroot00000000000000belcard-5.3.105/build/rpm/belcard.spec.cmake000077500000000000000000000056451464614212200205240ustar00rootroot00000000000000# -*- rpm-spec -*- %define _prefix @CMAKE_INSTALL_PREFIX@ %define pkg_prefix @BC_PACKAGE_NAME_PREFIX@ %define package_name @CPACK_PACKAGE_NAME@-${FULL_VERSION} # re-define some directories for older RPMBuild versions which don't. This messes up the doc/ dir # taken from https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros %define _datarootdir %{_prefix}/share %define _datadir %{_datarootdir} %define _docdir %{_datadir}/doc Name: @CPACK_PACKAGE_NAME@ Version: ${RPM_VERSION} Release: ${RPM_RELEASE}%{?dist} Summary: Belcard is a C++ library to manipulate VCard standard format. Group: Applications/Communications License: GPL URL: http://www.linphone.org Source0: %{package_name}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot Requires: %{pkg_prefix}bctoolbox %description Belcard is a C++ library to manipulate VCard standard format %package devel Summary: Development libraries for belcard Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description devel Libraries and headers required to develop software with belcard %if 0%{?rhel} && 0%{?rhel} <= 7 %global cmake_name cmake3 %define ctest_name ctest3 %else %global cmake_name cmake %define ctest_name ctest %endif # This is for debian builds where debug_package has to be manually specified, whereas in centos it does not %define custom_debug_package %{!?_enable_debug_packages:%debug_package}%{?_enable_debug_package:%{nil}} %custom_debug_package %prep %setup -n %{package_name} %build %{expand:%%%cmake_name} . -DCMAKE_BUILD_TYPE=@CMAKE_BUILD_TYPE@ -DCMAKE_PREFIX_PATH:PATH=%{_prefix} @RPM_ALL_CMAKE_OPTIONS@ make %{?_smp_mflags} %install make install DESTDIR=%{buildroot} # Dirty workaround to give exec rights for all shared libraries. Debian packaging needs this # TODO : set CMAKE_INSTALL_SO_NO_EXE for a cleaner workaround chmod +x `find %{buildroot} *.so.*` %check %{ctest_name} -V %{?_smp_mflags} %clean rm -rf $RPM_BUILD_ROOT %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files %defattr(-,root,root) %doc LICENSE.txt CHANGELOG.md README.md %{_libdir}/*.so.* %{_datadir}/belr/grammars/vcard_grammar %files devel %defattr(-,root,root) %{_includedir}/belcard %if @ENABLE_STATIC@ %{_libdir}/libbelcard.a %endif %if @ENABLE_SHARED@ %{_libdir}/libbelcard.so %endif %{_datadir}/Belcard/cmake/BelcardConfig*.cmake %{_datadir}/Belcard/cmake/BelcardTargets*.cmake %if @ENABLE_UNIT_TESTS@ %{_datadir}/belcard_tester/vcards/* %endif %if @ENABLE_TOOLS@ %{_bindir}/* %endif %changelog * Tue Nov 27 2018 ronan.abhamon - Do not set CMAKE_INSTALL_LIBDIR and never with _libdir! * Fri May 25 2018 ronan.abhamon - Add vcard_grammar. * Wed Jul 19 2017 jehan.monnier - Initial RPM release. belcard-5.3.105/config.h.cmake000066400000000000000000000026631464614212200157670ustar00rootroot00000000000000/*************************************************************************** * config.h.cmake * Copyright (C) 2015 Belledonne Communications, Grenoble France * **************************************************************************** * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ****************************************************************************/ #define BELCARD_MAJOR_VERSION ${BELCARD_MAJOR_VERSION} #define BELCARD_MINOR_VERSION ${BELCARD_MINOR_VERSION} #define BELCARD_MICRO_VERSION ${BELCARD_MICRO_VERSION} #define BELCARD_VERSION "${BELCARD_VERSION}" #define BELCARD_LOCAL_RESOURCE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/tester/" #define VCARD_LOCAL_GRAMMAR_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/src/" #cmakedefine HAVE_BCUNIT_BCUNIT_H 1 #cmakedefine HAVE_CU_GET_SUITE 1 belcard-5.3.105/configure.ac000066400000000000000000000120101464614212200155430ustar00rootroot00000000000000# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) AC_INIT([belcard], [1.0.1], [sylvain.berfini@belledonne-communications.com]) BELCARD_SO_CURRENT=0 dnl increment this number when you add/change/remove an interface BELCARD_SO_REVISION=0 dnl increment this number when you change source code, without changing interfaces; set to 0 when incrementing CURRENT BELCARD_SO_AGE=1 dnl increment this number when you add an interface, set to 0 if you remove an interface BELCARD_SO_VERSION=$BELCARD_SO_CURRENT:$BELCARD_SO_REVISION:$BELCARD_SO_AGE AC_SUBST(BELCARD_SO_CURRENT, $BELCARD_SO_CURRENT) AC_SUBST(BELCARD_SO_VERSION) AC_CONFIG_SRCDIR([src/]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([config.h]) AC_CANONICAL_SYSTEM LT_INIT([shared disable-static]) dnl initialize pkg-config so that we can use it within if else fi statements. PKG_PROG_PKG_CONFIG() AM_INIT_AUTOMAKE(subdir-objects foreign) AM_SILENT_RULES(yes) # Checks for programs. AC_PROG_CXX CXXFLAGS="$CXXFLAGS -std=c++11 -Wall -Werror -Wextra -Wno-unused-parameter" # Checks for libraries. dnl ################################################## dnl # Check for XXD dnl ################################################## AC_CHECK_PROG(xxd_found, xxd, yes) if test "$xxd_found" != yes ;then AC_MSG_ERROR("xxd is required (provided by vim package)") fi dnl ################################################## dnl # Check for BcToolbox dnl ################################################## dnl check bctoolbox PKG_CHECK_MODULES(BCTOOLBOX, [bctoolbox],[libbctoolbox_found=yes],foo=bar) if test "$libbctoolbox_found" != "yes" ; then dnl Check the lib presence in case the PKG-CONFIG version is not found AC_LANG_CPLUSPLUS AC_CHECK_LIB(bctoolbox, main, [BCTOOLBOX_LIBS+=" -lbctoolbox"; libbctoolbox_found=yes], [foo=bar]) AC_LANG_C fi if test "$libbctoolbox_found" != "yes" ; then AC_MSG_ERROR([libbctoolbox not found. Install it and try again]) fi AC_SUBST(BCTOOLBOX_LIBS) dnl check bctoolbox-tester PKG_CHECK_MODULES(BCTOOLBOXTESTER, [bctoolbox-tester],[libbctoolbox_tester_found=yes],foo=bar) if test "$libbctoolbox_tester_found" != "yes" ; then dnl Check the lib presence in case the PKG-CONFIG version is not found AC_LANG_CPLUSPLUS AC_CHECK_LIB(bctoolbox-tester, main, [BCTOOLBOXTESTER_LIBS+=" -lbctoolbox-tester"; libbctoolbox_tester_found=yes], [foo=bar]) AC_LANG_C fi if test "$libbctoolbox_tester_found" != "yes" ; then AC_MSG_ERROR([libbctoolbox tester not found. Install it and try again]) fi AC_SUBST(BCTOOLBOXTESTER_LIBS) dnl ################################################## dnl # Check for Belr dnl ################################################## dnl check belr PKG_CHECK_MODULES(BELR, [belr],[libbelr_found=yes],foo=bar) if test "$libbelr_found" != "yes" ; then dnl Check the lib presence in case the PKG-CONFIG version is not found AC_LANG_CPLUSPLUS AC_CHECK_LIB(belr, main, [BELR_LIBS+=" -lbelr"; libbelr_found=yes], [foo=bar]) AC_LANG_C fi if test "$libbelr_found" != "yes" ; then AC_MSG_ERROR([libbelr not found. Install it and try again]) fi AC_SUBST(BELR_CFLAGS) AC_SUBST(BELR_LIBS) dnl ################################################## dnl # Check for BCUnit dnl ################################################## PKG_CHECK_MODULES(BCUNIT, bcunit, [found_bcunit=yes],[found_bcunit=no]) if test "$found_bcunit" = "no" ; then AC_CHECK_HEADERS(BCUnit/BCUnit.h, [ AC_CHECK_LIB(bcunit,CU_add_suite,[ found_bcunit=yes BCUNIT_LIBS+=" -lbcunit" ]) ]) fi case "$target_os" in *darwin*) #hack for macport BCUNIT_LIBS+=" -lncurses" ;; *mingw*) CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0501" LIBS="$LIBS -lws2_32 -liphlpapi" LDFLAGS="$LDFLAGS -Wl,--export-all-symbols" ;; esac if test "$found_bcunit" = "no" ; then AC_MSG_WARN([Could not find bcunit framework, tests are not compiled.]) else AC_CHECK_LIB(bcunit,CU_get_suite,[ AC_DEFINE(HAVE_CU_GET_SUITE,1,[defined when CU_get_suite is available]) ],[foo=bar],[$BCUNIT_LIBS]) AC_CHECK_LIB(bcunit,CU_curses_run_tests,[ AC_DEFINE(HAVE_CU_CURSES,1,[defined when CU_curses_run_tests is available]) ],[foo=bar],[$BCUNIT_LIBS]) fi AM_CONDITIONAL(BUILD_TESTS,test x$found_bcunit = xyes) # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SSIZE_T dnl substitute variables used by .pc files if test "$prefix" = "NONE" ; then install_prefix=/usr else install_prefix=$prefix fi PROJECT_VERSION=$VERSION CMAKE_INSTALL_PREFIX=$install_prefix CMAKE_INSTALL_FULL_LIBDIR=${libdir} CMAKE_INSTALL_FULL_INCLUDEDIR=${install_prefix}/include AC_SUBST(PROJECT_VERSION) AC_SUBST(CMAKE_INSTALL_PREFIX) AC_SUBST(CMAKE_INSTALL_FULL_LIBDIR) AC_SUBST(CMAKE_INSTALL_FULL_INCLUDEDIR) AC_SUBST(TESTER_REQUIRES_PRIVATE) # Checks for library functions. AC_CONFIG_FILES( Makefile src/Makefile tester/Makefile tools/Makefile include/Makefile include/belcard/Makefile cmake/BelcardConfig.cmake belcard.pc ) AC_OUTPUT belcard-5.3.105/include/000077500000000000000000000000001464614212200147065ustar00rootroot00000000000000belcard-5.3.105/include/CMakeLists.txt000066400000000000000000000034621464614212200174530ustar00rootroot00000000000000############################################################################ # CMakeLists.txt # Copyright (C) 2015 Belledonne Communications, Grenoble France # ############################################################################ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################################################ set(HEADER_FILES belcard_addressing.hpp belcard_communication.hpp belcard_general.hpp belcard_geographical.hpp belcard_identification.hpp belcard_params.hpp belcard_property.hpp belcard_security.hpp belcard_calendar.hpp belcard_explanatory.hpp belcard_generic.hpp belcard.hpp belcard_organizational.hpp belcard_parser.hpp belcard_rfc6474.hpp belcard_utils.hpp vcard_grammar.hpp ) set(BELCARD_HEADER_FILES ) foreach(HEADER_FILE ${HEADER_FILES}) list(APPEND BELCARD_HEADER_FILES "${CMAKE_CURRENT_LIST_DIR}/belcard/${HEADER_FILE}") endforeach() set(BELCARD_HEADER_FILES ${BELCARD_HEADER_FILES} PARENT_SCOPE) install(FILES ${BELCARD_HEADER_FILES} DESTINATION include/belcard PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ) belcard-5.3.105/include/Makefile.am000066400000000000000000000000201464614212200167320ustar00rootroot00000000000000SUBDIRS=belcard belcard-5.3.105/include/belcard/000077500000000000000000000000001464614212200163025ustar00rootroot00000000000000belcard-5.3.105/include/belcard/Makefile.am000066400000000000000000000010441464614212200203350ustar00rootroot00000000000000belcard_includedir=$(includedir)/belcard belcard_include_HEADERS = belcard.hpp \ belcard_generic.hpp \ belcard_params.hpp \ belcard_property.hpp \ belcard_general.hpp \ belcard_identification.hpp \ belcard_addressing.hpp \ belcard_communication.hpp \ belcard_geographical.hpp \ belcard_organizational.hpp \ belcard_explanatory.hpp \ belcard_security.hpp \ belcard_calendar.hpp \ belcard_rfc6474.hpp \ belcard_parser.hpp \ vcard_grammar.hpp \ belcard_utils.hpp EXTRA_DIST=$(belcard_include_HEADERS) belcard-5.3.105/include/belcard/belcard.hpp000066400000000000000000000376121464614212200204200ustar00rootroot00000000000000/* belcard.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_hpp #define belcard_hpp #include "belcard_utils.hpp" #include "belcard_generic.hpp" #include "belcard_params.hpp" #include "belcard_property.hpp" #include "belcard_general.hpp" #include "belcard_identification.hpp" #include "belcard_addressing.hpp" #include "belcard_communication.hpp" #include "belcard_geographical.hpp" #include "belcard_organizational.hpp" #include "belcard_explanatory.hpp" #include "belcard_security.hpp" #include "belcard_calendar.hpp" #include "belcard_rfc6474.hpp" #include "bctoolbox/logging.h" #include #include namespace belcard { class BelCard : public BelCardGeneric { private: std::string _folded_string; bool _skipFieldValidation = false; std::shared_ptr _kind; std::shared_ptr _fn; std::shared_ptr _n; std::shared_ptr _bday; std::shared_ptr _anniversary; std::shared_ptr _gender; std::shared_ptr _pid; std::shared_ptr _rev; std::shared_ptr _uid; std::shared_ptr _bplace; std::shared_ptr _dplace; std::shared_ptr _ddate; std::list> _nicknames; std::list> _photos; std::list> _addr; std::list> _tel; std::list> _emails; std::list> _impp; std::list> _langs; std::list> _sources; std::list> _xml; std::list> _timezones; std::list> _geos; std::list> _titles; std::list> _roles; std::list> _logos; std::list> _organizations; std::list> _members; std::list> _related; std::list> _categories; std::list> _notes; std::list> _sounds; std::list> _clientpidmaps; std::list> _urls; std::list> _keys; std::list> _fburls; std::list> _caladruris; std::list> _caluris; std::list> _extended_properties; std::list> _properties; template void set(std::shared_ptr &p, const std::shared_ptr &property); template void add(std::list> &property_list, const std::shared_ptr &property); template void remove(std::list> &property_list, std::shared_ptr property); // The following are for belcard use only, they don't do any check on the value void _setKind(const std::shared_ptr &kind); void _setFullName(const std::shared_ptr &fn); void _setName(const std::shared_ptr &n); void _setBirthday(const std::shared_ptr &bday); void _setAnniversary(const std::shared_ptr &anniversary); void _setGender(const std::shared_ptr &gender); void _setProductId(const std::shared_ptr &pid); void _setRevision(const std::shared_ptr &rev); void _setUniqueId(const std::shared_ptr &uid); void _setBirthPlace(const std::shared_ptr &place); void _setDeathPlace(const std::shared_ptr &place); void _setDeathDate(const std::shared_ptr &date); void _addNickname(const std::shared_ptr &nickname); void _addPhoto(const std::shared_ptr &photo); void _addAddress(const std::shared_ptr &addr); void _addPhoneNumber(const std::shared_ptr &tel); void _addEmail(const std::shared_ptr &email); void _addImpp(const std::shared_ptr &impp); void _addLang(const std::shared_ptr &lang); void _addSource(const std::shared_ptr &source); void _addXML(const std::shared_ptr &xml); void _addTimezone(const std::shared_ptr &tz); void _addGeo(const std::shared_ptr &geo); void _addTitle(const std::shared_ptr &title); void _addRole(const std::shared_ptr &role); void _addLogo(const std::shared_ptr &logo); void _addOrganization(const std::shared_ptr &org); void _addMember(const std::shared_ptr &member); void _addRelated(const std::shared_ptr &related); void _addCategories(const std::shared_ptr &categories); void _addNote(const std::shared_ptr ¬e); void _addSound(const std::shared_ptr &sound); void _addClientProductIdMap(const std::shared_ptr &clientpidmap); void _addURL(const std::shared_ptr &url); void _addKey(const std::shared_ptr &key); void _addFBURL(const std::shared_ptr &fburl); void _addCALADRURI(const std::shared_ptr &caladruri); void _addCALURI(const std::shared_ptr &caluri); void _addExtendedProperty(const std::shared_ptr &property); public: BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCard(); BELCARD_PUBLIC void setSkipFieldValidation(bool skip); BELCARD_PUBLIC bool getSkipFieldValidation(); BELCARD_PUBLIC bool setKind(const std::shared_ptr &kind); BELCARD_PUBLIC const std::shared_ptr &getKind() const; BELCARD_PUBLIC bool setFullName(const std::shared_ptr &fn); BELCARD_PUBLIC const std::shared_ptr &getFullName() const; BELCARD_PUBLIC bool setName(const std::shared_ptr &n); BELCARD_PUBLIC const std::shared_ptr &getName() const; BELCARD_PUBLIC bool setBirthday(const std::shared_ptr &bday); BELCARD_PUBLIC const std::shared_ptr &getBirthday() const; BELCARD_PUBLIC bool setAnniversary(const std::shared_ptr &anniversary); BELCARD_PUBLIC const std::shared_ptr &getAnniversary() const; BELCARD_PUBLIC bool setGender(const std::shared_ptr &gender); BELCARD_PUBLIC const std::shared_ptr &getGender() const; BELCARD_PUBLIC bool setProductId(const std::shared_ptr &pid); BELCARD_PUBLIC const std::shared_ptr &getProductId() const; BELCARD_PUBLIC bool setRevision(const std::shared_ptr &rev); BELCARD_PUBLIC const std::shared_ptr &getRevision() const; BELCARD_PUBLIC bool setUniqueId(const std::shared_ptr &uid); BELCARD_PUBLIC const std::shared_ptr &getUniqueId() const; BELCARD_PUBLIC bool setBirthPlace(const std::shared_ptr &place); BELCARD_PUBLIC const std::shared_ptr &getBirthPlace() const; BELCARD_PUBLIC bool setDeathPlace(const std::shared_ptr &place); BELCARD_PUBLIC const std::shared_ptr &getDeathPlace() const; BELCARD_PUBLIC bool setDeathDate(const std::shared_ptr &date); BELCARD_PUBLIC const std::shared_ptr &getDeathDate() const; BELCARD_PUBLIC bool addNickname(const std::shared_ptr &nickname); BELCARD_PUBLIC void removeNickname(const std::shared_ptr &nickname); BELCARD_PUBLIC const std::list> &getNicknames() const; BELCARD_PUBLIC bool addPhoto(const std::shared_ptr &photo); BELCARD_PUBLIC void removePhoto(const std::shared_ptr &photo); BELCARD_PUBLIC const std::list> &getPhotos() const; BELCARD_PUBLIC bool addAddress(const std::shared_ptr &addr); BELCARD_PUBLIC void removeAddress(const std::shared_ptr &addr); BELCARD_PUBLIC const std::list> &getAddresses() const; BELCARD_PUBLIC bool addPhoneNumber(const std::shared_ptr &tel); BELCARD_PUBLIC void removePhoneNumber(const std::shared_ptr &tel); BELCARD_PUBLIC const std::list> &getPhoneNumbers() const; BELCARD_PUBLIC bool addEmail(const std::shared_ptr &email); BELCARD_PUBLIC void removeEmail(const std::shared_ptr &email); BELCARD_PUBLIC const std::list> &getEmails() const; BELCARD_PUBLIC bool addImpp(const std::shared_ptr &impp); BELCARD_PUBLIC void removeImpp(const std::shared_ptr &impp); BELCARD_PUBLIC const std::list> &getImpp() const; BELCARD_PUBLIC bool addLang(const std::shared_ptr &lang); BELCARD_PUBLIC void removeLang(const std::shared_ptr &lang); BELCARD_PUBLIC const std::list> &getLangs() const; BELCARD_PUBLIC bool addSource(const std::shared_ptr &source); BELCARD_PUBLIC void removeSource(const std::shared_ptr &source); BELCARD_PUBLIC const std::list> &getSource() const; BELCARD_PUBLIC bool addXML(const std::shared_ptr &xml); BELCARD_PUBLIC void removeXML(const std::shared_ptr &xml); BELCARD_PUBLIC const std::list> &getXML() const; BELCARD_PUBLIC bool addTimezone(const std::shared_ptr &tz); BELCARD_PUBLIC void removeTimezone(const std::shared_ptr &tz); BELCARD_PUBLIC const std::list> &getTimezones() const; BELCARD_PUBLIC bool addGeo(const std::shared_ptr &geo); BELCARD_PUBLIC void removeGeo(const std::shared_ptr &geo); BELCARD_PUBLIC const std::list> &getGeos() const; BELCARD_PUBLIC bool addTitle(const std::shared_ptr &title); BELCARD_PUBLIC void removeTitle(const std::shared_ptr &title); BELCARD_PUBLIC const std::list> &getTitles() const; BELCARD_PUBLIC bool addRole(const std::shared_ptr &role); BELCARD_PUBLIC void removeRole(const std::shared_ptr &role); BELCARD_PUBLIC const std::list> &getRoles() const; BELCARD_PUBLIC bool addLogo(const std::shared_ptr &logo); BELCARD_PUBLIC void removeLogo(const std::shared_ptr &logo); BELCARD_PUBLIC const std::list> &getLogos() const; BELCARD_PUBLIC bool addOrganization(const std::shared_ptr &org); BELCARD_PUBLIC void removeOrganization(const std::shared_ptr &org); BELCARD_PUBLIC const std::list> &getOrganizations() const; BELCARD_PUBLIC bool addMember(const std::shared_ptr &member); BELCARD_PUBLIC void removeMember(const std::shared_ptr &member); BELCARD_PUBLIC const std::list> &getMembers() const; BELCARD_PUBLIC bool addRelated(const std::shared_ptr &related); BELCARD_PUBLIC void removeRelated(const std::shared_ptr &related); BELCARD_PUBLIC const std::list> &getRelated() const; BELCARD_PUBLIC bool addCategories(const std::shared_ptr &categories); BELCARD_PUBLIC void removeCategories(const std::shared_ptr &categories); BELCARD_PUBLIC const std::list> &getCategories() const; BELCARD_PUBLIC bool addNote(const std::shared_ptr ¬e); BELCARD_PUBLIC void removeNote(const std::shared_ptr ¬e); BELCARD_PUBLIC const std::list> &getNotes() const; BELCARD_PUBLIC bool addSound(const std::shared_ptr &sound); BELCARD_PUBLIC void removeSound(const std::shared_ptr &sound); BELCARD_PUBLIC const std::list> &getSounds() const; BELCARD_PUBLIC bool addClientProductIdMap(const std::shared_ptr &clientpidmap); BELCARD_PUBLIC void removeClientProductIdMap(const std::shared_ptr &clientpidmap); BELCARD_PUBLIC const std::list> &getClientProductIdMaps() const; BELCARD_PUBLIC bool addURL(const std::shared_ptr &url); BELCARD_PUBLIC void removeURL(const std::shared_ptr &url); BELCARD_PUBLIC const std::list> &getURLs() const; BELCARD_PUBLIC bool addKey(const std::shared_ptr &key); BELCARD_PUBLIC void removeKey(const std::shared_ptr &key); BELCARD_PUBLIC const std::list> &getKeys() const; BELCARD_PUBLIC bool addFBURL(const std::shared_ptr &fburl); BELCARD_PUBLIC void removeFBURL(const std::shared_ptr &fburl); BELCARD_PUBLIC const std::list> &getFBURLs() const; BELCARD_PUBLIC bool addCALADRURI(const std::shared_ptr &caladruri); BELCARD_PUBLIC void removeCALADRURI(const std::shared_ptr &caladruri); BELCARD_PUBLIC const std::list> &getCALADRURIs() const; BELCARD_PUBLIC bool addCALURI(const std::shared_ptr &caluri); BELCARD_PUBLIC void removeCALURI(const std::shared_ptr &caluri); BELCARD_PUBLIC const std::list> &getCALURIs() const; BELCARD_PUBLIC bool addExtendedProperty(const std::shared_ptr &property); BELCARD_PUBLIC void removeExtendedProperty(const std::shared_ptr &property); BELCARD_PUBLIC const std::list> &getExtendedProperties() const; BELCARD_PUBLIC void addProperty(const std::shared_ptr &property); BELCARD_PUBLIC void removeProperty(const std::shared_ptr &property); BELCARD_PUBLIC const std::list> &getProperties() const; BELCARD_PUBLIC std::string& toFoldedString(); BELCARD_PUBLIC bool assertRFCCompliance() const; BELCARD_PUBLIC void serialize(std::ostream &output) const override; }; class BelCardList : public BelCardGeneric { private: std::list> _vCards; public: BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardList(); BELCARD_PUBLIC void addCard(const std::shared_ptr &vcard); BELCARD_PUBLIC const std::list> &getCards() const; BELCARD_PUBLIC void serialize(std::ostream &output) const override; }; } #endif belcard-5.3.105/include/belcard/belcard_addressing.hpp000066400000000000000000000050301464614212200226100ustar00rootroot00000000000000/* belcard_addressing.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_addressing_hpp #define belcard_addressing_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include #include namespace belcard { class BelCardAddress : public BelCardProperty { private: std::string _po_box; std::string _extended_address; std::string _street; std::string _locality; std::string _region; std::string _postal_code; std::string _country; std::shared_ptr _label_param; public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardAddress(); BELCARD_PUBLIC void setPostOfficeBox(const std::string &value); BELCARD_PUBLIC const std::string &getPostOfficeBox() const; BELCARD_PUBLIC void setExtendedAddress(const std::string &value); BELCARD_PUBLIC const std::string &getExtendedAddress() const; BELCARD_PUBLIC void setStreet(const std::string &value); BELCARD_PUBLIC const std::string &getStreet() const; BELCARD_PUBLIC void setLocality(const std::string &value); BELCARD_PUBLIC const std::string &getLocality() const; BELCARD_PUBLIC void setRegion(const std::string &value); BELCARD_PUBLIC const std::string &getRegion() const; BELCARD_PUBLIC void setPostalCode(const std::string &value); BELCARD_PUBLIC const std::string &getPostalCode() const; BELCARD_PUBLIC void setCountry(const std::string &value); BELCARD_PUBLIC const std::string &getCountry() const; BELCARD_PUBLIC void setLabelParam(const std::shared_ptr ¶m); BELCARD_PUBLIC const std::shared_ptr &getLabelParam() const; BELCARD_PUBLIC void serialize(std::ostream &output) const override; }; } #endif belcard-5.3.105/include/belcard/belcard_calendar.hpp000066400000000000000000000034321464614212200222420ustar00rootroot00000000000000/* belcard_calendar.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_calendar_hpp #define belcard_calendar_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include namespace belcard { class BelCardFBURL : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardFBURL(); }; class BelCardCALADRURI : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardCALADRURI(); }; class BelCardCALURI : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardCALURI(); }; } #endif belcard-5.3.105/include/belcard/belcard_communication.hpp000066400000000000000000000041341464614212200233360ustar00rootroot00000000000000/* belcard_communication.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_communication_hpp #define belcard_communication_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include #include namespace belcard { class BelCardPhoneNumber : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardPhoneNumber(); }; class BelCardEmail : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardEmail(); }; class BelCardImpp : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardImpp(); }; class BelCardLang : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardLang(); }; } #endif belcard-5.3.105/include/belcard/belcard_explanatory.hpp000066400000000000000000000064451464614212200230460ustar00rootroot00000000000000/* belcard_explanatory.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_explanatory_hpp #define belcard_explanatory_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include namespace belcard { class BelCardCategories : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardCategories(); }; class BelCardNote : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardNote(); }; class BelCardProductId : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardProductId(); }; class BelCardRevision : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardRevision(); }; class BelCardSound : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardSound(); }; class BelCardUniqueId : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardUniqueId(); }; class BelCardClientProductIdMap : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardClientProductIdMap(); }; class BelCardURL : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardURL(); }; } #endif belcard-5.3.105/include/belcard/belcard_general.hpp000066400000000000000000000034121464614212200221040ustar00rootroot00000000000000/* belcard_general.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_general_hpp #define belcard_general_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include namespace belcard { class BelCardKind : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardKind(); }; class BelCardSource : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardSource(); }; class BelCardXML : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardXML(); }; } #endif belcard-5.3.105/include/belcard/belcard_generic.hpp000066400000000000000000000033401464614212200221030ustar00rootroot00000000000000/* belcard_generic.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_generic_hpp #define belcard_generic_hpp #include "belcard_utils.hpp" #include "belcard/vcard_grammar.hpp" #include #include namespace belcard { class BelCardGeneric { friend class BelCardParser; public: template static std::shared_ptr create() { return std::make_shared(); } template static bool isValid(const std::shared_ptr &property) { return T::parse(property->toString()) != nullptr; } BELCARD_PUBLIC BelCardGeneric() { } BELCARD_PUBLIC virtual ~BelCardGeneric() { } // A virtual destructor enables polymorphism and dynamic casting. BELCARD_PUBLIC virtual void serialize(std::ostream &output) const = 0; // Force heriting classes to define this BELCARD_PUBLIC friend std::ostream &operator<<(std::ostream &output, const BelCardGeneric &me) { me.serialize(output); return output; } BELCARD_PUBLIC virtual std::string toString() const { std::stringstream output; output << *this; return output.str(); } }; } #endif belcard-5.3.105/include/belcard/belcard_geographical.hpp000066400000000000000000000027741464614212200231260ustar00rootroot00000000000000/* belcard_geographical.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_geographical_hpp #define belcard_geographical_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include namespace belcard { class BelCardTimezone : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardTimezone(); }; class BelCardGeo : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardGeo(); }; } #endif belcard-5.3.105/include/belcard/belcard_identification.hpp000066400000000000000000000075341464614212200234710ustar00rootroot00000000000000/* belcard_identification.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_identification_hpp #define belcard_identification_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include #include #include namespace belcard { class BelCardFullName : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardFullName(); }; class BelCardName : public BelCardProperty { private: std::string _family_name; std::string _given_name; std::string _additional_name; std::string _prefixes; std::string _suffixes; public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser) ; BELCARD_PUBLIC BelCardName(); BELCARD_PUBLIC void setFamilyName(const std::string &value); BELCARD_PUBLIC const std::string &getFamilyName() const; BELCARD_PUBLIC void setGivenName(const std::string &value); BELCARD_PUBLIC const std::string &getGivenName() const; BELCARD_PUBLIC void setAdditionalName(const std::string &value); BELCARD_PUBLIC const std::string &getAdditionalName() const; BELCARD_PUBLIC void setPrefixes(const std::string &value); BELCARD_PUBLIC const std::string &getPrefixes() const; BELCARD_PUBLIC void setSuffixes(const std::string &value); BELCARD_PUBLIC const std::string &getSuffixes() const; BELCARD_PUBLIC void serialize(std::ostream &output) const override; }; class BelCardNickname : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardNickname(); }; class BelCardBirthday : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardBirthday(); }; class BelCardAnniversary : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardAnniversary(); }; class BelCardGender : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardGender(); }; class BelCardPhoto : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardPhoto(); }; } #endif belcard-5.3.105/include/belcard/belcard_organizational.hpp000066400000000000000000000052571464614212200235210ustar00rootroot00000000000000/* belcard_organizational.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_organizational_hpp #define belcard_organizational_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include namespace belcard { class BelCardTitle : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardTitle(); }; class BelCardRole : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardRole(); }; class BelCardLogo : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardLogo(); }; class BelCardOrganization : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardOrganization(); }; class BelCardMember : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardMember(); }; class BelCardRelated : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardRelated(); }; } #endif belcard-5.3.105/include/belcard/belcard_params.hpp000066400000000000000000000126451464614212200217620ustar00rootroot00000000000000/* belcard_params.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_params_hpp #define belcard_params_hpp #include #include #include "belcard_utils.hpp" #include "belcard_generic.hpp" #include #include namespace belcard { class BelCardParam : public BelCardGeneric { private: std::string _name; std::string _value; public: template static std::shared_ptr parseParam(const std::string& rule, const std::string& input); static std::shared_ptr parse(const std::string& input); static void setHandlerAndCollectors(belr::Parser> *parser); static void setAllParamsHandlersAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardParam(); BELCARD_PUBLIC virtual void setName(const std::string &name); BELCARD_PUBLIC virtual const std::string &getName() const; BELCARD_PUBLIC virtual void setValue(const std::string &value) ; BELCARD_PUBLIC virtual const std::string &getValue() const; BELCARD_PUBLIC void serialize(std::ostream &output) const override; }; class BelCardLanguageParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardLanguageParam(); }; class BelCardValueParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardValueParam(); }; class BelCardPrefParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardPrefParam(); }; class BelCardAlternativeIdParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardAlternativeIdParam(); }; class BelCardParamIdParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardParamIdParam(); }; class BelCardTypeParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardTypeParam(); }; class BelCardMediaTypeParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardMediaTypeParam(); }; class BelCardCALSCALEParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardCALSCALEParam(); }; class BelCardSortAsParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardSortAsParam(); }; class BelCardGeoParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardGeoParam(); }; class BelCardTimezoneParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardTimezoneParam(); }; class BelCardLabelParam : public BelCardParam { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardLabelParam(); }; } #endif belcard-5.3.105/include/belcard/belcard_parser.hpp000066400000000000000000000030411464614212200217610ustar00rootroot00000000000000/* belcard_parser.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_parser_hpp #define belcard_parser_hpp #include #include #include "belcard_utils.hpp" namespace belcard { class BelCardGeneric; class BelCardList; class BelCard; class BelCardParser { friend class BelCardProperty; private: belr::Parser> *_parser; protected: std::shared_ptr _parse(const std::string &input, const std::string &rule); public: BELCARD_PUBLIC static std::shared_ptr getInstance(); BELCARD_PUBLIC BelCardParser(); BELCARD_PUBLIC ~BelCardParser(); BELCARD_PUBLIC std::shared_ptr parseOne(const std::string &input); BELCARD_PUBLIC std::shared_ptr parse(const std::string &input); BELCARD_PUBLIC std::shared_ptr parseFile(const std::string &filename); }; } #endif belcard-5.3.105/include/belcard/belcard_property.hpp000066400000000000000000000123621464614212200223570ustar00rootroot00000000000000/* belcard_property.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_property_hpp #define belcard_property_hpp #include #include #include "belcard_utils.hpp" #include "belcard/belcard_generic.hpp" #include "belcard_params.hpp" #include "belcard/belcard_parser.hpp" #include #include #include namespace belcard { class BelCardProperty : public BelCardGeneric { protected: std::string _group; std::string _name; std::string _value; std::shared_ptr _lang_param; std::shared_ptr _value_param; std::shared_ptr _pref_param; std::shared_ptr _altid_param; std::shared_ptr _pid_param; std::shared_ptr _type_param; std::shared_ptr _mediatype_param; std::shared_ptr _calscale_param; std::shared_ptr _sort_as_param; std::shared_ptr _geo_param; std::shared_ptr _tz_param; std::list> _params; public: template static std::shared_ptr parseProperty(const std::string& rule, const std::string& input) { size_t parseLength; std::shared_ptr parser = BelCardParser::getInstance(); std::shared_ptr ret = parser->_parser->parseInput(rule, input, &parseLength); // -2 because the input is terminated by a new line. return ret && parseLength == input.length() - 2 ? std::dynamic_pointer_cast(ret) : nullptr; } BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardProperty(); BELCARD_PUBLIC virtual void setGroup(const std::string &group); BELCARD_PUBLIC virtual const std::string &getGroup() const; BELCARD_PUBLIC virtual void setName(const std::string &name); BELCARD_PUBLIC virtual const std::string &getName() const; BELCARD_PUBLIC virtual void setValue(const std::string &value); BELCARD_PUBLIC virtual const std::string &getValue() const; BELCARD_PUBLIC virtual void setLanguageParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getLanguageParam() const; BELCARD_PUBLIC virtual void setValueParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getValueParam() const; BELCARD_PUBLIC virtual void setPrefParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getPrefParam() const; BELCARD_PUBLIC virtual void setAlternativeIdParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getAlternativeIdParam() const; BELCARD_PUBLIC virtual void setParamIdParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getParamIdParam() const; BELCARD_PUBLIC virtual void setTypeParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getTypeParam() const; BELCARD_PUBLIC virtual void setMediaTypeParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getMediaTypeParam() const; BELCARD_PUBLIC virtual void setCALSCALEParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getCALSCALEParam() const; BELCARD_PUBLIC virtual void setSortAsParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getSortAsParam() const; BELCARD_PUBLIC virtual void setGeoParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getGeoParam() const; BELCARD_PUBLIC virtual void setTimezoneParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::shared_ptr &getTimezoneParam() const; BELCARD_PUBLIC virtual void addParam(const std::shared_ptr ¶m); BELCARD_PUBLIC virtual const std::list> &getParams() const; BELCARD_PUBLIC virtual void removeParam(const std::shared_ptr ¶m); BELCARD_PUBLIC void serialize(std::ostream &output) const override; }; } #endif belcard-5.3.105/include/belcard/belcard_rfc6474.hpp000066400000000000000000000035641464614212200215760ustar00rootroot00000000000000/* belcard_rfc6474.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_rfc6474_hpp #define belcard_rfc6474_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include #include namespace belcard { class BelCardBirthPlace : public BelCardProperty { private: public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardBirthPlace(); }; class BelCardDeathPlace : public BelCardProperty { private: public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardDeathPlace(); }; class BelCardDeathDate : public BelCardProperty { private: public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardDeathDate(); }; } #endif belcard-5.3.105/include/belcard/belcard_security.hpp000066400000000000000000000023011464614212200223320ustar00rootroot00000000000000/* belcard_security.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_security_hpp #define belcard_security_hpp #include "belcard_utils.hpp" #include "belcard_property.hpp" #include #include #include namespace belcard { class BelCardKey : public BelCardProperty { public: BELCARD_PUBLIC static std::shared_ptr parse(const std::string& input); BELCARD_PUBLIC static void setHandlerAndCollectors(belr::Parser> *parser); BELCARD_PUBLIC BelCardKey(); }; } #endif belcard-5.3.105/include/belcard/belcard_utils.hpp000066400000000000000000000023401464614212200216260ustar00rootroot00000000000000/* belcard_utils.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_utils_hpp #define belcard_utils_hpp #include #ifdef _MSC_VER #ifdef BELCARD_STATIC #define BELCARD_PUBLIC #else #ifdef BELCARD_EXPORTS #define BELCARD_PUBLIC __declspec(dllexport) #else #define BELCARD_PUBLIC __declspec(dllimport) #endif #endif #else #define BELCARD_PUBLIC #endif BELCARD_PUBLIC std::string belcard_fold(const std::string &input); BELCARD_PUBLIC std::string belcard_unfold(const std::string &input); BELCARD_PUBLIC std::string belcard_read_file(const std::string &filename); #endif belcard-5.3.105/include/belcard/vcard_grammar.hpp000066400000000000000000000015661464614212200216300ustar00rootroot00000000000000/* vcard_grammar.hpp Copyright (C) 2017 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef vcard_grammar_hpp #define vcard_grammar_hpp #include #define VCARD_GRAMMAR "vcard_grammar" std::shared_ptr loadVcardGrammar(); #endif belcard-5.3.105/src/000077500000000000000000000000001464614212200140525ustar00rootroot00000000000000belcard-5.3.105/src/CMakeLists.txt000066400000000000000000000063501464614212200166160ustar00rootroot00000000000000############################################################################ # CMakeLists.txt # Copyright (C) 2015-2023 Belledonne Communications, Grenoble France # ############################################################################ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################################################ set(BELCARD_HEADER_FILES ) set(BELCARD_SOURCE_FILES_C ) set(BELCARD_SOURCE_FILES_CXX belcard_addressing.cpp belcard_communication.cpp belcard_explanatory.cpp belcard_geographical.cpp belcard_organizational.cpp belcard_parser.cpp belcard_rfc6474.cpp belcard_utils.cpp belcard_calendar.cpp belcard.cpp belcard_general.cpp belcard_identification.cpp belcard_params.cpp belcard_property.cpp belcard_security.cpp vcard_grammar.cpp ) set(VCARD_GRAMMAR_FILES vcard_grammar ) bc_apply_compile_flags(BELCARD_SOURCE_FILES_C STRICT_OPTIONS_CPP STRICT_OPTIONS_C) bc_apply_compile_flags(BELCARD_SOURCE_FILES_CXX STRICT_OPTIONS_CPP STRICT_OPTIONS_CXX) add_library(belcard ${BELCARD_HEADER_FILES} ${BELCARD_SOURCE_FILES_C} ${BELCARD_SOURCE_FILES_CXX} ${VCARD_GRAMMAR_FILES}) set_target_properties(belcard PROPERTIES VERSION ${BELCARD_SO_VERSION}) target_include_directories(belcard INTERFACE $ $ ) target_link_libraries(belcard PUBLIC ${Belr_TARGET} PRIVATE ${BCToolbox_TARGET}) if(BUILD_SHARED_LIBS) if(APPLE) set_target_properties(belcard PROPERTIES FRAMEWORK TRUE MACOSX_FRAMEWORK_IDENTIFIER org.linphone.belcard MACOSX_FRAMEWORK_INFO_PLIST "${PROJECT_SOURCE_DIR}/build/osx/Info.plist.in" RESOURCE ${VCARD_GRAMMAR_FILES} PUBLIC_HEADER "${BELCARD_HEADER_FILES}" ) endif() if(MSVC) install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE CONFIGURATIONS Debug RelWithDebInfo ) endif() endif() install(TARGETS belcard EXPORT ${PROJECT_NAME}Targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} FRAMEWORK DESTINATION Frameworks PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) install(FILES ${BELCARD_HEADER_FILES} DESTINATION include/belcard PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ ) install(FILES ${VCARD_GRAMMAR_FILES} DESTINATION "${CMAKE_INSTALL_DATADIR}/belr/grammars" ) belcard-5.3.105/src/Makefile.am000066400000000000000000000011731464614212200161100ustar00rootroot00000000000000 lib_LTLIBRARIES=libbelcard.la libbelcard_la_SOURCES=belcard_parser.cpp \ belcard_params.cpp \ belcard_property.cpp \ belcard.cpp \ belcard_general.cpp \ belcard_identification.cpp \ belcard_addressing.cpp \ belcard_communication.cpp \ belcard_geographical.cpp \ belcard_organizational.cpp \ belcard_explanatory.cpp \ belcard_security.cpp \ belcard_calendar.cpp \ belcard_rfc6474.cpp \ vcard_grammar.cpp \ belcard_utils.cpp libbelcard_la_CFLAGS=$(BELR_CFLAGS) libbelcard_la_CXXFLAGS=$(BELR_CFLAGS) AM_CPPFLAGS=-I$(top_srcdir)/include libbelcard_la_LIBADD=$(BELR_LIBS) $(BCTOOLBOX_LIBS) belcard-5.3.105/src/belcard.cpp000066400000000000000000000552301464614212200161570ustar00rootroot00000000000000/* belcard.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" #include "belcard/belcard_utils.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; void BelCard::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("vcard", make_fn(BelCardGeneric::create)) ->setCollector("X-PROPERTY", make_sfn(&BelCard::_addExtendedProperty)) ->setCollector("SOURCE", make_sfn(&BelCard::_addSource)) ->setCollector("KIND", make_sfn(&BelCard::_setKind)) ->setCollector("XML", make_sfn(&BelCard::_addXML)) ->setCollector("FN", make_sfn(&BelCard::_setFullName)) ->setCollector("N", make_sfn(&BelCard::_setName)) ->setCollector("BDAY", make_sfn(&BelCard::_setBirthday)) ->setCollector("ANNIVERSARY", make_sfn(&BelCard::_setAnniversary)) ->setCollector("GENDER", make_sfn(&BelCard::_setGender)) ->setCollector("NICKNAME", make_sfn(&BelCard::_addNickname)) ->setCollector("PHOTO", make_sfn(&BelCard::_addPhoto)) ->setCollector("ADR", make_sfn(&BelCard::_addAddress)) ->setCollector("TEL", make_sfn(&BelCard::_addPhoneNumber)) ->setCollector("EMAIL", make_sfn(&BelCard::_addEmail)) ->setCollector("IMPP", make_sfn(&BelCard::_addImpp)) ->setCollector("LANG", make_sfn(&BelCard::_addLang)) ->setCollector("TZ", make_sfn(&BelCard::_addTimezone)) ->setCollector("GEO", make_sfn(&BelCard::_addGeo)) ->setCollector("TITLE", make_sfn(&BelCard::_addTitle)) ->setCollector("ROLE", make_sfn(&BelCard::_addRole)) ->setCollector("LOGO", make_sfn(&BelCard::_addLogo)) ->setCollector("ORG", make_sfn(&BelCard::_addOrganization)) ->setCollector("MEMBER", make_sfn(&BelCard::_addMember)) ->setCollector("RELATED", make_sfn(&BelCard::_addRelated)) ->setCollector("CATEGORIES", make_sfn(&BelCard::_addCategories)) ->setCollector("NOTE", make_sfn(&BelCard::_addNote)) ->setCollector("PRODID", make_sfn(&BelCard::_setProductId)) ->setCollector("REV", make_sfn(&BelCard::_setRevision)) ->setCollector("SOUND", make_sfn(&BelCard::_addSound)) ->setCollector("UID", make_sfn(&BelCard::_setUniqueId)) ->setCollector("CLIENTPIDMAP", make_sfn(&BelCard::_addClientProductIdMap)) ->setCollector("URL", make_sfn(&BelCard::_addURL)) ->setCollector("KEY", make_sfn(&BelCard::_addKey)) ->setCollector("FBURL", make_sfn(&BelCard::_addFBURL)) ->setCollector("CALADRURI", make_sfn(&BelCard::_addCALADRURI)) ->setCollector("CALURI", make_sfn(&BelCard::_addCALURI)) ->setCollector("BIRTHPLACE", make_sfn(&BelCard::_setBirthPlace)) ->setCollector("DEATHDATE", make_sfn(&BelCard::_setDeathDate)) ->setCollector("DEATHPLACE", make_sfn(&BelCard::_setDeathPlace)); } BelCard::BelCard() : BelCardGeneric() { } void BelCard::setSkipFieldValidation(bool skip) { _skipFieldValidation = skip; } bool BelCard::getSkipFieldValidation() { return _skipFieldValidation; } bool comparePropertiesUsingPrefParam(const shared_ptr &prop1, const shared_ptr &prop2) { shared_ptr pref1 = prop1->getPrefParam(); shared_ptr pref2 = prop2->getPrefParam(); if ((pref1 == nullptr) && (pref2 == nullptr)) return false; if (pref2 == nullptr) { return true; } else if (pref1 == nullptr) { return false; } else { return pref1->getValue() < pref2->getValue(); } } template void BelCard::set(shared_ptr &p, const shared_ptr &property) { if (p) { removeProperty(p); } p = property; addProperty(property); } template void BelCard::add(list> &property_list, const shared_ptr &property) { property_list.push_back(property); property_list.sort(comparePropertiesUsingPrefParam); addProperty(property); } template void BelCard::remove(list> &property_list, shared_ptr property) { property_list.remove(property); removeProperty(property); } void BelCard::_setKind(const shared_ptr &kind) { set(_kind, kind); } bool BelCard::setKind(const shared_ptr &kind) { if (_skipFieldValidation || BelCardGeneric::isValid(kind)) { _setKind(kind); return true; } return false; } const shared_ptr &BelCard::getKind() const { return _kind; } void BelCard::_setFullName(const shared_ptr &fn) { set(_fn, fn); } bool BelCard::setFullName(const shared_ptr &fn) { if (_skipFieldValidation || BelCardGeneric::isValid(fn)) { _setFullName(fn); return true; } return false; } const shared_ptr &BelCard::getFullName() const { return _fn; } void BelCard::_setName(const shared_ptr &n) { set(_n, n); } bool BelCard::setName(const shared_ptr &n) { if (_skipFieldValidation || BelCardGeneric::isValid(n)) { _setName(n); return true; } return false; } const shared_ptr &BelCard::getName() const { return _n; } void BelCard::_setBirthday(const shared_ptr &bday) { set(_bday, bday); } bool BelCard::setBirthday(const shared_ptr &bday) { if (_skipFieldValidation || BelCardGeneric::isValid(bday)) { _setBirthday(bday); return true; } return false; } const shared_ptr &BelCard::getBirthday() const { return _bday; } void BelCard::_setAnniversary(const shared_ptr &anniversary) { set(_anniversary, anniversary); } bool BelCard::setAnniversary(const shared_ptr &anniversary) { if (_skipFieldValidation || BelCardGeneric::isValid(anniversary)) { _setAnniversary(anniversary); return true; } return false; } const shared_ptr &BelCard::getAnniversary() const { return _anniversary; } void BelCard::_setGender(const shared_ptr &gender) { set(_gender, gender); } bool BelCard::setGender(const shared_ptr &gender) { if (_skipFieldValidation || BelCardGeneric::isValid(gender)) { _setGender(gender); return true; } return false; } const shared_ptr &BelCard::getGender() const { return _gender; } void BelCard::_setProductId(const shared_ptr &pid) { set(_pid, pid); } bool BelCard::setProductId(const shared_ptr &pid) { if (_skipFieldValidation || BelCardGeneric::isValid(pid)) { _setProductId(pid); return true; } return false; } const shared_ptr &BelCard::getProductId() const { return _pid; } void BelCard::_setRevision(const shared_ptr &rev) { set(_rev, rev); } bool BelCard::setRevision(const shared_ptr &rev) { if (_skipFieldValidation || BelCardGeneric::isValid(rev)) { _setRevision(rev); return true; } return false; } const shared_ptr &BelCard::getRevision() const { return _rev; } void BelCard::_setUniqueId(const shared_ptr &uid) { set(_uid, uid); } bool BelCard::setUniqueId(const shared_ptr &uid) { if (_skipFieldValidation || BelCardGeneric::isValid(uid)) { _setUniqueId(uid); return true; } return false; } const shared_ptr &BelCard::getUniqueId() const { return _uid; } void BelCard::_setBirthPlace(const shared_ptr &place) { set(_bplace, place); } bool BelCard::setBirthPlace(const shared_ptr &place) { if (_skipFieldValidation || BelCardGeneric::isValid(place)) { _setBirthPlace(place); return true; } return false; } const shared_ptr &BelCard::getBirthPlace() const { return _bplace; } void BelCard::_setDeathPlace(const shared_ptr &place) { set(_dplace, place); } bool BelCard::setDeathPlace(const shared_ptr &place) { if (_skipFieldValidation || BelCardGeneric::isValid(place)) { _setDeathPlace(place); return true; } return false; } const shared_ptr &BelCard::getDeathPlace() const { return _dplace; } void BelCard::_setDeathDate(const shared_ptr &date) { set(_ddate, date); } bool BelCard::setDeathDate(const shared_ptr &date) { if (_skipFieldValidation || BelCardGeneric::isValid(date)) { _setDeathDate(date); return true; } return false; } const shared_ptr &BelCard::getDeathDate() const { return _ddate; } void BelCard::_addNickname(const shared_ptr &nickname) { add(_nicknames, nickname); } bool BelCard::addNickname(const shared_ptr &nickname) { if (_skipFieldValidation || BelCardGeneric::isValid(nickname)) { _addNickname(nickname); return true; } return false; } void BelCard::removeNickname(const shared_ptr &nickname) { remove(_nicknames, nickname); } const list> &BelCard::getNicknames() const { return _nicknames; } void BelCard::_addPhoto(const shared_ptr &photo) { add(_photos, photo); } bool BelCard::addPhoto(const shared_ptr &photo) { if (_skipFieldValidation || BelCardGeneric::isValid(photo)) { _addPhoto(photo); return true; } return false; } void BelCard::removePhoto(const shared_ptr &photo) { remove(_photos, photo); } const list> &BelCard::getPhotos() const { return _photos; } void BelCard::_addAddress(const shared_ptr &addr) { add(_addr, addr); } bool BelCard::addAddress(const shared_ptr &addr) { if (_skipFieldValidation || BelCardGeneric::isValid(addr)) { _addAddress(addr); return true; } return false; } void BelCard::removeAddress(const shared_ptr &addr) { remove(_addr, addr); } const list> &BelCard::getAddresses() const { return _addr; } void BelCard::_addPhoneNumber(const shared_ptr &tel) { add(_tel, tel); } bool BelCard::addPhoneNumber(const shared_ptr &tel) { if (_skipFieldValidation || BelCardGeneric::isValid(tel)) { _addPhoneNumber(tel); return true; } return false; } void BelCard::removePhoneNumber(const shared_ptr &tel) { remove(_tel, tel); } const list> &BelCard::getPhoneNumbers() const { return _tel; } void BelCard::_addEmail(const shared_ptr &email) { add(_emails, email); } bool BelCard::addEmail(const shared_ptr &email) { if (_skipFieldValidation || BelCardGeneric::isValid(email)) { _addEmail(email); return true; } return false; } void BelCard::removeEmail(const shared_ptr &email) { remove(_emails, email); } const list> &BelCard::getEmails() const { return _emails; } void BelCard::_addImpp(const shared_ptr &impp) { add(_impp, impp); } bool BelCard::addImpp(const shared_ptr &impp) { if (_skipFieldValidation || BelCardGeneric::isValid(impp)) { _addImpp(impp); return true; } return false; } void BelCard::removeImpp(const shared_ptr &impp) { remove(_impp, impp); } const list> &BelCard::getImpp() const { return _impp; } void BelCard::_addLang(const shared_ptr &lang) { add(_langs, lang); } bool BelCard::addLang(const shared_ptr &lang) { if (_skipFieldValidation || BelCardGeneric::isValid(lang)) { _addLang(lang); return true; } return false; } void BelCard::removeLang(const shared_ptr &lang) { remove(_langs, lang); } const list> &BelCard::getLangs() const { return _langs; } void BelCard::_addSource(const shared_ptr &source) { add(_sources, source); } bool BelCard::addSource(const shared_ptr &source) { if (_skipFieldValidation || BelCardGeneric::isValid(source)) { _addSource(source); return true; } return false; } void BelCard::removeSource(const shared_ptr &source) { remove(_sources, source); } const list> &BelCard::getSource() const { return _sources; } void BelCard::_addXML(const shared_ptr &xml) { add(_xml, xml); } bool BelCard::addXML(const shared_ptr &xml) { if (_skipFieldValidation || BelCardGeneric::isValid(xml)) { _addXML(xml); return true; } return false; } void BelCard::removeXML(const shared_ptr &xml) { remove(_xml, xml); } const list> &BelCard::getXML() const { return _xml; } void BelCard::_addTimezone(const shared_ptr &tz) { add(_timezones, tz); } bool BelCard::addTimezone(const shared_ptr &tz) { if (_skipFieldValidation || BelCardGeneric::isValid(tz)) { _addTimezone(tz); return true; } return false; } void BelCard::removeTimezone(const shared_ptr &tz) { remove(_timezones, tz); } const list> &BelCard::getTimezones() const { return _timezones; } void BelCard::_addGeo(const shared_ptr &geo) { add(_geos, geo); } bool BelCard::addGeo(const shared_ptr &geo) { if (_skipFieldValidation || BelCardGeneric::isValid(geo)) { _addGeo(geo); return true; } return false; } void BelCard::removeGeo(const shared_ptr &geo) { remove(_geos, geo); } const list> &BelCard::getGeos() const { return _geos; } void BelCard::_addTitle(const shared_ptr &title) { add(_titles, title); } bool BelCard::addTitle(const shared_ptr &title) { if (_skipFieldValidation || BelCardGeneric::isValid(title)) { _addTitle(title); return true; } return false; } void BelCard::removeTitle(const shared_ptr &title) { remove(_titles, title); } const list> &BelCard::getTitles() const { return _titles; } void BelCard::_addRole(const shared_ptr &role) { add(_roles, role); } bool BelCard::addRole(const shared_ptr &role) { if (_skipFieldValidation || BelCardGeneric::isValid(role)) { _addRole(role); return true; } return false; } void BelCard::removeRole(const shared_ptr &role) { remove(_roles, role); } const list> &BelCard::getRoles() const { return _roles; } void BelCard::_addLogo(const shared_ptr &logo) { add(_logos, logo); } bool BelCard::addLogo(const shared_ptr &logo) { if (_skipFieldValidation || BelCardGeneric::isValid(logo)) { _addLogo(logo); return true; } return false; } void BelCard::removeLogo(const shared_ptr &logo) { remove(_logos, logo); } const list> &BelCard::getLogos() const { return _logos; } void BelCard::_addOrganization(const shared_ptr &org) { add(_organizations, org); } bool BelCard::addOrganization(const shared_ptr &org) { if (_skipFieldValidation || BelCardGeneric::isValid(org)) { _addOrganization(org); return true; } return false; } void BelCard::removeOrganization(const shared_ptr &org) { remove(_organizations, org); } const list> &BelCard::getOrganizations() const { return _organizations; } void BelCard::_addMember(const shared_ptr &member) { add(_members, member); } bool BelCard::addMember(const shared_ptr &member) { if (_skipFieldValidation || BelCardGeneric::isValid(member)) { _addMember(member); return true; } return false; } void BelCard::removeMember(const shared_ptr &member) { remove(_members, member); } const list> &BelCard::getMembers() const { return _members; } void BelCard::_addRelated(const shared_ptr &related) { add(_related, related); } bool BelCard::addRelated(const shared_ptr &related) { if (_skipFieldValidation || BelCardGeneric::isValid(related)) { _addRelated(related); return true; } return false; } void BelCard::removeRelated(const shared_ptr &related) { remove(_related, related); } const list> &BelCard::getRelated() const { return _related; } void BelCard::_addCategories(const shared_ptr &categories) { add(_categories, categories); } bool BelCard::addCategories(const shared_ptr &categories) { if (_skipFieldValidation || BelCardGeneric::isValid(categories)) { _addCategories(categories); return true; } return false; } void BelCard::removeCategories(const shared_ptr &categories) { remove(_categories, categories); } const list> &BelCard::getCategories() const { return _categories; } void BelCard::_addNote(const shared_ptr ¬e) { add(_notes, note); } bool BelCard::addNote(const shared_ptr ¬e) { if (_skipFieldValidation || BelCardGeneric::isValid(note)) { _addNote(note); return true; } return false; } void BelCard::removeNote(const shared_ptr ¬e) { remove(_notes, note); } const list> &BelCard::getNotes() const { return _notes; } void BelCard::_addSound(const shared_ptr &sound) { add(_sounds, sound); } bool BelCard::addSound(const shared_ptr &sound) { if (_skipFieldValidation || BelCardGeneric::isValid(sound)) { _addSound(sound); return true; } return false; } void BelCard::removeSound(const shared_ptr &sound) { remove(_sounds, sound); } const list> &BelCard::getSounds() const { return _sounds; } void BelCard::_addClientProductIdMap(const shared_ptr &clientpidmap) { add(_clientpidmaps, clientpidmap); } bool BelCard::addClientProductIdMap(const shared_ptr &clientpidmap) { if (_skipFieldValidation || BelCardGeneric::isValid(clientpidmap)) { _addClientProductIdMap(clientpidmap); return true; } return false; } void BelCard::removeClientProductIdMap(const shared_ptr &clientpidmap) { remove(_clientpidmaps, clientpidmap); } const list> &BelCard::getClientProductIdMaps() const { return _clientpidmaps; } void BelCard::_addURL(const shared_ptr &url) { add(_urls, url); } bool BelCard::addURL(const shared_ptr &url) { if (_skipFieldValidation || BelCardGeneric::isValid(url)) { _addURL(url); return true; } return false; } void BelCard::removeURL(const shared_ptr &url) { remove(_urls, url); } const list> &BelCard::getURLs() const { return _urls; } void BelCard::_addKey(const shared_ptr &key) { add(_keys, key); } bool BelCard::addKey(const shared_ptr &key) { if (_skipFieldValidation || BelCardGeneric::isValid(key)) { _addKey(key); return true; } return false; } void BelCard::removeKey(const shared_ptr &key) { remove(_keys, key); } const list> &BelCard::getKeys() const { return _keys; } void BelCard::_addFBURL(const shared_ptr &fburl) { add(_fburls, fburl); } bool BelCard::addFBURL(const shared_ptr &fburl) { if (_skipFieldValidation || BelCardGeneric::isValid(fburl)) { _addFBURL(fburl); return true; } return false; } void BelCard::removeFBURL(const shared_ptr &fburl) { remove(_fburls, fburl); } const list> &BelCard::getFBURLs() const { return _fburls; } void BelCard::_addCALADRURI(const shared_ptr &caladruri) { add(_caladruris, caladruri); } bool BelCard::addCALADRURI(const shared_ptr &caladruri) { if (_skipFieldValidation || BelCardGeneric::isValid(caladruri)) { _addCALADRURI(caladruri); return true; } return false; } void BelCard::removeCALADRURI(const shared_ptr &caladruri) { remove(_caladruris, caladruri); } const list> &BelCard::getCALADRURIs() const { return _caladruris; } void BelCard::_addCALURI(const shared_ptr &caluri) { add(_caluris, caluri); } bool BelCard::addCALURI(const shared_ptr &caluri) { if (_skipFieldValidation || BelCardGeneric::isValid(caluri)) { _addCALURI(caluri); return true; } return false; } void BelCard::removeCALURI(const shared_ptr &caluri) { remove(_caluris, caluri); } const list> &BelCard::getCALURIs() const { return _caluris; } void BelCard::_addExtendedProperty(const shared_ptr &property) { add(_extended_properties, property); } bool BelCard::addExtendedProperty(const shared_ptr &property) { if (_skipFieldValidation || BelCardGeneric::isValid(property)) { _addExtendedProperty(property); return true; } return false; } void BelCard::removeExtendedProperty(const shared_ptr &property) { remove(_extended_properties, property); } const list> &BelCard::getExtendedProperties() const { return _extended_properties; } void BelCard::addProperty(const shared_ptr &property) { _properties.push_back(property); } void BelCard::removeProperty(const shared_ptr &property) { _properties.remove(property); } const list> &BelCard::getProperties() const { return _properties; } void BelCard::serialize(ostream &output) const { output << "BEGIN:VCARD\r\nVERSION:4.0\r\n"; for (auto it = getProperties().begin(); it != getProperties().end(); ++it) { output << (**it); } output << "END:VCARD\r\n"; } string &BelCard::toFoldedString() { string temp = toString(); _folded_string = belcard_fold(temp); return _folded_string; } bool BelCard::assertRFCCompliance() const { if (!_fn) { return false; } return true; } void BelCardList::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("vcard-list", make_fn(BelCardGeneric::create)) ->setCollector("vcard", make_sfn(&BelCardList::addCard)); } BelCardList::BelCardList() : BelCardGeneric() { } void BelCardList::addCard(const shared_ptr &vcard) { _vCards.push_back(vcard); } const list> &BelCardList::getCards() const { return _vCards; } void BelCardList::serialize(ostream &output) const { for (auto it = getCards().begin(); it != getCards().end(); ++it) { output << (*it)->toFoldedString(); } } belcard-5.3.105/src/belcard_addressing.cpp000066400000000000000000000104631464614212200203610ustar00rootroot00000000000000/* belcard_addressing.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardAddress::parse(const string &input) { return BelCardProperty::parseProperty("ADR", input); } void BelCardAddress::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("ADR", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("LABEL-param", make_sfn(&BelCardAddress::setLabelParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("GEO-PARAM-param", make_sfn(&BelCardProperty::setGeoParam)) ->setCollector("TZ-PARAM-param", make_sfn(&BelCardProperty::setTimezoneParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ADR-pobox", make_sfn(&BelCardAddress::setPostOfficeBox)) ->setCollector("ADR-ext", make_sfn(&BelCardAddress::setExtendedAddress)) ->setCollector("ADR-street", make_sfn(&BelCardAddress::setStreet)) ->setCollector("ADR-locality", make_sfn(&BelCardAddress::setLocality)) ->setCollector("ADR-region", make_sfn(&BelCardAddress::setRegion)) ->setCollector("ADR-code", make_sfn(&BelCardAddress::setPostalCode)) ->setCollector("ADR-country", make_sfn(&BelCardAddress::setCountry)); } BelCardAddress::BelCardAddress() : BelCardProperty() { setName("ADR"); } void BelCardAddress::setPostOfficeBox(const string &value) { _po_box = value; } const string &BelCardAddress::getPostOfficeBox() const { return _po_box; } void BelCardAddress::setExtendedAddress(const string &value) { _extended_address = value; } const string &BelCardAddress::getExtendedAddress() const { return _extended_address; } void BelCardAddress::setStreet(const string &value) { _street = value; } const string &BelCardAddress::getStreet() const { return _street; } void BelCardAddress::setLocality(const string &value) { _locality = value; } const string &BelCardAddress::getLocality() const { return _locality; } void BelCardAddress::setRegion(const string &value) { _region = value; } const string &BelCardAddress::getRegion() const { return _region; } void BelCardAddress::setPostalCode(const string &value) { _postal_code = value; } const string &BelCardAddress::getPostalCode() const { return _postal_code; } void BelCardAddress::setCountry(const string &value) { _country = value; } const string &BelCardAddress::getCountry() const { return _country; } void BelCardAddress::setLabelParam(const shared_ptr ¶m) { _label_param = param; _params.push_back(_label_param); } const shared_ptr &BelCardAddress::getLabelParam() const { return _label_param; } void BelCardAddress::serialize(ostream &output) const { if (getGroup().length() > 0) { output << getGroup() << "."; } output << getName(); for (auto it = getParams().begin(); it != getParams().end(); ++it) { output << ";" << (**it); } output << ":" << getPostOfficeBox() << ";" << getExtendedAddress() << ";" << getStreet() << ";" << getLocality() << ";" << getRegion() << ";" << getPostalCode() << ";" << getCountry() << "\r\n"; }belcard-5.3.105/src/belcard_calendar.cpp000066400000000000000000000100321464614212200177770ustar00rootroot00000000000000/* belcard_calendar.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardFBURL::parse(const string &input) { return BelCardProperty::parseProperty("FBURL", input); } void BelCardFBURL::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("FBURL", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("FBURL-value", make_sfn(&BelCardProperty::setValue)); } BelCardFBURL::BelCardFBURL() : BelCardProperty() { setName("FBURL"); } shared_ptr BelCardCALADRURI::parse(const string &input) { return BelCardProperty::parseProperty("CALADRURI", input); } void BelCardCALADRURI::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("CALADRURI", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("CALADRURI-value", make_sfn(&BelCardProperty::setValue)); } BelCardCALADRURI::BelCardCALADRURI() : BelCardProperty() { setName("CALADRURI"); } shared_ptr BelCardCALURI::parse(const string &input) { return BelCardProperty::parseProperty("CALURI", input); } void BelCardCALURI::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("CALURI", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("CALURI-value", make_sfn(&BelCardProperty::setValue)); } BelCardCALURI::BelCardCALURI() : BelCardProperty() { setName("CALURI"); }belcard-5.3.105/src/belcard_communication.cpp000066400000000000000000000115021464614212200210760ustar00rootroot00000000000000/* belcard_communication.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" #include using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardPhoneNumber::parse(const string &input) { return BelCardProperty::parseProperty("TEL", input); } void BelCardPhoneNumber::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("TEL", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("TEL-value", make_sfn(&BelCardProperty::setValue)); } BelCardPhoneNumber::BelCardPhoneNumber() : BelCardProperty() { setName("TEL"); } shared_ptr BelCardEmail::parse(const string &input) { return BelCardProperty::parseProperty("EMAIL", input); } void BelCardEmail::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("EMAIL", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("EMAIL-value", make_sfn(&BelCardProperty::setValue)); } BelCardEmail::BelCardEmail() : BelCardProperty() { setName("EMAIL"); } shared_ptr BelCardImpp::parse(const string &input) { return BelCardProperty::parseProperty("IMPP", input); } void BelCardImpp::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("IMPP", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("IMPP-value", make_sfn(&BelCardProperty::setValue)); } BelCardImpp::BelCardImpp() : BelCardProperty() { setName("IMPP"); } shared_ptr BelCardLang::parse(const string &input) { return BelCardProperty::parseProperty("LANG", input); } void BelCardLang::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("LANG", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("LANG-value", make_sfn(&BelCardProperty::setValue)); } BelCardLang::BelCardLang() : BelCardProperty() { setName("LANG"); }belcard-5.3.105/src/belcard_explanatory.cpp000066400000000000000000000174151464614212200206100ustar00rootroot00000000000000/* belcard_explanatory.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardCategories::parse(const string &input) { return BelCardProperty::parseProperty("CATEGORIES", input); } void BelCardCategories::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("CATEGORIES", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("CATEGORIES-value", make_sfn(&BelCardProperty::setValue)); } BelCardCategories::BelCardCategories() : BelCardProperty() { setName("CATEGORIES"); } shared_ptr BelCardNote::parse(const string &input) { return BelCardProperty::parseProperty("NOTE", input); } void BelCardNote::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("NOTE", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("NOTE-value", make_sfn(&BelCardProperty::setValue)); } BelCardNote::BelCardNote() : BelCardProperty() { setName("NOTE"); } shared_ptr BelCardProductId::parse(const string &input) { return BelCardProperty::parseProperty("PRODID", input); } void BelCardProductId::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("PRODID", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PRODID-value", make_sfn(&BelCardProperty::setValue)); } BelCardProductId::BelCardProductId() : BelCardProperty() { setName("PRODID"); } shared_ptr BelCardRevision::parse(const string &input) { return BelCardProperty::parseProperty("REV", input); } void BelCardRevision::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("REV", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("REV-value", make_sfn(&BelCardProperty::setValue)); } BelCardRevision::BelCardRevision() : BelCardProperty() { setName("REV"); } shared_ptr BelCardSound::parse(const string &input) { return BelCardProperty::parseProperty("SOUND", input); } void BelCardSound::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("SOUND", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("SOUND-value", make_sfn(&BelCardProperty::setValue)); } BelCardSound::BelCardSound() : BelCardProperty() { setName("SOUND"); } shared_ptr BelCardUniqueId::parse(const string &input) { return BelCardProperty::parseProperty("UID", input); } void BelCardUniqueId::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("UID", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("UID-value", make_sfn(&BelCardProperty::setValue)); } BelCardUniqueId::BelCardUniqueId() : BelCardProperty() { setName("UID"); } shared_ptr BelCardClientProductIdMap::parse(const string &input) { return BelCardProperty::parseProperty("CLIENTPIDMAP", input); } void BelCardClientProductIdMap::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("CLIENTPIDMAP", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("CLIENTPIDMAP-value", make_sfn(&BelCardProperty::setValue)); } BelCardClientProductIdMap::BelCardClientProductIdMap() : BelCardProperty() { setName("CLIENTPIDMAP"); } shared_ptr BelCardURL::parse(const string &input) { return BelCardProperty::parseProperty("URL", input); } void BelCardURL::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("URL", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("URL-value", make_sfn(&BelCardProperty::setValue)); } BelCardURL::BelCardURL() : BelCardProperty() { setName("URL"); }belcard-5.3.105/src/belcard_general.cpp000066400000000000000000000061341464614212200176530ustar00rootroot00000000000000/* belcard_general.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardSource::parse(const string &input) { return BelCardProperty::parseProperty("SOURCE", input); } void BelCardSource::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("SOURCE", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("SOURCE-value", make_sfn(&BelCardProperty::setValue)); } BelCardSource::BelCardSource() : BelCardProperty() { setName("SOURCE"); } shared_ptr BelCardKind::parse(const string &input) { return BelCardProperty::parseProperty("KIND", input); } void BelCardKind::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("KIND", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("KIND-value", make_sfn(&BelCardProperty::setValue)); } BelCardKind::BelCardKind() : BelCardProperty() { setName("KIND"); } shared_ptr BelCardXML::parse(const string &input) { return BelCardProperty::parseProperty("XML", input); } void BelCardXML::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("XML", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("XML-value", make_sfn(&BelCardProperty::setValue)); } BelCardXML::BelCardXML() : BelCardProperty() { setName("XML"); }belcard-5.3.105/src/belcard_geographical.cpp000066400000000000000000000056501464614212200206650ustar00rootroot00000000000000/* belcard_geographical.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardTimezone::parse(const string &input) { return BelCardProperty::parseProperty("TZ", input); } void BelCardTimezone::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("TZ", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("TZ-value", make_sfn(&BelCardProperty::setValue)); } BelCardTimezone::BelCardTimezone() : BelCardProperty() { setName("TZ"); } shared_ptr BelCardGeo::parse(const string &input) { return BelCardProperty::parseProperty("GEO", input); } void BelCardGeo::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("GEO", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("GEO-value", make_sfn(&BelCardProperty::setValue)); } BelCardGeo::BelCardGeo() : BelCardProperty() { setName("GEO"); }belcard-5.3.105/src/belcard_identification.cpp000066400000000000000000000214621464614212200212300ustar00rootroot00000000000000/* belcard_identification.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardFullName::parse(const string &input) { return BelCardProperty::parseProperty("FN", input); } void BelCardFullName::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("FN", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("FN-value", make_sfn(&BelCardProperty::setValue)); } BelCardFullName::BelCardFullName() : BelCardProperty() { setName("FN"); } shared_ptr BelCardName::parse(const string &input) { return BelCardProperty::parseProperty("N", input); } void BelCardName::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("N", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("SORT-AS-param", make_sfn(&BelCardProperty::setSortAsParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("N-fn", make_sfn(&BelCardName::setFamilyName)) ->setCollector("N-gn", make_sfn(&BelCardName::setGivenName)) ->setCollector("N-an", make_sfn(&BelCardName::setAdditionalName)) ->setCollector("N-prefixes", make_sfn(&BelCardName::setPrefixes)) ->setCollector("N-suffixes", make_sfn(&BelCardName::setSuffixes)); } BelCardName::BelCardName() : BelCardProperty() { setName("N"); } void BelCardName::setFamilyName(const string &value) { _family_name = value; } const string &BelCardName::getFamilyName() const { return _family_name; } void BelCardName::setGivenName(const string &value) { _given_name = value; } const string &BelCardName::getGivenName() const { return _given_name; } void BelCardName::setAdditionalName(const string &value) { _additional_name = value; } const string &BelCardName::getAdditionalName() const { return _additional_name; } void BelCardName::setPrefixes(const string &value) { _prefixes = value; } const string &BelCardName::getPrefixes() const { return _prefixes; } void BelCardName::setSuffixes(const string &value) { _suffixes = value; } const string &BelCardName::getSuffixes() const { return _suffixes; } void BelCardName::serialize(ostream &output) const { if (getGroup().length() > 0) { output << getGroup() << "."; } output << getName(); for (auto it = getParams().begin(); it != getParams().end(); ++it) { output << ";" << (**it); } output << ":" << getFamilyName() + ";" + getGivenName() + ";" + getAdditionalName() + ";" + getPrefixes() + ";" + getSuffixes() << "\r\n"; } shared_ptr BelCardNickname::parse(const string &input) { return BelCardProperty::parseProperty("NICKNAME", input); } void BelCardNickname::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("NICKNAME", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("NICKNAME-value", make_sfn(&BelCardProperty::setValue)); } BelCardNickname::BelCardNickname() : BelCardProperty() { setName("NICKNAME"); } shared_ptr BelCardBirthday::parse(const string &input) { return BelCardProperty::parseProperty("BDAY", input); } void BelCardBirthday::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("BDAY", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("CALSCALE-param", make_sfn(&BelCardProperty::setCALSCALEParam)) ->setCollector("BDAY-value", make_sfn(&BelCardProperty::setValue)); } BelCardBirthday::BelCardBirthday() : BelCardProperty() { setName("BDAY"); } shared_ptr BelCardAnniversary::parse(const string &input) { return BelCardProperty::parseProperty("ANNIVERSARY", input); } void BelCardAnniversary::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("ANNIVERSARY", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("CALSCALE-param", make_sfn(&BelCardProperty::setCALSCALEParam)) ->setCollector("ANNIVERSARY-value", make_sfn(&BelCardProperty::setValue)); } BelCardAnniversary::BelCardAnniversary() : BelCardProperty() { setName("ANNIVERSARY"); } shared_ptr BelCardGender::parse(const string &input) { return BelCardProperty::parseProperty("GENDER", input); } void BelCardGender::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("GENDER", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("GENDER-value", make_sfn(&BelCardProperty::setValue)); } BelCardGender::BelCardGender() : BelCardProperty() { setName("GENDER"); } shared_ptr BelCardPhoto::parse(const string &input) { return BelCardProperty::parseProperty("PHOTO", input); } void BelCardPhoto::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("PHOTO", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PHOTO-value", make_sfn(&BelCardProperty::setValue)); } BelCardPhoto::BelCardPhoto() : BelCardProperty() { setName("PHOTO"); }belcard-5.3.105/src/belcard_organizational.cpp000066400000000000000000000162601464614212200212600ustar00rootroot00000000000000/* belcard_organizational.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardTitle::parse(const string &input) { return BelCardProperty::parseProperty("TITLE", input); } void BelCardTitle::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("TITLE", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("TITLE-value", make_sfn(&BelCardProperty::setValue)); } BelCardTitle::BelCardTitle() : BelCardProperty() { setName("TITLE"); } shared_ptr BelCardRole::parse(const string &input) { return BelCardProperty::parseProperty("ROLE", input); } void BelCardRole::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("ROLE", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("ROLE-value", make_sfn(&BelCardProperty::setValue)); } BelCardRole::BelCardRole() : BelCardProperty() { setName("ROLE"); } shared_ptr BelCardLogo::parse(const string &input) { return BelCardProperty::parseProperty("LOGO", input); } void BelCardLogo::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("LOGO", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("LOGO-value", make_sfn(&BelCardProperty::setValue)); } BelCardLogo::BelCardLogo() : BelCardProperty() { setName("LOGO"); } shared_ptr BelCardOrganization::parse(const string &input) { return BelCardProperty::parseProperty("ORG", input); } void BelCardOrganization::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("ORG", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("SORT-AS-param", make_sfn(&BelCardProperty::setSortAsParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("ORG-value", make_sfn(&BelCardProperty::setValue)); } BelCardOrganization::BelCardOrganization() : BelCardProperty() { setName("ORG"); } shared_ptr BelCardMember::parse(const string &input) { return BelCardProperty::parseProperty("MEMBER", input); } void BelCardMember::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("MEMBER", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("MEDIATYPE-param", make_sfn(&BelCardProperty::setMediaTypeParam)) ->setCollector("MEMBER-value", make_sfn(&BelCardProperty::setValue)); } BelCardMember::BelCardMember() : BelCardProperty() { setName("MEMBER"); } shared_ptr BelCardRelated::parse(const string &input) { return BelCardProperty::parseProperty("RELATED", input); } void BelCardRelated::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("RELATED", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("RELATED-value", make_sfn(&BelCardProperty::setValue)); } BelCardRelated::BelCardRelated() : BelCardProperty() { setName("RELATED"); }belcard-5.3.105/src/belcard_params.cpp000066400000000000000000000222061464614212200175170ustar00rootroot00000000000000/* belcard_params.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard_params.hpp" #include "belcard/vcard_grammar.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; template shared_ptr BelCardParam::parseParam(const string &rule, const string &input) { shared_ptr grammar = loadVcardGrammar(); Parser> parser(grammar); T::setHandlerAndCollectors(&parser); shared_ptr ret = parser.parseInput(rule, input, NULL); return dynamic_pointer_cast(ret); } shared_ptr BelCardParam::parse(const string &input) { return BelCardParam::parseParam("any-param", input); } void BelCardParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("any-param", make_fn(BelCardGeneric::create)) ->setCollector("param-name", make_sfn(&BelCardParam::setName)) ->setCollector("param-value", make_sfn(&BelCardParam::setValue)); } void BelCardParam::setAllParamsHandlersAndCollectors(Parser> *parser) { BelCardParam::setHandlerAndCollectors(parser); BelCardLabelParam::setHandlerAndCollectors(parser); BelCardValueParam::setHandlerAndCollectors(parser); BelCardPrefParam::setHandlerAndCollectors(parser); BelCardAlternativeIdParam::setHandlerAndCollectors(parser); BelCardParamIdParam::setHandlerAndCollectors(parser); BelCardTypeParam::setHandlerAndCollectors(parser); BelCardMediaTypeParam::setHandlerAndCollectors(parser); BelCardCALSCALEParam::setHandlerAndCollectors(parser); BelCardSortAsParam::setHandlerAndCollectors(parser); BelCardGeoParam::setHandlerAndCollectors(parser); BelCardTimezoneParam::setHandlerAndCollectors(parser); BelCardLabelParam::setHandlerAndCollectors(parser); } BelCardParam::BelCardParam() : BelCardGeneric() { } void BelCardParam::serialize(ostream &output) const { output << getName() << "=" << getValue(); } void BelCardParam::setName(const string &name) { _name = name; } const string &BelCardParam::getName() const { return _name; } void BelCardParam::setValue(const string &value) { _value = value; } const string &BelCardParam::getValue() const { return _value; } shared_ptr BelCardLanguageParam::parse(const string &input) { return BelCardParam::parseParam("LANGUAGE-param", input); } void BelCardLanguageParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("LANGUAGE-param", make_fn(BelCardGeneric::create)) ->setCollector("LANGUAGE-param-value", make_sfn(&BelCardLanguageParam::setValue)); } BelCardLanguageParam::BelCardLanguageParam() : BelCardParam() { setName("LANGUAGE"); } shared_ptr BelCardValueParam::parse(const string &input) { shared_ptr grammar = loadVcardGrammar(); Parser> parser(grammar); setHandlerAndCollectors(&parser); shared_ptr ret = parser.parseInput("VALUE-param", input, NULL); return dynamic_pointer_cast(ret); } void BelCardValueParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("VALUE-param", make_fn(BelCardGeneric::create)) ->setCollector("VALUE-param-value", make_sfn(&BelCardValueParam::setValue)); } BelCardValueParam::BelCardValueParam() : BelCardParam() { setName("VALUE"); } shared_ptr BelCardPrefParam::parse(const string &input) { return BelCardParam::parseParam("PREF-param", input); } void BelCardPrefParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("PREF-param", make_fn(BelCardGeneric::create)) ->setCollector("PREF-param-value", make_sfn(&BelCardPrefParam::setValue)); } BelCardPrefParam::BelCardPrefParam() : BelCardParam() { setName("PREF"); } shared_ptr BelCardAlternativeIdParam::parse(const string &input) { return BelCardParam::parseParam("ALTID-param", input); } void BelCardAlternativeIdParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("ALTID-param", make_fn(BelCardGeneric::create)) ->setCollector("ALTID-param-value", make_sfn(&BelCardAlternativeIdParam::setValue)); } BelCardAlternativeIdParam::BelCardAlternativeIdParam() : BelCardParam() { setName("ALTID"); } shared_ptr BelCardParamIdParam::parse(const string &input) { return BelCardParam::parseParam("PID-param", input); } void BelCardParamIdParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("PID-param", make_fn(BelCardGeneric::create)) ->setCollector("PID-param-value", make_sfn(&BelCardParamIdParam::setValue)); } BelCardParamIdParam::BelCardParamIdParam() : BelCardParam() { setName("PID"); } shared_ptr BelCardTypeParam::parse(const string &input) { return BelCardParam::parseParam("TYPE-param", input); } void BelCardTypeParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("TYPE-param", make_fn(BelCardGeneric::create)) ->setCollector("TYPE-param-value", make_sfn(&BelCardTypeParam::setValue)); } BelCardTypeParam::BelCardTypeParam() : BelCardParam() { setName("TYPE"); } shared_ptr BelCardMediaTypeParam::parse(const string &input) { return BelCardParam::parseParam("MEDIATYPE-param", input); } void BelCardMediaTypeParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("MEDIATYPE-param", make_fn(BelCardGeneric::create)) ->setCollector("MEDIATYPE-param-value", make_sfn(&BelCardMediaTypeParam::setValue)); } BelCardMediaTypeParam::BelCardMediaTypeParam() : BelCardParam() { setName("MEDIATYPE"); } shared_ptr BelCardCALSCALEParam::parse(const string &input) { return BelCardParam::parseParam("CALSCALE-param", input); } void BelCardCALSCALEParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("CALSCALE-param", make_fn(BelCardGeneric::create)) ->setCollector("CALSCALE-param-value", make_sfn(&BelCardCALSCALEParam::setValue)); } BelCardCALSCALEParam::BelCardCALSCALEParam() : BelCardParam() { setName("CALSCALE"); } shared_ptr BelCardSortAsParam::parse(const string &input) { return BelCardParam::parseParam("SORT-AS-param", input); } void BelCardSortAsParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("SORT-AS-param", make_fn(BelCardGeneric::create)) ->setCollector("SORT-AS-param-value", make_sfn(&BelCardSortAsParam::setValue)); } BelCardSortAsParam::BelCardSortAsParam() : BelCardParam() { setName("SORT-AS"); } shared_ptr BelCardGeoParam::parse(const string &input) { return BelCardParam::parseParam("GEO-PARAM-param", input); } void BelCardGeoParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("GEO-PARAM-param", make_fn(BelCardGeneric::create)) ->setCollector("GEO-PARAM-param-value", make_sfn(&BelCardGeoParam::setValue)); } BelCardGeoParam::BelCardGeoParam() : BelCardParam() { setName("GEO"); } shared_ptr BelCardTimezoneParam::parse(const string &input) { return BelCardParam::parseParam("TZ-PARAM-param", input); } void BelCardTimezoneParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("TZ-PARAM-param", make_fn(BelCardGeneric::create)) ->setCollector("TZ-PARAM-param-value", make_sfn(&BelCardTimezoneParam::setValue)); } BelCardTimezoneParam::BelCardTimezoneParam() : BelCardParam() { setName("TZ"); } shared_ptr BelCardLabelParam::parse(const string &input) { return BelCardParam::parseParam("LABEL-param", input); } void BelCardLabelParam::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("LABEL-param", make_fn(BelCardGeneric::create)) ->setCollector("LABEL-param-value", make_sfn(&BelCardLabelParam::setValue)); } BelCardLabelParam::BelCardLabelParam() : BelCardParam() { setName("LABEL"); } belcard-5.3.105/src/belcard_parser.cpp000066400000000000000000000106401464614212200175270ustar00rootroot00000000000000/* belcard_parser.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard_parser.hpp" #include "belcard/belcard.hpp" #include "belcard/belcard_utils.hpp" #include "belcard/vcard_grammar.hpp" #include #include #include using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardParser::getInstance() { static shared_ptr parser(new BelCardParser); return parser; } BelCardParser::BelCardParser() { shared_ptr grammar = loadVcardGrammar(); _parser = new Parser>(grammar); BelCardList::setHandlerAndCollectors(_parser); BelCard::setHandlerAndCollectors(_parser); BelCardParam::setAllParamsHandlersAndCollectors(_parser); BelCardProperty::setHandlerAndCollectors(_parser); BelCardSource::setHandlerAndCollectors(_parser); BelCardKind::setHandlerAndCollectors(_parser); BelCardXML::setHandlerAndCollectors(_parser); BelCardFullName::setHandlerAndCollectors(_parser); BelCardName::setHandlerAndCollectors(_parser); BelCardNickname::setHandlerAndCollectors(_parser); BelCardPhoto::setHandlerAndCollectors(_parser); BelCardBirthday::setHandlerAndCollectors(_parser); BelCardAnniversary::setHandlerAndCollectors(_parser); BelCardGender::setHandlerAndCollectors(_parser); BelCardAddress::setHandlerAndCollectors(_parser); BelCardPhoneNumber::setHandlerAndCollectors(_parser); BelCardEmail::setHandlerAndCollectors(_parser); BelCardImpp::setHandlerAndCollectors(_parser); BelCardLang::setHandlerAndCollectors(_parser); BelCardTimezone::setHandlerAndCollectors(_parser); BelCardGeo::setHandlerAndCollectors(_parser); BelCardTitle::setHandlerAndCollectors(_parser); BelCardRole::setHandlerAndCollectors(_parser); BelCardLogo::setHandlerAndCollectors(_parser); BelCardOrganization::setHandlerAndCollectors(_parser); BelCardMember::setHandlerAndCollectors(_parser); BelCardRelated::setHandlerAndCollectors(_parser); BelCardCategories::setHandlerAndCollectors(_parser); BelCardNote::setHandlerAndCollectors(_parser); BelCardProductId::setHandlerAndCollectors(_parser); BelCardRevision::setHandlerAndCollectors(_parser); BelCardSound::setHandlerAndCollectors(_parser); BelCardUniqueId::setHandlerAndCollectors(_parser); BelCardClientProductIdMap::setHandlerAndCollectors(_parser); BelCardURL::setHandlerAndCollectors(_parser); BelCardKey::setHandlerAndCollectors(_parser); BelCardFBURL::setHandlerAndCollectors(_parser); BelCardCALADRURI::setHandlerAndCollectors(_parser); BelCardCALURI::setHandlerAndCollectors(_parser); BelCardBirthPlace::setHandlerAndCollectors(_parser); BelCardDeathPlace::setHandlerAndCollectors(_parser); BelCardDeathDate::setHandlerAndCollectors(_parser); } BelCardParser::~BelCardParser() { delete _parser; } shared_ptr BelCardParser::_parse(const string &input, const string &rule) { size_t parsedSize = 0; shared_ptr ret = _parser->parseInput(rule, input, &parsedSize); if (parsedSize < input.size()) { bctbx_error("[belcard] Parsing ended prematuraly at pos %llu", (unsigned long long)parsedSize); } return ret; } shared_ptr BelCardParser::parseOne(const string &input) { string vcard = belcard_unfold(input); shared_ptr ret = _parse(vcard, "vcard"); shared_ptr belCard = dynamic_pointer_cast(ret); return belCard; } shared_ptr BelCardParser::parse(const string &input) { string vcards = belcard_unfold(input); shared_ptr ret = _parse(vcards, "vcard-list"); shared_ptr belCards = dynamic_pointer_cast(ret); return belCards; } shared_ptr BelCardParser::parseFile(const string &filename) { string vcard = belcard_read_file(filename); return parse(vcard); } belcard-5.3.105/src/belcard_property.cpp000066400000000000000000000137571464614212200201330ustar00rootroot00000000000000/* belcard_property.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard_property.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardProperty::parse(const string &input) { return BelCardProperty::parseProperty("X-PROPERTY", input); } void BelCardProperty::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("X-PROPERTY", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("X-PROPERTY-name", make_sfn(&BelCardProperty::setName)) ->setCollector("X-PROPERTY-value", make_sfn(&BelCardProperty::setValue)); } BelCardProperty::BelCardProperty() : BelCardGeneric() { } void BelCardProperty::setGroup(const string &group) { _group = group; } const string &BelCardProperty::getGroup() const { return _group; } void BelCardProperty::setName(const string &name) { _name = name; } const string &BelCardProperty::getName() const { return _name; } void BelCardProperty::setValue(const string &value) { string s = value; // Trim. s.erase(s.begin(), find_if(s.begin(), s.end(), [](const unsigned char &c) { return !isspace(c); })); s.erase(find_if(s.rbegin(), s.rend(), [](const unsigned char &c) { return !isspace(c); }).base(), s.end()); _value = s; } const string &BelCardProperty::getValue() const { return _value; } void BelCardProperty::setLanguageParam(const shared_ptr ¶m) { if (_lang_param) { removeParam(_lang_param); } _lang_param = param; _params.push_back(_lang_param); } const shared_ptr &BelCardProperty::getLanguageParam() const { return _lang_param; } void BelCardProperty::setValueParam(const shared_ptr ¶m) { if (_value_param) { removeParam(_value_param); } _value_param = param; _params.push_back(_value_param); } const shared_ptr &BelCardProperty::getValueParam() const { return _value_param; } void BelCardProperty::setPrefParam(const shared_ptr ¶m) { if (_pref_param) { removeParam(_pref_param); } _pref_param = param; _params.push_back(_pref_param); } const shared_ptr &BelCardProperty::getPrefParam() const { return _pref_param; } void BelCardProperty::setAlternativeIdParam(const shared_ptr ¶m) { if (_altid_param) { removeParam(_altid_param); } _altid_param = param; _params.push_back(_altid_param); } const shared_ptr &BelCardProperty::getAlternativeIdParam() const { return _altid_param; } void BelCardProperty::setParamIdParam(const shared_ptr ¶m) { if (_pid_param) { removeParam(_pid_param); } _pid_param = param; _params.push_back(_pid_param); } const shared_ptr &BelCardProperty::getParamIdParam() const { return _pid_param; } void BelCardProperty::setTypeParam(const shared_ptr ¶m) { if (_type_param) { removeParam(_type_param); } _type_param = param; _params.push_back(_type_param); } const shared_ptr &BelCardProperty::getTypeParam() const { return _type_param; } void BelCardProperty::setMediaTypeParam(const shared_ptr ¶m) { if (_mediatype_param) { removeParam(_mediatype_param); } _mediatype_param = param; _params.push_back(_mediatype_param); } const shared_ptr &BelCardProperty::getMediaTypeParam() const { return _mediatype_param; } void BelCardProperty::setCALSCALEParam(const shared_ptr ¶m) { if (_calscale_param) { removeParam(_calscale_param); } _calscale_param = param; _params.push_back(_calscale_param); } const shared_ptr &BelCardProperty::getCALSCALEParam() const { return _calscale_param; } void BelCardProperty::setSortAsParam(const shared_ptr ¶m) { if (_sort_as_param) { removeParam(_sort_as_param); } _sort_as_param = param; _params.push_back(_sort_as_param); } const shared_ptr &BelCardProperty::getSortAsParam() const { return _sort_as_param; } void BelCardProperty::setGeoParam(const shared_ptr ¶m) { if (_geo_param) { removeParam(_geo_param); } _geo_param = param; _params.push_back(_geo_param); } const shared_ptr &BelCardProperty::getGeoParam() const { return _geo_param; } void BelCardProperty::setTimezoneParam(const shared_ptr ¶m) { if (_tz_param) { removeParam(_tz_param); } _tz_param = param; _params.push_back(_tz_param); } const shared_ptr &BelCardProperty::getTimezoneParam() const { return _tz_param; } void BelCardProperty::addParam(const shared_ptr ¶m) { _params.push_back(param); } const list> &BelCardProperty::getParams() const { return _params; } void BelCardProperty::removeParam(const shared_ptr ¶m) { _params.remove(param); } void BelCardProperty::serialize(ostream &output) const { if (getGroup().length() > 0) { output << getGroup() << "."; } output << getName(); for (auto it = getParams().begin(); it != getParams().end(); ++it) { output << ";" << (**it); } output << ":" << getValue() << "\r\n"; } belcard-5.3.105/src/belcard_rfc6474.cpp000066400000000000000000000070301464614212200173310ustar00rootroot00000000000000/* belcard_rfc6474.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardBirthPlace::parse(const string &input) { return BelCardProperty::parseProperty("BIRTHPLACE", input); } void BelCardBirthPlace::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("BIRTHPLACE", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("BIRTHPLACE-value", make_sfn(&BelCardProperty::setValue)); } BelCardBirthPlace::BelCardBirthPlace() : BelCardProperty() { setName("BIRTHPLACE"); } shared_ptr BelCardDeathPlace::parse(const string &input) { return BelCardProperty::parseProperty("DEATHPLACE", input); } void BelCardDeathPlace::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("DEATHPLACE", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("DEATHPLACE-value", make_sfn(&BelCardProperty::setValue)); } BelCardDeathPlace::BelCardDeathPlace() : BelCardProperty() { setName("DEATHPLACE"); } shared_ptr BelCardDeathDate::parse(const string &input) { return BelCardProperty::parseProperty("DEATHDATE", input); } void BelCardDeathDate::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("DEATHDATE", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("LANGUAGE-param", make_sfn(&BelCardProperty::setLanguageParam)) ->setCollector("CALSCALE-param", make_sfn(&BelCardProperty::setCALSCALEParam)) ->setCollector("DEATHDATE-value", make_sfn(&BelCardProperty::setValue)); } BelCardDeathDate::BelCardDeathDate() : BelCardProperty() { setName("DEATHDATE"); }belcard-5.3.105/src/belcard_security.cpp000066400000000000000000000034231464614212200201030ustar00rootroot00000000000000/* belcard_security.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belr; using namespace ::belcard; shared_ptr BelCardKey::parse(const string &input) { return BelCardProperty::parseProperty("KEY", input); } void BelCardKey::setHandlerAndCollectors(Parser> *parser) { parser->setHandler("KEY", make_fn(BelCardGeneric::create)) ->setCollector("group", make_sfn(&BelCardProperty::setGroup)) ->setCollector("any-param", make_sfn(&BelCardProperty::addParam)) ->setCollector("VALUE-param", make_sfn(&BelCardProperty::setValueParam)) ->setCollector("ALTID-param", make_sfn(&BelCardProperty::setAlternativeIdParam)) ->setCollector("PID-param", make_sfn(&BelCardProperty::setParamIdParam)) ->setCollector("PREF-param", make_sfn(&BelCardProperty::setPrefParam)) ->setCollector("TYPE-param", make_sfn(&BelCardProperty::setTypeParam)) ->setCollector("KEY-value", make_sfn(&BelCardProperty::setValue)); } BelCardKey::BelCardKey() : BelCardProperty() { setName("KEY"); }belcard-5.3.105/src/belcard_utils.cpp000066400000000000000000000030311464614212200173670ustar00rootroot00000000000000/* belcard_utils.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard_utils.hpp" #include "bctoolbox/logging.h" #include "bctoolbox/utils.hh" #include #include #include #include using namespace ::std; string belcard_fold(const string &input) { return bctoolbox::Utils::fold(input); } string belcard_unfold(const string &input) { return bctoolbox::Utils::unfold(input); } string belcard_read_file(const string &filename) { const char *fName = filename.c_str(); ifstream istr(fName, ifstream::in | ifstream::binary); if (!istr || !istr.is_open() || istr.fail()) { bctbx_error("[belcard] Couldn't open file %s", fName); return string(); } string vcard; istr.seekg(0, ios::end); vcard.resize((size_t)istr.tellg()); istr.seekg(0, ios::beg); istr.read(&vcard[0], vcard.size()); istr.close(); return vcard; } belcard-5.3.105/src/vcard_grammar000066400000000000000000000440451464614212200166110ustar00rootroot00000000000000#!belrcore rulesabsolute-uri scheme: hier-part? queryadr group.adr; adr-param: adr-valueadr-code component, componentadr-country component, componentadr-ext component, componentadr-locality component, componentadr-param value-param label-param language-param geo-param-param tz-param-param altid-param pid-param pref-param type-param any-paramadr-pobox component, componentadr-region component, componentadr-street component, componentadr-value adr-pobox; adr-ext; adr-street; adr-locality; adr-region; adr-code; adr-countryalphaazAZalphanum alpha digitaltid-paramaltid= altid-param-value altid-param-value param-valueanniversary group.anniversary; anniversary-param: anniversary-valueanniversary-param value-param altid-param calscale-param any-paramanniversary-value date-and-or-time textany-param param-name= param-valueauthority userinfo@ host: portbday group.bday; bday-param: bday-valuebday-param value-param language-param altid-param calscale-param any-parambday-value date-and-or-time textbirthplace group.birthplace; birthplace-param: birthplace-valuebirthplace-param value-param altid-param language-param any-parambirthplace-value text uribit01booleantruefalsecaladruri group.caladruri; caladruri-param: caladruri-valuecaladruri-param value-param pid-param pref-param type-param mediatype-param altid-param any-param caladruri-value uricalscale-paramcalscale= calscale-param-valuecalscale-param-valuegregorian iana-token x-namecaluri group.caluri; caluri-param: caluri-valuecaluri-param value-param pid-param pref-param type-param mediatype-param altid-param any-param caluri-value uricategories group.categories; categories-param: categories-valuecategories-param value-param pid-param pref-param type-param altid-param any-param categories-value text-listcharclientpidmap group.clientpidmap; clientpidmap-param: clientpidmap-value clientpidmap-param any-paramclientpidmap-value digit; uricomponent component-charcomponent-char \\\,\;\n wsp non-ascii!+-:<[]~cr crlf cr lfctldate year month day year- month-- month day--- daydate-and-or-time date-time date time-designator timedate-and-or-time-list date-and-or-time, date-and-or-timedate-complete year month daydate-list date, datedate-noreduc year month day-- month day--- daydate-time date-noreduc time-designator time-notruncdate-time-list date-time, date-timeday digitdeathdate group.deathdate; deathdate-param: deathdate-valuedeathdate-param value-param altid-param language-param any-paramdeathdate-value date-and-or-time textdeathplace group.deathplace; deathplace-param: deathplace-valuedeathplace-param value-param altid-param language-param any-paramdeathplace-value text uridec-octet digit19 digit1 digit204 digit2505digit09dquote"email group.email; email-param: email-valueemail-param value-param pid-param pref-param type-param altid-param any-param email-value textextension singleton- alphanumextlang alpha- alphafburl group.fburl; fburl-param: fburl-valuefburl-param value-param pid-param pref-param type-param mediatype-param altid-param any-param fburl-value urifloat sign digit. digitfloat-list float, floatfn group.fn; fn-param: fn-valuefn-param value-param type-param language-param altid-param pid-param pref-param any-param fn-value textfragment pchar/?gen-delims:/?#[]@gender group.gender; gender-param: gender-valuegender-param value-param any-paramgender-value sex; textgeo group.geo; geo-param: geo-valuegeo-param value-param pid-param pref-param type-param mediatype-param altid-param any-paramgeo-param-paramgeo= geo-param-paramgeo-param-param-value dquote uri dquotegeo-value text urigrandfathered irregular regulargroup alpha digit-h16 hexdighexdig digitabcdefhier-part// authority path-abempty path-absolute path-rootless path-emptyhost ip-literal ipv4address reg-namehour digithtab iana-token alpha digit-impp group.impp; impp-param: impp-valueimpp-param value-param pid-param pref-param type-param mediatype-param altid-param any-param impp-value uriinteger sign digitinteger-list integer, integerip-literal[ ipv6address ipvfuture]ipv4address dec-octet. dec-octet. dec-octet. dec-octetipv6address  h16: ls32:: h16: ls32 h16:: h16: ls32 h16: h16:: h16: ls32 h16: h16:: h16: ls32 h16: h16:: h16: ls32 h16: h16:: ls32 h16: h16:: h16 h16: h16::ipvfuturev hexdig. unreserved sub-delims:irregularen-gb-oedi-amii-bnni-defaulti-enochiani-haki-klingoni-luxi-mingoi-navajoi-pwni-taoi-tayi-tsusgn-be-frsgn-be-nlsgn-ch-dekey group.key; key-param: key-valuekey-param value-param altid-param pid-param pref-param type-param any-paramkey-value uri textkind group.kind; kind-param: kind-valuekind-param value-param any-paramkind-valueindividualgrouporglocation iana-token x-namelabel-paramlabel= label-param-value label-param-value param-valuelang group.lang; lang-param: lang-valuelang-param value-param pid-param pref-param altid-param type-param any-param lang-value language-taglangtag language- script- region- variant- extension- privateuselanguage alpha- extlang alpha alphalanguage-paramlanguage= language-param-value language-param-value language-taglanguage-tag langtag privateuse grandfatheredlf list-component component, componentlogo group.logo; logo-param: logo-valuelogo-param value-param language-param pid-param pref-param type-param mediatype-param altid-param any-param logo-value urils32 h16: h16 ipv4addresslwsp wsp crlf wspmediatype-parammediatype= mediatype-param-valuemediatype-param-value type-name/ subtype-name; any-parammember group.member; member-param: member-valuemember-param value-param pid-param pref-param altid-param mediatype-param any-param member-value uriminute digitmonth digitn group.n; n-param: n-valuen-an component, componentn-fn component, componentn-gn component, componentn-param value-param sort-as-param language-param altid-param any-paramn-prefixes component, componentn-suffixes component, componentn-value n-fn; n-gn; n-an; n-prefixes; n-suffixesnickname group.nickname; nickname-param: nickname-valuenickname-param value-param type-param language-param altid-param pid-param pref-param any-param nickname-value text-listnon-ascii utf8-2 utf8-3 utf8-4note group.note; note-param: note-valuenote-param value-param language-param pid-param pref-param type-param altid-param any-param note-value textoctetorg group.org; org-param: org-valueorg-param value-param sort-as-param language-param pid-param pref-param altid-param type-param any-paramorg-value component; componentparam-name iana-token x-nameparam-value param-value-component, param-value-componentparam-value-component safe-char dquote qsafe-char dquotepath path-abempty path-absolute path-noscheme path-rootless path-emptypath-abempty/ segmentpath-absolute/ segment-nz/ segmentpath-empty pcharpath-noscheme segment-nz-nc/ segmentpath-rootless segment-nz/ segmentpchar unreserved pct-encoded sub-delims:@\,pct-encoded% hexdig hexdigphoto group.photo; photo-param: photo-valuephoto-param value-param altid-param type-param mediatype-param pref-param pid-param any-param photo-value uripid-parampid= pid-param-value, pid-param-valuepid-param-value digit. digitport digitpref-parampref= pref-param-valuepref-param-value digit100privateusex- alphanumprodid group.prodid; prodid-param: prodid-valueprodid-param value-param any-param prodid-value textproperty' source kind xml fn n nickname photo bday anniversary gender adr tel email impp lang tz geo title role logo org member related categories note prodid rev sound uid clientpidmap url key fburl caladruri caluri birthplace deathplace deathdate x-property cr lfqsafe-char wsp!#~ non-asciiquery pchar/?reg-name unreserved pct-encoded sub-delimsregion alpha digitregular art-lojbancel-gaulishno-bokno-nynzh-guoyuzh-hakkazh-minzh-min-nanzh-xiangrelated group.related; related-param: related-valuerelated-param value-param pid-param pref-param altid-param type-param any-paramrelated-type-valuecontactacquaintancefriendmetco-workercolleagueco-residentneighborchildparentsiblingspousekinmusecrushdatesweetheartmeagentemergencyrelated-value uri textrelative-part// authority path-abempty path-absolute path-noscheme path-emptyrelative-ref relative-part? query# fragmentreserved gen-delims sub-delimsrev group.rev; rev-param: rev-valuerev-param value-param any-param rev-value timestamprole group.role; role-param: role-valuerole-param value-param language-param pid-param pref-param type-param altid-param any-param role-value textsafe-char wsp!#+-9<~ non-asciischeme alpha alpha digit+-.script alphasecond digitsegment pcharsegment-nz pchar[]segment-nz-nc unreserved pct-encoded sub-delims@sexmfonusign+-singleton digitAWYZawyzsort-as-paramsort-as= sort-as-param-valuesort-as-param-value param-value, param-valuesound group.sound; sound-param: sound-valuesound-param value-param language-param pid-param pref-param type-param mediatype-param altid-param any-param sound-value urisource group.source; source-param: source-valuesource-param value-param pid-param pref-param altid-param mediatype-param any-param source-value urisp sub-delims !$&'()*+,;= subtype-name reg-nametel group.tel; tel-param: tel-valuetel-param value-param type-param pid-param pref-param altid-param any-paramtel-value uri texttext text-chartext-char\\\,\n wsp non-ascii!+-[]~text-list text, texttime hour minute second zone- minute second-- secondtime-complete hour minute second zonetime-designatorTtime-list time, timetime-notrunc hour minute second zonetimestamp date-complete time-designator time-completetimestamp-list timestamp, timestamptitle group.title; title-param: title-valuetitle-param value-param language-param pid-param pref-param altid-param type-param any-param title-value text type-name reg-nametype-paramtype= type-param-value, type-param-valuetype-param-related related-type-value, related-type-valuetype-param-tel textvoicefaxcellvideopagertextphone iana-token x-nametype-param-valueworkhome type-param-tel type-param-related iana-token x-nametz group.tz; tz-param: tz-valuetz-param value-param altid-param pid-param pref-param type-param mediatype-param any-paramtz-param-paramtz= tz-param-param-valuetz-param-param-value param-value dquote uri dquotetz-value text uri utc-offsetuid group.uid; uid-param: uid-valueuid-param value-param any-paramuid-value uri textunreserved alpha digit-._~uri scheme: hier-part? query# fragmenturi-reference uri relative-refurl group.url; url-param: url-valueurl-param value-param pid-param pref-param type-param mediatype-param altid-param any-param url-value uriuserinfo unreserved pct-encoded sub-delims:utc-designatorZutc-offset sign hour minuteutf8-1utf8-2 utf8-tailutf8-3 utf8-tail utf8-tail utf8-tail utf8-tailutf8-4 utf8-tail utf8-tail utf8-tailutf8-tailvalue-char wsp vchar non-asciivalue-paramvalue= value-param-valuevalue-param-value texturidatetimedate-timedate-and-or-timetimestampbooleanintegerfloatutc-offsetlanguage-tag x-namevariant alphanum digit alphanumvcard begin:vcard cr lfversion:4.0 cr lf propertyend:vcard cr lfvcard-list vcard vcardvchar!~wsp sp htabx-namex- alpha digit-x-property group. x-property-name; x-property-param: x-property-value x-property-name x-name x-property-param any-paramx-property-value text text-list date-list time-list date-time-list date-and-or-time-list timestamp-list boolean integer-list float-list uri utc-offset language-tagxml group.xml; xml-param: xml-valuexml-param value-param any-param xml-value textyear digitzone utc-designator utc-offsetbelcard-5.3.105/src/vcard_grammar.cpp000066400000000000000000000020041464614212200173570ustar00rootroot00000000000000/* vcard_grammar.cpp Copyright (C) 2017 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/vcard_grammar.hpp" #include "bctoolbox/logging.h" std::shared_ptr loadVcardGrammar() { std::shared_ptr grammar = belr::GrammarLoader::get().load(VCARD_GRAMMAR); if (!grammar) bctbx_fatal("Unable to load VCARD grammar."); return grammar; } belcard-5.3.105/src/vcard_rules000066400000000000000000000431441464614212200163140ustar00rootroot00000000000000vcard-list = vcard *vcard vcard = "BEGIN:VCARD" [CR] LF "VERSION:4.0" [CR] LF 1*property "END:VCARD" *([CR] LF) property = (SOURCE / KIND / XML / FN / N / NICKNAME / PHOTO / BDAY / ANNIVERSARY / GENDER / ADR / TEL / EMAIL / IMPP / LANG / TZ / GEO / TITLE / ROLE / LOGO / ORG / MEMBER / RELATED / CATEGORIES / NOTE / PRODID / REV / SOUND / UID / CLIENTPIDMAP / URL / KEY / FBURL / CALADRURI / CALURI / BIRTHPLACE / DEATHPLACE / DEATHDATE / X-PROPERTY) [CR] LF X-PROPERTY = [group "."] X-PROPERTY-name *(";" X-PROPERTY-param) ":" X-PROPERTY-value X-PROPERTY-name = x-name X-PROPERTY-param = any-param X-PROPERTY-value = text / text-list / date-list / time-list / date-time-list / date-and-or-time-list / timestamp-list / boolean / integer-list / float-list / URI / utc-offset / Language-Tag SOURCE = [group "."] "SOURCE" *(";" SOURCE-param) ":" SOURCE-value SOURCE-param = VALUE-param / PID-param / PREF-param / ALTID-param / MEDIATYPE-param / any-param SOURCE-value = URI KIND = [group "."] "KIND" *(";" KIND-param) ":" KIND-value KIND-param = VALUE-param / any-param KIND-value = "individual" / "group" / "org" / "location" / iana-token / x-name XML = [group "."] "XML" *(";" XML-param) ":" XML-value XML-param = VALUE-param / any-param XML-value = text FN = [group "."] "FN" *(";" FN-param) ":" FN-value FN-param = VALUE-param / TYPE-param / LANGUAGE-param / ALTID-param / PID-param / PREF-param / any-param FN-value = text N = [group "."] "N" *(";" N-param) ":" N-value N-param = VALUE-param / SORT-AS-param / LANGUAGE-param / ALTID-param / any-param N-value = N-fn ";" N-gn ";" N-an ";" N-prefixes ";" N-suffixes N-fn = component *("," component) N-gn = component *("," component) N-an = component *("," component) N-prefixes = component *("," component) N-suffixes = component *("," component) NICKNAME = [group "."] "NICKNAME" *(";" NICKNAME-param) ":" NICKNAME-value NICKNAME-param = VALUE-param / TYPE-param / LANGUAGE-param / ALTID-param / PID-param / PREF-param / any-param NICKNAME-value = text-list BDAY = [group "."] "BDAY" *(";" BDAY-param) ":" BDAY-value BDAY-param = VALUE-param / LANGUAGE-param / ALTID-param / CALSCALE-param / any-param BDAY-value = date-and-or-time / text ANNIVERSARY = [group "."] "ANNIVERSARY" *(";" ANNIVERSARY-param) ":" ANNIVERSARY-value ANNIVERSARY-param = VALUE-param / ALTID-param / CALSCALE-param / any-param ANNIVERSARY-value = date-and-or-time / text GENDER = [group "."] "GENDER" *(";" GENDER-param) ":" GENDER-value GENDER-param = VALUE-param / any-param GENDER-value = [sex] [";" text] sex = "M" / "F" / "O" / "N" / "U" PHOTO = [group "."] "PHOTO" *(";" PHOTO-param) ":" PHOTO-value PHOTO-param = VALUE-param / ALTID-param / TYPE-param / MEDIATYPE-param / PREF-param / PID-param / any-param PHOTO-value = URI ADR = [group "."] "ADR" *(";" ADR-param) ":" ADR-value ADR-param = VALUE-param / LABEL-param / LANGUAGE-param / GEO-PARAM-param / TZ-PARAM-param / ALTID-param / PID-param / PREF-param / TYPE-param / any-param ADR-value = ADR-pobox ";" ADR-ext ";" ADR-street ";" ADR-locality ";" ADR-region ";" ADR-code ";" ADR-country ADR-pobox = component *("," component) ADR-ext = component *("," component) ADR-street = component *("," component) ADR-locality = component *("," component) ADR-region = component *("," component) ADR-code = component *("," component) ADR-country = component *("," component) TEL = [group "."] "TEL" *(";" TEL-param) ":" TEL-value TEL-param = VALUE-param / TYPE-param / PID-param / PREF-param / ALTID-param / any-param TEL-value = URI / text EMAIL = [group "."] "EMAIL" *(";" EMAIL-param) ":" EMAIL-value EMAIL-param = VALUE-param / PID-param / PREF-param / TYPE-param / ALTID-param / any-param EMAIL-value = text IMPP = [group "."] "IMPP" *(";" IMPP-param) ":" IMPP-value IMPP-param = VALUE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param IMPP-value = URI LANG = [group "."] "LANG" *(";" LANG-param) ":" LANG-value LANG-param = VALUE-param / PID-param / PREF-param / ALTID-param / TYPE-param / any-param LANG-value = Language-Tag TZ = [group "."] "TZ" *(";" TZ-param) ":" TZ-value TZ-param = VALUE-param / ALTID-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / any-param TZ-value = text / URI / utc-offset GEO = [group "."] "GEO" *(";" GEO-param) ":" GEO-value GEO-param = VALUE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param GEO-value = text / URI TITLE = [group "."] "TITLE" *(";" TITLE-param) ":" TITLE-value TITLE-param = VALUE-param / LANGUAGE-param / PID-param / PREF-param / ALTID-param / TYPE-param / any-param TITLE-value = text ROLE = [group "."] "ROLE" *(";" ROLE-param) ":" ROLE-value ROLE-param = VALUE-param / LANGUAGE-param / PID-param / PREF-param / TYPE-param / ALTID-param / any-param ROLE-value = text LOGO = [group "."] "LOGO" *(";" LOGO-param) ":" LOGO-value LOGO-param = VALUE-param / LANGUAGE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param LOGO-value = URI ORG = [group "."] "ORG" *(";" ORG-param) ":" ORG-value ORG-param = VALUE-param / SORT-AS-param / LANGUAGE-param / PID-param / PREF-param / ALTID-param / TYPE-param / any-param ORG-value = component *(";" component) MEMBER = [group "."] "MEMBER" *(";" MEMBER-param) ":" MEMBER-value MEMBER-param = VALUE-param / PID-param / PREF-param / ALTID-param / MEDIATYPE-param / any-param MEMBER-value = URI RELATED = [group "."] "RELATED" *(";" RELATED-param) ":" RELATED-value RELATED-param = VALUE-param / PID-param / PREF-param / ALTID-param / TYPE-param / any-param RELATED-value = URI / text CATEGORIES = [group "."] "CATEGORIES" *(";" CATEGORIES-param) ":" CATEGORIES-value CATEGORIES-param = VALUE-param / PID-param / PREF-param / TYPE-param / ALTID-param / any-param CATEGORIES-value = text-list NOTE = [group "."] "NOTE" *(";" NOTE-param) ":" NOTE-value NOTE-param = VALUE-param / LANGUAGE-param / PID-param / PREF-param / TYPE-param / ALTID-param / any-param NOTE-value = text PRODID = [group "."] "PRODID" *(";" PRODID-param) ":" PRODID-value PRODID-param = VALUE-param / any-param PRODID-value = text REV = [group "."] "REV" *(";" REV-param) ":" REV-value REV-param = VALUE-param / any-param REV-value = timestamp SOUND = [group "."] "SOUND" *(";" SOUND-param) ":" SOUND-value SOUND-param = VALUE-param / LANGUAGE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param SOUND-value = URI UID = [group "."] "UID" *(";" UID-param) ":" UID-value UID-param = VALUE-param / any-param UID-value = URI / text CLIENTPIDMAP = [group "."] "CLIENTPIDMAP" *(";" CLIENTPIDMAP-param) ":" CLIENTPIDMAP-value CLIENTPIDMAP-param = any-param CLIENTPIDMAP-value = 1*DIGIT ";" URI URL = [group "."] "URL" *(";" URL-param) ":" URL-value URL-param = VALUE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param URL-value = URI KEY = [group "."] "KEY" *(";" KEY-param) ":" KEY-value KEY-param = VALUE-param / ALTID-param / PID-param / PREF-param / TYPE-param / any-param KEY-value = URI / text FBURL = [group "."] "FBURL" *(";" FBURL-param) ":" FBURL-value FBURL-param = VALUE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param FBURL-value = URI CALADRURI = [group "."] "CALADRURI" *(";" CALADRURI-param) ":" CALADRURI-value CALADRURI-param = VALUE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param CALADRURI-value = URI CALURI = [group "."] "CALURI" *(";" CALURI-param) ":" CALURI-value CALURI-param = VALUE-param / PID-param / PREF-param / TYPE-param / MEDIATYPE-param / ALTID-param / any-param CALURI-value = URI BIRTHPLACE = [group "."] "BIRTHPLACE" *(";" BIRTHPLACE-param) ":" BIRTHPLACE-value BIRTHPLACE-param = VALUE-param / ALTID-param / LANGUAGE-param / any-param BIRTHPLACE-value = text / URI DEATHPLACE = [group "."] "DEATHPLACE" *(";" DEATHPLACE-param) ":" DEATHPLACE-value DEATHPLACE-param = VALUE-param / ALTID-param / LANGUAGE-param / any-param DEATHPLACE-value = text / URI DEATHDATE = [group "."] "DEATHDATE" *(";" DEATHDATE-param) ":" DEATHDATE-value DEATHDATE-param = VALUE-param / ALTID-param / LANGUAGE-param / any-param DEATHDATE-value = date-and-or-time / text group = 1*(ALPHA / DIGIT / "-") LANGUAGE-param = "LANGUAGE=" LANGUAGE-param-value LANGUAGE-param-value = Language-Tag VALUE-param = "VALUE=" VALUE-param-value VALUE-param-value = "text" / "uri" / "date" / "time" / "date-time" / "date-and-or-time" / "timestamp" / "boolean" / "integer" / "float" / "utc-offset" / "language-tag" / x-name PREF-param = "PREF=" PREF-param-value PREF-param-value = (1*2DIGIT / "100") ALTID-param = "ALTID=" ALTID-param-value ALTID-param-value = param-value PID-param = "PID=" PID-param-value *("," PID-param-value) PID-param-value = 1*DIGIT ["." 1*DIGIT] TYPE-param = "TYPE=" TYPE-param-value *("," TYPE-param-value) TYPE-param-value = "work" / "home" / type-param-tel / type-param-related / iana-token / x-name MEDIATYPE-param = "MEDIATYPE=" MEDIATYPE-param-value MEDIATYPE-param-value = type-name "/" subtype-name *( ";" any-param ) CALSCALE-param = "CALSCALE=" CALSCALE-param-value CALSCALE-param-value = "gregorian" / iana-token / x-name SORT-AS-param = "SORT-AS=" SORT-AS-param-value SORT-AS-param-value = param-value *("," param-value) GEO-PARAM-param = "GEO=" GEO-PARAM-param GEO-PARAM-param-value = DQUOTE URI DQUOTE TZ-PARAM-param = "TZ=" TZ-PARAM-param-value TZ-PARAM-param-value = (param-value / DQUOTE URI DQUOTE) LABEL-param = "LABEL=" LABEL-param-value LABEL-param-value = param-value any-param = param-name "=" param-value param-name = (iana-token / x-name) param-value = param-value-component *("," param-value-component) param-value-component = *SAFE-CHAR / (DQUOTE *QSAFE-CHAR DQUOTE) iana-token = 1*(ALPHA / DIGIT / "-") x-name = "x-" 1*(ALPHA / DIGIT / "-") COMPONENT-CHAR = "\\" / "\," / "\;" / "\n" / WSP / NON-ASCII / %x21-2B / %x2D-3A / %x3C-5B / %x5D-7E component = *COMPONENT-CHAR list-component = component *("," component) text-list = text *("," text) text = *TEXT-CHAR TEXT-CHAR = "\\" / "\," / "\n" / WSP / NON-ASCII / %x21-2B / %x2D-5B / %x5D-7E NON-ASCII = UTF8-2 / UTF8-3 / UTF8-4 QSAFE-CHAR = WSP / "!" / %x23-7E / NON-ASCII SAFE-CHAR = WSP / "!" / %x23-2B / %x2D-39 / %x3C-7E / NON-ASCII VALUE-CHAR = WSP / VCHAR / NON-ASCII UTF8-1 = %x00-7F UTF8-2 = %xC2-DF UTF8-tail UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / %xF4 %x80-8F 2( UTF8-tail ) UTF8-tail = %x80-BF date-list = date *("," date) time-list = time *("," time) date-time-list = date-time *("," date-time) date-and-or-time-list = date-and-or-time *("," date-and-or-time) timestamp-list = timestamp *("," timestamp) integer-list = integer *("," integer) float-list = float *("," float) boolean = "TRUE" / "FALSE" integer = [sign] 1*DIGIT float = [sign] 1*DIGIT ["." 1*DIGIT] sign = "+" / "-" year = 4DIGIT ; 0000-9999 month = 2DIGIT ; 01-12 day = 2DIGIT ; 01-28/29/30/31 depending on month and leap year hour = 2DIGIT ; 00-23 minute = 2DIGIT ; 00-59 second = 2DIGIT ; 00-58/59/60 depending on leap second zone = utc-designator / utc-offset utc-designator = %x5A ; uppercase "Z" date = year [month day] / year "-" month / "--" month [day] / "--" "-" day date-noreduc = year month day / "--" month day / "--" "-" day date-complete = year month day time = hour [minute [second]] [zone] / "-" minute [second] / "-" "-" second time-notrunc = hour [minute [second]] [zone] time-complete = hour minute second [zone] time-designator = %x54 ; uppercase "T" date-time = date-noreduc time-designator time-notrunc timestamp = date-complete time-designator time-complete date-and-or-time = date-time / date / time-designator time utc-offset = sign hour [minute] type-param-related = related-type-value *("," related-type-value) related-type-value = "contact" / "acquaintance" / "friend" / "met" / "co-worker" / "colleague" / "co-resident" / "neighbor" / "child" / "parent" / "sibling" / "spouse" / "kin" / "muse" / "crush" / "date" / "sweetheart" / "me" / "agent" / "emergency" type-param-tel = "text" / "voice" / "fax" / "cell" / "video" / "pager" / "textphone" / iana-token / x-name type-name = reg-name subtype-name = reg-name URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty URI-reference = URI / relative-ref absolute-URI = scheme ":" hier-part [ "?" query ] relative-ref = relative-part [ "?" query ] [ "#" fragment ] relative-part = "//" authority path-abempty / path-absolute / path-noscheme / path-empty scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) authority = [ userinfo "@" ] host [ ":" port ] userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) host = IP-literal / IPv4address / reg-name port = *DIGIT IP-literal = "[" ( IPv6address / IPvFuture ) "]" IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) IPv6address = 6( h16 ":" ) ls32 / "::" 5( h16 ":" ) ls32 / [ h16 ] "::" 4( h16 ":" ) ls32 / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 / [ *4( h16 ":" ) h16 ] "::" ls32 / [ *5( h16 ":" ) h16 ] "::" h16 / [ *6( h16 ":" ) h16 ] "::" h16 = 1*4HEXDIG ls32 = ( h16 ":" h16 ) / IPv4address IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet dec-octet = DIGIT ; 0-9 / %x31-39 DIGIT ; 10-99 / "1" 2DIGIT ; 100-199 / "2" %x30-34 DIGIT ; 200-249 / "25" %x30-35 ; 250-255 reg-name = *( unreserved / pct-encoded / sub-delims ) path = path-abempty ; begins with "/" or is empty / path-absolute ; begins with "/" but not "//" / path-noscheme ; begins with a non-colon segment / path-rootless ; begins with a segment / path-empty ; zero characters path-abempty = *( "/" segment ) path-absolute = "/" [ segment-nz *( "/" segment ) ] path-noscheme = segment-nz-nc *( "/" segment ) path-rootless = segment-nz *( "/" segment ) path-empty = [pchar] segment = *pchar segment-nz = 1*( pchar / "[" / "]" ) ; to be compatible with IPv6 SIP URIs segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" ) ; non-zero-length segment without any colon ":" pchar = unreserved / pct-encoded / sub-delims / ":" / "@" / "\," query = *( pchar / "/" / "?" ) fragment = *( pchar / "/" / "?" ) pct-encoded = "%" HEXDIG HEXDIG unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" Language-Tag = langtag ; normal language tags / privateuse ; private use tag / grandfathered ; grandfathered tags langtag = language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse] language = 2*3ALPHA ; shortest ISO 639 code ["-" extlang] ; sometimes followed by extended language subtags / 4ALPHA ; or reserved for future use / 5*8ALPHA ; or registered language subtag extlang = 3ALPHA ; selected ISO 639 codes *2("-" 3ALPHA) ; permanently reserved script = 4ALPHA ; ISO 15924 code region = 2ALPHA ; ISO 3166-1 code / 3DIGIT ; UN M.49 code variant = 5*8alphanum ; registered variants / (DIGIT 3alphanum) extension = singleton 1*("-" (2*8alphanum)) singleton = DIGIT ; 0 - 9 / %x41-57 ; A - W / %x59-5A ; Y - Z / %x61-77 ; a - w / %x79-7A ; y - z privateuse = "x" 1*("-" (1*8alphanum)) grandfathered = irregular ; non-redundant tags registered / regular ; during the RFC 3066 era irregular = "en-GB-oed" ; irregular tags do not match / "i-ami" ; the 'langtag' production and / "i-bnn" ; would not otherwise be / "i-default" ; considered 'well-formed' / "i-enochian" ; These tags are all valid, / "i-hak" ; but most are deprecated / "i-klingon" ; in favor of more modern / "i-lux" ; subtags or subtag / "i-mingo" ; combination / "i-navajo" / "i-pwn" / "i-tao" / "i-tay" / "i-tsu" / "sgn-BE-FR" / "sgn-BE-NL" / "sgn-CH-DE" regular = "art-lojban" ; these tags match the 'langtag' / "cel-gaulish" ; production, but their subtags / "no-bok" ; are not extended language / "no-nyn" ; or variant subtags: their meaning / "zh-guoyu" ; is defined by their registration / "zh-hakka" ; and all of these are deprecated / "zh-min" ; in favor of a more modern / "zh-min-nan" ; subtag or sequence of subtags / "zh-xiang" alphanum = (ALPHA / DIGIT) ; letters and numbers belcard-5.3.105/tester/000077500000000000000000000000001464614212200145715ustar00rootroot00000000000000belcard-5.3.105/tester/.bc_tester_utils.tmp000066400000000000000000000000001464614212200205510ustar00rootroot00000000000000belcard-5.3.105/tester/CMakeLists.txt000066400000000000000000000045671464614212200173450ustar00rootroot00000000000000############################################################################ # CMakeLists.txt # Copyright (C) 2015-2023 Belledonne Communications, Grenoble France # ############################################################################ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################################################ set(BELCARD_LIBRARIES_FOR_TESTER belcard) set(VCARD_FILES vcards/foldtest.vcf vcards/unfoldtest.vcf vcards/vcard.vcf vcards/vcards.vcf ) set(HEADER_FILES_CXX belcard-tester.hpp) set(SOURCE_FILES_CXX belcard-addressing-tester.cpp belcard-calendar-tester.cpp belcard-communication-tester.cpp belcard-explanatory-tester.cpp belcard-general-tester.cpp belcard-geographical-tester.cpp belcard-identification-tester.cpp belcard-organizational-tester.cpp belcard-rfc6474-tester.cpp belcard-security-tester.cpp belcard-tester.cpp belcard-vcard-tester.cpp ) bc_apply_compile_flags(SOURCE_FILES_CXX STRICT_OPTIONS_CPP STRICT_OPTIONS_CXX) add_executable(belcard-tester ${SOURCE_FILES_CXX} ${HEADER_FILES_CXX}) set_target_properties(belcard-tester PROPERTIES LINKER_LANGUAGE CXX) target_include_directories(belcard-tester PRIVATE ${BCTOOLBOX_INCLUDE_DIRS}) target_link_libraries(belcard-tester belcard belr bctoolbox bctoolbox-tester) if(NOT IOS) install(TARGETS belcard-tester RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) endif() install(FILES ${VCARD_FILES} DESTINATION "${CMAKE_INSTALL_DATADIR}/belcard-tester/vcards") belcard-5.3.105/tester/Makefile.am000066400000000000000000000017421464614212200166310ustar00rootroot00000000000000EXTRA_DIST=vcards/vcard.vcf vcards/vcards.vcf vcards/unfoldtest.vcf vcards/foldtest.vcf if BUILD_TESTS noinst_PROGRAMS=belcard-tester belcard_tester_SOURCES=belcard-tester.cpp belcard-tester.hpp \ belcard-general-tester.cpp \ belcard-identification-tester.cpp \ belcard-addressing-tester.cpp \ belcard-communication-tester.cpp \ belcard-geographical-tester.cpp \ belcard-organizational-tester.cpp \ belcard-explanatory-tester.cpp \ belcard-security-tester.cpp \ belcard-calendar-tester.cpp \ belcard-rfc6474-tester.cpp \ belcard-vcard-tester.cpp belcard_tester_LDADD=$(top_builddir)/src/libbelcard.la $(BELR_LIBS) -lbcunit $(BCTOOLBOX_LIBS) $(BCTOOLBOXTESTER_LIBS) belcard_tester_CFLAGS=\ -DBC_CONFIG_FILE=\"config.h\" \ $(BCUNIT_CFLAGS) belcard_tester_CXXFLAGS=$(BELR_CFLAGS) belcard_tester_AM_CPPFLAGS=-I$(top_srcdir)/include \ -I$(top_srcdir)/tester \ -I$(top_srcdir)/tester/common endif # BUILD_TESTS AM_CPPFLAGS=-I$(top_srcdir)/include belcard-5.3.105/tester/belcard-addressing-tester.cpp000066400000000000000000000023161464614212200223200ustar00rootroot00000000000000/* belcard-addressing-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void adr_property(void) { test_property("ADR;TYPE=work:;;34 avenue de l'Europe,le Trident bat D;GRENOBLE;;38100;FRANCE\r\n"); } static test_t tests[] = { TEST_NO_TAG("Adr", adr_property), }; test_suite_t vcard_addressing_properties_test_suite = { "Addressing", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-calendar-tester.cpp000066400000000000000000000030471464614212200217500ustar00rootroot00000000000000/* belcard-calendar-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void fburl_property(void) { test_property("FBURL;MEDIATYPE=text/calendar:ftp://example.com/busy/project-a.ifb\r\n"); } static void caladruri_property(void) { test_property("CALADRURI:http://example.com/calendar/jdoe\r\n"); } static void caluri_property(void) { test_property("CALURI;MEDIATYPE=text/calendar:ftp://ftp.example.com/calA.ics\r\n"); } static test_t tests[] = { TEST_NO_TAG("FBURL", fburl_property), TEST_NO_TAG("CALADRURI", caladruri_property), TEST_NO_TAG("CALURI", caluri_property), }; test_suite_t vcard_calendar_properties_test_suite = { "Calendar", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-communication-tester.cpp000066400000000000000000000035641464614212200230500ustar00rootroot00000000000000/* belcard-communication-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void tel_property(void) { test_property("TEL;VALUE=uri;TYPE=work:tel:+33-9-52-63-65-05\r\n"); test_property("TEL;VALUE=uri;TYPE=\"voice,work\":tel:+33952636505\r\n"); test_property("TEL;VALUE=text;TYPE=work:+33 9 52 63 65 05\r\n"); } static void email_property(void) { test_property("EMAIL;TYPE=work:sylvain.berfini@belledonne-communications.com\r\n"); } static void impp_property(void) { test_property("IMPP;TYPE=work:sip:sylvain@sip.linphone.org\r\n"); } static void lang_property(void) { test_property("LANG;TYPE=home:fr\r\n"); test_property("LANG:fr-FR\r\n"); } static test_t tests[] = { TEST_NO_TAG("Tel", tel_property), TEST_NO_TAG("Email", email_property), TEST_NO_TAG("IMPP", impp_property), TEST_NO_TAG("Language", lang_property), }; test_suite_t vcard_communication_properties_test_suite = { "Communication", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-explanatory-tester.cpp000066400000000000000000000060451464614212200225460ustar00rootroot00000000000000/* belcard-explanatory-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void categories_property(void) { test_property("CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY\r\n"); } static void note_property(void) { test_property("NOTE:This fax number is operational 0800 to 1715\\n EST\\, Mon-Fri.\r\n"); } static void prodid_property(void) { test_property("PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN\r\n"); } static void rev_property(void) { test_property("REV:19951031T222710Z\r\n"); shared_ptr card = BelCardGeneric::create(); shared_ptr rev = BelCardGeneric::create(); rev->setValue("AZERTY"); BC_ASSERT_FALSE(BelCardGeneric::isValid(rev)); card->setRevision(rev); BC_ASSERT_TRUE(card->getRevision() == NULL); rev->setValue("19951031T222710Z"); BC_ASSERT_TRUE(BelCardGeneric::isValid(rev)); card->setRevision(rev); BC_ASSERT_TRUE(card->getRevision() != NULL); } static void sound_property(void) { test_property("SOUND:data:audio/" "basic;base64," "MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlI" "ENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0\r\n"); } static void uid_property(void) { test_property("UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6\r\n"); } static void clientpidmap_property(void) { test_property("CLIENTPIDMAP:1;urn:uuid:3df403f4-5924-4bb7-b077-3c711d9eb34b\r\n"); } static void url_property(void) { test_property("URL:http://example.org/restaurant.french/~chezchic.html\r\n"); } static test_t tests[] = { TEST_NO_TAG("CATEGORIES", categories_property), TEST_NO_TAG("NOTE", note_property), TEST_NO_TAG("PRODID", prodid_property), TEST_NO_TAG("REV", rev_property), TEST_NO_TAG("SOUND", sound_property), TEST_NO_TAG("UID", uid_property), TEST_NO_TAG("CLIENTPIDMAP", clientpidmap_property), TEST_NO_TAG("URL", url_property), }; test_suite_t vcard_explanatory_properties_test_suite = { "Explanatory", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-general-tester.cpp000066400000000000000000000044161464614212200216150ustar00rootroot00000000000000/* belcard-general-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void kind_property(void) { test_property("KIND:individual\r\n"); } static void source_property(void) { test_property("SOURCE:ldap://ldap.example.com/cn=Babs%20Jensen,%20o=Babsco,%20c=US\r\n"); test_property("SOURCE:http://directory.example.com/addressbooks/jdoe/Jean%20Dupont.vcf\r\n"); shared_ptr card = BelCardGeneric::create(); shared_ptr source = BelCardGeneric::create(); source->setValue("AZERTY"); BC_ASSERT_FALSE(BelCardGeneric::isValid(source)); card->addSource(source); BC_ASSERT_TRUE(card->getSource().size() == 0); source->setValue("https://www.linphone.org/"); BC_ASSERT_TRUE(BelCardGeneric::isValid(source)); card->addSource(source); BC_ASSERT_TRUE(card->getSource().size() == 1); } static void xml_property(void) { test_property( "XML:\r\n"); } static test_t tests[] = { TEST_NO_TAG("Kind", kind_property), TEST_NO_TAG("Source", source_property), TEST_NO_TAG("XML", xml_property), }; test_suite_t vcard_general_properties_test_suite = {"General", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-geographical-tester.cpp000066400000000000000000000024351464614212200226240ustar00rootroot00000000000000/* belcard-geographical-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void tz_property(void) { test_property("TZ:Paris/Europe\r\n"); } static void geo_property(void) { test_property("GEO:geo:45.159612\\,5.732511\r\n"); } static test_t tests[] = { TEST_NO_TAG("TZ", tz_property), TEST_NO_TAG("Geo", geo_property), }; test_suite_t vcard_geographical_properties_test_suite = { "Geographical", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-identification-tester.cpp000066400000000000000000000127731464614212200231760ustar00rootroot00000000000000/* belcard-identification-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void fn_property(void) { test_property("FN:Sylvain Berfini\r\n"); test_property("FN:François Grisez\r\n"); } static void n_property(void) { test_property("N:Berfini;Sylvain;Pascal;;\r\n"); } static void nickname_property(void) { test_property("NICKNAME;TYPE=home:Viish\r\n"); } static void bday_property(void) { test_property("BDAY:19891001\r\n"); test_property("BDAY;VALUE=text:1er Octobre 1989\r\n"); } static void anniversary_property(void) { test_property("ANNIVERSARY;VALUE=date-and-or-time:20140621\r\n"); } static void gender_property(void) { test_property("GENDER:M\r\n"); test_property("GENDER:F;just kidding\r\n"); } static void photo_property(void) { test_property("PHOTO;TYPE=work;VALUE=URL;MEDIATYPE=image/png:http://" "www.belledonne-communications.com/uploads/images/belledonne-communications.png\r\n"); test_property( "PHOTO:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAAehFoBAAAABmJLR0QA/wD/" "AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH3wkYDSo4+LD+vgAAB/pJREFUWMPtmH1sXXUZxz/" "P75x7z23X3q5rx9bSrVs3Fjbes43RrY5XRYQJiNEoiSLRbRIiQQIYSDQoiCAvQtWxgWgw/qEhKAYxYMabW5tNQdjYSthYt67jrqPrbt/u2zm/" "3+Mf965NJTJsBybaJzm5557fy/mc73l+z/" "P8DkzapE3apP1PmUxo9Pp2WNNcPH+krRwjdSBVOA2ILFjNEUVpOo+k+Onncv9d4KOw69sXAhswsgIA6+SsZEBLQxXV5QEJTzSdCzlwOPPcb95+" "by3fPm+fqiIiHxPwKOgKjDyK04XTEx6ty+bwVn+Gv3T3c2Z1GZc2VtM0tZykb0j4BmMMe49kePvw0Ov1lYmrW+" "bU7OSRV2Dtyo9B4Q3trSjXn1FTzhUnJvE9w8PbU1y7cAbXzK+lY7DAS119DIaWuGeYGsSoi3vMqy7jlGnl9AzlGYjc9y+eV/" "u9j1bh9e0xRN4Uw4Ib5teSAZ7u7ONT9Ul++ckFfH3jbl460M+aRTP4ztJZhE5J5yI60xkiq5yYTDCjIg4KgW9Qp38zRppFxH5YBP8/" "cgNhR0L0pHXNc7j39RSpTIGtnz+dP+7p4zNPbuOiudN47ML5dPfn+NKzbxEVQgqRklOl4IoHIhQ84fFz53HaCRVLgU1A8/FXeF1b6+k1Zdd/" "ec401u3oob48zp9XLeLmzZ3s6B3mB8vnsKK+inu27OO11CDTEz5OIXJKhBJaJa9K1jpyTtmTCbnypFpaP9GEwu1G5IfHB3h9G1hdcUZt+" "aa1p9Tx4N+7qU54vHD5qbQ8tZ2GuMd9F8wnGfO5aeMupgceVotDFcWpEjlKCjtyVsk4x2Ck9EaWk6vLePqyU1BoFOg6VvSQD+" "MKdU9s2Xnr6Q0LW7elGChEdH1lCa1vvEuVET49r5bQOe5v30eZ7+EJIyHLaRHYOqVgHQUHWevIWseQdQxEyiFrWTW3hoda5m4VkWUTV/" "iOPy2885JTd969LUVj4PP0qkUkxNCQDADoTGe5Z3MnU+MxfAOekZFJlZJLOCV0St4WFc5ay7BVBiNHX+" "TYmS3w1AUncVlTzVQR6f8gHHMs3s3XLl//" "o45DVPmG8+dU86udPXQOjiatx994l2mJGHEfAs+Q8IREKfYGnpDwDIEvxD1D4BniBuLGEIgQGKHcCPVBjG9t7QJ44Fg8HwisquVf2LirJe+U+" "RUBd5/" "dyNauNFO80WHlniFmIDCGuCfEPY+4Z0qAXvGaKYLGTBE8ZqR4boS4CBUidA4X+GtX+msTCmuyob0Oz+" "ABty1u4ILfb6fOGKzq6AQCvilBeAZPwJiSDztFMIBDMVh1+" "CrEBHyR0gFxgaTvcfmLu1DVOhFJjc8lxFQhyKLKBNPKYiQFBlGW1iVHurjSJCdUBNSWxxAEj6KqMSOIFOuGmRUBDckEycBnOHJ4BoyAb4rgcYE" "jkZVvvLCreiKJIwDhF+c2cdfW/fgi3L5s9pgOS+qSXNhUM+baS5197D48TAScNiPJRfPGtqcG89z+yh5QN7Ly/" "ZJ+v95zOJjQoiOyGKe81jvMsMLiuiTZyI00/" "ysswHlzp3HxgulcsuCE98EC1FUGPH7pQmZWBu+LWXmV8S86Qpu7cvZUHu7o4cSETzLhExdh07sDY7oN5CPa96fp6s+OXJuVTDC3umzk/" "950li3daUJbfNiX96d5J50FLbpVVFzlgObG7xL9w+l7l56hV23cLUOh5f6zGtiw4yBLpleMAbmvbS8NFQEFq6xonPo+1Z/" "q6GFLdz8i8LNXu7l+ySzubd9LmeeRjixWlYKWQrejb9wK37h4dmretHI6hvKIwvJZVTzT2UfcjL62Jzt6qCmLEakS+" "MKW7vSYOXozBXYeGiLuCU6hOu7z6D8OUBX3iFCsQl6VIdViMFnb3DNu4AcvPjn3xLbUc6EqtZUBTqEQWjJuNKzlQkfBKqEr/" "g6Hjlw4Wi3mI0fBOkILYameKDglLNUXeVWGXDEEgrZOKHEAXPP822tAmDElRtZaIutIZcOR9rLAIx85cpGSd46YZ0jEvJH2ysCnN2dLD1SEHSh" "EFFSLadoph9UV/" "ddx64SBueX8Lpy+Pn9KwIGBPENWeedIZqT5pmWNZFAGQsvBTMhXz6wfMzwZ+NzcPJtULuS9QoSN+1x39my6chFZVdLWMewUHJtY25w/" "DuVlO2TChT9eOWfnomQZN7TtpcwTtl29eEy3TGiLe7d/Ux4eLYISflGj9p5Brnq2g0Mi2MhB5Gow0jeyCx+3wmua4caVHdecPOOO/" "UMFUlaJFM7/w5slvyvVFDFvDOzdbXt56NXu0XBkZAQWoNwIWc9grYLqdXxz+TFhP/SO4+i2/Isv7t762z29Sys9Q71nGAwtP1/" "ZxLK6KuJGiFTZn85yy+" "ZOako1x6AR7mtpYmZFHBEhF1o2bE9x55sHwTNg3TOsaV710WxCH3zZY0p8M55ZFjdCvSdUilBxtAITQVC8ktKqEKkSKhRQhq3Sbx0HrBbfjnXP" "IHyW1c360W7z17ffhpG7xBPKjaHWCBUCcRE8kRE/" "U4rAxTgLh50j4xQ96garm9d9jF9+2hoR8zsMZ1NSNyFCIKPpMwJyChktKaqqONpw7grWLu8dz23NuIGRfaw+" "ZxlWawjdY2Hk3GBktTe0HIwcByNHb2gZiqy60IVY9xMincLqc1oQ6R33XY/bZ8XvPi/UV87EUA1SKsM0h6PvWOl20iZt0ibt/" "9j+CXhStzl5GgtiAAAAAElFTkSuQmCC\r\n"); } static test_t tests[] = { TEST_NO_TAG("Full name", fn_property), TEST_NO_TAG("Name", n_property), TEST_NO_TAG("Nickname", nickname_property), TEST_NO_TAG("Birthday", bday_property), TEST_NO_TAG("Anniversary", anniversary_property), TEST_NO_TAG("Gender", gender_property), TEST_NO_TAG("Photo", photo_property), }; test_suite_t vcard_identification_properties_test_suite = { "Identification", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-organizational-tester.cpp000066400000000000000000000054451464614212200232240ustar00rootroot00000000000000/* belcard-organizational-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void title_property(void) { test_property("TITLE:Research Scientist\r\n"); } static void role_property(void) { test_property("ROLE:Project Leader\r\n"); } static void logo_property(void) { test_property("LOGO:http://www.example.com/pub/logos/abccorp.jpg\r\n"); test_property("LOGO:data:image/" "jpeg;base64," "MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBl" "IENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0\r\n"); } static void org_property(void) { test_property("ORG:ABC\\, Inc.;North American Division;Marketing\r\n"); } static void member_property(void) { test_property("MEMBER:mailto:subscriber1@example.com\r\n"); test_property("MEMBER:xmpp:subscriber2@example.com\r\n"); test_property("MEMBER:sip:subscriber3@example.com\r\n"); test_property("MEMBER:tel:+1-418-555-5555\r\n"); test_property("MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519\r\n"); } static void related_property(void) { test_property("RELATED;TYPE=friend:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6\r\n"); test_property("RELATED;TYPE=contact:http://example.com/directory/jdoe.vcf\r\n"); test_property( "RELATED;TYPE=co-worker;VALUE=text:Please contact my assistant Jane Doe for any inquiries.\r\n"); } static test_t tests[] = { TEST_NO_TAG("TITLE", title_property), TEST_NO_TAG("ROLE", role_property), TEST_NO_TAG("LOGO", logo_property), TEST_NO_TAG("ORG", org_property), TEST_NO_TAG("MEMBER", member_property), TEST_NO_TAG("RELATED", related_property), }; test_suite_t vcard_organizational_properties_test_suite = { "Organizational", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-rfc6474-tester.cpp000066400000000000000000000041251464614212200212740ustar00rootroot00000000000000/* belcard-rfc6474-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void birth_place_property(void) { test_property("BIRTHPLACE:Babies'R'Us Hospital\r\n"); test_property("BIRTHPLACE;VALUE=uri:http://example.com/hospitals/babiesrus.vcf\r\n"); test_property("BIRTHPLACE;VALUE=uri:geo:46.769307\\,-71.283079\r\n"); } static void death_place_property(void) { test_property("DEATHPLACE:Aboard the Titanic\\, near Newfoundland\r\n"); test_property("DEATHPLACE;VALUE=uri:http://example.com/ships/titanic.vcf\r\n"); test_property("DEATHPLACE;VALUE=uri:geo:41.731944\\,-49.945833\r\n"); } static void death_date_property(void) { test_property("DEATHDATE:19960415\r\n"); test_property("DEATHDATE:--0415\r\n"); test_property("DEATHDATE:19531015T231000Z\r\n"); test_property("DEATHDATE;VALUE=text:circa 1800\r\n"); } static test_t tests[] = { TEST_NO_TAG("Birth place", birth_place_property), TEST_NO_TAG("Death place", death_place_property), TEST_NO_TAG("Death date", death_date_property), }; test_suite_t vcard_rfc6474_properties_test_suite = { "RFC 6474", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-security-tester.cpp000066400000000000000000000025331464614212200220450ustar00rootroot00000000000000/* belcard-security-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" using namespace ::std; using namespace ::belcard; static void key_property(void) { test_property("KEY;MEDIATYPE=application/pgp-keys:ftp://example.com/keys/jdoe\r\n"); test_property( "KEY:data:application/" "pgp-keys;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05l\r\n"); } static test_t tests[] = { TEST_NO_TAG("Key", key_property), }; test_suite_t vcard_security_properties_test_suite = { "Security", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/belcard-tester.cpp000066400000000000000000000065311464614212200202020ustar00rootroot00000000000000/* belcard-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include #include #include #include #include "config.h" int main(int argc, char *argv[]) { int i; int ret; belcard_tester_init(NULL); // If the tester is not installed we configure it, so it can be launched without installing if (!bctoolbox::Utils::isExecutableInstalled(std::string(argv[0]), "vcards/vcard.vcf")) { bc_tester_set_resource_dir_prefix(BELCARD_LOCAL_RESOURCE_LOCATION); printf("Resource dir set to %s\n", BELCARD_LOCAL_RESOURCE_LOCATION); belr::GrammarLoader::get().addPath(std::string(VCARD_LOCAL_GRAMMAR_LOCATION)); } if (strstr(argv[0], ".libs")) { int prefix_length = (int)(strstr(argv[0], ".libs") - argv[0]) + 1; char prefix[200]; sprintf(prefix, "%s%.*s", argv[0][0] == '/' ? "" : "./", prefix_length, argv[0]); bc_tester_set_resource_dir_prefix(prefix); bc_tester_set_writable_dir_prefix(prefix); } for (i = 1; i < argc; ++i) { ret = bc_tester_parse_args(argc, argv, i); if (ret > 0) { i += ret - 1; continue; } else if (ret < 0) { bc_tester_helper(argv[0], ""); } return ret; } ret = bc_tester_start(argv[0]); belcard_tester_uninit(); return ret; } static void log_handler(int lev, const char *fmt, va_list args) { #ifdef _WIN32 vfprintf(lev == BCTBX_LOG_ERROR ? stderr : stdout, fmt, args); fprintf(lev == BCTBX_LOG_ERROR ? stderr : stdout, "\n"); #else va_list cap; va_copy(cap, args); /* Otherwise, we must use stdio to avoid log formatting (for autocompletion etc.) */ vfprintf(lev == BCTBX_LOG_ERROR ? stderr : stdout, fmt, cap); fprintf(lev == BCTBX_LOG_ERROR ? stderr : stdout, "\n"); va_end(cap); #endif } void belcard_tester_init(void (*ftester_printf)(int level, const char *fmt, va_list args)) { if (ftester_printf == NULL) ftester_printf = log_handler; bc_tester_init(ftester_printf, BCTBX_LOG_MESSAGE, BCTBX_LOG_ERROR, "vcards"); bc_tester_add_suite(&vcard_general_properties_test_suite); bc_tester_add_suite(&vcard_identification_properties_test_suite); bc_tester_add_suite(&vcard_addressing_properties_test_suite); bc_tester_add_suite(&vcard_communication_properties_test_suite); bc_tester_add_suite(&vcard_geographical_properties_test_suite); bc_tester_add_suite(&vcard_organizational_properties_test_suite); bc_tester_add_suite(&vcard_explanatory_properties_test_suite); bc_tester_add_suite(&vcard_security_properties_test_suite); bc_tester_add_suite(&vcard_calendar_properties_test_suite); bc_tester_add_suite(&vcard_rfc6474_properties_test_suite); bc_tester_add_suite(&vcard_test_suite); } void belcard_tester_uninit(void) { bc_tester_uninit(); } belcard-5.3.105/tester/belcard-tester.hpp000066400000000000000000000041531464614212200202050ustar00rootroot00000000000000/* belcard-tester.hpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef belcard_tester_hpp #define belcard_tester_hpp #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif extern test_suite_t vcard_general_properties_test_suite; extern test_suite_t vcard_identification_properties_test_suite; extern test_suite_t vcard_addressing_properties_test_suite; extern test_suite_t vcard_communication_properties_test_suite; extern test_suite_t vcard_geographical_properties_test_suite; extern test_suite_t vcard_organizational_properties_test_suite; extern test_suite_t vcard_explanatory_properties_test_suite; extern test_suite_t vcard_security_properties_test_suite; extern test_suite_t vcard_calendar_properties_test_suite; extern test_suite_t vcard_rfc6474_properties_test_suite; extern test_suite_t vcard_test_suite; void belcard_tester_init(void(*ftester_printf)(int level, const char *fmt, va_list args)); void belcard_tester_uninit(void); #ifdef __cplusplus }; #endif template void test_property(const std::string& input) { std::shared_ptr ptr = T::parse(input); BC_ASSERT_TRUE(ptr!=NULL); if (ptr == NULL) { std::cout << "Couldn't parse " << input << std::endl; } else { std::string str = ptr->toString(); int compare = input.compare(str); BC_ASSERT_EQUAL(compare, 0, int, "%d"); if (compare != 0) { std::cout << "Expected " << input << " but got " << str << std::endl; } } } #endif belcard-5.3.105/tester/belcard-vcard-tester.cpp000066400000000000000000000122061464614212200212730ustar00rootroot00000000000000/* belcard-vcard-tester.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard-tester.hpp" #include "belcard/belcard.hpp" #include "belcard/belcard_parser.hpp" #include "belcard/belcard_utils.hpp" #include #include #include #include #include #include using namespace ::std; using namespace ::belr; using namespace ::belcard; static string openFile(const char *name) { char *res = bc_tester_res(name); ifstream istr(res, std::ios::binary); if (!istr.is_open()) { BC_FAIL(name); } bctbx_free(res); stringstream vcardStream; vcardStream << istr.rdbuf(); string vcard = vcardStream.str(); return vcard; } static void folding(void) { string vcard = openFile("vcards/foldtest.vcf"); string folded_vcard = belcard_fold(vcard); string unfolded_vcard = openFile("vcards/unfoldtest.vcf"); BC_ASSERT_EQUAL(unfolded_vcard.compare(folded_vcard), 0, int, "%d"); } static void unfolding(void) { string vcard = openFile("vcards/unfoldtest.vcf"); string unfolded_vcard = belcard_unfold(vcard); string folded_vcard = openFile("vcards/foldtest.vcf"); BC_ASSERT_EQUAL(folded_vcard.compare(unfolded_vcard), 0, int, "%d"); } static void vcard_parsing(void) { string vcard = openFile("vcards/vcard.vcf"); BelCardParser *parser = new BelCardParser(); shared_ptr belCard = parser->parseOne(vcard); if (!BC_ASSERT_TRUE(belCard != NULL)) return; BC_ASSERT_TRUE(belCard->assertRFCCompliance()); string vcard2 = belCard->toFoldedString(); BC_ASSERT_EQUAL(vcard2.compare(vcard), 0, int, "%d"); delete (parser); } static void vcards_parsing(void) { string vcards = openFile("vcards/vcards.vcf"); BelCardParser *parser = new BelCardParser(); shared_ptr belCards = parser->parse(vcards); if (!BC_ASSERT_TRUE(belCards != NULL)) return; BC_ASSERT_EQUAL((unsigned int)belCards->getCards().size(), 2, unsigned int, "%u"); string vcards2 = belCards->toString(); BC_ASSERT_EQUAL(vcards2.compare(vcards), 0, int, "%d"); delete (parser); } static void create_vcard_from_api(void) { shared_ptr belCard = BelCard::create(); if (!BC_ASSERT_TRUE(belCard != NULL)) return; BC_ASSERT_FALSE(belCard->assertRFCCompliance()); shared_ptr fn = BelCard::create(); fn->setValue("Sylvain Berfini"); belCard->setFullName(fn); BC_ASSERT_TRUE(belCard->assertRFCCompliance()); BC_ASSERT(belCard->getFullName()->toString() == fn->toString()); fn = BelCard::create(); fn->setValue("Belcard Tester"); belCard->setFullName(fn); BC_ASSERT(belCard->getFullName()->toString() == fn->toString()); string vcard = belCard->toString(); BelCardParser *parser = new BelCardParser(); shared_ptr belCard2 = parser->parseOne(vcard); if (!BC_ASSERT_TRUE(belCard2 != NULL)) return; BC_ASSERT_TRUE(belCard2->assertRFCCompliance()); string vcard2 = belCard2->toString(); BC_ASSERT_EQUAL(vcard.compare(vcard2), 0, unsigned, "%u"); delete (parser); } static void property_sort_using_pref_param(void) { shared_ptr belCard = BelCard::create(); BC_ASSERT_TRUE(belCard != NULL); shared_ptr impp1 = BelCardImpp::parse("IMPP;TYPE=home;PREF=2:sip:viish@sip.linphone.org\r\n"); BC_ASSERT_TRUE(impp1 != NULL); shared_ptr impp2 = BelCardImpp::parse("IMPP;PREF=1;TYPE=work:sip:sylvain@sip.linphone.org\r\n"); BC_ASSERT_TRUE(impp2 != NULL); belCard->addImpp(impp1); belCard->addImpp(impp2); const list> imppList = belCard->getImpp(); BC_ASSERT_EQUAL((unsigned int)imppList.size(), 2, unsigned int, "%u"); BC_ASSERT_TRUE(imppList.front() == impp2); BC_ASSERT_TRUE(imppList.back() == impp1); const list> propertiesList = belCard->getProperties(); BC_ASSERT_EQUAL((unsigned int)propertiesList.size(), 2, unsigned int, "%u"); belCard->removeImpp(impp1); BC_ASSERT_EQUAL((unsigned int)belCard->getImpp().size(), 1, unsigned int, "%u"); BC_ASSERT_EQUAL((unsigned int)belCard->getProperties().size(), 1, unsigned int, "%u"); } static test_t tests[] = { TEST_NO_TAG("Folding", folding), TEST_NO_TAG("Unfolding", unfolding), TEST_NO_TAG("VCard parsing", vcard_parsing), TEST_NO_TAG("VCards parsing", vcards_parsing), TEST_NO_TAG("VCard created from scratch", create_vcard_from_api), TEST_NO_TAG("Property sort using pref param", property_sort_using_pref_param), }; test_suite_t vcard_test_suite = {"VCard", NULL, NULL, NULL, NULL, sizeof(tests) / sizeof(tests[0]), tests, 0, 0}; belcard-5.3.105/tester/vcards/000077500000000000000000000000001464614212200160535ustar00rootroot00000000000000belcard-5.3.105/tester/vcards/foldtest.vcf000066400000000000000000002607011464614212200204050ustar00rootroot00000000000000BEGIN:VCARD VERSION:4.0 PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN FN:Sylvain Berfini N:Berfini;Sylvain;;; PHOTO:data:image/jpeg;base64,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 END:VCARD belcard-5.3.105/tester/vcards/unfoldtest.vcf000066400000000000000000002701031464614212200207450ustar00rootroot00000000000000BEGIN:VCARD VERSION:4.0 PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN FN:Sylvain Berfini N:Berfini;Sylvain;;; PHOTO:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASwBLAAD/2wBDAAgGBgcGBQgHB wcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zND L/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI yMjIyMjIyMjIyMjIyMjL/wAARCAImAiYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAA AAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBk aEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZW ZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8j JytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAEC AwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRo bHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2 hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMn K0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDyJJFEiBExn1NPXiV1 2ggnI+akA2kEjkc4x1qw9sjMr7Qe5wf6VgURxtGseBuL4zk1UnlY7S+WUjGCelTTyNJIVizw2 OAAartEzgDOMdAT0pJCsHmDbjnd6k0oD7DnkHtTBs4yuMd6sKWOdmNuP0qhkCxhmVCcAjt25q a3jd42xyy9qZgqd2RkNxV3TWxdADG1hyfrSk9AY+xhQeY8z7Dv24zjHArSVPsPnRBI5Fb7kjq CR+HaobOwiupbqGMsj+a2zcBtwAOPrVHf+/aNc5UZ6Zx0wx/Os7czM3qaljC27chjE0a7sNgh 178HjOOa1LWKC4ZTGZntxtiQuqtxuzyvPr0A71gQTtBfIJQrMp78g1sLLdRaiksOoRrMqFklg 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 END:VCARD belcard-5.3.105/tester/vcards/vcard.vcf000066400000000000000000000077211464614212200176610ustar00rootroot00000000000000BEGIN:VCARD VERSION:4.0 PRODID:-//Research In Motion//RIM App//EN KIND:individual FN:Sylvain Berfini N:Berfini;Sylvain;Pascal;; NICKNAME;TYPE=home:Viish BDAY:19891001 ANNIVERSARY:20140621 BIRTHPLACE;VALUE=text:Grenoble GENDER:M ADR;TYPE=work:;;34 avenue de l'Europe,le Trident bat D;GRENOBLE;;38100;FRA NCE ADR;TYPE=home;LABEL="15 rue Elisee Chatin\n38100 Grenoble, Isere\nFrance": ;;15 rue Elisee Chatin;Grenoble;Isere;38100;FRANCE TEL;VALUE=uri;TYPE=work:tel:+33-9-52-63-65-05 EMAIL;TYPE=work:sylvain.berfini@belledonne-communications.com X-GOOGLE-TALK:belledonnecomm@gmail.com IMPP;TYPE=work:sip:sylvain@sip.linphone.org LANG;TYPE=work;PREF=1:en LANG;TYPE=work;PREF=2:fr LANG;TYPE=home:fr PHOTO:data:image/png;base64,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 TZ:Paris/Europe GEO:geo:45.159612\,5.732511 TITLE:Software Engineer ROLE:Developper LOGO:http://www.belledonne-communications.com/uploads/images/belledonne-co mmunications.png ORG:Belledonne Communications REV:20151202T145423Z UID:8ce0100a-4a77-11e5-82b8-53de4f31f9f1 NOTE:This is a note END:VCARD belcard-5.3.105/tester/vcards/vcards.vcf000066400000000000000000000020251464614212200200340ustar00rootroot00000000000000BEGIN:VCARD VERSION:4.0 KIND:individual FN:Sylvain Berfini N:Berfini;Sylvain;Pascal;; GENDER:M ADR;TYPE=work:;;34 avenue de l'Europe,le Trident bat D;GRENOBLE;;38100;FRA NCE TEL;VALUE=uri;TYPE=work:tel:+33-9-52-63-65-05 EMAIL;TYPE=work:sylvain.berfini@belledonne-communications.com IMPP;TYPE=work:sip:sylvain@sip.linphone.org TZ:Paris/Europe GEO:geo:45.159612\,5.732511 TITLE:Software Engineer ROLE:Developper LOGO:http://www.belledonne-communications.com/uploads/images/belledonne-co mmunications.png ORG:Belledonne Communications REV:20151202T145423Z END:VCARD BEGIN:VCARD VERSION:4.0 KIND:individual FN:François Grisez N:Grisez;François;;; GENDER:M EMAIL;TYPE=work:francois.grisez@belledonne-communications.com IMPP;TYPE=work:sip:francois.grisez@sip.linphone.org TZ:Paris/Europe GEO:geo:45.159612\,5.732511 TITLE:Software Engineer ROLE:Developper LOGO:http://www.belledonne-communications.com/uploads/images/belledonne-co mmunications.png ORG:Belledonne Communications REV:20151210T104312Z END:VCARD belcard-5.3.105/tools/000077500000000000000000000000001464614212200144235ustar00rootroot00000000000000belcard-5.3.105/tools/CMakeLists.txt000066400000000000000000000034031464614212200171630ustar00rootroot00000000000000############################################################################ # CMakeLists.txt # Copyright (C) 2015-2023 Belledonne Communications, Grenoble France # ############################################################################ # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # ############################################################################ set(BELCARD_LIBRARIES_FOR_TOOLS belcard) foreach(EXECTUABLE belcard-folder belcard-unfolder belcard-parser) set(SOURCE_FILES_CXX ${EXECTUABLE}.cpp) bc_apply_compile_flags(SOURCE_FILES_CXX STRICT_OPTIONS_CPP STRICT_OPTIONS_CXX) add_executable(${EXECTUABLE} ${SOURCE_FILES_CXX}) set_target_properties(${EXECTUABLE} PROPERTIES LINKER_LANGUAGE CXX) target_link_libraries(${EXECTUABLE} PRIVATE belcard belr) if(NOT IOS) install(TARGETS ${EXECTUABLE} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) endif() endforeach() belcard-5.3.105/tools/Makefile.am000066400000000000000000000006751464614212200164670ustar00rootroot00000000000000bin_PROGRAMS=belcard-folder belcard-unfolder belcard-parser belcard_folder_SOURCES=belcard-folder.cpp belcard_folder_LDADD=$(top_builddir)/src/libbelcard.la -lbelr belcard_unfolder_SOURCES=belcard-unfolder.cpp belcard_unfolder_LDADD=$(top_builddir)/src/libbelcard.la -lbelr belcard_parser_SOURCES=belcard-parser.cpp belcard_parser_LDADD=$(top_builddir)/src/libbelcard.la -lbelr AM_CXXFLAGS=$(BELR_CFLAGS) AM_CPPFLAGS=-I$(top_srcdir)/include belcard-5.3.105/tools/belcard-folder.cpp000066400000000000000000000023671464614212200200040ustar00rootroot00000000000000/* belcard-folder.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard_utils.hpp" #include #include #include using namespace std; int main(int argc, char *argv[]) { const char *file = NULL; if (argc < 2) { cerr << argv[0] << " - fold the content of a file" << endl; return -1; } file = argv[1]; ifstream istr(file); if (!istr.is_open()) { return -1; } stringstream vcardStream; vcardStream << istr.rdbuf(); string vcard = vcardStream.str(); vcard = belcard_fold(vcard); cout << vcard << endl; return 0; } belcard-5.3.105/tools/belcard-parser.cpp000066400000000000000000000036301464614212200200170ustar00rootroot00000000000000/* belcard-parser.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard.hpp" #include "belcard/belcard_parser.hpp" #include #include #include #include #include using namespace ::std; using namespace ::belr; using namespace ::belcard; int main(int argc, char *argv[]) { const char *file = NULL; if (argc < 2) { cerr << argv[0] << " - parse the content of a file" << endl; return -1; } file = argv[1]; auto t_start = std::chrono::high_resolution_clock::now(); BelCardParser *parser = new BelCardParser(); auto t_end = std::chrono::high_resolution_clock::now(); auto t_start_2 = std::chrono::high_resolution_clock::now(); shared_ptr belCards = parser->parseFile(file); auto t_end_2 = std::chrono::high_resolution_clock::now(); if (belCards) { cout << *belCards << endl; } else { cerr << "Failure: couldn't parse input file " << file << endl; } cout << "Parser initialized in " << std::chrono::duration(t_end - t_start).count() << " milliseconds" << endl; cout << "Parsing done in " << std::chrono::duration(t_end_2 - t_start_2).count() << " milliseconds" << endl; delete (parser); return 0; }belcard-5.3.105/tools/belcard-unfolder.cpp000066400000000000000000000023771464614212200203500ustar00rootroot00000000000000/* belcard-unfolder.cpp Copyright (C) 2015 Belledonne Communications SARL This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "belcard/belcard_utils.hpp" #include #include #include using namespace std; int main(int argc, char *argv[]) { const char *file = NULL; if (argc < 2) { cerr << argv[0] << " - unfold the content of a file" << endl; return -1; } file = argv[1]; ifstream istr(file); if (!istr.is_open()) { return -1; } stringstream vcardStream; vcardStream << istr.rdbuf(); string vcard = vcardStream.str(); vcard = belcard_unfold(vcard); cout << vcard << endl; return 0; } belcard-5.3.105/tools/random_vcard_generator.py000077500000000000000000000037701464614212200215140ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf8 -*- from barnum import gen_data import codecs import frogress import random from random import shuffle gender_vcard_list = ['M', 'F', 'O', 'N', 'U'] def generate_vCard(): gender_initial = gender_vcard_list[random.randint(0, 4)] gender = None if gender_initial == 'M': gender = 'Male' elif gender_initial == 'F': gender = 'Female' (first_name, last_name) = gen_data.create_name(gender=gender) adr = gen_data.create_street() zip, city, state = gen_data.create_city_state_zip() properties = [] properties.append('FN:{} {}\r\n'.format(first_name, last_name)) if random.randint(0, 1): properties.append('N:{};{};;;\r\n'.format(last_name, first_name)) if random.randint(0, 1): properties.append('TEL:tel:{}\r\n'.format(gen_data.create_phone())) if random.randint(0, 1): properties.append('GENDER:{}\r\n'.format(gender_initial)) if random.randint(0, 1): properties.append('EMAIL:{}\r\n'.format(gen_data.create_email(name=(first_name, last_name)).lower())) if random.randint(0, 1): properties.append('IMPP:sip:{}@{}\r\n'.format(first_name.lower(), 'sip.linphone.org')) if random.randint(0, 1): properties.append('ADR:;;{};{};{};{};\r\n'.format(adr, city, state, zip)) if random.randint(0, 1): properties.append('NOTE:{}\r\n'.format(gen_data.create_sentence())) if random.randint(0, 1): properties.append('ORG:{}\r\n'.format(gen_data.create_company_name())) if random.randint(0, 1): properties.append('BDAY:{0:%Y%m%d}\r\n'.format(gen_data.create_birthday())) shuffle(properties) vCard = 'BEGIN:VCARD\r\n' vCard += 'VERSION:4.0\r\n' for property in properties: vCard += property vCard += 'END:VCARD\r\n' return vCard def main(): output = '' count = 1000 widgets = [frogress.BarWidget, frogress.PercentageWidget, frogress.ProgressWidget('vCard ')] for i in frogress.bar(range(count), steps=count, widgets=widgets): output += generate_vCard() with codecs.open('output.vcf', 'w', 'utf-8') as f: f.write(output) if __name__ == "__main__": main()