1 /**
2  * \file connect.c
3  * Main programs implementing several utilities in one.
4  *
5  * Copyright (C) 2006 Chris A. Debenham <chris@adebenham.com>
6  * Copyright (C) 2008-2009 Linus Walleij <triad@df.lth.se>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23 #include <stdlib.h>
24 #include <libgen.h>
25 #include <getopt.h>
26 #include <string.h>
27 #include "common.h"
28 #include "util.h"
29 #include "pathutils.h"
30 
31 LIBMTP_folder_t *folders;
32 LIBMTP_file_t *files;
33 LIBMTP_mtpdevice_t *device;
34 
35 void usage(void);
36 void split_arg(char *,char **, char **);
37 void delfile_function(char *);
38 void delfile_command(int, char **);
39 void delfile_usage(void);
40 int sendtrack_function(char *, char *, char *, char *, char *, char *, char *, char *, uint16_t, uint16_t, uint16_t);
41 void sendtrack_command (int, char **);
42 void sendtrack_usage(void);
43 void sendfile_function(char *,char *);
44 void sendfile_command(int, char **);
45 void sendfile_usage(void);
46 void getfile_function(char *,char *);
47 void getfile_command(int, char **);
48 void getfile_usage(void);
49 void newfolder_function(char *);
50 void newfolder_command(int,char **);
51 void newfolder_usage(void);
52 
53 void
split_arg(char * argument,char ** part1,char ** part2)54 split_arg(char * argument, char ** part1, char ** part2)
55 {
56   char *sepp;
57   *part1 = NULL;
58   *part2 = NULL;
59 
60   sepp = argument + strcspn(argument, ",");
61   sepp[0] = '\0';
62   *part1 = argument;
63   *part2 = sepp+1;
64 }
65 
66 void
usage(void)67 usage(void)
68 {
69   printf("Usage: connect <command1> <command2>\n");
70   printf("Commands: --delete [filename]\n");
71   printf("          --sendfile [source] [destination]\n");
72   printf("          --sendtrack [source] [destination]\n");
73   printf("          --getfile [source] [destination]\n");
74   printf("          --newfolder [foldername]\n");
75 }
76 
77 
main(int argc,char ** argv)78 int main (int argc, char **argv)
79 {
80   checklang();
81 
82   LIBMTP_Init();
83 
84   fprintf(stdout, "libmtp version: " LIBMTP_VERSION_STRING "\n\n");
85 
86   device = LIBMTP_Get_First_Device();
87   if (device == NULL) {
88     printf("No devices.\n");
89     return 0;
90   }
91   files = LIBMTP_Get_Filelisting_With_Callback (device, NULL, NULL);
92   folders = LIBMTP_Get_Folder_List (device);
93 
94   if ((strncmp(basename(argv[0]),"mtp-delfile",11) == 0) || (strncmp(basename(argv[0]),"delfile",7) == 0)) {
95     delfile_command(argc,argv);
96   } else if ((strncmp(basename(argv[0]),"mtp-getfile",13) == 0) || (strncmp(basename(argv[0]),"getfile",9) == 0)) {
97     getfile_command(argc,argv);
98   } else if ((strncmp(basename(argv[0]),"mtp-newfolder",13) == 0) || (strncmp(basename(argv[0]),"newfolder",9) == 0)) {
99     newfolder_command(argc,argv);
100   } else if ((strncmp(basename(argv[0]),"mtp-sendfile",11) == 0) || (strncmp(basename(argv[0]),"sendfile",7) == 0)) {
101     sendfile_command(argc, argv);
102   } else if ((strncmp(basename(argv[0]),"mtp-sendtr",10) == 0) || (strncmp(basename(argv[0]),"sendtr",6) == 0)) {
103     sendtrack_command(argc, argv);
104   } else {
105     if ( argc < 2 ) {
106       usage ();
107       return 1;
108     }
109 
110     while (1) {
111       int option_index = 0;
112       static struct option long_options[] = {
113         {"delete", 1, 0, 'd'},
114         {"sendfile", 1, 0, 'f'},
115         {"getfile", 1, 0, 'g'},
116         {"newfolder", 1, 0, 'n'},
117         {"sendtrack", 1, 0, 't'},
118         {0, 0, 0, 0}
119       };
120 
121       int c = getopt_long (argc, argv, "d:f:g:n:t:", long_options, &option_index);
122       if (c == -1)
123         break;
124 
125       char *arg1, *arg2;
126       switch (c) {
127       case 'd':
128         printf("Delete %s\n",optarg);
129         delfile_function(optarg);
130         break;
131 
132       case 'f':
133         printf("Send file %s\n",optarg);
134         split_arg(optarg,&arg1,&arg2);
135         sendfile_function(arg1,arg2);
136         break;
137 
138       case 'g':
139         printf("Get file %s\n",optarg);
140         split_arg(optarg,&arg1,&arg2);
141         getfile_function(arg1,arg2);
142         break;
143 
144       case 'n':
145         printf("New folder %s\n",optarg);
146         newfolder_function(optarg);
147         break;
148 
149       case 't':
150         printf("Send track %s\n",optarg);
151         split_arg(optarg,&arg1,&arg2);
152         sendtrack_function(arg1,arg2,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0);
153         break;
154       }
155     }
156 
157     if (optind < argc) {
158       printf("Unknown options: ");
159       while (optind < argc)
160         printf("%s ", argv[optind++]);
161       printf("\n");
162     }
163   }
164 
165   LIBMTP_Release_Device(device);
166 
167   exit (0);
168 }
169 
170