Skip to content

Commit 9784c1f

Browse files
committed
Merge branch 'master' of github.com:arduino/ARM
2 parents c2e8721 + 90f4337 commit 9784c1f

File tree

4 files changed

+73
-29
lines changed

4 files changed

+73
-29
lines changed

app/src/processing/app/Base.java

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.util.List;
3030

3131
import javax.swing.*;
32+
import javax.swing.filechooser.FileNameExtensionFilter;
3233

3334
import processing.app.debug.TargetPackage;
3435
import processing.app.debug.TargetPlatform;
@@ -954,8 +955,19 @@ public Map<String, File> getUserLibs() {
954955
return userLibs;
955956
}
956957

957-
public void rebuildImportMenu(JMenu importMenu) {
958+
public void rebuildImportMenu(JMenu importMenu, final Editor editor) {
958959
importMenu.removeAll();
960+
961+
JMenuItem addLibraryMenuItem = new JMenuItem(_("Add Library..."));
962+
addLibraryMenuItem.addActionListener(new ActionListener() {
963+
public void actionPerformed(ActionEvent e) {
964+
Base.this.handleAddLibrary(editor);
965+
Base.this.onBoardOrPortChange();
966+
Base.this.rebuildImportMenu(Editor.importMenu, editor);
967+
Base.this.rebuildExamplesMenu(Editor.examplesMenu);
968+
}
969+
});
970+
importMenu.add(addLibraryMenuItem);
959971

960972
// Split between user supplied libraries and IDE libraries
961973
Map<String, File> ideLibs = getIDELibs();
@@ -1108,7 +1120,7 @@ public void onBoardOrPortChange() {
11081120
}
11091121

11101122

1111-
public void rebuildBoardsMenu(JMenu boardsMenu, final JMenu cpuTypeMenu) {
1123+
public void rebuildBoardsMenu(JMenu boardsMenu, final JMenu cpuTypeMenu, final Editor editor) {
11121124
String selPackage = Preferences.get("target_package");
11131125
String selPlatform = Preferences.get("target_platform");
11141126
String selBoard = Preferences.get("board");
@@ -1172,7 +1184,7 @@ public void actionPerformed(ActionEvent actionevent) {
11721184

11731185
onBoardOrPortChange();
11741186
Sketch.buildSettingChanged();
1175-
rebuildImportMenu(Editor.importMenu);
1187+
rebuildImportMenu(Editor.importMenu, editor);
11761188
rebuildExamplesMenu(Editor.examplesMenu);
11771189
}
11781190
};
@@ -2600,22 +2612,54 @@ public void handleAddLibrary(Editor editor) {
26002612
JFileChooser fileChooser = new JFileChooser(System.getProperty("user.home"));
26012613
fileChooser.setDialogTitle(_("Select a zip file or a folder containing the library you'd like to add"));
26022614
fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
2615+
fileChooser.setFileFilter(new FileNameExtensionFilter("ZIP files or folders", "zip"));
26032616

26042617
Dimension preferredSize = fileChooser.getPreferredSize();
26052618
fileChooser.setPreferredSize(new Dimension(preferredSize.width + 200, preferredSize.height + 200));
2606-
2619+
26072620
int returnVal = fileChooser.showOpenDialog(editor);
26082621

26092622
if (returnVal != JFileChooser.APPROVE_OPTION) {
26102623
return;
26112624
}
26122625

26132626
File sourceFile = fileChooser.getSelectedFile();
2627+
File tmpFolder = null;
2628+
2629+
try {
2630+
// unpack ZIP
2631+
if (!sourceFile.isDirectory()) {
2632+
try {
2633+
tmpFolder = FileUtils.createTempFolder();
2634+
ZipDeflater zipDeflater = new ZipDeflater(sourceFile, tmpFolder);
2635+
zipDeflater.deflate();
2636+
File[] foldersInTmpFolder = tmpFolder.listFiles(new OnlyDirs());
2637+
if (foldersInTmpFolder.length != 1) {
2638+
throw new IOException("Zip doesn't contain one library");
2639+
}
2640+
sourceFile = foldersInTmpFolder[0];
2641+
} catch (IOException e) {
2642+
editor.statusError(e);
2643+
return;
2644+
}
2645+
}
2646+
2647+
// is there a library?
2648+
File libFolder = scanFatLibrary(sourceFile);
2649+
if (libFolder == null) {
2650+
editor.statusError("Not a valid library");
2651+
return;
2652+
}
2653+
String[] headerFiles = headerListFromIncludePath(libFolder);
2654+
if (headerFiles == null || headerFiles.length == 0) {
2655+
editor.statusError("Not a valid library");
2656+
return;
2657+
}
26142658

2615-
if (sourceFile.isDirectory()) {
2659+
// copy folder
26162660
File destinationFolder = new File(getSketchbookLibrariesFolder(), sourceFile.getName());
26172661
if (!destinationFolder.mkdir()) {
2618-
editor.statusError("Can't create folder: " + sourceFile.getName() + " into libraries folder");
2662+
editor.statusError("A library named " + sourceFile.getName() + " already exists");
26192663
return;
26202664
}
26212665
try {
@@ -2624,15 +2668,10 @@ public void handleAddLibrary(Editor editor) {
26242668
editor.statusError(e);
26252669
return;
26262670
}
2627-
} else {
2628-
try {
2629-
ZipDeflater zipDeflater = new ZipDeflater(sourceFile, getSketchbookLibrariesFolder());
2630-
zipDeflater.deflate();
2631-
} catch (IOException e) {
2632-
editor.statusError(e);
2633-
return;
2634-
}
2671+
editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu"));
2672+
} finally {
2673+
// delete zip created temp folder, if exists
2674+
FileUtils.recursiveDelete(tmpFolder);
26352675
}
2636-
editor.statusNotice(_("Library added to your libraries. Check \"Import library\" menu"));
26372676
}
26382677
}

app/src/processing/app/Editor.java

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -630,20 +630,10 @@ public void actionPerformed(ActionEvent e) {
630630

631631
if (importMenu == null) {
632632
importMenu = new JMenu(_("Import Library..."));
633-
base.rebuildImportMenu(importMenu);
633+
base.rebuildImportMenu(importMenu, this);
634634
}
635635
sketchMenu.add(importMenu);
636636

637-
item = new JMenuItem(_("Add Library..."));
638-
item.addActionListener(new ActionListener() {
639-
public void actionPerformed(ActionEvent e) {
640-
base.handleAddLibrary(Editor.this);
641-
base.onBoardOrPortChange();
642-
base.rebuildImportMenu(Editor.importMenu);
643-
}
644-
});
645-
sketchMenu.add(item);
646-
647637
item = newJMenuItem(_("Show Sketch Folder"), 'K');
648638
item.addActionListener(new ActionListener() {
649639
public void actionPerformed(ActionEvent e) {
@@ -694,10 +684,10 @@ public void actionPerformed(ActionEvent e) {
694684
if (boardsMenu == null) {
695685
boardsMenu = new JMenu(_("Board"));
696686
cpuTypeMenu = new JMenu(_("Processor"));
697-
base.rebuildBoardsMenu(boardsMenu, cpuTypeMenu);
687+
base.rebuildBoardsMenu(boardsMenu, cpuTypeMenu, this);
698688
//Debug: rebuild imports
699689
importMenu.removeAll();
700-
base.rebuildImportMenu(importMenu);
690+
base.rebuildImportMenu(importMenu, this);
701691
}
702692
menu.add(boardsMenu);
703693
menu.add(cpuTypeMenu);

app/src/processing/app/helpers/FileUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.io.FileInputStream;
55
import java.io.FileOutputStream;
66
import java.io.IOException;
7+
import java.util.Random;
78

89
public class FileUtils {
910

@@ -66,6 +67,9 @@ public static void copy(File sourceFolder, File destFolder) throws IOException {
6667
}
6768

6869
public static void recursiveDelete(File file) {
70+
if (file == null) {
71+
return;
72+
}
6973
if (file.isDirectory()) {
7074
for (File current : file.listFiles()) {
7175
if (current.isDirectory()) {
@@ -78,4 +82,12 @@ public static void recursiveDelete(File file) {
7882
file.delete();
7983
}
8084

85+
public static File createTempFolder() throws IOException {
86+
File tmpFolder = new File(System.getProperty("java.io.tmpdir"), "arduino_" + new Random().nextInt(1000000));
87+
if (!tmpFolder.mkdir()) {
88+
throw new IOException("Unable to create temp folder " + tmpFolder);
89+
}
90+
return tmpFolder;
91+
}
92+
8193
}

hardware/arduino/sam/cores/arduino/USB/USBCore.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -385,11 +385,14 @@ static bool USBD_SendDescriptor(Setup& setup)
385385
if (USB_DEVICE_DESCRIPTOR_TYPE == t)
386386
{
387387
TRACE_CORE(puts("=> USBD_SendDescriptor : USB_DEVICE_DESCRIPTOR_TYPE\r\n");)
388-
if (setup.wLength == 8)
388+
if (setup.wLength >= 8)
389389
{
390390
_cdcComposite = 1;
391391
}
392392
desc_addr = _cdcComposite ? (const uint8_t*)&USB_DeviceDescriptorA : (const uint8_t*)&USB_DeviceDescriptor;
393+
if( *desc_addr > setup.wLength ) {
394+
desc_length = setup.wLength;
395+
}
393396
}
394397
else if (USB_STRING_DESCRIPTOR_TYPE == t)
395398
{

0 commit comments

Comments
 (0)