From: Amlan Chowdhury Date: Thu, 9 Jun 2016 10:55:30 +0000 (+0600) Subject: [TBT][NSD DNS-SD, NSD SSDP][DPTTIZEN-1868][Added NSD DNS-SD, NSD SSDP local and remot... X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=47146a914d19e6df1bcdd723ca45f6787a26ddb3;p=test%2Ftct%2Fnative%2Fbehavior.git [TBT][NSD DNS-SD, NSD SSDP][DPTTIZEN-1868][Added NSD DNS-SD, NSD SSDP local and remote modules. Added operationpickviewapp for pick/view operation] Signed-off-by: Amlan Chowdhury Change-Id: I00f4a375e18bf62e235673d2a38338737e140288 --- diff --git a/operationpickviewapp/.cproject b/operationpickviewapp/.cproject new file mode 100644 index 0000000..398ae90 --- /dev/null +++ b/operationpickviewapp/.cproject @@ -0,0 +1,570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/operationpickviewapp/.exportMap b/operationpickviewapp/.exportMap new file mode 100644 index 0000000..43e310e --- /dev/null +++ b/operationpickviewapp/.exportMap @@ -0,0 +1,4 @@ +{ + global: main; + local: *; +}; diff --git a/operationpickviewapp/.gitignore b/operationpickviewapp/.gitignore new file mode 100644 index 0000000..ffab4a7 --- /dev/null +++ b/operationpickviewapp/.gitignore @@ -0,0 +1,3 @@ +/SA_Report +/Debug +/.sign diff --git a/operationpickviewapp/.package-stamp b/operationpickviewapp/.package-stamp new file mode 100644 index 0000000..40cbe59 --- /dev/null +++ b/operationpickviewapp/.package-stamp @@ -0,0 +1 @@ +TPK \ No newline at end of file diff --git a/operationpickviewapp/.project b/operationpickviewapp/.project new file mode 100644 index 0000000..6c7a060 --- /dev/null +++ b/operationpickviewapp/.project @@ -0,0 +1,26 @@ + + + operationpickviewapp + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/operationpickviewapp/.rds_delta b/operationpickviewapp/.rds_delta new file mode 100644 index 0000000..f676049 --- /dev/null +++ b/operationpickviewapp/.rds_delta @@ -0,0 +1,6 @@ +#delete +#add +#modify +author-signature.xml +signature1.xml +tizen-manifest.xml diff --git a/operationpickviewapp/.sdk_delta.info b/operationpickviewapp/.sdk_delta.info new file mode 100644 index 0000000..018296c Binary files /dev/null and b/operationpickviewapp/.sdk_delta.info differ diff --git a/operationpickviewapp/.tproject b/operationpickviewapp/.tproject new file mode 100644 index 0000000..56660b2 --- /dev/null +++ b/operationpickviewapp/.tproject @@ -0,0 +1,12 @@ + + + + + mobile-3.0 + + + + + + + diff --git a/operationpickviewapp/inc/filemanager-util.h b/operationpickviewapp/inc/filemanager-util.h new file mode 100644 index 0000000..94ad6bd --- /dev/null +++ b/operationpickviewapp/inc/filemanager-util.h @@ -0,0 +1,175 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file filemanager-utils.h + * @brief This file provide basic filemanager utils. + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date February, 2016 + * @bug + * @credit FileManager sample app + */ + +#ifndef __FILEMANAGER_UTIL_H__ +#define __FILEMANAGER_UTIL_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "logger.h" + +#define FM_NAME_PATTERN "[\\:*\"&<>'/]" + +typedef enum { + FILE_TYPE_NONE = 0, + FILE_TYPE_DIR, /**< Folder category */ + FILE_TYPE_FILE, /**< File category */ + FILE_TYPE_IMAGE, /**< Image category */ + FILE_TYPE_VIDEO, /**< Video category */ + FILE_TYPE_MUSIC, /**< Music category */ + FILE_TYPE_SOUND, /**< Sound category */ + FILE_TYPE_PDF, /**< Pdf category */ + FILE_TYPE_DOC, /**< Word category */ + FILE_TYPE_PPT, /**< Powerpoint category */ + FILE_TYPE_EXCEL, /**< Excel category */ + FILE_TYPE_VOICE, /**< Voice category */ + FILE_TYPE_HTML, /**< Html category */ + FILE_TYPE_FLASH, /**< Flash category */ + FILE_TYPE_GAME, /**< Game category */ + FILE_TYPE_APP, /**< Application category */ + FILE_TYPE_THEME, /**< Theme category */ + FILE_TYPE_TXT, /**< Txt category */ + FILE_TYPE_VCONTACT, /**< Vcontact category */ + FILE_TYPE_VCALENDAR, /**< Vcalendar category */ + FILE_TYPE_VNOTE, /**< Vnote category */ + FILE_TYPE_VBOOKMARK, /**< Vbookmark category */ + FILE_TYPE_VIDEO_PROJECT, /**< Video editor project category */ + FILE_TYPE_RADIO_RECORDED, /**< radio recorded clips category */ + FILE_TYPE_MOVIE_MAKER, /**< Movie maker project category */ + FILE_TYPE_SVG, /**< Svg category */ + FILE_TYPE_RSS, /**< Rss reader file, *.opml */ + FILE_TYPE_CERTIFICATION, /**< certification file, *.pem */ + FILE_TYPE_JAVA, /**< java file, *.jad, *.jar */ + FILE_TYPE_WGT, /**< wrt , *.wgt, *.wgt */ + FILE_TYPE_DRM, /**< drm file , *.dcf */ + FILE_TYPE_ETC, /**< Other files category */ + FILE_TYPE_MAX +} file_type; + +typedef struct _file_type_by_ext { + const char *ext; + file_type ftype; +} file_type_by_ext; + + +static file_type_by_ext FILE_TYPE_BY_EXT[] = { + {"3G2", FILE_TYPE_VIDEO}, + {"3GP", FILE_TYPE_VIDEO}, + {"3GPP", FILE_TYPE_VIDEO}, + {"AAC", FILE_TYPE_MUSIC}, + {"AMR", FILE_TYPE_VOICE}, + {"ASF", FILE_TYPE_VIDEO}, + {"AVI", FILE_TYPE_VIDEO}, + {"AWB", FILE_TYPE_VOICE}, + {"BMP", FILE_TYPE_IMAGE}, + {"DCF", FILE_TYPE_DRM}, + {"DIVX", FILE_TYPE_VIDEO}, + {"DOC", FILE_TYPE_DOC}, + {"DOCX", FILE_TYPE_DOC}, + {"G72", FILE_TYPE_MUSIC}, + {"GIF", FILE_TYPE_IMAGE}, + {"H263", FILE_TYPE_VIDEO}, + {"HTM", FILE_TYPE_HTML}, + {"HTML", FILE_TYPE_HTML}, + {"IMY", FILE_TYPE_SOUND}, + {"IPK", FILE_TYPE_APP}, + {"JAD", FILE_TYPE_JAVA}, + {"JAR", FILE_TYPE_JAVA}, + {"JPE", FILE_TYPE_IMAGE}, + {"JPEG", FILE_TYPE_IMAGE}, + {"JPG", FILE_TYPE_IMAGE}, + {"M3G", FILE_TYPE_FLASH}, + {"M4A", FILE_TYPE_MUSIC}, + {"MID", FILE_TYPE_SOUND}, + {"MIDI", FILE_TYPE_SOUND}, + {"MKA", FILE_TYPE_MUSIC}, + {"MKV", FILE_TYPE_VIDEO}, + {"MMF", FILE_TYPE_SOUND}, + {"MP3", FILE_TYPE_MUSIC}, + {"MP4", FILE_TYPE_VIDEO}, + {"MPEG", FILE_TYPE_VIDEO}, + {"MPG", FILE_TYPE_VIDEO}, + {"MXMF", FILE_TYPE_SOUND}, + {"OPML", FILE_TYPE_RSS}, + {"PDF", FILE_TYPE_PDF}, + {"PEM", FILE_TYPE_CERTIFICATION}, + {"PJPEG", FILE_TYPE_IMAGE}, + {"PNG", FILE_TYPE_IMAGE}, + {"PPT", FILE_TYPE_PPT}, + {"PPTX", FILE_TYPE_PPT}, + {"SCN", FILE_TYPE_MOVIE_MAKER}, + {"SDP", FILE_TYPE_VIDEO}, + {"SMP", FILE_TYPE_SOUND}, + {"SPF", FILE_TYPE_SOUND}, + {"SPM", FILE_TYPE_SOUND}, + {"SVG", FILE_TYPE_SVG}, + {"SVGZ", FILE_TYPE_SVG}, + {"SWF", FILE_TYPE_FLASH}, + {"THM", FILE_TYPE_THEME}, + {"TXT", FILE_TYPE_TXT}, + {"VBM", FILE_TYPE_VBOOKMARK}, + {"VCF", FILE_TYPE_VCONTACT}, + {"VCS", FILE_TYPE_VCALENDAR}, + {"VNT", FILE_TYPE_VNOTE}, + {"WAV", FILE_TYPE_SOUND}, + {"WBMP", FILE_TYPE_IMAGE}, + {"WGT", FILE_TYPE_WGT}, + {"WMA", FILE_TYPE_MUSIC}, + {"WMV", FILE_TYPE_VIDEO}, + {"XHTML", FILE_TYPE_HTML}, + {"XLS", FILE_TYPE_EXCEL}, + {"XLSX", FILE_TYPE_EXCEL}, + {"XMF", FILE_TYPE_SOUND} +}; + + + +enum { + FILE_TYPE_BY_EXT_ITEM_SIZE = sizeof(file_type_by_ext), + FILE_TYPE_BY_EXT_LENGTH = sizeof(FILE_TYPE_BY_EXT) / FILE_TYPE_BY_EXT_ITEM_SIZE, + MAX_EXT_LENGTH = 8 +}; + +typedef struct _filemanager_data{ + file_type type; + +}filemanager_data_s; + +int filemanager_utils_file_type_by_ext_compare(const void *key, const void *elem); +void filemanager_utils_get_file_category(const char *filepath, file_type *category); +file_type filemanager_utils_get_category_by_file_ext(const char *file_ext, const char *fullpath); +Eina_Bool filemanager_utils_is_file_exists(const char *filepath); +const char *filemanager_util_get_filename(const char *path); +void filemanager_utils_get_file_list_of_type(const char *dir_path, Eina_List **file_list,file_type file_type, void* data); + +#endif diff --git a/operationpickviewapp/inc/logger.h b/operationpickviewapp/inc/logger.h new file mode 100644 index 0000000..b2f6119 --- /dev/null +++ b/operationpickviewapp/inc/logger.h @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file logger.h + * @brief This file provide necessary macro for logging information. + * @since_tizen 2.3 + * @author Amlan Chowdhury (amlan.c@samsung.com) + * @date October, 2014 + * @bug + * @credit + */ +#ifndef __LOGGER_H__ +#define __LOGGER_H__ + +#include + +#define LOG_TAG_CORE "[OPERATION_PICK_VIEW]_" + +#define DLOG(prio, fmt, arg...) dlog_print(prio, LOG_TAG_CORE, "%s (Line: %d) > " fmt, __func__, __LINE__, ##arg) +#define DBG(fmt, arg...) DLOG(DLOG_DEBUG, fmt, ##arg) +#define ERR(fmt, arg...) DLOG(DLOG_ERROR, fmt, ##arg) + +#define RETM_IF(expr, fmt, arg...) \ +{ \ + if (expr) \ + { \ + ERR(fmt, ##arg); \ + return; \ + } \ +} + +#define RETVM_IF(expr, val, fmt, arg...) \ +{ \ + if (expr) \ + { \ + ERR(fmt, ##arg); \ + return (val); \ + } \ +} + +#define SAFE_DELETE(a) if( (a) != NULL ) free (a); (a) = NULL; + +#endif /* __LOGGER_H__ */ diff --git a/operationpickviewapp/inc/operationpickviewapp.h b/operationpickviewapp/inc/operationpickviewapp.h new file mode 100644 index 0000000..0922e6e --- /dev/null +++ b/operationpickviewapp/inc/operationpickviewapp.h @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file operationviewpickapp.h + * @brief + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date january, 2016 + * @bug + * @credit + **/ + + +#ifndef __operationpickviewapp_H__ +#define __operationpickviewapp_H__ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef LOG_TAG +#undef LOG_TAG +#endif +#define LOG_TAG "operationpickviewapp" + +#if !defined(PACKAGE) +#define PACKAGE "org.tizen.operationpickviewapp" +#endif + +#define EDJ_FILE "edje/operationpickviewapp.edj" +#define GRP_MAIN "main" + + +#endif /* __operationpickviewapp_H__ */ diff --git a/operationpickviewapp/inc/soundplayer-util.h b/operationpickviewapp/inc/soundplayer-util.h new file mode 100644 index 0000000..637999e --- /dev/null +++ b/operationpickviewapp/inc/soundplayer-util.h @@ -0,0 +1,49 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file soundplayer-utils.h + * @brief This file provide basic video sound utils. + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date February, 2016 + * @bug + * @credit + */ + + +#ifndef __SOUNDPLAYER_UTIL_H__ +#define __SOUNDPLAYER_UTIL_H__ + +#include +#include "logger.h" + + +typedef struct _soundplayer_data +{ + player_h player; + char* uri; + +}soundplayer_data_s; + + +void start_sound_player(soundplayer_data_s *this); +void destroy_sound_player(soundplayer_data_s *this); +player_h create_sound_player(soundplayer_data_s *this); + +#endif + + diff --git a/operationpickviewapp/inc/ui-utils.h b/operationpickviewapp/inc/ui-utils.h new file mode 100644 index 0000000..0090b19 --- /dev/null +++ b/operationpickviewapp/inc/ui-utils.h @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file ui-utils.h + * @brief This file provide basic ui utils. + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date january, 2016 + * @bug + * @credit + */ +#ifndef __UI_UTILS_H__ +#define __UI_UTILS_H__ + +#include "logger.h" +#include +#include +#include + +Evas_Object *ui_utils_create_image(Evas_Object *parent, const char *file_path); + +#endif /* __UI_UTILS_H__ */ diff --git a/operationpickviewapp/inc/videoplayer-util.h b/operationpickviewapp/inc/videoplayer-util.h new file mode 100644 index 0000000..5dfeb5f --- /dev/null +++ b/operationpickviewapp/inc/videoplayer-util.h @@ -0,0 +1,47 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file videoplayer-utils.h + * @brief This file provide basic video player utils. + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date February, 2016 + * @bug + * @credit + */ + +#ifndef __VIDEOPLAYER_UTILS_H__ +#define __VIDEOPLAYER_UTILS_H__ + +#include +#include "operationpickviewapp.h" +#include "logger.h" + +typedef struct _videoplayer_data{ + Evas_Object* video_rect; + player_h player; + char* uri; +}videoplayer_data_s; + + + +void start_player(videoplayer_data_s *this); +void destroy_player(videoplayer_data_s *this); +player_h create_player(videoplayer_data_s *this); +char* get_video_player_error(player_error_e error_state); + +#endif diff --git a/operationpickviewapp/project_def.prop b/operationpickviewapp/project_def.prop new file mode 100644 index 0000000..5a62beb --- /dev/null +++ b/operationpickviewapp/project_def.prop @@ -0,0 +1,11 @@ +APPNAME = operationpickviewapp + +type = app +profile = mobile-2.4 + +USER_SRCS = src/operationpickviewapp.c +USER_DEFS = +USER_INC_DIRS = inc +USER_OBJS = +USER_LIBS = +USER_EDCS = res/edje/operationpickviewapp.edc diff --git a/operationpickviewapp/res/edje/operationpickviewapp.edc b/operationpickviewapp/res/edje/operationpickviewapp.edc new file mode 100644 index 0000000..391d188 --- /dev/null +++ b/operationpickviewapp/res/edje/operationpickviewapp.edc @@ -0,0 +1,21 @@ +collections { + group { name: "main"; + parts { + part { name: "data_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 1.0 0.68; + } + } + + } + } + } +} diff --git a/operationpickviewapp/shared/res/operationpickviewapp.png b/operationpickviewapp/shared/res/operationpickviewapp.png new file mode 100644 index 0000000..9765b1b Binary files /dev/null and b/operationpickviewapp/shared/res/operationpickviewapp.png differ diff --git a/operationpickviewapp/src/filemanager-util.c b/operationpickviewapp/src/filemanager-util.c new file mode 100644 index 0000000..ea55043 --- /dev/null +++ b/operationpickviewapp/src/filemanager-util.c @@ -0,0 +1,151 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file filemanager-utils.c + * @brief This file is implementation of filemanager-utils.h + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date February, 2016 + * @bug + * @credit FileManager sample app + */ + +#include "filemanager-util.h" + +int filemanager_utils_file_type_by_ext_compare(const void *key, const void *elem) +{ + return strcmp((const char *)key, ((const file_type_by_ext *)elem)->ext); +} + +void filemanager_utils_get_file_category(const char *filepath, file_type *category) +{ + if (filemanager_utils_is_file_exists(filepath)) { + *category = FILE_TYPE_DIR; + return; + } + + const char *filename = filemanager_util_get_filename(filepath); + if (!filename) { + *category = FILE_TYPE_NONE; + return; + } + + const char *ext = strrchr(filename, '.'); + if ((ext) && (ext != filename) && (strlen(ext) != 1)) { + *category = filemanager_utils_get_category_by_file_ext(ext + 1, filepath); + return; + } + + *category = FILE_TYPE_NONE; + return; + +} + +file_type filemanager_utils_get_category_by_file_ext(const char *file_ext, const char *fullpath) +{ + file_type result = FILE_TYPE_ETC; + + if (file_ext) { + char ext_upper[MAX_EXT_LENGTH + 1]; + int i = 0; + + { + const int skip = (file_ext[0] == '.') ? 1 : 0; + while ((file_ext[i + skip] != '\0') && (i < MAX_EXT_LENGTH)) { + ext_upper[i] = toupper(file_ext[i + skip]); + ++i; + } + ext_upper[i] = '\0'; + } + + if (i > 0) { + file_type_by_ext *const item = bsearch(ext_upper, + FILE_TYPE_BY_EXT, + FILE_TYPE_BY_EXT_LENGTH, + FILE_TYPE_BY_EXT_ITEM_SIZE, + filemanager_utils_file_type_by_ext_compare); + + if (item) { + result = item->ftype; + } + } + } + return result; +} + +Eina_Bool filemanager_utils_is_file_exists(const char *filepath) +{ + struct stat st; + + if ((stat(filepath, &st) < 0) && (strcmp(filepath, "/"))) { + return EINA_FALSE; + } + + return EINA_TRUE; +} + + +const char *filemanager_util_get_filename(const char *path) +{ + char *result = NULL; + + if (!path) { + return NULL; + } + if ((result = strrchr(path, '/'))) { + result++; + } else { + result = (char *)path; + } + + return result; +} + + +void filemanager_utils_get_file_list_of_type(const char *dir_path, Eina_List **file_list,file_type file_type, void* data) +{ + filemanager_data_s *ad =(filemanager_data_s*) data; + + DIR *d; + struct dirent *dir; + + d = opendir(dir_path); + //DBG("dir_path: %s",dir_path); + if (d) { + while ((dir = readdir(d)) != NULL) { + //DBG("FILES: %s",dir->d_name); + if ((strcmp(dir->d_name, ".")) && (strcmp(dir->d_name, ".."))) { + + filemanager_utils_get_file_category(dir->d_name, &(ad->type)); + if(file_type!=NULL){ + if(ad->type == file_type){ + //DBG("FILES: %s",dir->d_name); + *file_list = eina_list_append(*file_list, dir->d_name); + } + } + else if(ad->type == FILE_TYPE_IMAGE || ad->type == FILE_TYPE_MUSIC || ad->type == FILE_TYPE_VIDEO){ + *file_list = eina_list_append(*file_list, dir->d_name); + } + + } + } + + closedir(d); + } + + +} diff --git a/operationpickviewapp/src/operationpickviewapp.c b/operationpickviewapp/src/operationpickviewapp.c new file mode 100644 index 0000000..03d4f40 --- /dev/null +++ b/operationpickviewapp/src/operationpickviewapp.c @@ -0,0 +1,723 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file operationviewpickapp.c + * @brief This file is provides the main functionalaties of operation view pick app + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date january, 2016 + * @bug + * @credit + **/ + + + +#include "operationpickviewapp.h" +#include "ui-utils.h" +#include +#include "filemanager-util.h" +#include "videoplayer-util.h" +#include "soundplayer-util.h" + + +#define SAFE_DELETE(a) if( (a) != NULL ) free (a); (a) = NULL; + + +typedef struct appdata{ + Evas_Object* win; + Evas_Object* layout; + Evas_Object* conform; + + char* category; + char* mime; + char* uri; + app_control_h app_control; + + Evas_Object* video_rect; + player_h player; + + file_type type; + char* file_name; + + Evas_Object* files_list; + + videoplayer_data_s* video_player_data; + soundplayer_data_s* sound_player_data; + + +} appdata_s; + +static int _supportedStorageID; +static app_control_h _control; + +static Elm_Genlist_Item_Class *_itc = NULL; + + +static void show_image(void* data); +static void show_video(void* data); +static void show_audio(void* data); +static void show_url(void* data); + +static char* get_app_control_error(int ret); +static void list_item_clicked_cb(void *data, Evas_Object *obj, void *event_info); +static char * _item_label_get(void *data, Evas_Object *obj, const char *part); + +Eina_List* get_image_dir_image_file_list(void* data); +Eina_List* get_audio_dir_audio_file_list(void* data); +Eina_List* get_video_dir_video_file_list(void* data); + +Eina_List* get_all_dir_file_list(void* data); + + + +static bool _storage_device_supported_cb(int storage_id, storage_type_e type, storage_state_e state, const char *path, void *user_data) +{ + if(type == STORAGE_TYPE_INTERNAL) + { + // save storage id + _supportedStorageID=storage_id; + return false; + } + return true; +} + +static inline const char *get_storage_image_dir_path() +{ + static char *absolute_path; + // lets set storage devices + storage_foreach_device_supported(_storage_device_supported_cb,NULL); + storage_get_directory(_supportedStorageID,STORAGE_DIRECTORY_IMAGES,&absolute_path); + DBG("Logging_Dir set = %s",absolute_path); + + return strdup(absolute_path); +} + +static inline const char *get_storage_audio_dir_path() +{ + static char *absolute_path; + // lets set storage devices + storage_foreach_device_supported(_storage_device_supported_cb,NULL); + storage_get_directory(_supportedStorageID,STORAGE_DIRECTORY_SOUNDS,&absolute_path); + DBG("Logging_Dir set = %s",absolute_path); + + return strdup(absolute_path); +} + +static inline const char *get_storage_video_dir_path() +{ + static char *absolute_path; + // lets set storage devices + storage_foreach_device_supported(_storage_device_supported_cb,NULL); + storage_get_directory(_supportedStorageID,STORAGE_DIRECTORY_VIDEOS,&absolute_path); + DBG("Logging_Dir set = %s",absolute_path); + + return strdup(absolute_path); +} + +static void win_delete_request_cb(void *data, Evas_Object *obj, void *event_info) +{ + ui_app_exit(); +} + +static void layout_back_cb(void *data, Evas_Object *obj, void *event_info) +{ + appdata_s *ad = data; + /* Let window go to hide state. */ + if(!strcmp(ad->mime, "video/3gpp") || + !strcmp(ad->mime, "video/mp4")) + { + destroy_player(ad->video_player_data); + } + else if(!strcmp(ad->mime, "audio/mp3") || + !strcmp(ad->mime, "audio/aac") || + !strcmp(ad->mime, "audio/amr") || + !strcmp(ad->mime, "audio/wav")) + { + destroy_sound_player(ad->sound_player_data); + } + elm_win_lower(ad->win); +} + +static void app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max) +{ + char *res_path = app_get_resource_path(); + if (res_path) { + snprintf(edj_path_out, edj_path_max, "%s%s", res_path, edj_file_in); + free(res_path); + } +} + +static void create_base_gui(appdata_s *ad) +{ + char edj_path[PATH_MAX] = {0, }; + + /* Window */ + /* Create and initialize elm_win. + elm_win is mandatory to manipulate window. */ + ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE); + elm_win_conformant_set(ad->win, EINA_TRUE); + elm_win_autodel_set(ad->win, EINA_TRUE); + + if (elm_win_wm_rotation_supported_get(ad->win)) { + int rots[4] = { 0, 90, 180, 270 }; + elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4); + } + + evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL); + + /* Conformant */ + /* Create and initialize elm_conformant. + elm_conformant is mandatory for base gui to have proper size + when indicator or virtual keypad is visible. */ + ad->conform = elm_conformant_add(ad->win); + elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW); + elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE); + evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(ad->win, ad->conform); + evas_object_show(ad->conform); + + /* Base Layout */ + /* Create an actual view of the base gui. + Modify this part to change the view. */ + app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX); + ad->layout = elm_layout_add(ad->win); + elm_layout_file_set(ad->layout, edj_path, GRP_MAIN); + evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + eext_object_event_callback_add(ad->layout, EEXT_CALLBACK_BACK, layout_back_cb, ad); + elm_object_content_set(ad->conform, ad->layout); + + /* Show window after base gui is set up */ + evas_object_show(ad->win); + +} + +static bool app_create(void *data) +{ + /* Hook to take necessary actions before main event loop starts + Initialize UI resources and application's data + If this function returns true, the main loop of application starts + If this function returns false, the application is terminated */ + appdata_s *ad = data; + + create_base_gui(ad); + + return true; +} +static void gl_del_cb(void *data, Evas_Object *obj EINA_UNUSED); +static void app_control(app_control_h app_control, void *data) +{ + /* Handle the launch request. */ + int result; + appdata_s *ad = data; + + ad->category = NULL; + ad->mime = NULL; + ad->uri = NULL; + ad->app_control = app_control; + + result = app_control_get_operation(app_control,&ad->category); + + if(!ad->category) + { + ERR("category is Null"); + return; + } + else if(strcmp(ad->category,APP_CONTROL_OPERATION_VIEW)==0) + { + DBG("Operation View"); + app_control_get_mime(app_control, &ad->mime); + DBG("mime : %s", ad->mime); + if(ad->mime == NULL) + { + return; + } + else + { + app_control_get_uri(app_control, &ad->uri); + DBG("uri : %s", ad->uri); + + if(!strcmp(ad->mime, "image/jpeg") || + !strcmp(ad->mime, "image/png") || + !strcmp(ad->mime, "image/gif") || + !strcmp(ad->mime, "image/bmp")) + { + if(ad->uri != NULL) + { + show_image(ad); + } + } + + else if(!strcmp(ad->mime, "video/3gpp") || + !strcmp(ad->mime, "video/mp4")) + { + if(ad->uri != NULL) + { + show_video(ad); + } + } + else if(!strcmp(ad->mime, "audio/mp3") || + !strcmp(ad->mime, "audio/aac") || + !strcmp(ad->mime, "audio/amr") || + !strcmp(ad->mime, "audio/wav")) + { + if (ad->uri != NULL) + { + show_audio(ad); + } + } + } + + } + else if(strcmp(ad->category,APP_CONTROL_OPERATION_DEFAULT)==0) + { + DBG("Operation Default"); + } + else if(strcmp(ad->category,APP_CONTROL_OPERATION_PICK)==0) + { + + int nStatus=app_control_clone (&_control, app_control); + DBG("app_control_clone=%s",get_app_control_error(nStatus)); + if(!_control) + { + DBG("_control is Null"); + } + + if (!_itc) + + { + _itc = elm_genlist_item_class_new(); + _itc->item_style = "default"; + _itc->func.text_get = _item_label_get; + _itc->func.content_get = NULL; + _itc->func.state_get = NULL; + _itc->func.del = gl_del_cb; + + } + + + ad->files_list = elm_genlist_add(ad->layout); + elm_object_part_content_set(ad->layout, "data_view", ad->files_list); + evas_object_show(ad->files_list); + + DBG("Operation pick"); + app_control_get_mime(app_control, &ad->mime); + DBG("mime : %s", ad->mime); + if(ad->mime == NULL) + { + return; + } + else + { + app_control_get_uri(app_control, &ad->uri); + DBG("uri : %s", ad->uri); + + Eina_List* file_list = NULL; + + if(!strcmp(ad->mime, "image/*")) + { + file_list = get_image_dir_image_file_list(ad); + } + else if(!strcmp(ad->mime, "video/*")) + { + file_list = get_video_dir_video_file_list(ad); + } + else if(!strcmp(ad->mime, "audio/*")) + { + file_list = get_audio_dir_audio_file_list(ad); + } + else if(!strcmp(ad->mime, "*/*")) + { + file_list = get_all_dir_file_list(ad); + } + + Eina_List *l; + void *list_data; + + EINA_LIST_FOREACH(file_list, l, list_data) + { + + //DBG("list_data%s", list_data); + elm_genlist_item_append(ad->files_list, _itc, strdup(list_data), NULL, ELM_GENLIST_ITEM_NONE, list_item_clicked_cb, strdup(list_data)); + + } +// elm_genlist_item_append(ad->files_list, _itc, "amlan", NULL, ELM_GENLIST_ITEM_NONE, list_item_clicked_cb, NULL); +// elm_genlist_item_class_free(_itc); + + + + } + } +} + + +static void gl_del_cb(void *data, Evas_Object *obj EINA_UNUSED) +{ + + DBG("gl_del_cb"); + +} + +static char * _item_label_get(void *data, Evas_Object *obj, const char *part) +{ +// appdata_s *ad = data; + DBG("_item_label_get %s %s", (char*)data, part); + + char buf[256]; + snprintf(buf, sizeof(buf), "%s", (char*)data); + return strdup(buf); + +} + + +void list_item_clicked_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + RETM_IF(NULL == data, "data is null"); + const char *str_data = (char*) data; + DBG("list item clicked %s", str_data); + + + + app_control_h reply; + int nStatus = app_control_create (&reply); + DBG("app_control_create=%s",get_app_control_error(nStatus)); + if(!reply) + { + DBG("reply is Null"); + } + // lets craete reply dta +/* const Eina_List *items,*l; + Elm_Object_Item *list_it; + + DBG("Getting List Items"); + items = elm_list_selected_items_get(ad->list); + DBG("Got List Items"); + + EINA_LIST_FOREACH(items, l, list_it) + { + selectionCount++; + DBG("SELECTED %s",elm_object_item_text_get(list_it)); + } + + char countStr[32]; + snprintf(countStr, sizeof(countStr), "%d",selectionCount); + nStatus = app_control_add_extra_data ( reply, "count", countStr); + DBG("app_control_add_extra_data=%s",get_app_control_error(nStatus)); + + + char *values[selectionCount]; + int now=0; + + + EINA_LIST_FOREACH(items, l, list_it) + { + values[now++]=(char*)elm_object_item_text_get(list_it); + }*/ + + + nStatus = app_control_add_extra_data_array( reply, "filename", &str_data, 1); + DBG("app_control_add_extra_data=%s",get_app_control_error(nStatus)); + + + // ************************************ + //APP_CONTROL_RESULT_SUCCEEDED + + app_control_result_e res=APP_CONTROL_RESULT_SUCCEEDED; + nStatus = app_control_reply_to_launch_request(reply,_control,res); + DBG("app_control_reply_to_launch_request=%s",get_app_control_error(nStatus)); + + ui_app_exit(); + + +} + +Eina_List* get_image_dir_image_file_list(void* data) +{ + DBG("get_image_dir_image_file_list"); + appdata_s *ad =(appdata_s*) data; + Eina_List* file_list = NULL; + char *app_id; + char *shared_res_path; + app_control_get_caller (ad->app_control, &app_id); + //DBG("app_id%s", app_id); + app_manager_get_shared_resource_path(app_id, &shared_res_path); + //DBG("shared_path%s", shared_res_path); + //strcat(shared_res_path, "images/"); + DBG("shared_res_path%s", shared_res_path); + filemanager_utils_get_file_list_of_type(shared_res_path,&file_list, FILE_TYPE_IMAGE, ad); + //filemanager_utils_get_file_list_of_type(get_storage_image_dir_path(),&file_list, FILE_TYPE_IMAGE, ad); + return file_list; +} + +Eina_List* get_audio_dir_audio_file_list(void* data) +{ + DBG("get_audio_dir_audio_file_list"); + appdata_s *ad =(appdata_s*) data; + Eina_List* file_list = NULL; + char *app_id; + char *shared_res_path; + app_control_get_caller (ad->app_control, &app_id); + //DBG("app_id%s", app_id); + app_manager_get_shared_resource_path(app_id, &shared_res_path); + //DBG("shared_path%s", shared_res_path); + //strcat(shared_res_path, "sounds/"); + DBG("shared_res_path%s", shared_res_path); + filemanager_utils_get_file_list_of_type(shared_res_path,&file_list, FILE_TYPE_MUSIC, ad); + //filemanager_utils_get_file_list_of_type(get_storage_audio_dir_path(),&file_list, FILE_TYPE_MUSIC, ad); + return file_list; +} + +Eina_List* get_all_dir_file_list(void* data) +{ + DBG("get_audio_dir_audio_file_list"); + appdata_s *ad =(appdata_s*) data; + Eina_List* file_list = NULL; + char *app_id; + char *shared_res_path; + app_control_get_caller (ad->app_control, &app_id); + //DBG("app_id%s", app_id); + app_manager_get_shared_resource_path(app_id, &shared_res_path); + //DBG("shared_path%s", shared_res_path); + //strcat(shared_res_path, "sounds/"); + DBG("shared_res_path%s", shared_res_path); + filemanager_utils_get_file_list_of_type(shared_res_path,&file_list, NULL, ad); + //filemanager_utils_get_file_list_of_type(get_storage_audio_dir_path(),&file_list, FILE_TYPE_MUSIC, ad); + return file_list; +} + +Eina_List* get_video_dir_video_file_list(void* data) +{ + DBG("get_video_dir_video_file_list"); + appdata_s *ad =(appdata_s*) data; + Eina_List* file_list = NULL; + char *app_id; + char *shared_res_path; + app_control_get_caller (ad->app_control, &app_id); + DBG("app_id%s", app_id); + app_manager_get_shared_resource_path(app_id, &shared_res_path); + DBG("shared_path%s", shared_res_path); + //strcat(shared_res_path, "video/"); + DBG("shared_res_path%s", shared_res_path); + filemanager_utils_get_file_list_of_type(shared_res_path,&file_list, FILE_TYPE_VIDEO, ad); + //filemanager_utils_get_file_list_of_type(get_storage_video_dir_path(),&file_list, FILE_TYPE_VIDEO, ad); + return file_list; +} + + + +static void +app_pause(void *data) +{ + /* Take necessary actions when application becomes invisible. */ +} + +static void +app_resume(void *data) +{ + /* Take necessary actions when application becomes visible. */ +} + +static void +app_terminate(void *data) +{ + /* Release all resources. */ +} + +static void +ui_app_lang_changed(app_event_info_h event_info, void *user_data) +{ + /*APP_EVENT_LANGUAGE_CHANGED*/ + char *locale = NULL; + system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale); + elm_language_set(locale); + free(locale); + return; +} + +static void +ui_app_orient_changed(app_event_info_h event_info, void *user_data) +{ + /*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/ + return; +} + +static void +ui_app_region_changed(app_event_info_h event_info, void *user_data) +{ + /*APP_EVENT_REGION_FORMAT_CHANGED*/ +} + +static void +ui_app_low_battery(app_event_info_h event_info, void *user_data) +{ + /*APP_EVENT_LOW_BATTERY*/ +} + +static void +ui_app_low_memory(app_event_info_h event_info, void *user_data) +{ + /*APP_EVENT_LOW_MEMORY*/ +} + +int +main(int argc, char *argv[]) +{ + appdata_s ad = {0,}; + int ret = 0; + + ui_app_lifecycle_callback_s event_callback = {0,}; + app_event_handler_h handlers[5] = {NULL, }; + + event_callback.create = app_create; + event_callback.terminate = app_terminate; + event_callback.pause = app_pause; + event_callback.resume = app_resume; + event_callback.app_control = app_control; + + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad); + ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad); + + ret = ui_app_main(argc, argv, &event_callback, &ad); + if (ret != APP_ERROR_NONE) { + dlog_print(DLOG_ERROR, LOG_TAG, "ui_app_main() is failed. err = %d", ret); + } + + return ret; +} + +static void show_image(void* data) +{ + appdata_s *this =(appdata_s*) data; + + const char *file_path; + file_path = this->uri; + file_path += 7; + + DBG("FILE: %s", file_path); + + Evas_Object* image = ui_utils_create_image(this->layout, file_path); + + if(EINA_TRUE == elm_image_animated_available_get(image)) + { + elm_image_animated_set(image, EINA_TRUE); + elm_image_animated_play_set(image, EINA_TRUE); + } + + elm_object_part_content_set(this->layout, "data_view", image); +} + +static void show_video(void* data) +{ + DBG("show_video....."); + appdata_s *this = (appdata_s*) data; + + Evas *evas = evas_object_evas_get(this->layout); + this->video_rect = evas_object_image_filled_add(evas); + + evas_object_show(this->video_rect); + elm_object_part_content_set(this->layout, "data_view", this->video_rect); + + + this->video_player_data = (videoplayer_data_s*) malloc(sizeof(videoplayer_data_s)); + this->video_player_data->video_rect = this->video_rect; + this->video_player_data->player = NULL; + this->video_player_data->uri = this->uri; + + start_player(this->video_player_data); + + +} + +static void show_audio(void* data) +{ + DBG("show_audio....."); + appdata_s *this = (appdata_s*) data; + + this->sound_player_data = (soundplayer_data_s*) malloc(sizeof(soundplayer_data_s)); + this->sound_player_data->uri = this->uri; + + this->sound_player_data->player = create_sound_player(this->sound_player_data); + start_sound_player(this->sound_player_data); +} + +static void show_url(void* data) +{ + DBG("show_url....."); + appdata_s *this = (appdata_s*) data; + + Evas_Object *web_view = ewk_view_add (evas_object_evas_get(this->layout)); + + ewk_view_url_set(web_view, "http://www.google.com"); //TODO: this url will change according to data + + evas_object_show(web_view); + elm_object_part_content_set(this->layout, "data_view", web_view); +} + + +static char* get_app_control_error(int ret) +{ + char* error = NULL; + + switch (ret) { + case APP_CONTROL_ERROR_NONE: + error = "APP_CONTROL_ERROR_NONE"; + break; + case APP_CONTROL_ERROR_INVALID_PARAMETER: + error = "APP_CONTROL_ERROR_INVALID_PARAMETER"; + break; + case APP_CONTROL_ERROR_OUT_OF_MEMORY: + error = "APP_CONTROL_ERROR_OUT_OF_MEMORY"; + break; + case APP_CONTROL_ERROR_APP_NOT_FOUND: + error = "APP_CONTROL_ERROR_APP_NOT_FOUND"; + break; + case APP_CONTROL_ERROR_KEY_NOT_FOUND: + error = "APP_CONTROL_ERROR_KEY_NOT_FOUND"; + break; + case APP_CONTROL_ERROR_KEY_REJECTED: + error = "APP_CONTROL_ERROR_KEY_REJECTED"; + break; + case APP_CONTROL_ERROR_INVALID_DATA_TYPE: + error = "APP_CONTROL_ERROR_INVALID_DATA_TYPE"; + break; + case APP_CONTROL_ERROR_LAUNCH_REJECTED: + error = "APP_CONTROL_ERROR_LAUNCH_REJECTED"; + break; + case APP_CONTROL_ERROR_PERMISSION_DENIED: + error = "APP_CONTROL_ERROR_PERMISSION_DENIED"; + break; + case APP_CONTROL_ERROR_LAUNCH_FAILED: + error = "APP_CONTROL_ERROR_LAUNCH_FAILED"; + break; + case APP_CONTROL_ERROR_TIMED_OUT: + error = "APP_CONTROL_ERROR_TIMED_OUT"; + break; + //case APP_CONTROL_ERROR_IO_ERROR: + //error = "APP_CONTROL_ERROR_IO_ERROR"; + //break; + default: + error = "Unknown Error"; + break; + } + return error; +} + + + + diff --git a/operationpickviewapp/src/soundplayer-util.c b/operationpickviewapp/src/soundplayer-util.c new file mode 100644 index 0000000..e760d08 --- /dev/null +++ b/operationpickviewapp/src/soundplayer-util.c @@ -0,0 +1,213 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file soundplayer-utils.c + * @brief This file is implementation of soundplayer-utils.h + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date February, 2016 + * @bug + * @credit + */ + + + +#include "soundplayer-util.h" + +static char* get_player_error(int ret); + +void start_sound_player(soundplayer_data_s *this) +{ + int ret; + RETM_IF(NULL == this, "this is NULL"); + + if(!this->player) + { + this->player = create_sound_player(this); + } + + if(this->player) + { + player_state_e state; + ret = player_get_state(this->player, &state); + RETM_IF(PLAYER_ERROR_NONE!=ret, "player_get_state failed:%s", get_player_error(ret)); + + if(state != PLAYER_STATE_PLAYING) + { + ret = player_set_display_visible(this->player, true); + RETM_IF(PLAYER_ERROR_NONE!=ret, "player_set_display_visible failed:%s", get_player_error(ret)); + ret = player_start(this->player); + RETM_IF(PLAYER_ERROR_NONE!=ret, "player_start failed:%s", get_player_error(ret)); + + } + } +} + +void destroy_sound_player(soundplayer_data_s *this) +{ + RETM_IF(NULL == this, "view is NULL"); + int ret; + if(this->player) + { + ret = player_unset_interrupted_cb( this->player); + DBG("player_unset_interrupted_cb failed: %s", get_player_error(ret)); + player_state_e state; + player_get_state(this->player, &state); + if(state != PLAYER_STATE_READY) + { + ret = player_stop(this->player); + RETM_IF(PLAYER_ERROR_NONE!=ret, "player_stop failed:%s", get_player_error(ret)); + } + ret = player_unprepare(this->player); + RETM_IF(PLAYER_ERROR_NONE!=ret, "player_unprepare failed:%s", get_player_error(ret)); + ret = player_destroy(this->player); + RETM_IF(PLAYER_ERROR_NONE!=ret, "player_destroy failed:%s", get_player_error(ret)); + this->player = NULL; + } +} + + +player_h create_sound_player(soundplayer_data_s *this) +{ + RETVM_IF(NULL == this, NULL, "view is NULL"); + + player_h player = NULL; + + int ret ; + + ret = player_create(&player); + RETVM_IF(ret != PLAYER_ERROR_NONE, NULL, "player_create fail > Error = %s", get_player_error(ret)); + RETVM_IF(player == NULL, NULL, "player_create fail"); + + ret = player_set_sound_type(player, SOUND_TYPE_MEDIA); + if(ret != PLAYER_ERROR_NONE) + { + DBG( "player_set_sound_type fail > Error = %s", get_player_error(ret)); + } + + ret = player_set_volume(player, 1.0, 1.0); + if(ret != PLAYER_ERROR_NONE) + { + DBG( "player_set_volume fail > Error = %s", get_player_error(ret)); + } + + ret = player_set_looping(player, true); + if(ret != PLAYER_ERROR_NONE) + { + DBG( "player_set_looping fail > Error = %s", get_player_error(ret)); + } + +// ret = player_set_interrupted_cb(player, _player_interrupted_cb, this); +// if(ret != PLAYER_ERROR_NONE) +// { +// DBG( "player_set_looping fail > Error = %s", get_player_error(ret)); +// } + + // ret = player_set_uri(player, get_resource_path(this->view->tbt_info->file_name)); + + + ret = player_set_uri(player, this->uri); + if(ret != PLAYER_ERROR_NONE) + { + DBG( "player_set_uri fail > Error = %s", get_player_error(ret)); + } + ret = player_set_display_visible(player, true); + if(ret != PLAYER_ERROR_NONE) + { + DBG( "player_set_display_visible fail > Error = %s", get_player_error(ret)); + } + ret = player_prepare(player); + if(ret != PLAYER_ERROR_NONE) + { + DBG( "player_prepare fail > Error = %s", get_player_error(ret)); + } + + return player; +} + +static char* get_player_error(int ret) +{ + char* error; + +switch(ret) +{ + case PLAYER_ERROR_NONE: + error = "PLAYER_ERROR_NONE "; + break; + case PLAYER_ERROR_OUT_OF_MEMORY: + error = "PLAYER_ERROR_OUT_OF_MEMORY"; + break; + case PLAYER_ERROR_INVALID_PARAMETER: + error = "PLAYER_ERROR_INVALID_PARAMETER"; + break; + case PLAYER_ERROR_NO_SUCH_FILE: + error = "PLAYER_ERROR_NO_SUCH_FILE "; + break; + case PLAYER_ERROR_INVALID_OPERATION: + error = "PLAYER_ERROR_INVALID_OPERATION"; + break; + case PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE: + error = "PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE "; + break; + case PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE: + error = "PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE "; + break; + case PLAYER_ERROR_SEEK_FAILED: + error = "PLAYER_ERROR_SEEK_FAILED "; + break; + case PLAYER_ERROR_INVALID_STATE: + error = "PLAYER_ERROR_INVALID_STATE"; + break; + case PLAYER_ERROR_NOT_SUPPORTED_FILE: + error = "PLAYER_ERROR_NOT_SUPPORTED_FIL"; + break; + case PLAYER_ERROR_INVALID_URI: + error = "PLAYER_ERROR_INVALID_URI "; + break; + case PLAYER_ERROR_SOUND_POLICY: + error = "PLAYER_ERROR_SOUND_POLICY "; + break; + case PLAYER_ERROR_CONNECTION_FAILED: + error = "PLAYER_ERROR_CONNECTION_FAILED"; + break; + case PLAYER_ERROR_VIDEO_CAPTURE_FAILED: + error = "PLAYER_ERROR_VIDEO_CAPTURE_FAILED "; + break; + case PLAYER_ERROR_DRM_EXPIRED: + error = "PLAYER_ERROR_DRM_EXPIRED "; + break; + case PLAYER_ERROR_DRM_NO_LICENSE: + error = "PLAYER_ERROR_DRM_NO_LICENSE"; + break; + case PLAYER_ERROR_DRM_FUTURE_USE: + error = "PLAYER_ERROR_DRM_FUTURE_USE"; + break; + case PLAYER_ERROR_DRM_NOT_PERMITTED: + error = "PLAYER_ERROR_DRM_NOT_PERMITTED"; + break; + case PLAYER_ERROR_RESOURCE_LIMIT: + error = "PLAYER_ERROR_RESOURCE_LIMIT "; + break; + case PLAYER_ERROR_PERMISSION_DENIED: + error = "PLAYER_ERROR_PERMISSION_DENIED"; + break; + default: + error = "Unknown error"; + } + return error; +} + diff --git a/operationpickviewapp/src/ui-utils.c b/operationpickviewapp/src/ui-utils.c new file mode 100644 index 0000000..81bef1d --- /dev/null +++ b/operationpickviewapp/src/ui-utils.c @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file ui-utils.c + * @brief This file is implementation of ui-utils.h. + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date january, 2016 + * @bug + * @credit + **/ + +#include "ui-utils.h" + +Evas_Object *ui_utils_create_image(Evas_Object *parent, const char *file_path) +{ + RETVM_IF(NULL == parent, NULL, "create_image parent is NULL"); + + Evas_Object *image = NULL; + image = elm_image_add(parent); + RETVM_IF(NULL == image, NULL, "elm_image_add is NULL"); + + bool result = (EINA_TRUE == elm_image_file_set(image, file_path, NULL)); + if(!result) + { + ERR("error with elm_image_file_set, image name %s", file_path); + evas_object_del(image); + return NULL; + } + + elm_image_no_scale_set(image, EINA_FALSE); + elm_image_resizable_set(image, EINA_TRUE, EINA_TRUE); + elm_image_smooth_set(image, EINA_FALSE); + elm_image_aspect_fixed_set(image, EINA_TRUE); + elm_image_editable_set(image, EINA_FALSE); + evas_object_show(image); + + return image; +} diff --git a/operationpickviewapp/src/videoplayer-util.c b/operationpickviewapp/src/videoplayer-util.c new file mode 100644 index 0000000..b61bd3e --- /dev/null +++ b/operationpickviewapp/src/videoplayer-util.c @@ -0,0 +1,169 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + +/** + * @file videoplayer-utils.c + * @brief This file is implementation of videoplayer-utils.h + * @since_tizen 2.4 + * @author A. B. M. Nazibullah (nazib.ullah@samsung.com) + * @date February, 2016 + * @bug + * @credit + */ + + + +#include "videoplayer-util.h" + + +player_h create_player(videoplayer_data_s* this) +{ + RETVM_IF(NULL == this, NULL, "view is NULL"); + + player_h player = NULL; + int result = player_create(&player); + if(result == PLAYER_ERROR_NONE) + { + result = player_set_sound_type(player, SOUND_TYPE_MEDIA); + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_set_sound_type fail > Error = %s", get_video_player_error(result)); + result = player_set_volume(player, 1.0, 1.0); + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_set_volume fail > Error = %s", get_video_player_error(result)); + result = player_set_looping(player, true); + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_set_looping fail > Error = %s", get_video_player_error(result)); + result = player_set_uri(player, this->uri); + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_set_uri fail > Error = %s", get_video_player_error(result)); + + result = player_set_display(player, PLAYER_DISPLAY_TYPE_EVAS, GET_DISPLAY(this->video_rect)); + + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_set_display fail > Error = %s", get_video_player_error(result)); + result = player_set_display_mode(player, PLAYER_DISPLAY_MODE_FULL_SCREEN); + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_set_display_mode fail > Error = %s", get_video_player_error(result)); + result = player_set_display_visible(player, true); + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_set_display_visible fail > Error = %s", get_video_player_error(result)); + result = player_prepare(player); + DBG("result is %d", result); + RETVM_IF(result != PLAYER_ERROR_NONE, NULL, "player_prepare fail > Error = %s", get_video_player_error(result)); + } + else + { + ERR("player_pause fail > Error = %s", get_video_player_error(result)); + } + + return player; +} + +void start_player(videoplayer_data_s *this) +{ + DBG("start_player......."); + RETM_IF(NULL == this, "this is NULL"); + int result; + if(!this->player) + { + this->player = create_player(this); + } + + if(this->player) + { + player_state_e state; + result = player_get_state(this->player, &state); + DBG( "player_get_state fail > Error = %s", get_video_player_error(result)); + if(state != PLAYER_STATE_PLAYING) + { + result = player_set_display_visible(this->player, true); + RETM_IF(result != PLAYER_ERROR_NONE, "player_set_display_visible fail > Error = %s", get_video_player_error(result)); + result = player_start(this->player); + RETM_IF(result != PLAYER_ERROR_NONE, "player_start fail > Error = %s", get_video_player_error(result)); + } + } +} + +char* get_video_player_error(player_error_e error_state) +{ + +switch(error_state) +{ + case PLAYER_ERROR_OUT_OF_MEMORY: + return "PLAYER_ERROR_OUT_OF_MEMORY"; + + case PLAYER_ERROR_INVALID_PARAMETER: + return "PLAYER_ERROR_INVALID_PARAMETER"; + + case PLAYER_ERROR_NO_SUCH_FILE: + return "PLAYER_ERROR_NO_SUCH_FILE"; + + case PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE: + return "PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE"; + + case PLAYER_ERROR_INVALID_OPERATION: + return "PLAYER_ERROR_INVALID_OPERATION"; + + case PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE: + return "PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE"; + + case PLAYER_ERROR_SEEK_FAILED: + return "PLAYER_ERROR_SEEK_FAILED"; + + case PLAYER_ERROR_INVALID_STATE: + return "PLAYER_ERROR_INVALID_STATE"; + + case PLAYER_ERROR_NOT_SUPPORTED_FILE: + return "PLAYER_ERROR_NOT_SUPPORTED_FILE"; + + case PLAYER_ERROR_INVALID_URI: + return "PLAYER_ERROR_INVALID_URI"; + + case PLAYER_ERROR_SOUND_POLICY: + return "PLAYER_ERROR_SOUND_POLICY"; + + case PLAYER_ERROR_CONNECTION_FAILED: + return "PLAYER_ERROR_CONNECTION_FAILED"; + + case PLAYER_ERROR_VIDEO_CAPTURE_FAILED: + return "PLAYER_ERROR_VIDEO_CAPTURE_FAILED"; + case PLAYER_ERROR_DRM_EXPIRED: + return "PLAYER_ERROR_DRM_EXPIRED"; + case PLAYER_ERROR_DRM_NO_LICENSE: + return "PLAYER_ERROR_DRM_NO_LICENSE"; + case PLAYER_ERROR_DRM_FUTURE_USE: + return "PLAYER_ERROR_DRM_FUTURE_USE"; + case PLAYER_ERROR_DRM_NOT_PERMITTED: + return "PLAYER_ERROR_DRM_NOT_PERMITTED"; + case PLAYER_ERROR_RESOURCE_LIMIT: + return "PLAYER_ERROR_RESOURCE_LIMIT"; + case PLAYER_ERROR_PERMISSION_DENIED: + return "PLAYER_ERROR_PERMISSION_DENIED"; + default: + return "ERROR_NOT_FOUND"; + + + } +} + +void destroy_player(videoplayer_data_s *this) +{ + RETM_IF(NULL == this, "view is NULL"); + int result; + if(this->player) + { + result = player_stop(this->player); + DBG( "player_stop fail > Error = %s", get_video_player_error(result)); + result = player_unprepare(this->player); + DBG( "player_unprepare fail > Error = %s", get_video_player_error(result)); + result = player_destroy(this->player); + DBG( "player_destroy fail > Error = %s", get_video_player_error(result)); + this->player = NULL; + } +} diff --git a/operationpickviewapp/tizen-manifest.xml b/operationpickviewapp/tizen-manifest.xml new file mode 100644 index 0000000..ce3754c --- /dev/null +++ b/operationpickviewapp/tizen-manifest.xml @@ -0,0 +1,97 @@ + + + + + + operationpickviewapp.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://tizen.org/privilege/mediastorage + http://tizen.org/privilege/appmanager.launch + http://tizen.org/privilege/externalstorage + + diff --git a/release/binary-armv7l/install.sh b/release/binary-armv7l/install.sh index 0c49acd..6fba834 100644 --- a/release/binary-armv7l/install.sh +++ b/release/binary-armv7l/install.sh @@ -29,7 +29,8 @@ sdb install org.tizen.coretbt_serviceapp-0.0.1-1.armv7l.tpk sdb install org.tizen.coretbt_uiapp-0.0.1-1.armv7l.tpk sdb install org.tizen.coretbtwidgetapp-0.0.1-1.armv7l.tpk sdb install org.tizen.tbt-ime-0.0.1-1.armv7l.tpk -sdb install org.tizen.tbtcoreapp-0.0.1-1.armv7l.tpk +sdb install org.tizen.operationpickviewapp-1.0.0-arm.tpk +sdb install org.tizen.tbtcoreapp-1.0.0-arm.tpk sdb push dog_1024_960.gif /opt/home/owner/content/Images sdb push SampleMP3.mp3 /opt/home/owner/content/Sounds diff --git a/release/binary-armv7l/org.tizen.operationpickviewapp-1.0.0-arm.tpk b/release/binary-armv7l/org.tizen.operationpickviewapp-1.0.0-arm.tpk new file mode 100644 index 0000000..2c91933 Binary files /dev/null and b/release/binary-armv7l/org.tizen.operationpickviewapp-1.0.0-arm.tpk differ diff --git a/release/binary-armv7l/org.tizen.tbtcoreapp-0.0.1-1.armv7l.tpk b/release/binary-armv7l/org.tizen.tbtcoreapp-0.0.1-1.armv7l.tpk deleted file mode 100644 index 23c274b..0000000 Binary files a/release/binary-armv7l/org.tizen.tbtcoreapp-0.0.1-1.armv7l.tpk and /dev/null differ diff --git a/release/binary-armv7l/org.tizen.tbtcoreapp-1.0.0-arm.tpk b/release/binary-armv7l/org.tizen.tbtcoreapp-1.0.0-arm.tpk new file mode 100644 index 0000000..0e2177c Binary files /dev/null and b/release/binary-armv7l/org.tizen.tbtcoreapp-1.0.0-arm.tpk differ diff --git a/release/binary-x86/install.sh b/release/binary-x86/install.sh index 310d721..0aeb09e 100644 --- a/release/binary-x86/install.sh +++ b/release/binary-x86/install.sh @@ -29,6 +29,7 @@ sdb install org.tizen.coretbt_serviceapp-1.0.0-i386.tpk sdb install org.tizen.coretbt_uiapp-1.0.0-i386.tpk sdb install org.tizen.coretbtwidgetapp-1.0.0-i386.tpk sdb install org.tizen.tbt-ime-1.0.0-i386.tpk +sdb install org.tizen.operationpickviewapp-1.0.0-i386.tpk sdb install org.tizen.tbtcoreapp-1.0.0-i386.tpk sdb push dog_1024_960.gif /opt/home/owner/content/Images diff --git a/release/binary-x86/org.tizen.operationpickviewapp-1.0.0-i386.tpk b/release/binary-x86/org.tizen.operationpickviewapp-1.0.0-i386.tpk new file mode 100644 index 0000000..4ee27e5 Binary files /dev/null and b/release/binary-x86/org.tizen.operationpickviewapp-1.0.0-i386.tpk differ diff --git a/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-i386.tpk b/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-i386.tpk index 48f41ba..7fdd163 100644 Binary files a/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-i386.tpk and b/release/binary-x86/org.tizen.tbtcoreapp-1.0.0-i386.tpk differ diff --git a/tbtcoreapp/CMakeLists.txt b/tbtcoreapp/CMakeLists.txt index 2d8c87d..2c8450e 100755 --- a/tbtcoreapp/CMakeLists.txt +++ b/tbtcoreapp/CMakeLists.txt @@ -8,7 +8,6 @@ SET(PKG_MODULES accounts-svc ail appcore-efl -appfw-env appsvc attach-panel aul @@ -44,7 +43,6 @@ ecore-evas ecore-file ecore-imf ecore-input -ecore-x edje eet efl-extension @@ -64,8 +62,11 @@ pkgmgr-info shortcut storage syspopup-caller -utilX -x11 +nsd-dns-sd +nsd-ssdp +capi-network-mtp +ecore-wayland +efl ) INCLUDE(FindPkgConfig) @@ -92,7 +93,6 @@ TARGET_LINK_LIBRARIES(${PROJECT_NAME} capi-appfw-application capi-appfw-preference capi-base-common - capi-data-control capi-location-manager capi-media-camera capi-media-player @@ -126,6 +126,11 @@ TARGET_LINK_LIBRARIES(${PROJECT_NAME} xml2 capi-media-screen-mirroring attach-panel + nsd-dns-sd + nsd-ssdp + capi-network-mtp + efl + data-control ) CONFIGURE_FILE(tizen-manifest.xml ${PACKAGE_NAME}.xml) diff --git a/tbtcoreapp/inc/model/tbt-info.h b/tbtcoreapp/inc/model/tbt-info.h index 5a64272..9df84c6 100644 --- a/tbtcoreapp/inc/model/tbt-info.h +++ b/tbtcoreapp/inc/model/tbt-info.h @@ -178,8 +178,14 @@ typedef enum { TBT_APP_MTP, - TBT_APP_NSD_DNS_SD, - + TBT_APP_NSD_DNS_SD_LOCAL, + + TBT_APP_NSD_DNS_SD_REMOTE, + + TBT_APP_NSD_SSDP_LOCAL, + + TBT_APP_NSD_SSDP_REMOTE, + TBT_APP_STORAGE, TBT_APP_RADIO diff --git a/tbtcoreapp/inc/utils/app_module_config.h b/tbtcoreapp/inc/utils/app_module_config.h index f7a9126..cf855ba 100644 --- a/tbtcoreapp/inc/utils/app_module_config.h +++ b/tbtcoreapp/inc/utils/app_module_config.h @@ -169,8 +169,11 @@ #define TBT_MODULE_MTP #define TBT_MODULE_APP_MTP -//#define TBT_MODULE_NSD -//#define TBT_MODULE_APP_NSD_DNS_SD +#define TBT_MODULE_NSD +#define TBT_MODULE_APP_NSD_DNS_SD_LOCAL +#define TBT_MODULE_APP_NSD_DNS_SD_REMOTE +#define TBT_MODULE_APP_NSD_SSDP_LOCAL +#define TBT_MODULE_APP_NSD_SSDP_REMOTE #define TBT_MODULE_STORAGE #define TBT_MODULE_APP_STORAGE diff --git a/tbtcoreapp/inc/view/tbt-nsd-ssdp-view.h b/tbtcoreapp/inc/view/tbt-nsd-ssdp-view.h new file mode 100644 index 0000000..3d74479 --- /dev/null +++ b/tbtcoreapp/inc/view/tbt-nsd-ssdp-view.h @@ -0,0 +1,53 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *******************************************************************************/ +/** + * @file tbt-nsd_ssdp-view.h + * @brief checks availability of nsd_ssdps in device + * @since_tizen 2.3 + * @author A B M Nazibullah(nazib.ullah@samsung.com) + * @date October, 2014 + * @bug NA + * @credit Tizen SDK Version 2.3.0 Sample Example + * + */ + +#ifndef __TBT_NSD_SSDP_VIEW_H__ +#define __TBT_NSD_SSDP_VIEW_H__ + +#include "utils/app_module_config.h" +#ifdef TBT_MODULE_NSD +#include +#include "model/tbt-list.h" + +/** + * @typedef nsd_ssdp_view + * @since_tizen 3.0 + * @brief A nsd_ssdp viewer view handle. + */ +typedef struct _nsd_ssdp_view nsd_ssdp_view; + +/** + * @brief Add nsd_ssdp view + * @since_tizen 2.3 + * @param[in] app The pointer to _app_data instance + * @param[in] navi The naviframe object + * @return nsd_ssdp viewer view data + */ +nsd_ssdp_view *nsd_ssdp_view_add(Evas_Object *navi, tbt_info *tbt_info, Elm_Object_Item *item); + +#endif +#endif // __TBT_NSD_SSDP_VIEW_H__ diff --git a/tbtcoreapp/packaging/org.tizen.tbtcoreapp.spec b/tbtcoreapp/packaging/org.tizen.tbtcoreapp.spec index 9e6e291..447e4f4 100755 --- a/tbtcoreapp/packaging/org.tizen.tbtcoreapp.spec +++ b/tbtcoreapp/packaging/org.tizen.tbtcoreapp.spec @@ -19,7 +19,6 @@ BuildRequires: pkgconfig(ail) BuildRequires: pkgconfig(alarm-service) BuildRequires: pkgconfig(appcore-common) BuildRequires: pkgconfig(appcore-efl) -BuildRequires: pkgconfig(appfw-env) BuildRequires: pkgconfig(appsvc) BuildRequires: pkgconfig(attach-panel) BuildRequires: pkgconfig(aul) @@ -69,7 +68,6 @@ BuildRequires: pkgconfig(ecore-evas) BuildRequires: pkgconfig(ecore-file) BuildRequires: pkgconfig(ecore-imf) BuildRequires: pkgconfig(ecore-input) -BuildRequires: pkgconfig(ecore-x) BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(edje) BuildRequires: pkgconfig(eet) @@ -91,24 +89,24 @@ BuildRequires: pkgconfig(key-manager) BuildRequires: pkgconfig(libcurl) BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(libxml-2.0) -BuildRequires: pkgconfig(location) BuildRequires: pkgconfig(mm-wfd) BuildRequires: pkgconfig(msg-service) BuildRequires: pkgconfig(notification) BuildRequires: pkgconfig(oauth2) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(pkgmgr) -BuildRequires: pkgconfig(privacy-manager-client) BuildRequires: pkgconfig(push) -BuildRequires: pkgconfig(security-server) BuildRequires: pkgconfig(shortcut) BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgconfig(storage) BuildRequires: pkgconfig(syspopup-caller) BuildRequires: pkgconfig(tapi) BuildRequires: pkgconfig(tts) -BuildRequires: pkgconfig(utilX) -BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(nsd-dns-sd) +BuildRequires: pkgconfig(nsd-ssdp) +BuildRequires: pkgconfig(capi-network-mtp) +BuildRequires: pkgconfig(ecore-wayland) +BuildRequires: pkgconfig(efl) %description Platform Project diff --git a/tbtcoreapp/res/edje/2.4/mobile/nsd_dnssd_viewer.edc b/tbtcoreapp/res/edje/2.4/mobile/nsd_dnssd_viewer.edc deleted file mode 100644 index f289d0c..0000000 --- a/tbtcoreapp/res/edje/2.4/mobile/nsd_dnssd_viewer.edc +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#define TEXT_HEIGHT 0.08 - -collections -{ - base_scale: 1.8; - group - { - name: "nsd_dnssd_viewer"; - parts{ - part{ - name: "nsd_dnssd_view"; - type: SWALLOW; - description{ - state: "default" 0.0; - align: 0.0 0.0; - visible: 1; - rel1 {relative: 0.0 0.0; } - rel2 {relative: 1.0 0.5; } - } - } - - part{ - name: "nsd_dnssd_info_view"; - type: SWALLOW; - description{ - state: "default" 0.0; - align: 0.0 0.0; - visible: 1; - rel1 {relative: 0.0 0.5; } - rel2 {relative: 1.0 0.8; } - } - } - - part{ - name: "nsd_dnssd_btn_view"; - type: SWALLOW; - description{ - state: "default" 0.0; - align: 0.0 0.0; - visible: 1; - rel1 {relative: 0.0 0.8; } - rel2 {relative: 1.0 1.0; } - } - } - } - } -} diff --git a/tbtcoreapp/res/edje/2.4/mobile/nsd_viewer.edc b/tbtcoreapp/res/edje/2.4/mobile/nsd_viewer.edc new file mode 100644 index 0000000..31543bc --- /dev/null +++ b/tbtcoreapp/res/edje/2.4/mobile/nsd_viewer.edc @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define TEXT_HEIGHT 0.08 + +collections +{ + base_scale: 1.8; + group + { + name: "nsd_dnssd_viewer"; + parts{ + part{ + name: "nsd_dnssd_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.0; } + rel2 {relative: 1.0 0.5; } + } + } + + part{ + name: "nsd_dnssd_info_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.5; } + rel2 {relative: 1.0 0.8; } + } + } + + part{ + name: "nsd_dnssd_btn_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.8; } + rel2 {relative: 1.0 1.0; } + } + } + + } + } + + + group + { + name: "nsd_ssdp_viewer"; + parts{ + part{ + name: "nsd_ssdp_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.0; } + rel2 {relative: 1.0 0.5; } + } + } + + part{ + name: "nsd_ssdp_info_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.5; } + rel2 {relative: 1.0 0.8; } + } + } + + part{ + name: "nsd_ssdp_btn_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.8; } + rel2 {relative: 1.0 1.0; } + } + } + + } + } +} diff --git a/tbtcoreapp/res/edje/3.0/mobile/nsd_viewer.edc b/tbtcoreapp/res/edje/3.0/mobile/nsd_viewer.edc new file mode 100644 index 0000000..31543bc --- /dev/null +++ b/tbtcoreapp/res/edje/3.0/mobile/nsd_viewer.edc @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define TEXT_HEIGHT 0.08 + +collections +{ + base_scale: 1.8; + group + { + name: "nsd_dnssd_viewer"; + parts{ + part{ + name: "nsd_dnssd_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.0; } + rel2 {relative: 1.0 0.5; } + } + } + + part{ + name: "nsd_dnssd_info_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.5; } + rel2 {relative: 1.0 0.8; } + } + } + + part{ + name: "nsd_dnssd_btn_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.8; } + rel2 {relative: 1.0 1.0; } + } + } + + } + } + + + group + { + name: "nsd_ssdp_viewer"; + parts{ + part{ + name: "nsd_ssdp_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.0; } + rel2 {relative: 1.0 0.5; } + } + } + + part{ + name: "nsd_ssdp_info_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.5; } + rel2 {relative: 1.0 0.8; } + } + } + + part{ + name: "nsd_ssdp_btn_view"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + rel1 {relative: 0.0 0.8; } + rel2 {relative: 1.0 1.0; } + } + } + + } + } +} diff --git a/tbtcoreapp/src/model/tbt-list.c b/tbtcoreapp/src/model/tbt-list.c index 4f72367..98c9c01 100644 --- a/tbtcoreapp/src/model/tbt-list.c +++ b/tbtcoreapp/src/model/tbt-list.c @@ -1447,7 +1447,7 @@ static tbt_info tbtapps[] = #ifdef TBT_MODULE_MTP #ifdef TBT_MODULE_APP_MTP - //HW-SW Feature summary + //MTP { .name = "MTP", .parent = "MTP", @@ -1460,18 +1460,51 @@ static tbt_info tbtapps[] = #endif #ifdef TBT_MODULE_NSD - #ifdef TBT_MODULE_APP_NSD_DNS_SD + #ifdef TBT_MODULE_APP_NSD_DNS_SD_LOCAL - //HW-SW Feature summary + //NSD DNSSD LOCAL + { + .name = "DNS-SD Local", + .parent = "NSD", + .apptype = TBT_APP_NSD_DNS_SD_LOCAL, + .icon_name = "dummy", + .info = "Check NSD DNS-SD
", + .result = 0 + }, + #endif + #ifdef TBT_MODULE_APP_NSD_DNS_SD_REMOTE + + //NSD DNSSD REMOTE { - .name = "DNS-SD", + .name = "DNS-SD Remote", .parent = "NSD", - .apptype = TBT_APP_NSD_DNS_SD, + .apptype = TBT_APP_NSD_DNS_SD_REMOTE, .icon_name = "dummy", .info = "Check NSD DNS-SD
", .result = 0 }, #endif + #ifdef TBT_MODULE_APP_NSD_SSDP_LOCAL + { + .name = "SSDP Local", + .parent = "NSD", + .apptype = TBT_APP_NSD_SSDP_LOCAL, + .icon_name = "dummy", + .info = "Check NSD SSDP
", + .result = 0 + }, + #endif + + #ifdef TBT_MODULE_APP_NSD_SSDP_REMOTE + { + .name = "SSDP Remote", + .parent = "NSD", + .apptype = TBT_APP_NSD_SSDP_REMOTE, + .icon_name = "dummy", + .info = "Check NSD SSDP
", + .result = 0 + }, + #endif #endif #ifdef TBT_MODULE_STORAGE #ifdef TBT_MODULE_APP_STORAGE diff --git a/tbtcoreapp/src/view/tbt-genlist-view.c b/tbtcoreapp/src/view/tbt-genlist-view.c index b5393dd..aa5c7d0 100644 --- a/tbtcoreapp/src/view/tbt-genlist-view.c +++ b/tbtcoreapp/src/view/tbt-genlist-view.c @@ -82,6 +82,7 @@ #include "view/tbt-attachpanel-view.h" #include "view/tbt-mtp-view.h" #include "view/tbt-nsd-dns-sd-view.h" +#include "view/tbt-nsd-ssdp-view.h" #include "view/tbt-storage-view.h" #include "view/tbt-radio-view.h" @@ -948,9 +949,18 @@ static void _gl_item_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void #endif #ifdef TBT_MODULE_NSD - case TBT_APP_NSD_DNS_SD: + case TBT_APP_NSD_DNS_SD_LOCAL: nsd_dnssd_view_add(view->navi, info, it); break; + case TBT_APP_NSD_DNS_SD_REMOTE: + nsd_dnssd_view_add(view->navi, info, it); + break; + case TBT_APP_NSD_SSDP_LOCAL: + nsd_ssdp_view_add(view->navi, info, it); + break; + case TBT_APP_NSD_SSDP_REMOTE: + nsd_ssdp_view_add(view->navi, info, it); + break; #endif #ifdef TBT_MODULE_STORAGE diff --git a/tbtcoreapp/src/view/tbt-mtp-view.c b/tbtcoreapp/src/view/tbt-mtp-view.c index 0c6a5ca..450447b 100644 --- a/tbtcoreapp/src/view/tbt-mtp-view.c +++ b/tbtcoreapp/src/view/tbt-mtp-view.c @@ -139,7 +139,8 @@ static void mtp_functions(mtp_view *this) snprintf(buf, MAX_LENGTH, "%d MTP Devices found",this->device_count); elm_list_item_append(this->info_list, buf, NULL, NULL, NULL, NULL); - for(int i=0; idevice_count;i++) + int i; + for(i=0; idevice_count;i++) { snprintf(buf, MAX_LENGTH, "Device %d's Info: ",i); elm_list_item_append(this->info_list, buf, NULL, NULL, NULL, NULL); @@ -175,8 +176,8 @@ static void mtp_functions(mtp_view *this) elm_list_item_append(this->info_list, buf, NULL, NULL, NULL, NULL); - - for(int j=0; jstorage_count;j++) + int j; + for(j=0; jstorage_count;j++) { snprintf(buf, MAX_LENGTH, "Device %d's Storage %d's Info: ", i, j); @@ -223,7 +224,8 @@ static void mtp_functions(mtp_view *this) snprintf(buf, MAX_LENGTH, "MTP Folders: "); elm_list_item_append(this->info_list, buf, NULL, NULL, NULL, NULL); - for (int k = 0; k < folder_count; k++) + int k; + for (k = 0; k < folder_count; k++) { char* folder_name; res = mtp_objectinfo_get_file_name(this->mtp_devices[i], folder_list[k], &folder_name); @@ -256,7 +258,8 @@ static void mtp_functions(mtp_view *this) snprintf(buf, MAX_LENGTH, "File count: %d", file_count); elm_list_item_append(this->list, buf, NULL, NULL, NULL, NULL); - for (int k = 0; k < file_count; k++) + int k; + for (k = 0; k < file_count; k++) { mtp_data *data = (mtp_data*) malloc(sizeof(mtp_data)); @@ -322,7 +325,8 @@ static void _app_destroy_cb(void* this) int res = MTP_ERROR_NONE; DBG("Count %d", count); - for(int i=0; iview, NULL, "calloc failed"); tbt_info->layout_group = "nsd_dnssd_viewer"; - tbt_info->layout_file = get_edje_path("nsd_dnssd_viewer.edj"); + tbt_info->layout_file = get_edje_path("nsd_viewer.edj"); common_view_add(navi, tbt_info, item, this->view, _app_destroy_cb, this); @@ -93,8 +101,16 @@ nsd_dnssd_view *nsd_dnssd_view_add(Evas_Object *navi, tbt_info *tbt_info, Elm_Ob elm_object_part_content_set(this->view->layout, "nsd_dnssd_info_view", this->info_list); - this->btn_browse_service = ui_utils_push_button_add(this, this->view->layout, "Browse Service", _on_browse_btn_clickded_cb); - elm_object_part_content_set(this->view->layout, "nsd_dnssd_btn_view", this->btn_browse_service); + if(this->view->tbt_info->apptype == TBT_APP_NSD_DNS_SD_LOCAL) + { + this->btn_browse_service = ui_utils_push_button_add(this, this->view->layout, "Browse Service", _on_browse_btn_clickded_cb); + elm_object_part_content_set(this->view->layout, "nsd_dnssd_btn_view", this->btn_browse_service); + } + else if(this->view->tbt_info->apptype == TBT_APP_NSD_DNS_SD_REMOTE) + { + this->btn_add_text_record = ui_utils_push_button_add(this, this->view->layout, "Add Record", _on_add_record_btn_clickded_cb); + elm_object_part_content_set(this->view->layout, "nsd_dnssd_btn_view", this->btn_add_text_record); + } evas_object_show(this->list); evas_object_show(this->info_list); @@ -118,31 +134,36 @@ static void dns_sd_api(void* data) res = dnssd_initialize(); RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_initialize fail > Error = %s", get_dns_sd_error(res)); - res = dnssd_create_local_service("_http._tcp", &this->dnssd_local_service); - RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_create_local_service fail > Error = %s", get_dns_sd_error(res)); - - res = dnssd_service_set_name(this->dnssd_local_service, "NsdDnsChat"); - RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_set_name fail > Error = %s", get_dns_sd_error(res)); - - res = dnssd_service_set_port(this->dnssd_local_service, 12683); - RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_set_port fail > Error = %s", get_dns_sd_error(res)); - - res = dnssd_register_local_service(this->dnssd_local_service, _dnssd_registered_cb, this); - RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_register_local_service fail > Error = %s", get_dns_sd_error(res)); + char* str = format_string("%s", "dnssd initialized"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); - res = dnssd_service_add_txt_record(this->dnssd_local_service, "kk", 5, "Hello"); - RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_add_txt_record fail > Error = %s", get_dns_sd_error(res)); } -static void _dnssd_registered_cb(dnssd_error_e result, dnssd_service_h local_service, void *user_data) +static void _dnssd_registered_cb(dnssd_error_e result, dnssd_service_h local_service, void *data) { DBG("_dnssd_registered_cb"); + RETM_IF(NULL == data, "data is NULL"); + nsd_dnssd_view *this = (nsd_dnssd_view*) data; + + char* str = format_string("%s", "local service registered"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + str = format_string("registered service: %u", local_service); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + elm_list_go(this->list); + elm_list_go(this->info_list); } -static void _dnssd_found_cb(dnssd_service_state_e service_state, dnssd_service_h remote_service, void *user_data) +static void _dnssd_found_cb(dnssd_service_state_e service_state, dnssd_service_h remote_service, void *data) { DBG("_dnssd_found_cb"); + RETM_IF(NULL == data, "data is NULL"); + nsd_dnssd_view *this = (nsd_dnssd_view*) data; unsigned short length; char* value; @@ -151,26 +172,182 @@ static void _dnssd_found_cb(dnssd_service_state_e service_state, dnssd_service_h char* ipv6; int port; char* service_name; + char* service_type; + char* str; if(service_state == DNSSD_SERVICE_STATE_AVAILABLE) - { + str = format_string("remote service %u", remote_service); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + str = format_string("found remote service"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + int res = dnssd_service_get_all_txt_record(remote_service, &length, (void*)&value); - show_txt_record(length, value); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_get_all_txt_record fail > Error = %s", get_dns_sd_error(res)); + + res = dnssd_service_get_name(remote_service, &service_name); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_get_name fail > Error = %s", get_dns_sd_error(res)); + if(service_name != NULL && sizeof(service_name) >0) + { + str = format_string("service name: %s", service_name); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + } + + res = dnssd_service_get_type(remote_service, &service_type); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_get_type fail > Error = %s", get_dns_sd_error(res)); + + if(service_type != NULL && sizeof(service_type) >0) + { + str = format_string("service type: %s", service_type); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + } + + res = dnssd_service_get_ip(remote_service, &ipv4, &ipv6); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_get_ip fail > Error = %s", get_dns_sd_error(res)); + + if(ipv4 != NULL && sizeof(ipv4) >0) + { + str = format_string("ipv4: %s", ipv4); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + } + if(ipv6 != NULL && sizeof(ipv6) >0) + { + str = format_string("ipv6: %s", ipv6); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + } + + res = dnssd_service_get_port(remote_service, &port); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_get_port fail > Error = %s", get_dns_sd_error(res)); + + str = format_string("port: %d", port); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + + memmove(value, value+1, strlen(value)); + + char** tokens = str_split(value, '='); - dnssd_service_get_name(remote_service, &service_name); - DBG("result : %s", get_dns_sd_error(res)); - dnssd_service_get_ip(remote_service, &ipv4, &ipv6); - dnssd_service_get_port(remote_service, &port); + if (tokens) + { - DBG("Length %u , Value: %s port %d ipv4 %s ipv6 %s service_name %s", length, value, port, ipv4, ipv6, service_name); + if(tokens[0] != NULL && strlen(tokens[0])>0) + { + str = format_string("key: %s", tokens[0]); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + } + if(tokens[1] != NULL && strlen(tokens[1])>0) + { + str = format_string("value: %s", tokens[1]); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + } + int i; + for (i = 0; *(tokens + i); i++) + { + SAFE_DELETE(*(tokens + i)); + } + + SAFE_DELETE(tokens); + } + + + elm_list_go(this->list); + elm_list_go(this->info_list); } } +static void _on_add_record_btn_clickded_cb(void *data, Evas_Object *obj, void *event_info) +{ + + RETM_IF(NULL == data, "data is NULL"); + nsd_dnssd_view *this = (nsd_dnssd_view*) data; + + this->is_btn_add_text_clicked = true; + + char* str; + + DBG("_on_add_record_btn_clickded_cb"); + + int res = DNSSD_ERROR_NONE; + + res = dnssd_create_local_service("_http._tcp", &this->dnssd_local_service); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_create_local_service fail > Error = %s", get_dns_sd_error(res)); + + str = format_string("local service created: %u", this->dnssd_local_service); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + char* service_name = "NsdDnsChat"; + res = dnssd_service_set_name(this->dnssd_local_service, service_name); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_set_name fail > Error = %s", get_dns_sd_error(res)); + + str = format_string("%s%s", "service name: ", service_name); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + int port = 12684; + res = dnssd_service_set_port(this->dnssd_local_service, port); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_set_port fail > Error = %s", get_dns_sd_error(res)); + + str = format_string("%s%d", "port: ", port); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + res = dnssd_register_local_service(this->dnssd_local_service, _dnssd_registered_cb, this); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_register_local_service fail > Error = %s", get_dns_sd_error(res)); + + str = format_string("%s", "register local service invoked"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + this->txt_record_key = "kk"; + unsigned short txt_length = 10; + char* text_value = "Hello"; + res = dnssd_service_add_txt_record(this->dnssd_local_service, this->txt_record_key, txt_length, text_value); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_add_txt_record fail > Error = %s", get_dns_sd_error(res)); + + void* val; + unsigned short buf_len, type; + dnssd_service_get_all_txt_record(this->dnssd_local_service, &buf_len, &val); + + //DBG("length %d value %s", l, (char*)val); + + type = 16; //16 for TXT type + res = dnssd_service_set_record(this->dnssd_local_service, type, buf_len, val); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_set_record fail > Error = %s", get_dns_sd_error(res)); + + str = format_string("%s", "Text added successfully"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + str = format_string("%s%s", "key: ",this->txt_record_key); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + str = format_string("%s%s", "value: ", text_value); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + elm_list_go(this->list); + elm_list_go(this->info_list); + evas_object_show(this->list); + evas_object_show(this->info_list); + +} + static void _on_browse_btn_clickded_cb(void *data, Evas_Object *obj, void *event_info) { DBG("_on_browse_btn_clickded_cb"); @@ -178,30 +355,16 @@ static void _on_browse_btn_clickded_cb(void *data, Evas_Object *obj, void *event RETM_IF(NULL == data, "data is NULL"); nsd_dnssd_view *this = (nsd_dnssd_view*) data; + this->is_btn_browse_clicked = true; + int res; - dnssd_browser_h dnssd_service; - res = dnssd_start_browsing_service("_http._tcp", &dnssd_service, _dnssd_found_cb, this); -} -static void show_txt_record(unsigned short txt_len, const char *txt_record) -{ - const char *ptr = txt_record; - const char *max = txt_record + txt_len; - while (ptr < max) { - const char *const end = ptr + 1 + ptr[0]; - if (end > max) { - DBG("<< invalid data >>"); - break; - } - if (++ptr < end) - DBG(" "); - while (ptr < end) { - if (*ptr >= ' ') - DBG("%c", *ptr); - ptr++; - } - } - DBG("\n"); + res = dnssd_start_browsing_service("_http._tcp", &this->dnssd_remote_service, _dnssd_found_cb, this); + char* str = format_string("Remote service browsing started"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + elm_list_go(this->info_list); } @@ -216,8 +379,34 @@ static void _app_destroy_cb(void* this) { RETM_IF(NULL == this, "data is NULL"); + int res = DNSSD_ERROR_NONE; + nsd_dnssd_view *view = NULL; view = (nsd_dnssd_view*)this; + + if(view->is_btn_add_text_clicked == true) + { + res = dnssd_service_remove_txt_record(view->dnssd_local_service, view->txt_record_key); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_service_remove_txt_record fail > Error = %s", get_dns_sd_error(res)); + + res = dnssd_deregister_local_service(view->dnssd_local_service); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_deregister_local_service fail > Error = %s", get_dns_sd_error(res)); + + res = dnssd_destroy_local_service(view->dnssd_local_service); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_destroy_local_service fail > Error = %s", get_dns_sd_error(res)); + + res = dnssd_service_unset_record(view->dnssd_local_service, 16); + } + + if(view->is_btn_browse_clicked == true) + { + res = dnssd_stop_browsing_service(view->dnssd_remote_service); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_stop_browsing_service fail > Error = %s", get_dns_sd_error(res)); + } + + res = dnssd_deinitialize(); + RETM_IF(res != DNSSD_ERROR_NONE, "dnssd_deinitialize fail > Error = %s", get_dns_sd_error(res)); + RETM_IF(NULL == view, "view is NULL"); SAFE_DELETE(view->view); @@ -271,5 +460,48 @@ static char* get_dns_sd_error(dnssd_error_e error) return error_msg; } +static char** str_split(char* a_str, const char a_delim) +{ + char** result = 0; + size_t count = 0; + char* tmp = a_str; + char* last_comma = 0; + char delim[2]; + delim[0] = a_delim; + delim[1] = 0; + + while (*tmp) + { + + if (a_delim == *tmp) + { + count++; + last_comma = tmp; + } + tmp++; + } + + count += last_comma < (a_str + strlen(a_str) - 1); + count++; + + result = malloc(sizeof(char*) * count); + + if (result) + { + size_t idx = 0; + char* token = strtok(a_str, delim); + + while (token) + { + RETVM_IF(idx >= count, NULL, "idx >= count"); + *(result + idx++) = strdup(token); + token = strtok(0, delim); + } + *(result + idx) = 0; + } + + return result; +} + #endif diff --git a/tbtcoreapp/src/view/tbt-nsd-ssdp-view.c b/tbtcoreapp/src/view/tbt-nsd-ssdp-view.c new file mode 100644 index 0000000..5c1cfa7 --- /dev/null +++ b/tbtcoreapp/src/view/tbt-nsd-ssdp-view.c @@ -0,0 +1,369 @@ +/******************************************************************************* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ +/** + * @file tbt-nsd_ssdp-view.h + * @brief checks required nsd_ssdps are available or not + * + * @author A B M Nazibullah(nazib.ullah@samsung.com) + * @date October, 2014 + * @bug NA + * @credit Tizen SDK Version 2.3.0 Sample Example + * + */ + +#include "utils/app_module_config.h" +#ifdef TBT_MODULE_NSD + +#include +#include + +#include "utils/logger.h" +#include "utils/config.h" +#include "utils/ui-utils.h" +#include "view/tbt-nsd-ssdp-view.h" +#include "view/tbt-common-view.h" + +struct _nsd_ssdp_view +{ + common_view* view; + + Evas_Object* list; + Evas_Object* info_list; + + ssdp_service_h ssdp_local_service; + ssdp_service_h ssdp_remote_service; + ssdp_browser_h ssdp_browser; + + Evas_Object* btn_browse_service; + Evas_Object* btn_add_text_record; + + char* txt_record_key; + char* ssdp_target; + char* usn; + char* url; + + bool is_btn_add_text_clicked; + bool is_btn_browse_clicked; +}; + + +static void _app_destroy_cb(void* this); +static char* get_ssdp_error(ssdp_error_e error); +static void ssdp_api(void* data); +static void _ssdp_registered_cb(ssdp_error_e result, ssdp_service_h local_service, void *user_data); +static void _on_browse_btn_clickded_cb(void *data, Evas_Object *obj, void *event_info); +static void _on_add_record_btn_clickded_cb(void *data, Evas_Object *obj, void *event_info); +static void _ssdp_found_cb(ssdp_service_state_e service_state, ssdp_service_h remote_service, void *user_data); + + + +/** + * @function nsd_ssdp_view_add + * @since_tizen 3.0 + * @description nsd_ssdp View Add + * @parameter Evas_Object*: Evas Object Pointer, tbt_info*: Tbt Info Pointer, Elm_Object_Item*: Elm Object Item Pointer + * @return nsd_ssdp_view* + */ +nsd_ssdp_view *nsd_ssdp_view_add(Evas_Object *navi, tbt_info *tbt_info, Elm_Object_Item *item) +{ + RETVM_IF(NULL == navi, NULL, "navi is null"); + + nsd_ssdp_view *this = NULL; + this = calloc(1, sizeof(nsd_ssdp_view)); + RETVM_IF(!this, NULL, "calloc failed"); + this->view = calloc(1, sizeof(common_view)); + RETVM_IF(!this->view, NULL, "calloc failed"); + + tbt_info->layout_group = "nsd_ssdp_viewer"; + tbt_info->layout_file = get_edje_path("nsd_viewer.edj"); + + common_view_add(navi, tbt_info, item, this->view, _app_destroy_cb, this); + + RETVM_IF(NULL == this->view, NULL, "navi is null"); + + this->list = elm_list_add(this->view->layout); + RETVM_IF(!this->list, NULL, "elm_list_add failed"); + evas_object_data_set(this->list, "view_data", this); + elm_object_part_content_set(this->view->layout, "nsd_ssdp_view", this->list); + + this->info_list = elm_list_add(this->view->layout); + RETVM_IF(!this->info_list, NULL, "elm_list_add failed"); + evas_object_data_set(this->info_list, "view_data", this); + elm_object_part_content_set(this->view->layout, "nsd_ssdp_info_view", this->info_list); + + + if(this->view->tbt_info->apptype == TBT_APP_NSD_SSDP_LOCAL) + { + this->btn_browse_service = ui_utils_push_button_add(this, this->view->layout, "Browse Service", _on_browse_btn_clickded_cb); + elm_object_part_content_set(this->view->layout, "nsd_ssdp_btn_view", this->btn_browse_service); + } + else if(this->view->tbt_info->apptype == TBT_APP_NSD_SSDP_REMOTE) + { + this->btn_add_text_record = ui_utils_push_button_add(this, this->view->layout, "Add Service", _on_add_record_btn_clickded_cb); + elm_object_part_content_set(this->view->layout, "nsd_ssdp_btn_view", this->btn_add_text_record); + } + + evas_object_show(this->list); + evas_object_show(this->info_list); + + ssdp_api(this); + + + return this; +} + + +static void ssdp_api(void* data) +{ + DBG("ssdp_api"); + + RETM_IF(NULL == data, "data is NULL"); + nsd_ssdp_view *this = (nsd_ssdp_view*) data; + + int res = SSDP_ERROR_NONE; + + res = ssdp_initialize(); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_initialize fail > Error = %s", get_ssdp_error(res)); + + char* str = format_string("%s", "ssdp initialized"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + +} + + +static void _ssdp_registered_cb(ssdp_error_e result, ssdp_service_h local_service, void *user_data) +{ + DBG("_ssdp_registered_cb"); + + RETM_IF(NULL == user_data, "data is NULL"); + nsd_ssdp_view *this = (nsd_ssdp_view*) user_data; + + char* str = format_string("service registered"); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); +} + +static void _ssdp_found_cb(ssdp_service_state_e service_state, ssdp_service_h remote_service, void *user_data) +{ + DBG("_ssdp_found_cb"); + RETM_IF(NULL == user_data, "data is NULL"); + nsd_ssdp_view *this = (nsd_ssdp_view*) user_data; + int res = SSDP_ERROR_NONE; + + char* str; + str = format_string("Found remote service"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + if(service_state == SSDP_SERVICE_STATE_AVAILABLE) + { + char* usn; + char* url; + + DBG("remote service %u", remote_service); + str = format_string("remote service %u", remote_service); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + res = ssdp_service_get_usn(remote_service, &usn); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_service_get_usn fail > Error = %s", get_ssdp_error(res)); + + str = format_string("usn: %s", usn); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + res = ssdp_service_get_url(remote_service, &url); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_service_get_url fail > Error = %s", get_ssdp_error(res)); + + str = format_string("url: %s", url); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + DBG("usn: %s, url: %s", usn, url); + + } + + elm_list_go(this->list); + elm_list_go(this->info_list); + +} + +static void _on_add_record_btn_clickded_cb(void *data, Evas_Object *obj, void *event_info) +{ + DBG("_on_add_record_btn_clickded_cb"); + + RETM_IF(NULL == data, "data is NULL"); + nsd_ssdp_view *this = (nsd_ssdp_view*) data; + + this->is_btn_add_text_clicked = true; + + int res = SSDP_ERROR_NONE; + char* str; + + char* target; + + this->ssdp_target="upnp:rootdevice"; + res = ssdp_create_local_service(this->ssdp_target, &this->ssdp_local_service); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_create_local_service fail > Error = %s", get_ssdp_error(res)); + + str = format_string("service created"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + str = format_string("service: %u", this->ssdp_local_service); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + this->usn = "uuid:1234abcd-12ab-12ab-12ab-1234567abc12::upnp:rootdevice"; + res = ssdp_service_set_usn(this->ssdp_local_service, this->usn); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_service_set_usn fail > Error = %s", get_ssdp_error(res)); + + str = format_string("usn: %s", this->usn); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + this->url = "http://192.168.0.111"; + res = ssdp_service_set_url(this->ssdp_local_service, this->url); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_service_set_url fail > Error = %s", get_ssdp_error(res)); + + str = format_string("url: %s", this->url); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + res = ssdp_service_get_target(this->ssdp_local_service, &target); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_service_get_target fail > Error = %s", get_ssdp_error(res)); + + str = format_string("target: %s", target); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + res = ssdp_register_local_service(this->ssdp_local_service, _ssdp_registered_cb, this); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_register_local_service fail > Error = %s", get_ssdp_error(res)); + + str = format_string("service register called"); + elm_list_item_append(this->list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + DBG("_on_add_record_btn_clickded_cb finished"); + + elm_list_go(this->list); + elm_list_go(this->info_list); +} + +static void _on_browse_btn_clickded_cb(void *data, Evas_Object *obj, void *event_info) +{ + DBG("_on_browse_btn_clickded_cb"); + + RETM_IF(NULL == data, "data is NULL"); + nsd_ssdp_view *this = (nsd_ssdp_view*) data; + + char* str; + + this->is_btn_browse_clicked = true; + + int res = SSDP_ERROR_NONE; + + this->ssdp_target="upnp:rootdevice"; + res = ssdp_start_browsing_service(this->ssdp_target, &this->ssdp_browser,_ssdp_found_cb, this); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_start_browsing_service fail > Error = %s", get_ssdp_error(res)); + + str = format_string("Service browsing started"); + elm_list_item_append(this->info_list, str, NULL, NULL, NULL, NULL); + SAFE_DELETE(str); + + elm_list_go(this->info_list); +} + + + +/** + * @function _app_destroy_cb + * @since_tizen 2.3 + * @description App Destroy Cb + * @parameter void*: Void Pointer + * @return static void + */ +static void _app_destroy_cb(void* this) +{ + RETM_IF(NULL == this, "data is NULL"); + + int res = SSDP_ERROR_NONE; + + nsd_ssdp_view *view = NULL; + view = (nsd_ssdp_view*)this; + RETM_IF(NULL == view, "view is NULL"); + + if(view->is_btn_add_text_clicked == true) + { + res = ssdp_deregister_local_service(view->ssdp_local_service); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_deregister_local_service fail > Error = %s", get_ssdp_error(res)); + } + + if(view->is_btn_browse_clicked == true) + { + res = ssdp_stop_browsing_service(view->ssdp_browser); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_stop_browsing_service fail > Error = %s", get_ssdp_error(res)); + } + + res = ssdp_deinitialize(); + RETM_IF(res != SSDP_ERROR_NONE, "ssdp_deinitialize fail > Error = %s", get_ssdp_error(res)); + + SAFE_DELETE(view->view); + SAFE_DELETE(view); +} + +static char* get_ssdp_error(ssdp_error_e error) +{ + + char* error_msg; + switch(error) + { + case SSDP_ERROR_NONE: + error_msg = "SSDP_ERROR_NONE"; + break; + case SSDP_ERROR_OUT_OF_MEMORY: + error_msg = "SSDP_ERROR_OUT_OF_MEMORY"; + break; + case SSDP_ERROR_INVALID_PARAMETER: + error_msg = "SSDP_ERROR_INVALID_PARAMETER"; + break; + case SSDP_ERROR_NOT_SUPPORTED: + error_msg = "SSDP_ERROR_NOT_SUPPORTED"; + break; + case SSDP_ERROR_NOT_INITIALIZED: + error_msg = "SSDP_ERROR_NOT_INITIALIZED"; + break; + + case SSDP_ERROR_OPERATION_FAILED: + error_msg = "SSDP_ERROR_OPERATION_FAILED"; + break; + case SSDP_ERROR_SERVICE_NOT_FOUND: + error_msg = "SSDP_ERROR_SERVICE_NOT_FOUND"; + break; + case SSDP_ERROR_SERVICE_ALREADY_REGISTERED: + error_msg = "SSDP_ERROR_SERVICE_ALREADY_REGISTERED"; + break; + default: + error_msg = "UNSUPPORTED_ERROR"; + break; + } + + return error_msg; +} + + +#endif diff --git a/tbtcoreapp/src/view/tbt-oauth2-view.c b/tbtcoreapp/src/view/tbt-oauth2-view.c index 877ad3f..7f9f502 100644 --- a/tbtcoreapp/src/view/tbt-oauth2-view.c +++ b/tbtcoreapp/src/view/tbt-oauth2-view.c @@ -39,10 +39,15 @@ #include #include -//Following client_id and client secret generated against srbd.tizen.tbt.test@gmail.com pass: tizentbttest +//Following client_id and client secret generated against srbd.tizen.tbt.test@gmail.com pass: tizentbttest123 + +//#define GOOGLE_CLIENT_ID "670877175811-sfjbiiambdqg411db9472u13ko89m972.apps.googleusercontent.com" +//#define GOOGLE_CLIENT_SECRET "FHPYeaQnAD2nFEA7yyJac2SS" + + +#define GOOGLE_CLIENT_ID "670877175811-fneddq3cnvgajhalsndlqargbft6tn5j.apps.googleusercontent.com" +#define GOOGLE_CLIENT_SECRET "AIRkuD9jcPEtaHwDZlvW-pwr" -#define GOOGLE_CLIENT_ID "670877175811-sfjbiiambdqg411db9472u13ko89m972.apps.googleusercontent.com" -#define GOOGLE_CLIENT_SECRET "FHPYeaQnAD2nFEA7yyJac2SS" #define OAUTH2_TYPE_STR(k) #k @@ -261,7 +266,7 @@ static void start_google_oauth_code(void* data) ret = oauth2_request_set_token_end_point_url(request,"https://accounts.google.com/o/oauth2/token"); RETM_IF(ret != OAUTH2_ERROR_NONE, "oauth2_request_set_token_end_point_url error: %s", get_oauth2_error(ret)); - ret = oauth2_request_set_redirection_url(request,"https://localhost:8080"); + ret = oauth2_request_set_redirection_url(request,"https://developer.tizen.org"); RETM_IF(ret != OAUTH2_ERROR_NONE, "oauth2_request_set_redirection_url error: %s", get_oauth2_error(ret)); ret = oauth2_request_set_client_id(request, GOOGLE_CLIENT_ID); diff --git a/tbtcoreapp/tbt32_mobile.conf b/tbtcoreapp/tbt32_mobile.conf new file mode 100755 index 0000000..4809ccf --- /dev/null +++ b/tbtcoreapp/tbt32_mobile.conf @@ -0,0 +1,30 @@ +[general] +buildroot = ~/GBS-ROOT-TBT-MOBILE + +################ Profile for Device ################ +[profile.device] +repos = repo.public_3.0_base_arm,repo.public_3.0_mobile_tm1 + +[repo.public_3.0_base_arm] +url = http://download.tizen.org/snapshots/tizen/base/latest/repos/arm/packages/ +user = nazib +passwdx = QlpoOTFBWSZTWRS3BYsAAAQRgAABMGUCECAAMQZMQQDJ6lptGgLxdyRThQkBS3BYsA== + +[repo.public_3.0_mobile_tm1] +url = http://download.tizen.org/snapshots/tizen/mobile/latest/repos/target-TM1/packages/ +user = nazib +passwdx = QlpoOTFBWSZTWRS3BYsAAAQRgAABMGUCECAAMQZMQQDJ6lptGgLxdyRThQkBS3BYsA== + +################ Profile for Emulator ################ +[profile.sdk] +repos = repo.public_3.0_base_emul,repo.public_3.0_mobile_emul + +[repo.public_3.0_base_emul] +url = http://download.tizen.org/snapshots/tizen/base/latest/repos/emulator32/packages/ +user = nazib +passwdx = QlpoOTFBWSZTWRS3BYsAAAQRgAABMGUCECAAMQZMQQDJ6lptGgLxdyRThQkBS3BYsA== + +[repo.public_3.0_mobile_emul] +url = http://download.tizen.org/snapshots/tizen/mobile/latest/repos/emulator32-wayland/packages/ +user = nazib +passwdx = QlpoOTFBWSZTWRS3BYsAAAQRgAABMGUCECAAMQZMQQDJ6lptGgLxdyRThQkBS3BYsA==